Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 65d733cd authored by Ming Lei's avatar Ming Lei Committed by Greg Kroah-Hartman
Browse files

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



[ 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: 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>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 68e51bf3
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -276,7 +276,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);
@@ -292,6 +292,7 @@ static void nbd_size_update(struct nbd_device *nbd)
	if (bdev) {
		if (bdev->bd_disk) {
			bd_set_size(bdev, config->bytesize);
			if (start)
				set_blocksize(bdev, config->blksize);
		} else
			bdev->bd_invalidated = 1;
@@ -307,7 +308,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)
@@ -1244,7 +1245,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;
}