Skip to content

Commit fb3eb5f

Browse files
Christoph Hellwigjfvogel
authored andcommitted
loop: refactor queue limits updates
[ Upstream commit b38c8be ] Replace loop_reconfigure_limits with a slightly less encompassing loop_update_limits that expects the caller to acquire and commit the queue limits to prepare for sorting out the freeze vs limits lock ordering. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Ming Lei <ming.lei@redhat.com> Reviewed-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Reviewed-by: Nilay Shroff <nilay@linux.ibm.com> Link: https://lore.kernel.org/r/20250110054726.1499538-11-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk> Stable-dep-of: f5c84ef ("loop: Add sanity check for read/write_iter") Signed-off-by: Sasha Levin <sashal@kernel.org> (cherry picked from commit 5e1470b276729d5e871c759086d734ec6a85da86) Signed-off-by: Jack Vogel <jack.vogel@oracle.com>
1 parent 17b5e4b commit fb3eb5f

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

drivers/block/loop.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -901,12 +901,12 @@ static unsigned int loop_default_blocksize(struct loop_device *lo,
901901
return SECTOR_SIZE;
902902
}
903903

904-
static int loop_reconfigure_limits(struct loop_device *lo, unsigned int bsize)
904+
static void loop_update_limits(struct loop_device *lo, struct queue_limits *lim,
905+
unsigned int bsize)
905906
{
906907
struct file *file = lo->lo_backing_file;
907908
struct inode *inode = file->f_mapping->host;
908909
struct block_device *backing_bdev = NULL;
909-
struct queue_limits lim;
910910
u32 granularity = 0, max_discard_sectors = 0;
911911

912912
if (S_ISBLK(inode->i_mode))
@@ -919,22 +919,20 @@ static int loop_reconfigure_limits(struct loop_device *lo, unsigned int bsize)
919919

920920
loop_get_discard_config(lo, &granularity, &max_discard_sectors);
921921

922-
lim = queue_limits_start_update(lo->lo_queue);
923-
lim.logical_block_size = bsize;
924-
lim.physical_block_size = bsize;
925-
lim.io_min = bsize;
926-
lim.features &= ~(BLK_FEAT_WRITE_CACHE | BLK_FEAT_ROTATIONAL);
922+
lim->logical_block_size = bsize;
923+
lim->physical_block_size = bsize;
924+
lim->io_min = bsize;
925+
lim->features &= ~(BLK_FEAT_WRITE_CACHE | BLK_FEAT_ROTATIONAL);
927926
if (file->f_op->fsync && !(lo->lo_flags & LO_FLAGS_READ_ONLY))
928-
lim.features |= BLK_FEAT_WRITE_CACHE;
927+
lim->features |= BLK_FEAT_WRITE_CACHE;
929928
if (backing_bdev && !bdev_nonrot(backing_bdev))
930-
lim.features |= BLK_FEAT_ROTATIONAL;
931-
lim.max_hw_discard_sectors = max_discard_sectors;
932-
lim.max_write_zeroes_sectors = max_discard_sectors;
929+
lim->features |= BLK_FEAT_ROTATIONAL;
930+
lim->max_hw_discard_sectors = max_discard_sectors;
931+
lim->max_write_zeroes_sectors = max_discard_sectors;
933932
if (max_discard_sectors)
934-
lim.discard_granularity = granularity;
933+
lim->discard_granularity = granularity;
935934
else
936-
lim.discard_granularity = 0;
937-
return queue_limits_commit_update(lo->lo_queue, &lim);
935+
lim->discard_granularity = 0;
938936
}
939937

940938
static int loop_configure(struct loop_device *lo, blk_mode_t mode,
@@ -943,6 +941,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
943941
{
944942
struct file *file = fget(config->fd);
945943
struct address_space *mapping;
944+
struct queue_limits lim;
946945
int error;
947946
loff_t size;
948947
bool partscan;
@@ -1014,7 +1013,9 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
10141013
lo->old_gfp_mask = mapping_gfp_mask(mapping);
10151014
mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
10161015

1017-
error = loop_reconfigure_limits(lo, config->block_size);
1016+
lim = queue_limits_start_update(lo->lo_queue);
1017+
loop_update_limits(lo, &lim, config->block_size);
1018+
error = queue_limits_commit_update(lo->lo_queue, &lim);
10181019
if (error)
10191020
goto out_unlock;
10201021

@@ -1382,6 +1383,7 @@ static int loop_set_dio(struct loop_device *lo, unsigned long arg)
13821383

13831384
static int loop_set_block_size(struct loop_device *lo, unsigned long arg)
13841385
{
1386+
struct queue_limits lim;
13851387
int err = 0;
13861388

13871389
if (lo->lo_state != Lo_bound)
@@ -1394,7 +1396,9 @@ static int loop_set_block_size(struct loop_device *lo, unsigned long arg)
13941396
invalidate_bdev(lo->lo_device);
13951397

13961398
blk_mq_freeze_queue(lo->lo_queue);
1397-
err = loop_reconfigure_limits(lo, arg);
1399+
lim = queue_limits_start_update(lo->lo_queue);
1400+
loop_update_limits(lo, &lim, arg);
1401+
err = queue_limits_commit_update(lo->lo_queue, &lim);
13981402
loop_update_dio(lo);
13991403
blk_mq_unfreeze_queue(lo->lo_queue);
14001404

0 commit comments

Comments
 (0)