diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 53a887777..5a1bb0acf 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -6147,6 +6147,8 @@ bdev_lock_lba_range_get_channel(struct spdk_io_channel_iter *i) static void bdev_lock_lba_range_ctx(struct spdk_bdev *bdev, struct locked_lba_range_ctx *ctx) { + assert(spdk_get_thread() == ctx->range.owner_ch->channel->thread); + /* We will add a copy of this range to each channel now. */ spdk_for_each_channel(__bdev_to_io_dev(bdev), bdev_lock_lba_range_get_channel, ctx, bdev_lock_lba_range_cb); @@ -6207,6 +6209,14 @@ bdev_lock_lba_range(struct spdk_bdev_desc *desc, struct spdk_io_channel *_ch, return 0; } +static void +bdev_lock_lba_range_ctx_msg(void *_ctx) +{ + struct locked_lba_range_ctx *ctx = _ctx; + + bdev_lock_lba_range_ctx(ctx->bdev, ctx); +} + static void bdev_unlock_lba_range_cb(struct spdk_io_channel_iter *i, int status) { @@ -6228,7 +6238,8 @@ bdev_unlock_lba_range_cb(struct spdk_io_channel_iter *i, int status) TAILQ_REMOVE(&bdev->internal.pending_locked_ranges, range, tailq); pending_ctx = SPDK_CONTAINEROF(range, struct locked_lba_range_ctx, range); TAILQ_INSERT_TAIL(&bdev->internal.locked_ranges, range, tailq); - bdev_lock_lba_range_ctx(bdev, pending_ctx); + spdk_thread_send_msg(pending_ctx->range.owner_ch->channel->thread, + bdev_lock_lba_range_ctx_msg, pending_ctx); } } pthread_mutex_unlock(&bdev->internal.mutex);