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