Commit b40813dd authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe
Browse files

nbd: don't update block size after device is started



Mounted NBD device can be resized, one use case is rbd-nbd.

Fix the issue by setting up default block size, then not touch it
in nbd_size_update() any more. This kind of usage is aligned with loop
which has same use case too.

Cc: stable@vger.kernel.org
Fixes: c8a83a6b ("nbd: Use set_blocksize() to set device blocksize")
Reported-by: default avatarlining <lining2020x@163.com>
Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Cc: Josef Bacik <josef@toxicpanda.com>
Cc: Jan Kara <jack@suse.cz>
Tested-by: default avatarlining <lining2020x@163.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 4977d121
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -296,7 +296,7 @@ static void nbd_size_clear(struct nbd_device *nbd)
	}
}

static void nbd_size_update(struct nbd_device *nbd)
static void nbd_size_update(struct nbd_device *nbd, bool start)
{
	struct nbd_config *config = nbd->config;
	struct block_device *bdev = bdget_disk(nbd->disk, 0);
@@ -313,6 +313,7 @@ static void nbd_size_update(struct nbd_device *nbd)
	if (bdev) {
		if (bdev->bd_disk) {
			bd_set_nr_sectors(bdev, nr_sectors);
			if (start)
				set_blocksize(bdev, config->blksize);
		} else
			set_bit(GD_NEED_PART_SCAN, &nbd->disk->state);
@@ -328,7 +329,7 @@ static void nbd_size_set(struct nbd_device *nbd, loff_t blocksize,
	config->blksize = blocksize;
	config->bytesize = blocksize * nr_blocks;
	if (nbd->task_recv != NULL)
		nbd_size_update(nbd);
		nbd_size_update(nbd, false);
}

static void nbd_complete_rq(struct request *req)
@@ -1308,7 +1309,7 @@ static int nbd_start_device(struct nbd_device *nbd)
		args->index = i;
		queue_work(nbd->recv_workq, &args->work);
	}
	nbd_size_update(nbd);
	nbd_size_update(nbd, true);
	return error;
}