Line data Source code
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 28 0 : ocf_get_cache_mode(const char *cache_mode) 29 : { 30 0 : int i; 31 : 32 0 : for (i = 0; i < ocf_cache_mode_max; i++) { 33 0 : if (strcmp(cache_mode, cache_modes[i]) == 0) { 34 0 : return i; 35 : } 36 0 : } 37 : 38 0 : return ocf_cache_mode_none; 39 0 : } 40 : 41 : const char * 42 0 : ocf_get_cache_modename(ocf_cache_mode_t mode) 43 : { 44 0 : if (mode > ocf_cache_mode_none && mode < ocf_cache_mode_max) { 45 0 : return cache_modes[mode]; 46 : } else { 47 0 : return NULL; 48 : } 49 0 : } 50 : 51 : int 52 0 : ocf_get_cache_line_size(ocf_cache_t cache) 53 : { 54 0 : return ocf_cache_get_line_size(cache) / KiB; 55 : } 56 : 57 : ocf_seq_cutoff_policy 58 0 : ocf_get_seqcutoff_policy(const char *policy_name) 59 : { 60 0 : int policy; 61 : 62 0 : for (policy = 0; policy < ocf_seq_cutoff_policy_max; policy++) 63 0 : if (!strcmp(policy_name, seqcutoff_policies[policy])) { 64 0 : return policy; 65 : } 66 : 67 0 : return ocf_seq_cutoff_policy_max; 68 0 : } 69 : 70 : int 71 0 : vbdev_ocf_mngt_start(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *path, 72 : vbdev_ocf_mngt_callback cb, void *cb_arg) 73 : { 74 0 : if (vbdev->mngt_ctx.current_step) { 75 0 : return -EBUSY; 76 : } 77 : 78 0 : memset(&vbdev->mngt_ctx, 0, sizeof(vbdev->mngt_ctx)); 79 : 80 0 : vbdev->mngt_ctx.current_step = path; 81 0 : vbdev->mngt_ctx.cb = cb; 82 0 : vbdev->mngt_ctx.cb_arg = cb_arg; 83 : 84 0 : (*vbdev->mngt_ctx.current_step)(vbdev); 85 : 86 0 : return 0; 87 0 : } 88 : 89 : void 90 0 : vbdev_ocf_mngt_stop(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *rollback_path, int status) 91 : { 92 0 : if (status) { 93 0 : vbdev->mngt_ctx.status = status; 94 0 : } 95 : 96 0 : if (vbdev->mngt_ctx.status && rollback_path) { 97 0 : vbdev->mngt_ctx.poller_fn = NULL; 98 0 : vbdev->mngt_ctx.current_step = rollback_path; 99 0 : (*vbdev->mngt_ctx.current_step)(vbdev); 100 0 : return; 101 : } 102 : 103 0 : if (vbdev->mngt_ctx.cb) { 104 0 : vbdev->mngt_ctx.cb(vbdev->mngt_ctx.status, vbdev, vbdev->mngt_ctx.cb_arg); 105 0 : } 106 : 107 0 : memset(&vbdev->mngt_ctx, 0, sizeof(vbdev->mngt_ctx)); 108 0 : } 109 : 110 : void 111 0 : vbdev_ocf_mngt_continue(struct vbdev_ocf *vbdev, int status) 112 : { 113 0 : if (vbdev->mngt_ctx.current_step == NULL) { 114 0 : return; 115 : } 116 : 117 0 : assert((*vbdev->mngt_ctx.current_step) != NULL); 118 : 119 0 : vbdev->mngt_ctx.status = status; 120 : 121 0 : vbdev->mngt_ctx.current_step++; 122 0 : if (*vbdev->mngt_ctx.current_step) { 123 0 : (*vbdev->mngt_ctx.current_step)(vbdev); 124 0 : return; 125 : } 126 : 127 0 : vbdev_ocf_mngt_stop(vbdev, NULL, 0); 128 0 : } 129 : 130 : int 131 0 : vbdev_ocf_mngt_get_status(struct vbdev_ocf *vbdev) 132 : { 133 0 : return vbdev->mngt_ctx.status; 134 : }