1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause
2*a6dbe372Spaul luse * Copyright (C) 2018 Intel Corporation.
307fe6a43SSeth Howell * All rights reserved.
407fe6a43SSeth Howell */
507fe6a43SSeth Howell
607fe6a43SSeth Howell #include "spdk/stdinc.h"
7494b1ba8SRafal Stefanowski #include "spdk/log.h"
807fe6a43SSeth Howell
907fe6a43SSeth Howell #include "utils.h"
1007fe6a43SSeth Howell #include "vbdev_ocf.h"
1107fe6a43SSeth Howell
1207fe6a43SSeth Howell static char *cache_modes[ocf_cache_mode_max] = {
1307fe6a43SSeth Howell [ocf_cache_mode_wt] = "wt",
1407fe6a43SSeth Howell [ocf_cache_mode_wb] = "wb",
1507fe6a43SSeth Howell [ocf_cache_mode_wa] = "wa",
1607fe6a43SSeth Howell [ocf_cache_mode_pt] = "pt",
1720894340SMarcin Dziegielewski [ocf_cache_mode_wi] = "wi",
1820894340SMarcin Dziegielewski [ocf_cache_mode_wo] = "wo",
1907fe6a43SSeth Howell };
2007fe6a43SSeth Howell
21494b1ba8SRafal Stefanowski static char *seqcutoff_policies[ocf_seq_cutoff_policy_max] = {
22494b1ba8SRafal Stefanowski [ocf_seq_cutoff_policy_always] = "always",
23494b1ba8SRafal Stefanowski [ocf_seq_cutoff_policy_full] = "full",
24494b1ba8SRafal Stefanowski [ocf_seq_cutoff_policy_never] = "never",
25494b1ba8SRafal Stefanowski };
26494b1ba8SRafal Stefanowski
2707fe6a43SSeth Howell ocf_cache_mode_t
ocf_get_cache_mode(const char * cache_mode)2807fe6a43SSeth Howell ocf_get_cache_mode(const char *cache_mode)
2907fe6a43SSeth Howell {
3007fe6a43SSeth Howell int i;
3107fe6a43SSeth Howell
3207fe6a43SSeth Howell for (i = 0; i < ocf_cache_mode_max; i++) {
3307fe6a43SSeth Howell if (strcmp(cache_mode, cache_modes[i]) == 0) {
3407fe6a43SSeth Howell return i;
3507fe6a43SSeth Howell }
3607fe6a43SSeth Howell }
3707fe6a43SSeth Howell
3807fe6a43SSeth Howell return ocf_cache_mode_none;
3907fe6a43SSeth Howell }
4007fe6a43SSeth Howell
4107fe6a43SSeth Howell const char *
ocf_get_cache_modename(ocf_cache_mode_t mode)4207fe6a43SSeth Howell ocf_get_cache_modename(ocf_cache_mode_t mode)
4307fe6a43SSeth Howell {
4407fe6a43SSeth Howell if (mode > ocf_cache_mode_none && mode < ocf_cache_mode_max) {
4507fe6a43SSeth Howell return cache_modes[mode];
4607fe6a43SSeth Howell } else {
4707fe6a43SSeth Howell return NULL;
4807fe6a43SSeth Howell }
4907fe6a43SSeth Howell }
5007fe6a43SSeth Howell
5107fe6a43SSeth Howell int
ocf_get_cache_line_size(ocf_cache_t cache)528fcb8b96SRafal Stefanowski ocf_get_cache_line_size(ocf_cache_t cache)
538fcb8b96SRafal Stefanowski {
548fcb8b96SRafal Stefanowski return ocf_cache_get_line_size(cache) / KiB;
558fcb8b96SRafal Stefanowski }
568fcb8b96SRafal Stefanowski
57494b1ba8SRafal Stefanowski ocf_seq_cutoff_policy
ocf_get_seqcutoff_policy(const char * policy_name)58494b1ba8SRafal Stefanowski ocf_get_seqcutoff_policy(const char *policy_name)
59494b1ba8SRafal Stefanowski {
60494b1ba8SRafal Stefanowski int policy;
61494b1ba8SRafal Stefanowski
62494b1ba8SRafal Stefanowski for (policy = 0; policy < ocf_seq_cutoff_policy_max; policy++)
63494b1ba8SRafal Stefanowski if (!strcmp(policy_name, seqcutoff_policies[policy])) {
64494b1ba8SRafal Stefanowski return policy;
65494b1ba8SRafal Stefanowski }
66494b1ba8SRafal Stefanowski
67494b1ba8SRafal Stefanowski return ocf_seq_cutoff_policy_max;
68494b1ba8SRafal Stefanowski }
69494b1ba8SRafal Stefanowski
708fcb8b96SRafal Stefanowski int
vbdev_ocf_mngt_start(struct vbdev_ocf * vbdev,vbdev_ocf_mngt_fn * path,vbdev_ocf_mngt_callback cb,void * cb_arg)7107fe6a43SSeth Howell vbdev_ocf_mngt_start(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *path,
7207fe6a43SSeth Howell vbdev_ocf_mngt_callback cb, void *cb_arg)
7307fe6a43SSeth Howell {
7407fe6a43SSeth Howell if (vbdev->mngt_ctx.current_step) {
7507fe6a43SSeth Howell return -EBUSY;
7607fe6a43SSeth Howell }
7707fe6a43SSeth Howell
7807fe6a43SSeth Howell memset(&vbdev->mngt_ctx, 0, sizeof(vbdev->mngt_ctx));
7907fe6a43SSeth Howell
8007fe6a43SSeth Howell vbdev->mngt_ctx.current_step = path;
8107fe6a43SSeth Howell vbdev->mngt_ctx.cb = cb;
8207fe6a43SSeth Howell vbdev->mngt_ctx.cb_arg = cb_arg;
8307fe6a43SSeth Howell
8407fe6a43SSeth Howell (*vbdev->mngt_ctx.current_step)(vbdev);
8507fe6a43SSeth Howell
8607fe6a43SSeth Howell return 0;
8707fe6a43SSeth Howell }
8807fe6a43SSeth Howell
8907fe6a43SSeth Howell void
vbdev_ocf_mngt_stop(struct vbdev_ocf * vbdev,vbdev_ocf_mngt_fn * rollback_path,int status)90790669ccSMarcin Dziegielewski vbdev_ocf_mngt_stop(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *rollback_path, int status)
9107fe6a43SSeth Howell {
92790669ccSMarcin Dziegielewski if (status) {
93790669ccSMarcin Dziegielewski vbdev->mngt_ctx.status = status;
94790669ccSMarcin Dziegielewski }
95790669ccSMarcin Dziegielewski
96790669ccSMarcin Dziegielewski if (vbdev->mngt_ctx.status && rollback_path) {
97790669ccSMarcin Dziegielewski vbdev->mngt_ctx.poller_fn = NULL;
98790669ccSMarcin Dziegielewski vbdev->mngt_ctx.current_step = rollback_path;
99790669ccSMarcin Dziegielewski (*vbdev->mngt_ctx.current_step)(vbdev);
100790669ccSMarcin Dziegielewski return;
101790669ccSMarcin Dziegielewski }
102790669ccSMarcin Dziegielewski
10307fe6a43SSeth Howell if (vbdev->mngt_ctx.cb) {
10407fe6a43SSeth Howell vbdev->mngt_ctx.cb(vbdev->mngt_ctx.status, vbdev, vbdev->mngt_ctx.cb_arg);
10507fe6a43SSeth Howell }
10607fe6a43SSeth Howell
10707fe6a43SSeth Howell memset(&vbdev->mngt_ctx, 0, sizeof(vbdev->mngt_ctx));
10807fe6a43SSeth Howell }
10907fe6a43SSeth Howell
11007fe6a43SSeth Howell void
vbdev_ocf_mngt_continue(struct vbdev_ocf * vbdev,int status)11107fe6a43SSeth Howell vbdev_ocf_mngt_continue(struct vbdev_ocf *vbdev, int status)
11207fe6a43SSeth Howell {
11307fe6a43SSeth Howell if (vbdev->mngt_ctx.current_step == NULL) {
11407fe6a43SSeth Howell return;
11507fe6a43SSeth Howell }
11607fe6a43SSeth Howell
11707fe6a43SSeth Howell assert((*vbdev->mngt_ctx.current_step) != NULL);
11807fe6a43SSeth Howell
11907fe6a43SSeth Howell vbdev->mngt_ctx.status = status;
12007fe6a43SSeth Howell
12107fe6a43SSeth Howell vbdev->mngt_ctx.current_step++;
12207fe6a43SSeth Howell if (*vbdev->mngt_ctx.current_step) {
12307fe6a43SSeth Howell (*vbdev->mngt_ctx.current_step)(vbdev);
12407fe6a43SSeth Howell return;
12507fe6a43SSeth Howell }
12607fe6a43SSeth Howell
127790669ccSMarcin Dziegielewski vbdev_ocf_mngt_stop(vbdev, NULL, 0);
128790669ccSMarcin Dziegielewski }
129790669ccSMarcin Dziegielewski
130790669ccSMarcin Dziegielewski int
vbdev_ocf_mngt_get_status(struct vbdev_ocf * vbdev)131790669ccSMarcin Dziegielewski vbdev_ocf_mngt_get_status(struct vbdev_ocf *vbdev)
132790669ccSMarcin Dziegielewski {
133790669ccSMarcin Dziegielewski return vbdev->mngt_ctx.status;
13407fe6a43SSeth Howell }
135