diff options
author | Christoph Hellwig <hch@lst.de> | 2024-02-29 15:38:45 +0100 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2024-03-01 17:08:22 +0100 |
commit | 242a49e5c8784e93a99e4dc4277b28a8ba85eac5 (patch) | |
tree | 4323a860a00292e5979106939a829c9dcba98caa /drivers/block/nbd.c | |
parent | nbd: don't clear discard_sectors in nbd_config_put (diff) | |
download | linux-242a49e5c8784e93a99e4dc4277b28a8ba85eac5.tar.xz linux-242a49e5c8784e93a99e4dc4277b28a8ba85eac5.zip |
nbd: freeze the queue for queue limits updates
nbd currently updates the logical and physical block sizes as well
as the discard_sectors on a live queue. Freeze the queue first to
make sure there are not commands in flight that can see torn or
inconsistent limits.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20240229143846.1047223-3-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to '')
-rw-r--r-- | drivers/block/nbd.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 384750d5259f..22ee0ed9aa6d 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -316,7 +316,7 @@ static void nbd_mark_nsock_dead(struct nbd_device *nbd, struct nbd_sock *nsock, nsock->sent = 0; } -static int nbd_set_size(struct nbd_device *nbd, loff_t bytesize, +static int __nbd_set_size(struct nbd_device *nbd, loff_t bytesize, loff_t blksize) { if (!blksize) @@ -348,6 +348,18 @@ static int nbd_set_size(struct nbd_device *nbd, loff_t bytesize, return 0; } +static int nbd_set_size(struct nbd_device *nbd, loff_t bytesize, + loff_t blksize) +{ + int error; + + blk_mq_freeze_queue(nbd->disk->queue); + error = __nbd_set_size(nbd, bytesize, blksize); + blk_mq_unfreeze_queue(nbd->disk->queue); + + return error; +} + static void nbd_complete_rq(struct request *req) { struct nbd_cmd *cmd = blk_mq_rq_to_pdu(req); |