xref: /spdk/module/bdev/ocf/utils.c (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
1  /*   SPDX-License-Identifier: BSD-3-Clause
2   *   Copyright (C) 2018 Intel Corporation.
3   *   All rights reserved.
4   */
5  
6  #include "spdk/stdinc.h"
7  #include "spdk/log.h"
8  
9  #include "utils.h"
10  #include "vbdev_ocf.h"
11  
12  static char *cache_modes[ocf_cache_mode_max] = {
13  	[ocf_cache_mode_wt] = "wt",
14  	[ocf_cache_mode_wb] = "wb",
15  	[ocf_cache_mode_wa] = "wa",
16  	[ocf_cache_mode_pt] = "pt",
17  	[ocf_cache_mode_wi] = "wi",
18  	[ocf_cache_mode_wo] = "wo",
19  };
20  
21  static char *seqcutoff_policies[ocf_seq_cutoff_policy_max] = {
22  	[ocf_seq_cutoff_policy_always] = "always",
23  	[ocf_seq_cutoff_policy_full] = "full",
24  	[ocf_seq_cutoff_policy_never] = "never",
25  };
26  
27  ocf_cache_mode_t
ocf_get_cache_mode(const char * cache_mode)28  ocf_get_cache_mode(const char *cache_mode)
29  {
30  	int i;
31  
32  	for (i = 0; i < ocf_cache_mode_max; i++) {
33  		if (strcmp(cache_mode, cache_modes[i]) == 0) {
34  			return i;
35  		}
36  	}
37  
38  	return ocf_cache_mode_none;
39  }
40  
41  const char *
ocf_get_cache_modename(ocf_cache_mode_t mode)42  ocf_get_cache_modename(ocf_cache_mode_t mode)
43  {
44  	if (mode > ocf_cache_mode_none && mode < ocf_cache_mode_max) {
45  		return cache_modes[mode];
46  	} else {
47  		return NULL;
48  	}
49  }
50  
51  int
ocf_get_cache_line_size(ocf_cache_t cache)52  ocf_get_cache_line_size(ocf_cache_t cache)
53  {
54  	return ocf_cache_get_line_size(cache) / KiB;
55  }
56  
57  ocf_seq_cutoff_policy
ocf_get_seqcutoff_policy(const char * policy_name)58  ocf_get_seqcutoff_policy(const char *policy_name)
59  {
60  	int policy;
61  
62  	for (policy = 0; policy < ocf_seq_cutoff_policy_max; policy++)
63  		if (!strcmp(policy_name, seqcutoff_policies[policy])) {
64  			return policy;
65  		}
66  
67  	return ocf_seq_cutoff_policy_max;
68  }
69  
70  int
vbdev_ocf_mngt_start(struct vbdev_ocf * vbdev,vbdev_ocf_mngt_fn * path,vbdev_ocf_mngt_callback cb,void * cb_arg)71  vbdev_ocf_mngt_start(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *path,
72  		     vbdev_ocf_mngt_callback cb, void *cb_arg)
73  {
74  	if (vbdev->mngt_ctx.current_step) {
75  		return -EBUSY;
76  	}
77  
78  	memset(&vbdev->mngt_ctx, 0, sizeof(vbdev->mngt_ctx));
79  
80  	vbdev->mngt_ctx.current_step = path;
81  	vbdev->mngt_ctx.cb = cb;
82  	vbdev->mngt_ctx.cb_arg = cb_arg;
83  
84  	(*vbdev->mngt_ctx.current_step)(vbdev);
85  
86  	return 0;
87  }
88  
89  void
vbdev_ocf_mngt_stop(struct vbdev_ocf * vbdev,vbdev_ocf_mngt_fn * rollback_path,int status)90  vbdev_ocf_mngt_stop(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *rollback_path, int status)
91  {
92  	if (status) {
93  		vbdev->mngt_ctx.status = status;
94  	}
95  
96  	if (vbdev->mngt_ctx.status && rollback_path) {
97  		vbdev->mngt_ctx.poller_fn = NULL;
98  		vbdev->mngt_ctx.current_step = rollback_path;
99  		(*vbdev->mngt_ctx.current_step)(vbdev);
100  		return;
101  	}
102  
103  	if (vbdev->mngt_ctx.cb) {
104  		vbdev->mngt_ctx.cb(vbdev->mngt_ctx.status, vbdev, vbdev->mngt_ctx.cb_arg);
105  	}
106  
107  	memset(&vbdev->mngt_ctx, 0, sizeof(vbdev->mngt_ctx));
108  }
109  
110  void
vbdev_ocf_mngt_continue(struct vbdev_ocf * vbdev,int status)111  vbdev_ocf_mngt_continue(struct vbdev_ocf *vbdev, int status)
112  {
113  	if (vbdev->mngt_ctx.current_step == NULL) {
114  		return;
115  	}
116  
117  	assert((*vbdev->mngt_ctx.current_step) != NULL);
118  
119  	vbdev->mngt_ctx.status = status;
120  
121  	vbdev->mngt_ctx.current_step++;
122  	if (*vbdev->mngt_ctx.current_step) {
123  		(*vbdev->mngt_ctx.current_step)(vbdev);
124  		return;
125  	}
126  
127  	vbdev_ocf_mngt_stop(vbdev, NULL, 0);
128  }
129  
130  int
vbdev_ocf_mngt_get_status(struct vbdev_ocf * vbdev)131  vbdev_ocf_mngt_get_status(struct vbdev_ocf *vbdev)
132  {
133  	return vbdev->mngt_ctx.status;
134  }
135