Commit cfc9dcdf authored by Philipp Riederer's avatar Philipp Riederer Committed by Tomasz Zawadzki
Browse files

bdev/rbd: react to size change on rbd



Change-Id: I6d69c1b2badc1029b4f9e48c83bdffef595c3c44
Signed-Off-By: default avatarPhilipp Riederer <priederer@genesiscloud.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18945


Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent 90562600
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -58,6 +58,8 @@ struct bdev_rbd {
	TAILQ_ENTRY(bdev_rbd) tailq;
	struct spdk_poller *reset_timer;
	struct spdk_bdev_io *reset_bdev_io;

	uint64_t rbd_watch_handle;
};

struct bdev_rbd_io_channel {
@@ -88,6 +90,33 @@ static STAILQ_HEAD(, bdev_rbd_cluster) g_map_bdev_rbd_cluster = STAILQ_HEAD_INIT
			g_map_bdev_rbd_cluster);
static pthread_mutex_t g_map_bdev_rbd_cluster_mutex = PTHREAD_MUTEX_INITIALIZER;

static struct spdk_io_channel *bdev_rbd_get_io_channel(void *ctx);

static void
_rbd_update_callback(void *arg)
{
	struct bdev_rbd *rbd = arg;
	uint64_t current_size_in_bytes = 0;
	int rc;

	rc = rbd_get_size(rbd->image, &current_size_in_bytes);
	if (rc < 0) {
		SPDK_ERRLOG("Failed getting size %d\n", rc);
		return;
	}

	rc = spdk_bdev_notify_blockcnt_change(&rbd->disk, current_size_in_bytes / rbd->disk.blocklen);
	if (rc != 0) {
		SPDK_ERRLOG("failed to notify block cnt change.\n");
	}
}

static void
rbd_update_callback(void *arg)
{
	spdk_thread_send_msg(spdk_thread_get_app_thread(), _rbd_update_callback, arg);
}

static void
bdev_rbd_cluster_free(struct bdev_rbd_cluster *entry)
{
@@ -155,6 +184,7 @@ bdev_rbd_free(struct bdev_rbd *rbd)
	}

	if (rbd->image) {
		rbd_update_unwatch(rbd->image, rbd->rbd_watch_handle);
		rbd_flush(rbd->image);
		rbd_close(rbd->image);
	}
@@ -402,6 +432,11 @@ bdev_rbd_init_context(void *arg)
		return NULL;
	}

	rc = rbd_update_watch(rbd->image, &rbd->rbd_watch_handle, rbd_update_callback, (void *)rbd);
	if (rc < 0) {
		SPDK_ERRLOG("Failed to set up watch %d\n", rc);
	}

	rc = rbd_stat(rbd->image, &rbd->info, sizeof(rbd->info));
	if (rc < 0) {
		SPDK_ERRLOG("Failed to stat specified rbd device\n");