Commit d3bfd244 authored by Jim Harris's avatar Jim Harris Committed by Darek Stojaczyk
Browse files

bdev/aio: unregister io_device correctly



The io_device associated with the aio bdev was only
getting unregistered when the aio bdev was explicitly
deleted - not in the implicit deletion path at shutdown.

Move the io_device_unregister into the destruct_cb -
this makes sure the io_device is always unregistered, whether
the bdev is getting unregistered via an explicit RPC or
implicitly in the shutdown path.

Fixes #618.

Signed-off-by: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: I44b77f5c38339f4cf97b02c0ee4002bf5fcc9998

Reviewed-on: https://review.gerrithub.io/c/442119


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarZiye Yang <optimistyzy@gmail.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
parent a3777e3f
Loading
Loading
Loading
Loading
+19 −22
Original line number Diff line number Diff line
@@ -201,6 +201,8 @@ bdev_aio_destruct(void *ctx)
	if (rc < 0) {
		SPDK_ERRLOG("bdev_aio_close() failed\n");
	}
	spdk_io_device_unregister(fdisk, NULL);
	aio_free_disk(fdisk);
	return rc;
}

@@ -626,44 +628,39 @@ 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);
}
struct delete_aio_disk_ctx {
	spdk_delete_aio_complete cb_fn;
	void *cb_arg;
};

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;
	}
	struct delete_aio_disk_ctx *ctx = arg;

	spdk_io_device_unregister(fdisk, aio_io_device_unregister_cb);
	ctx->cb_fn(ctx->cb_arg, bdeverrno);
	free(ctx);
}

void
delete_aio_disk(struct spdk_bdev *bdev, spdk_delete_aio_complete cb_fn, void *cb_arg)
{
	struct file_disk *fdisk;
	struct delete_aio_disk_ctx *ctx;

	if (!bdev || bdev->module != &aio_if) {
		cb_fn(cb_arg, -ENODEV);
		return;
	}

	fdisk = bdev->ctxt;
	fdisk->delete_cb_fn = cb_fn;
	fdisk->delete_cb_arg = cb_arg;
	spdk_bdev_unregister(bdev, aio_bdev_unregister_cb, fdisk);
	ctx = calloc(1, sizeof(*ctx));
	if (ctx == NULL) {
		cb_fn(cb_arg, -ENOMEM);
		return;
	}

	ctx->cb_fn = cb_fn;
	ctx->cb_arg = cb_arg;
	spdk_bdev_unregister(bdev, aio_bdev_unregister_cb, ctx);
}

static int
+0 −2
Original line number Diff line number Diff line
@@ -69,8 +69,6 @@ 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;
};

struct spdk_bdev *create_aio_disk(const char *name, const char *filename, uint32_t block_size);