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

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
...@@ -296,7 +296,7 @@ static void nbd_size_clear(struct nbd_device *nbd) ...@@ -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 nbd_config *config = nbd->config;
struct block_device *bdev = bdget_disk(nbd->disk, 0); struct block_device *bdev = bdget_disk(nbd->disk, 0);
...@@ -313,7 +313,8 @@ static void nbd_size_update(struct nbd_device *nbd) ...@@ -313,7 +313,8 @@ static void nbd_size_update(struct nbd_device *nbd)
if (bdev) { if (bdev) {
if (bdev->bd_disk) { if (bdev->bd_disk) {
bd_set_nr_sectors(bdev, nr_sectors); bd_set_nr_sectors(bdev, nr_sectors);
set_blocksize(bdev, config->blksize); if (start)
set_blocksize(bdev, config->blksize);
} else } else
set_bit(GD_NEED_PART_SCAN, &nbd->disk->state); set_bit(GD_NEED_PART_SCAN, &nbd->disk->state);
bdput(bdev); bdput(bdev);
...@@ -328,7 +329,7 @@ static void nbd_size_set(struct nbd_device *nbd, loff_t blocksize, ...@@ -328,7 +329,7 @@ static void nbd_size_set(struct nbd_device *nbd, loff_t blocksize,
config->blksize = blocksize; config->blksize = blocksize;
config->bytesize = blocksize * nr_blocks; config->bytesize = blocksize * nr_blocks;
if (nbd->task_recv != NULL) if (nbd->task_recv != NULL)
nbd_size_update(nbd); nbd_size_update(nbd, false);
} }
static void nbd_complete_rq(struct request *req) static void nbd_complete_rq(struct request *req)
...@@ -1308,7 +1309,7 @@ static int nbd_start_device(struct nbd_device *nbd) ...@@ -1308,7 +1309,7 @@ static int nbd_start_device(struct nbd_device *nbd)
args->index = i; args->index = i;
queue_work(nbd->recv_workq, &args->work); queue_work(nbd->recv_workq, &args->work);
} }
nbd_size_update(nbd); nbd_size_update(nbd, true);
return error; return error;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment