diff options
author | Christoph Hellwig <hch@lst.de> | 2024-02-29 06:38:45 -0800 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2024-03-01 09:08:22 -0700 |
commit | 242a49e5c8784e93a99e4dc4277b28a8ba85eac5 (patch) | |
tree | 4323a860a00292e5979106939a829c9dcba98caa | |
parent | 7ea201f2cc1da999b9a0a23ea20b64eb2c4719a9 (diff) |
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>
-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); |