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