Commit bb684fe7 authored by Jim Harris's avatar Jim Harris
Browse files

bdev/aio: unregister io_device when aio bdev is deleted



Signed-off-by: default avatarJim 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: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 703d1f80
Loading
Loading
Loading
Loading
+30 −2
Original line number Diff line number Diff line
@@ -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
+4 −2
Original line number Diff line number Diff line
@@ -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);