Commit 0037685d authored by Tomasz Zawadzki's avatar Tomasz Zawadzki Committed by Tomasz Zawadzki
Browse files

lib/bdev: add bdev_resize notification



Sparsely used lib notify can be used to catch events of importance
for the caller.

One example usage would be to catch resize of bdevs from a remote like
NVMe-oF.

For right now this will be used in bdev_nvme tests for namespace
add/remove. In some cases fixed later in the series, frequent handling
of ns changes could cause a nsdata to be zeroed out for a namespace
that was inactive. Yet this triggered a bdev resize event to 0 size.

Change-Id: Iadbe4eaa0fdd9c18c84d9fb68de0ba7960d56ec8
Signed-off-by: default avatarTomasz Zawadzki <tomasz.zawadzki@nutanix.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26474


Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarJacek Kalwas <jacek.kalwas@nutanix.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
parent d04c505f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -2367,6 +2367,7 @@ spdk_bdev_initialize(spdk_bdev_init_cb cb_fn, void *cb_arg)

	spdk_notify_type_register("bdev_register");
	spdk_notify_type_register("bdev_unregister");
	spdk_notify_type_register("bdev_resize");

	snprintf(mempool_name, sizeof(mempool_name), "bdev_io_%d", getpid());

@@ -5598,6 +5599,7 @@ spdk_bdev_notify_blockcnt_change(struct spdk_bdev *bdev, uint64_t size)
	    bdev->blockcnt > size) {
		ret = -EBUSY;
	} else {
		spdk_notify_send("bdev_resize", spdk_bdev_get_name(bdev));
		bdev->blockcnt = size;
		TAILQ_FOREACH(desc, &bdev->internal.open_descs, link) {
			event_notify(desc, _resize_notify);
+1 −1
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ function tgt_check_notification_types() {
	timing_enter "${FUNCNAME[0]}"

	local ret=0
	local enabled_types=("bdev_register" "bdev_unregister")
	local enabled_types=("bdev_register" "bdev_unregister" "bdev_resize")
	if [[ $CONFIG_FSDEV == y ]]; then
		enabled_types+=("fsdev_register" "fsdev_unregister")
	fi
+14 −0
Original line number Diff line number Diff line
@@ -11,6 +11,15 @@ rpc_py="$rootdir/scripts/rpc.py"
tgt_sock="/var/tmp/tgt.sock"
tgt_rpc="$rpc_py -s $tgt_sock"

function get_resize_count() {
	# Always use id zero to get notifications from the begining of time
	local notify_id=0

	event_count="$($rpc_py notify_get_notifications -i $notify_id | jq '. | map(select(.type == "bdev_resize")) | length')"

	echo $event_count
}

add_remove() {
	local nsid=$1 thread=$2
	local current
@@ -23,6 +32,11 @@ add_remove() {
		# Check if intiator is still alive, otherwise we'd wait until all threads finish
		kill -s 0 "$spdk_app_pid"
	done

	# No resizes are expected here. Should catch cases where nsdata
	# was zeroed out for inactive namespace, that incorrectly was assigned
	# to bdev_nvme.
	[[ "$(get_resize_count)" == 0 ]]
}

nvmftestinit