]> www.infradead.org Git - users/hch/block.git/commitdiff
md: set md-specific flags for all queue limits blk-flags-fixups
authorChristoph Hellwig <hch@lst.de>
Tue, 25 Jun 2024 06:48:18 +0000 (08:48 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 25 Jun 2024 08:54:12 +0000 (10:54 +0200)
The md driver wants to enforce a number of flags to an all devices, even
when not inheriting them from the underlying devices.  To make sure these
flags survive the queue_limits_set calls that md uses to update the
queue limits without deriving them form the previous limits add a new
md_init_stacking_limits helper that calls blk_set_stacking_limits and sets
these flags.

Fixes: 1122c0c1cc71 ("block: move cache control settings out of queue->flags")
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/md/md.c
drivers/md/md.h
drivers/md/raid0.c
drivers/md/raid1.c
drivers/md/raid10.c
drivers/md/raid5.c

index 69ea54aedd99a1c7f6f58464457a7f57d9df1de3..8368438e58e98950e0acc0007c7f3927d4759110 100644 (file)
@@ -5853,6 +5853,13 @@ static void mddev_delayed_delete(struct work_struct *ws)
        kobject_put(&mddev->kobj);
 }
 
+void md_init_stacking_limits(struct queue_limits *lim)
+{
+       blk_set_stacking_limits(lim);
+       lim->features = BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA |
+                       BLK_FEAT_IO_STAT | BLK_FEAT_NOWAIT;
+}
+
 struct mddev *md_alloc(dev_t dev, char *name)
 {
        /*
@@ -5871,10 +5878,6 @@ struct mddev *md_alloc(dev_t dev, char *name)
        int shift;
        int unit;
        int error;
-       struct queue_limits lim = {
-               .features               = BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA |
-                                         BLK_FEAT_IO_STAT | BLK_FEAT_NOWAIT,
-       };
 
        /*
         * Wait for any previous instance of this device to be completely
@@ -5914,7 +5917,7 @@ struct mddev *md_alloc(dev_t dev, char *name)
                 */
                mddev->hold_active = UNTIL_STOP;
 
-       disk = blk_alloc_disk(&lim, NUMA_NO_NODE);
+       disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
        if (IS_ERR(disk)) {
                error = PTR_ERR(disk);
                goto out_free_mddev;
index c4d7ebf9587d07b00936d92fab1c12b04fcc28e8..28cb4b0b6c1740ea564b3aade87553aa2b3f19e0 100644 (file)
@@ -893,6 +893,7 @@ extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale);
 
 extern int mddev_init(struct mddev *mddev);
 extern void mddev_destroy(struct mddev *mddev);
+void md_init_stacking_limits(struct queue_limits *lim);
 struct mddev *md_alloc(dev_t dev, char *name);
 void mddev_put(struct mddev *mddev);
 extern int md_run(struct mddev *mddev);
index 62634e2a33bd0fb8648ceda7b494fd8af0e7a63e..32d58752477847cf1db73e261992948a95c0e2cd 100644 (file)
@@ -379,7 +379,7 @@ static int raid0_set_limits(struct mddev *mddev)
        struct queue_limits lim;
        int err;
 
-       blk_set_stacking_limits(&lim);
+       md_init_stacking_limits(&lim);
        lim.max_hw_sectors = mddev->chunk_sectors;
        lim.max_write_zeroes_sectors = mddev->chunk_sectors;
        lim.io_min = mddev->chunk_sectors << 9;
index 1a0eba65b8a92b22f0e351033f6246856bbf3725..04a0c2ca1732452eb8d80344a17815966e00aa80 100644 (file)
@@ -3194,7 +3194,7 @@ static int raid1_set_limits(struct mddev *mddev)
        struct queue_limits lim;
        int err;
 
-       blk_set_stacking_limits(&lim);
+       md_init_stacking_limits(&lim);
        lim.max_write_zeroes_sectors = 0;
        err = mddev_stack_rdev_limits(mddev, &lim, MDDEV_STACK_INTEGRITY);
        if (err) {
index 3334aa803c8380dfbf657b191f15c92807fc79a9..2a9c4ee982e023f15100571d2abcfa7f72f9cf5f 100644 (file)
@@ -3974,7 +3974,7 @@ static int raid10_set_queue_limits(struct mddev *mddev)
        struct queue_limits lim;
        int err;
 
-       blk_set_stacking_limits(&lim);
+       md_init_stacking_limits(&lim);
        lim.max_write_zeroes_sectors = 0;
        lim.io_min = mddev->chunk_sectors << 9;
        lim.io_opt = lim.io_min * raid10_nr_stripes(conf);
index 0192a6323f09ba7b21c70790d4fc1adc1316c54c..10219205160bbf9d2ce45b3bdb99011fb610dc95 100644 (file)
@@ -7708,7 +7708,7 @@ static int raid5_set_limits(struct mddev *mddev)
         */
        stripe = roundup_pow_of_two(data_disks * (mddev->chunk_sectors << 9));
 
-       blk_set_stacking_limits(&lim);
+       md_init_stacking_limits(&lim);
        lim.io_min = mddev->chunk_sectors << 9;
        lim.io_opt = lim.io_min * (conf->raid_disks - conf->max_degraded);
        lim.features |= BLK_FEAT_RAID_PARTIAL_STRIPES_EXPENSIVE;