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