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: c8a83a6b54
("nbd: Use set_blocksize() to set device blocksize")
Reported-by: lining <lining2020x@163.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Cc: Josef Bacik <josef@toxicpanda.com>
Cc: Jan Kara <jack@suse.cz>
Tested-by: lining <lining2020x@163.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
4977d121bc
commit
b40813ddcd
@ -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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user