bdev/aio: unregister io_device when aio bdev is deleted

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: I2ec7387292854f93cee00edc15e9dfeb4019b8b0
Reviewed-on: https://review.gerrithub.io/420443
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Jim Harris 2018-07-25 10:56:43 -07:00
parent 703d1f80a8
commit bb684fe75e
2 changed files with 34 additions and 4 deletions

View File

@ -192,7 +192,6 @@ bdev_aio_destruct(void *ctx)
if (rc < 0) {
SPDK_ERRLOG("bdev_aio_close() failed\n");
}
aio_free_disk(fdisk);
return rc;
}
@ -546,15 +545,44 @@ error_return:
return NULL;
}
static void
aio_io_device_unregister_cb(void *io_device)
{
struct file_disk *fdisk = io_device;
spdk_delete_aio_complete cb_fn = fdisk->delete_cb_fn;
void *cb_arg = fdisk->delete_cb_arg;
aio_free_disk(fdisk);
cb_fn(cb_arg, 0);
}
static void
aio_bdev_unregister_cb(void *arg, int bdeverrno)
{
struct file_disk *fdisk = arg;
if (bdeverrno != 0) {
fdisk->delete_cb_fn(fdisk->delete_cb_arg, bdeverrno);
return;
}
spdk_io_device_unregister(fdisk, aio_io_device_unregister_cb);
}
void
delete_aio_disk(struct spdk_bdev *bdev, spdk_delete_aio_complete cb_fn, void *cb_arg)
{
struct file_disk *fdisk;
if (!bdev || bdev->module != &aio_if) {
cb_fn(cb_arg, -ENODEV);
return;
}
spdk_bdev_unregister(bdev, cb_fn, cb_arg);
fdisk = bdev->ctxt;
fdisk->delete_cb_fn = cb_fn;
fdisk->delete_cb_arg = cb_arg;
spdk_bdev_unregister(bdev, aio_bdev_unregister_cb, fdisk);
}
static int

View File

@ -55,6 +55,8 @@ struct bdev_aio_io_channel {
uint64_t io_inflight;
};
typedef void (*spdk_delete_aio_complete)(void *cb_arg, int bdeverrno);
struct file_disk {
struct bdev_aio_task *reset_task;
struct spdk_poller *reset_retry_timer;
@ -63,10 +65,10 @@ struct file_disk {
int fd;
TAILQ_ENTRY(file_disk) link;
bool block_size_override;
spdk_delete_aio_complete delete_cb_fn;
void *delete_cb_arg;
};
typedef void (*spdk_delete_aio_complete)(void *cb_arg, int bdeverrno);
struct spdk_bdev *create_aio_disk(const char *name, const char *filename, uint32_t block_size);
void delete_aio_disk(struct spdk_bdev *bdev, spdk_delete_aio_complete cb_fn, void *cb_arg);