]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob
ad26275a6e69259e116b35d2ae6898db0ed66275
[thirdparty/kernel/stable-queue.git] /
1 From 337382e09a38ac79003ca41d5d7c36aaf252ad7b Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Wed, 28 Oct 2020 15:24:34 +0800
4 Subject: nbd: don't update block size after device is started
5
6 From: Ming Lei <ming.lei@redhat.com>
7
8 [ Upstream commit b40813ddcd6bf9f01d020804e4cb8febc480b9e4 ]
9
10 Mounted NBD device can be resized, one use case is rbd-nbd.
11
12 Fix the issue by setting up default block size, then not touch it
13 in nbd_size_update() any more. This kind of usage is aligned with loop
14 which has same use case too.
15
16 Cc: stable@vger.kernel.org
17 Fixes: c8a83a6b54d0 ("nbd: Use set_blocksize() to set device blocksize")
18 Reported-by: lining <lining2020x@163.com>
19 Signed-off-by: Ming Lei <ming.lei@redhat.com>
20 Cc: Josef Bacik <josef@toxicpanda.com>
21 Cc: Jan Kara <jack@suse.cz>
22 Tested-by: lining <lining2020x@163.com>
23 Signed-off-by: Jens Axboe <axboe@kernel.dk>
24 Signed-off-by: Sasha Levin <sashal@kernel.org>
25 ---
26 drivers/block/nbd.c | 9 +++++----
27 1 file changed, 5 insertions(+), 4 deletions(-)
28
29 diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
30 index 52e1e71e81241..706115ecd9bee 100644
31 --- a/drivers/block/nbd.c
32 +++ b/drivers/block/nbd.c
33 @@ -276,7 +276,7 @@ static void nbd_size_clear(struct nbd_device *nbd)
34 }
35 }
36
37 -static void nbd_size_update(struct nbd_device *nbd)
38 +static void nbd_size_update(struct nbd_device *nbd, bool start)
39 {
40 struct nbd_config *config = nbd->config;
41 struct block_device *bdev = bdget_disk(nbd->disk, 0);
42 @@ -292,7 +292,8 @@ static void nbd_size_update(struct nbd_device *nbd)
43 if (bdev) {
44 if (bdev->bd_disk) {
45 bd_set_size(bdev, config->bytesize);
46 - set_blocksize(bdev, config->blksize);
47 + if (start)
48 + set_blocksize(bdev, config->blksize);
49 } else
50 bdev->bd_invalidated = 1;
51 bdput(bdev);
52 @@ -307,7 +308,7 @@ static void nbd_size_set(struct nbd_device *nbd, loff_t blocksize,
53 config->blksize = blocksize;
54 config->bytesize = blocksize * nr_blocks;
55 if (nbd->task_recv != NULL)
56 - nbd_size_update(nbd);
57 + nbd_size_update(nbd, false);
58 }
59
60 static void nbd_complete_rq(struct request *req)
61 @@ -1244,7 +1245,7 @@ static int nbd_start_device(struct nbd_device *nbd)
62 args->index = i;
63 queue_work(nbd->recv_workq, &args->work);
64 }
65 - nbd_size_update(nbd);
66 + nbd_size_update(nbd, true);
67 return error;
68 }
69
70 --
71 2.27.0
72