diff --git a/lib/bdev/raid/bdev_raid.c b/lib/bdev/raid/bdev_raid.c index c35f9dd4a..b0c6fd61c 100644 --- a/lib/bdev/raid/bdev_raid.c +++ b/lib/bdev/raid/bdev_raid.c @@ -67,7 +67,8 @@ struct raid_offline_tailq g_raid_bdev_offline_list; static void raid_bdev_examine(struct spdk_bdev *bdev); static int raid_bdev_init(void); static void raid_bdev_waitq_io_process(void *ctx); -static void raid_bdev_deconfigure(struct raid_bdev *raid_bdev); +static void raid_bdev_deconfigure(struct raid_bdev *raid_bdev, + raid_bdev_destruct_cb cb_fn, void *cb_arg); static void raid_bdev_remove_base_bdev(void *ctx); /* @@ -1716,13 +1717,19 @@ raid_bdev_configure(struct raid_bdev *raid_bdev) * in configuring list * params: * raid_bdev - pointer to raid bdev + * cb_fn - callback function + * cb_arg - argument to callback function * returns: * none */ static void -raid_bdev_deconfigure(struct raid_bdev *raid_bdev) +raid_bdev_deconfigure(struct raid_bdev *raid_bdev, raid_bdev_destruct_cb cb_fn, + void *cb_arg) { if (raid_bdev->state != RAID_BDEV_STATE_ONLINE) { + if (cb_fn) { + cb_fn(cb_arg, 0); + } return; } @@ -1733,7 +1740,7 @@ raid_bdev_deconfigure(struct raid_bdev *raid_bdev) TAILQ_INSERT_TAIL(&g_raid_bdev_offline_list, raid_bdev, state_link); SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid bdev state chaning from online to offline\n"); - spdk_bdev_unregister(&raid_bdev->bdev, NULL, NULL); + spdk_bdev_unregister(&raid_bdev->bdev, cb_fn, cb_arg); } /* @@ -1810,7 +1817,7 @@ raid_bdev_remove_base_bdev(void *ctx) } } - raid_bdev_deconfigure(raid_bdev); + raid_bdev_deconfigure(raid_bdev, NULL, NULL); } /* @@ -1819,9 +1826,12 @@ raid_bdev_remove_base_bdev(void *ctx) * doesn't exist. * params: * raid_cfg - pointer to raid bdev config. + * cb_fn - callback function + * cb_ctx - argument to callback function */ void -raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg) +raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg, + raid_bdev_destruct_cb cb_fn, void *cb_arg) { struct raid_bdev *raid_bdev; struct raid_base_bdev_info *info; @@ -1832,6 +1842,9 @@ raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg) raid_bdev = raid_cfg->raid_bdev; if (raid_bdev == NULL) { SPDK_DEBUGLOG(SPDK_LOG_BDEV_RAID, "raid bdev %s doesn't exist now\n", raid_cfg->name); + if (cb_fn) { + cb_fn(cb_arg, 0); + } return; } @@ -1855,12 +1868,15 @@ raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg) if (raid_bdev->num_base_bdevs_discovered == 0) { /* There is no base bdev for this raid, so free the raid device. */ raid_bdev_cleanup(raid_bdev); + if (cb_fn) { + cb_fn(cb_arg, 0); + } return; } } } - raid_bdev_deconfigure(raid_bdev); + raid_bdev_deconfigure(raid_bdev, cb_fn, cb_arg); } /* diff --git a/lib/bdev/raid/bdev_raid.h b/lib/bdev/raid/bdev_raid.h index cabde2208..36b396ac4 100644 --- a/lib/bdev/raid/bdev_raid.h +++ b/lib/bdev/raid/bdev_raid.h @@ -214,9 +214,12 @@ extern struct raid_all_tailq g_raid_bdev_list; extern struct raid_offline_tailq g_raid_bdev_offline_list; extern struct raid_config g_raid_config; +typedef void (*raid_bdev_destruct_cb)(void *cb_ctx, int rc); + int raid_bdev_create(struct raid_bdev_config *raid_cfg); int raid_bdev_add_base_devices(struct raid_bdev_config *raid_cfg); -void raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg); +void raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg, + raid_bdev_destruct_cb cb_fn, void *cb_ctx); int raid_bdev_config_add(const char *raid_name, int strip_size, int num_base_bdevs, int raid_level, struct raid_bdev_config **_raid_cfg); int raid_bdev_config_add_base_bdev(struct raid_bdev_config *raid_cfg, diff --git a/lib/bdev/raid/bdev_raid_rpc.c b/lib/bdev/raid/bdev_raid_rpc.c index 5de2a2529..e3b516c3e 100644 --- a/lib/bdev/raid/bdev_raid_rpc.c +++ b/lib/bdev/raid/bdev_raid_rpc.c @@ -399,7 +399,7 @@ spdk_rpc_destroy_raid_bdev(struct spdk_jsonrpc_request *request, const struct sp } /* Remove all the base bdevs from this raid bdev before destroying the raid bdev */ - raid_bdev_remove_base_devices(raid_cfg); + raid_bdev_remove_base_devices(raid_cfg, NULL, NULL); raid_bdev_config_destroy(raid_cfg); diff --git a/test/unit/lib/bdev/bdev_raid.c/bdev_raid_ut.c b/test/unit/lib/bdev/bdev_raid.c/bdev_raid_ut.c index b95582f84..f9889e602 100644 --- a/test/unit/lib/bdev/bdev_raid.c/bdev_raid_ut.c +++ b/test/unit/lib/bdev/bdev_raid.c/bdev_raid_ut.c @@ -324,6 +324,10 @@ void spdk_bdev_unregister(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, void *cb_arg) { bdev->fn_table->destruct(bdev->ctxt); + + if (cb_fn) { + cb_fn(cb_arg, 0); + } } int