Lines Matching refs:vbdev
55 examine_done(int status, struct vbdev_ocf *vbdev, void *cb_arg)
81 free_vbdev(struct vbdev_ocf *vbdev)
83 if (!vbdev) {
87 free(vbdev->name);
88 free(vbdev->cache.name);
89 free(vbdev->core.name);
90 free(vbdev);
94 * that is attached to other vbdev */
98 struct vbdev_ocf *vbdev;
100 TAILQ_FOREACH(vbdev, &g_ocf_vbdev_head, tailq) {
101 if (&vbdev->cache == base || !vbdev->cache.attached) {
104 if (!strcmp(vbdev->cache.name, base->name)) {
105 return &vbdev->cache;
113 is_ocf_cache_running(struct vbdev_ocf *vbdev)
115 if (vbdev->cache.attached && vbdev->ocf_cache) {
116 return ocf_cache_is_running(vbdev->ocf_cache);
122 is_ocf_cache_detached(struct vbdev_ocf *vbdev)
124 if (vbdev->cache.attached && vbdev->ocf_cache) {
125 return ocf_cache_is_detached(vbdev->ocf_cache);
131 * that is started by other vbdev */
133 get_other_cache_instance(struct vbdev_ocf *vbdev)
138 if (cmp->state.doing_finish || cmp == vbdev) {
141 if (strcmp(cmp->cache.name, vbdev->cache.name)) {
182 unregister_finish(struct vbdev_ocf *vbdev)
184 spdk_bdev_destruct_done(&vbdev->exp_bdev, vbdev->state.stop_status);
186 if (vbdev->ocf_cache) {
187 ocf_mngt_cache_put(vbdev->ocf_cache);
190 if (vbdev->cache_ctx) {
191 vbdev_ocf_cache_ctx_put(vbdev->cache_ctx);
193 vbdev_ocf_mngt_continue(vbdev, 0);
197 close_core_bdev(struct vbdev_ocf *vbdev)
199 remove_base_bdev(&vbdev->core);
200 vbdev_ocf_mngt_continue(vbdev, 0);
206 struct vbdev_ocf *vbdev = priv;
208 ocf_mngt_cache_unlock(vbdev->ocf_cache);
209 vbdev_ocf_mngt_continue(vbdev, error);
216 struct vbdev_ocf *vbdev = (struct vbdev_ocf *)priv;
220 error, vbdev->name);
221 vbdev_ocf_mngt_continue(vbdev, error);
225 ocf_mngt_cache_remove_core(vbdev->ocf_core, remove_core_cmpl, vbdev);
230 detach_core(struct vbdev_ocf *vbdev)
232 if (is_ocf_cache_running(vbdev)) {
233 ocf_mngt_cache_lock(vbdev->ocf_cache, remove_core_cache_lock_cmpl, vbdev);
235 vbdev_ocf_mngt_continue(vbdev, 0);
240 close_cache_bdev(struct vbdev_ocf *vbdev)
242 remove_base_bdev(&vbdev->cache);
243 vbdev_ocf_mngt_continue(vbdev, 0);
248 detach_cache(struct vbdev_ocf *vbdev)
250 vbdev->state.stop_status = vbdev->mngt_ctx.status;
252 /* If some other vbdev references this cache bdev,
254 if (get_other_cache_base(&vbdev->cache)) {
255 vbdev->cache.attached = false;
258 vbdev_ocf_mngt_continue(vbdev, 0);
264 struct vbdev_ocf *vbdev = priv;
266 vbdev_ocf_queue_put(vbdev->cache_ctx->mngt_queue);
269 vbdev_ocf_mngt_continue(vbdev, error);
276 struct vbdev_ocf *vbdev = (struct vbdev_ocf *)priv;
280 error, vbdev->name);
281 vbdev_ocf_mngt_continue(vbdev, error);
285 ocf_mngt_cache_stop(vbdev->ocf_cache, stop_vbdev_cmpl, vbdev);
291 stop_vbdev(struct vbdev_ocf *vbdev)
293 if (!is_ocf_cache_running(vbdev)) {
294 vbdev_ocf_mngt_continue(vbdev, 0);
298 if (!g_fini_started && get_other_cache_instance(vbdev)) {
301 vbdev->cache.name);
302 vbdev_ocf_mngt_continue(vbdev, 0);
306 ocf_mngt_cache_lock(vbdev->ocf_cache, stop_vbdev_cache_lock_cmpl, vbdev);
312 struct vbdev_ocf *vbdev = priv;
315 vbdev_ocf_mngt_continue(vbdev, error);
321 struct vbdev_ocf *vbdev = (struct vbdev_ocf *)priv;
325 error, vbdev->name);
326 vbdev_ocf_mngt_continue(vbdev, error);
330 ocf_mngt_cache_flush(vbdev->ocf_cache, flush_vbdev_cmpl, vbdev);
334 flush_vbdev(struct vbdev_ocf *vbdev)
336 if (!is_ocf_cache_running(vbdev)) {
337 vbdev_ocf_mngt_continue(vbdev, -EINVAL);
341 ocf_mngt_cache_lock(vbdev->ocf_cache, flush_vbdev_cache_lock_cmpl, vbdev);
372 struct vbdev_ocf *vbdev = opaque;
376 unregister_path = vbdev->state.doing_clean_delete ?
379 rc = vbdev_ocf_mngt_start(vbdev, unregister_path, NULL, NULL);
382 spdk_bdev_destruct_done(&vbdev->exp_bdev, rc);
389 _vbdev_ocf_destruct_clean(struct vbdev_ocf *vbdev)
391 if (vbdev->core.attached) {
392 detach_core(vbdev);
393 close_core_bdev(vbdev);
396 if (vbdev->cache.attached) {
397 detach_cache(vbdev);
398 close_cache_bdev(vbdev);
405 _vbdev_ocf_destruct_dirty(struct vbdev_ocf *vbdev)
407 if (vbdev->cache.attached) {
408 detach_cache(vbdev);
409 close_cache_bdev(vbdev);
412 if (vbdev->core.attached) {
413 detach_core(vbdev);
414 close_core_bdev(vbdev);
423 struct vbdev_ocf *vbdev = opaque;
425 if (vbdev->state.doing_finish) {
429 if (vbdev->state.starting && !vbdev->state.started) {
435 vbdev->state.doing_finish = true;
437 if (vbdev->state.started) {
438 spdk_io_device_unregister(vbdev, unregister_cb);
443 if (vbdev->state.doing_clean_delete) {
444 _vbdev_ocf_destruct_clean(vbdev);
446 _vbdev_ocf_destruct_dirty(vbdev);
454 vbdev_ocf_delete(struct vbdev_ocf *vbdev, void (*cb)(void *, int), void *cb_arg)
458 if (vbdev->state.started) {
459 spdk_bdev_unregister(&vbdev->exp_bdev, cb, cb_arg);
461 rc = vbdev_ocf_destruct(vbdev);
472 vbdev_ocf_delete_clean(struct vbdev_ocf *vbdev, void (*cb)(void *, int),
475 vbdev->state.doing_clean_delete = true;
477 return vbdev_ocf_delete(vbdev, cb, cb_arg);
481 /* If vbdev is online, return its object */
485 struct vbdev_ocf *vbdev;
492 TAILQ_FOREACH(vbdev, &g_ocf_vbdev_head, tailq) {
493 if (vbdev->name == NULL || vbdev->state.doing_finish) {
496 if (strcmp(vbdev->name, name) == 0) {
497 return vbdev;
503 /* Return matching base if parent vbdev is online */
507 struct vbdev_ocf *vbdev;
514 TAILQ_FOREACH(vbdev, &g_ocf_vbdev_head, tailq) {
515 if (vbdev->state.doing_finish) {
519 if (vbdev->cache.name && strcmp(vbdev->cache.name, name) == 0) {
520 return &vbdev->cache;
522 if (vbdev->core.name && strcmp(vbdev->core.name, name) == 0) {
523 return &vbdev->core;
533 struct vbdev_ocf *vbdev;
537 TAILQ_FOREACH(vbdev, &g_ocf_vbdev_head, tailq) {
538 if (!vbdev->state.doing_finish) {
539 fn(vbdev, ctx);
588 struct vbdev_ocf *vbdev = bdev_io->bdev->ctxt;
619 io = ocf_volume_new_io(ocf_core_get_front_volume(vbdev->ocf_core), qctx->queue, offset, len, dir, 0,
670 /* Called from bdev layer when an io to Cache vbdev is submitted */
699 struct vbdev_ocf *vbdev = opaque;
706 return spdk_bdev_io_type_supported(vbdev->core.bdev, io_type);
726 struct vbdev_ocf *vbdev = opaque;
728 spdk_json_write_named_string(w, "cache_device", vbdev->cache.name);
729 spdk_json_write_named_string(w, "core_device", vbdev->core.name);
732 ocf_get_cache_modename(ocf_cache_get_mode(vbdev->ocf_cache)));
734 ocf_get_cache_line_size(vbdev->ocf_cache));
736 vbdev->cfg.cache.metadata_volatile);
744 struct vbdev_ocf *vbdev = bdev->ctxt;
751 spdk_json_write_named_string(w, "name", vbdev->name);
753 ocf_get_cache_modename(ocf_cache_get_mode(vbdev->ocf_cache)));
755 ocf_get_cache_line_size(vbdev->ocf_cache));
756 spdk_json_write_named_string(w, "cache_bdev_name", vbdev->cache.name);
757 spdk_json_write_named_string(w, "core_bdev_name", vbdev->core.name);
763 /* Cache vbdev function table
826 /* Called on cache vbdev creation at every thread
831 struct vbdev_ocf *vbdev = io_device;
835 rc = vbdev_ocf_queue_create(vbdev->ocf_cache, &qctx->queue, &queue_ops);
842 qctx->vbdev = vbdev;
843 qctx->cache_ch = spdk_bdev_get_io_channel(vbdev->cache.desc);
844 qctx->core_ch = spdk_bdev_get_io_channel(vbdev->core.desc);
916 vbdev_ocf_mngt_exit(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *rollback_path, int rc)
918 vbdev->state.starting = false;
919 vbdev_ocf_mngt_stop(vbdev, rollback_path, rc);
924 finish_register(struct vbdev_ocf *vbdev)
930 vbdev->exp_bdev.blocklen = vbdev->core.bdev->blocklen;
931 vbdev->exp_bdev.write_cache = vbdev->core.bdev->write_cache;
932 vbdev->exp_bdev.required_alignment = vbdev->core.bdev->required_alignment;
934 vbdev->exp_bdev.name = vbdev->name;
935 vbdev->exp_bdev.product_name = "SPDK OCF";
937 vbdev->exp_bdev.blockcnt = vbdev->core.bdev->blockcnt;
938 vbdev->exp_bdev.ctxt = vbdev;
939 vbdev->exp_bdev.fn_table = &cache_dev_fn_table;
940 vbdev->exp_bdev.module = &ocf_if;
944 result = spdk_uuid_generate_sha1(&vbdev->exp_bdev.uuid, &ns_uuid,
945 (const char *)&vbdev->core.bdev->uuid, sizeof(struct spdk_uuid));
948 vbdev_ocf_mngt_exit(vbdev, unregister_path_dirty, result);
952 /* Finally register vbdev in SPDK */
953 spdk_io_device_register(vbdev, io_device_create_cb, io_device_destroy_cb,
954 sizeof(struct vbdev_ocf_qctx), vbdev->name);
955 result = spdk_bdev_register(&vbdev->exp_bdev);
958 vbdev->name);
959 vbdev_ocf_mngt_exit(vbdev, unregister_path_dirty, result);
962 vbdev->state.started = true;
965 vbdev_ocf_mngt_continue(vbdev, result);
971 struct vbdev_ocf *vbdev = priv;
977 "starting rollback\n", error, vbdev->name);
978 vbdev_ocf_mngt_exit(vbdev, unregister_path_dirty, error);
981 vbdev->ocf_core = core;
984 vbdev_ocf_mngt_continue(vbdev, error);
991 struct vbdev_ocf *vbdev = (struct vbdev_ocf *)priv;
995 "starting rollback\n", error, vbdev->name);
996 vbdev_ocf_mngt_exit(vbdev, unregister_path_dirty, error);
998 ocf_mngt_cache_add_core(vbdev->ocf_cache, &vbdev->cfg.core, add_core_cmpl, vbdev);
1003 add_core(struct vbdev_ocf *vbdev)
1005 ocf_mngt_cache_lock(vbdev->ocf_cache, add_core_cache_lock_cmpl, vbdev);
1011 struct vbdev_ocf *vbdev = priv;
1019 error, vbdev->name);
1022 volume_size = vbdev->cache.bdev->blockcnt * vbdev->cache.bdev->blocklen;
1029 volume_size, vbdev->cfg.cache.cache_line_size, mem_needed);
1032 vbdev_ocf_mngt_exit(vbdev, unregister_path_dirty, error);
1036 vbdev_ocf_mngt_continue(vbdev, error);
1040 create_management_queue(struct vbdev_ocf *vbdev)
1045 rc = vbdev_ocf_queue_create_mngt(vbdev->ocf_cache,
1046 &vbdev->cache_ctx->mngt_queue, &mngt_queue_ops);
1052 mngt_poller = SPDK_POLLER_REGISTER(mngt_queue_poll, vbdev->cache_ctx->mngt_queue, 100);
1058 ocf_queue_set_priv(vbdev->cache_ctx->mngt_queue, mngt_poller);
1065 start_cache(struct vbdev_ocf *vbdev)
1068 uint32_t cache_block_size = vbdev->cache.bdev->blocklen;
1069 uint32_t core_block_size = vbdev->core.bdev->blocklen;
1072 if (is_ocf_cache_running(vbdev)) {
1073 vbdev_ocf_mngt_stop(vbdev, NULL, -EALREADY);
1080 vbdev_ocf_mngt_exit(vbdev, unregister_path_dirty, -EINVAL);
1084 existing = get_other_cache_instance(vbdev);
1087 vbdev->name, vbdev->cache.name);
1088 vbdev->ocf_cache = existing;
1089 ocf_mngt_cache_get(vbdev->ocf_cache);
1090 vbdev->cache_ctx = ocf_cache_get_priv(existing);
1091 vbdev_ocf_cache_ctx_get(vbdev->cache_ctx);
1092 vbdev_ocf_mngt_continue(vbdev, 0);
1096 vbdev->cache_ctx = calloc(1, sizeof(struct vbdev_ocf_cache_ctx));
1097 if (vbdev->cache_ctx == NULL) {
1098 vbdev_ocf_mngt_exit(vbdev, unregister_path_dirty, -ENOMEM);
1102 vbdev_ocf_cache_ctx_get(vbdev->cache_ctx);
1104 rc = ocf_mngt_cache_start(vbdev_ocf_ctx, &vbdev->ocf_cache, &vbdev->cfg.cache, NULL);
1106 SPDK_ERRLOG("Could not start cache %s: %d\n", vbdev->name, rc);
1107 vbdev_ocf_mngt_exit(vbdev, unregister_path_dirty, rc);
1110 ocf_mngt_cache_get(vbdev->ocf_cache);
1112 ocf_cache_set_priv(vbdev->ocf_cache, vbdev->cache_ctx);
1114 rc = create_management_queue(vbdev);
1117 vbdev_ocf_mngt_exit(vbdev, unregister_path_dirty, rc);
1121 if (vbdev->cfg.loadq) {
1122 ocf_mngt_cache_load(vbdev->ocf_cache, &vbdev->cfg.attach, start_cache_cmpl, vbdev);
1124 ocf_mngt_cache_attach(vbdev->ocf_cache, &vbdev->cfg.attach, start_cache_cmpl, vbdev);
1138 register_vbdev(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_callback cb, void *cb_arg)
1142 if (!(vbdev->core.attached && vbdev->cache.attached) || vbdev->state.started) {
1143 cb(-EPERM, vbdev, cb_arg);
1147 vbdev->state.starting = true;
1148 rc = vbdev_ocf_mngt_start(vbdev, register_path, cb, cb_arg);
1150 cb(rc, vbdev, cb_arg);
1157 init_vbdev_config(struct vbdev_ocf *vbdev)
1159 struct vbdev_ocf_config *cfg = &vbdev->cfg;
1170 ret = snprintf(cfg->cache.name, sizeof(cfg->cache.name), "%s", vbdev->name);
1174 ret = snprintf(cfg->core.name, sizeof(cfg->core.name), "%s", vbdev->core.name);
1183 vbdev->cfg.cache.locked = true;
1187 if (vbdev->cfg.loadq) {
1191 vbdev->cfg.core.try_add = true;
1199 * Core UUID is a triple of (core name, vbdev name, cache name)
1206 uuid.size = strlen(vbdev->cache.name) + 1;
1207 uuid.data = vbdev->cache.name;
1214 snprintf(vbdev->uuid, VBDEV_OCF_MD_MAX_LEN, "%s %s %s",
1215 vbdev->core.name, vbdev->name, vbdev->cache.name);
1216 cfg->core.uuid.size = strlen(vbdev->uuid) + 1;
1217 cfg->core.uuid.data = vbdev->uuid;
1218 vbdev->uuid[strlen(vbdev->core.name)] = 0;
1219 vbdev->uuid[strlen(vbdev->core.name) + 1 + strlen(vbdev->name)] = 0;
1224 /* Allocate vbdev structure object and add it to the global list */
1233 struct vbdev_ocf *vbdev;
1241 vbdev = calloc(1, sizeof(*vbdev));
1242 if (!vbdev) {
1246 vbdev->name = strdup(vbdev_name);
1247 if (!vbdev->name) {
1251 vbdev->cache.name = strdup(cache_name);
1252 if (!vbdev->cache.name) {
1256 vbdev->core.name = strdup(core_name);
1257 if (!vbdev->core.name) {
1261 vbdev->cache.parent = vbdev;
1262 vbdev->core.parent = vbdev;
1263 vbdev->cache.is_cache = true;
1264 vbdev->core.is_cache = false;
1265 vbdev->cfg.loadq = loadq;
1267 rc = init_vbdev_config(vbdev);
1269 SPDK_ERRLOG("Fail to init vbdev config\n");
1275 vbdev->cfg.cache.cache_mode
1282 if (vbdev->cfg.cache.cache_mode < 0) {
1296 vbdev->cfg.attach.cache_line_size = set_cache_line_size;
1297 vbdev->cfg.cache.cache_line_size = set_cache_line_size;
1299 TAILQ_INSERT_TAIL(&g_ocf_vbdev_head, vbdev, tailq);
1305 free_vbdev(vbdev);
1337 struct vbdev_ocf *vbdev;
1339 while ((vbdev = TAILQ_FIRST(&g_ocf_vbdev_head))) {
1340 TAILQ_REMOVE(&g_ocf_vbdev_head, vbdev, tailq);
1341 free_vbdev(vbdev);
1349 * We will unregister cache vbdev here
1354 struct vbdev_ocf *vbdev;
1367 TAILQ_FOREACH(vbdev, &g_ocf_vbdev_head, tailq) {
1368 if (vbdev->state.doing_finish) {
1371 if (strcmp(base->name, vbdev->cache.name) == 0) {
1374 vbdev->name, base->name);
1375 vbdev_ocf_delete(vbdev, NULL, NULL);
1406 /* If base cache bdev was already opened by other vbdev,
1449 attach_base_bdevs(struct vbdev_ocf *vbdev,
1456 vbdev->cache.bdev = cache_bdev;
1457 rc |= attach_base(&vbdev->cache);
1461 vbdev->core.bdev = core_bdev;
1462 rc |= attach_base(&vbdev->core);
1468 /* Init and then start vbdev if all base devices are present */
1482 struct vbdev_ocf *vbdev;
1490 vbdev = vbdev_ocf_get_by_name(vbdev_name);
1491 if (vbdev == NULL) {
1498 vbdev->name, cache_name);
1502 vbdev->name, core_name);
1505 rc = attach_base_bdevs(vbdev, cache_bdev, core_bdev);
1507 cb(rc, vbdev, cb_arg);
1512 register_vbdev(vbdev, cb, cb_arg);
1514 cb(0, vbdev, cb_arg);
1520 vbdev_ocf_set_cache_mode(struct vbdev_ocf *vbdev,
1529 cache = vbdev->ocf_cache;
1534 cb(rc, vbdev, cb_arg);
1540 cb(rc, vbdev, cb_arg);
1545 vbdev_ocf_set_seqcutoff(struct vbdev_ocf *vbdev, const char *policy_name, uint32_t threshold,
1552 cache = vbdev->ocf_cache;
1590 * If that device named as one of base bdevs of OCF vbdev,
1596 struct vbdev_ocf *vbdev;
1598 TAILQ_FOREACH(vbdev, &g_ocf_vbdev_head, tailq) {
1599 if (vbdev->state.doing_finish) {
1603 if (!strcmp(bdev_name, vbdev->cache.name)) {
1604 attach_base_bdevs(vbdev, bdev, NULL);
1607 if (!strcmp(bdev_name, vbdev->core.name)) {
1608 attach_base_bdevs(vbdev, NULL, bdev);
1692 * If vbdev has all of its base devices it starts asynchronously here
1699 struct vbdev_ocf *vbdev;
1706 TAILQ_FOREACH(vbdev, &g_ocf_vbdev_head, tailq) {
1707 if (vbdev->state.doing_finish || vbdev->state.started) {
1711 if (!strcmp(bdev_name, vbdev->cache.name)) {
1713 register_vbdev(vbdev, examine_done, bdev);
1717 if (!strcmp(bdev_name, vbdev->core.name)) {
1719 register_vbdev(vbdev, examine_done, bdev);
1784 * Does not relate to vbdev instances */