]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/md/dm-raid.c
x86/speculation/l1tf: Protect PAE swap entries against L1TF
[mirror_ubuntu-bionic-kernel.git] / drivers / md / dm-raid.c
index 6319d846e0adb8c264f98676f0c2ddb8e85bdbb7..d0f330a5d0cb3cde0cea314d942f09705a3901e5 100644 (file)
@@ -675,15 +675,11 @@ static struct raid_type *get_raid_type_by_ll(const int level, const int layout)
        return NULL;
 }
 
-/*
- * Conditionally change bdev capacity of @rs
- * in case of a disk add/remove reshape
- */
-static void rs_set_capacity(struct raid_set *rs)
+/* Adjust rdev sectors */
+static void rs_set_rdev_sectors(struct raid_set *rs)
 {
        struct mddev *mddev = &rs->md;
        struct md_rdev *rdev;
-       struct gendisk *gendisk = dm_disk(dm_table_get_md(rs->ti->table));
 
        /*
         * raid10 sets rdev->sector to the device size, which
@@ -692,8 +688,16 @@ static void rs_set_capacity(struct raid_set *rs)
        rdev_for_each(rdev, mddev)
                if (!test_bit(Journal, &rdev->flags))
                        rdev->sectors = mddev->dev_sectors;
+}
 
-       set_capacity(gendisk, mddev->array_sectors);
+/*
+ * Change bdev capacity of @rs in case of a disk add/remove reshape
+ */
+static void rs_set_capacity(struct raid_set *rs)
+{
+       struct gendisk *gendisk = dm_disk(dm_table_get_md(rs->ti->table));
+
+       set_capacity(gendisk, rs->md.array_sectors);
        revalidate_disk(gendisk);
 }
 
@@ -1674,8 +1678,11 @@ static void do_table_event(struct work_struct *ws)
        struct raid_set *rs = container_of(ws, struct raid_set, md.event_work);
 
        smp_rmb(); /* Make sure we access most actual mddev properties */
-       if (!rs_is_reshaping(rs))
+       if (!rs_is_reshaping(rs)) {
+               if (rs_is_raid10(rs))
+                       rs_set_rdev_sectors(rs);
                rs_set_capacity(rs);
+       }
        dm_table_event(rs->ti->table);
 }
 
@@ -3842,11 +3849,10 @@ static int raid_preresume(struct dm_target *ti)
                mddev->resync_min = mddev->recovery_cp;
        }
 
-       rs_set_capacity(rs);
-
        /* Check for any reshape request unless new raid set */
        if (test_and_clear_bit(RT_FLAG_RESHAPE_RS, &rs->runtime_flags)) {
                /* Initiate a reshape. */
+               rs_set_rdev_sectors(rs);
                mddev_lock_nointr(mddev);
                r = rs_start_reshape(rs);
                mddev_unlock(mddev);
@@ -3875,6 +3881,10 @@ static void raid_resume(struct dm_target *ti)
        mddev->ro = 0;
        mddev->in_sync = 0;
 
+       /* Only reduce raid set size before running a disk removing reshape. */
+       if (mddev->delta_disks < 0)
+               rs_set_capacity(rs);
+
        /*
         * Keep the RAID set frozen if reshape/rebuild flags are set.
         * The RAID set is unfrozen once the next table load/resume,