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