Applied.
On 2020/11/18 9:25, Xie XiuQi wrote:
Reviewed-by: Xie XiuQi xiexiuqi@huawei.com
On 2020/11/18 9:04, lining wrote:
From: Ming Lei ming.lei@redhat.com
mainline inclusion from mainline-v5.10-rc2 commit b40813ddcd6b category: bugfix bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1891363 CVE: NA backport: openEuler-20.09
Here is the testcase:
- rbd create --size 2G rbdpool/foo
- rbd-nbd map rbdpool/foo
- mkfs.ext4 /dev/nbd0
- mount /dev/nbd0 /mnt
- rbd resize --size 4G rbdpool/foo
- ls /mnt
ls will stuck here forever.
[ Upstream commit b40813ddcd6bf9f01d020804e4cb8febc480b9e4 ]
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: c8a83a6b54d0 ("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 Signed-off-by: Sasha Levin sashal@kernel.org Signed-off-by: lining lining_yewu@cmss.chinamobile.com
drivers/block/nbd.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index cdf62fb94fb15..9a0fb2d52a76c 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -268,7 +268,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); @@ -279,7 +279,8 @@ static void nbd_size_update(struct nbd_device *nbd) if (bdev) { if (bdev->bd_disk) { bd_set_size(bdev, config->bytesize);
set_blocksize(bdev, config->blksize);
if (start)
} else bdev->bd_invalidated = 1; bdput(bdev);set_blocksize(bdev, config->blksize);
@@ -294,7 +295,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)
@@ -1231,7 +1232,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; }
Kernel mailing list -- kernel@openeuler.org To unsubscribe send an email to kernel-leave@openeuler.org