diff options
author | Heinz Mauelshagen <heinzm@redhat.com> | 2017-07-13 11:34:24 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2017-07-25 14:54:19 -0400 |
commit | 0cf352e5a00a0ccf362e4ae60dcaa3318933f6e4 (patch) | |
tree | dc5b13576fface6f62e9171304c80f9598de5bb0 /drivers/md/dm-raid.c | |
parent | f4af3f82daed14ea06ac22eac198a45f56eb2cb1 (diff) |
dm raid: avoid mddev->suspended access
Use runtime flag to ensure that an mddev gets suspended/resumed just once.
Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/dm-raid.c')
-rw-r--r-- | drivers/md/dm-raid.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index c256a723b964..757355b2f1a1 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c | |||
@@ -208,6 +208,7 @@ struct raid_dev { | |||
208 | #define RT_FLAG_RS_BITMAP_LOADED 2 | 208 | #define RT_FLAG_RS_BITMAP_LOADED 2 |
209 | #define RT_FLAG_UPDATE_SBS 3 | 209 | #define RT_FLAG_UPDATE_SBS 3 |
210 | #define RT_FLAG_RESHAPE_RS 4 | 210 | #define RT_FLAG_RESHAPE_RS 4 |
211 | #define RT_FLAG_RS_SUSPENDED 5 | ||
211 | 212 | ||
212 | /* Array elements of 64 bit needed for rebuild/failed disk bits */ | 213 | /* Array elements of 64 bit needed for rebuild/failed disk bits */ |
213 | #define DISKS_ARRAY_ELEMS ((MAX_RAID_DEVICES + (sizeof(uint64_t) * 8 - 1)) / sizeof(uint64_t) / 8) | 214 | #define DISKS_ARRAY_ELEMS ((MAX_RAID_DEVICES + (sizeof(uint64_t) * 8 - 1)) / sizeof(uint64_t) / 8) |
@@ -3169,6 +3170,7 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
3169 | } | 3170 | } |
3170 | 3171 | ||
3171 | mddev_suspend(&rs->md); | 3172 | mddev_suspend(&rs->md); |
3173 | set_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags); | ||
3172 | 3174 | ||
3173 | /* Try to adjust the raid4/5/6 stripe cache size to the stripe size */ | 3175 | /* Try to adjust the raid4/5/6 stripe cache size to the stripe size */ |
3174 | if (rs_is_raid456(rs)) { | 3176 | if (rs_is_raid456(rs)) { |
@@ -3626,7 +3628,7 @@ static void raid_postsuspend(struct dm_target *ti) | |||
3626 | { | 3628 | { |
3627 | struct raid_set *rs = ti->private; | 3629 | struct raid_set *rs = ti->private; |
3628 | 3630 | ||
3629 | if (!rs->md.suspended) | 3631 | if (!test_and_set_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags)) |
3630 | mddev_suspend(&rs->md); | 3632 | mddev_suspend(&rs->md); |
3631 | 3633 | ||
3632 | rs->md.ro = 1; | 3634 | rs->md.ro = 1; |
@@ -3760,7 +3762,7 @@ static int rs_start_reshape(struct raid_set *rs) | |||
3760 | return r; | 3762 | return r; |
3761 | 3763 | ||
3762 | /* Need to be resumed to be able to start reshape, recovery is frozen until raid_resume() though */ | 3764 | /* Need to be resumed to be able to start reshape, recovery is frozen until raid_resume() though */ |
3763 | if (mddev->suspended) | 3765 | if (test_and_clear_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags)) |
3764 | mddev_resume(mddev); | 3766 | mddev_resume(mddev); |
3765 | 3767 | ||
3766 | /* | 3768 | /* |
@@ -3787,8 +3789,8 @@ static int rs_start_reshape(struct raid_set *rs) | |||
3787 | } | 3789 | } |
3788 | 3790 | ||
3789 | /* Suspend because a resume will happen in raid_resume() */ | 3791 | /* Suspend because a resume will happen in raid_resume() */ |
3790 | if (!mddev->suspended) | 3792 | set_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags); |
3791 | mddev_suspend(mddev); | 3793 | mddev_suspend(mddev); |
3792 | 3794 | ||
3793 | /* | 3795 | /* |
3794 | * Now reshape got set up, update superblocks to | 3796 | * Now reshape got set up, update superblocks to |
@@ -3884,7 +3886,7 @@ static void raid_resume(struct dm_target *ti) | |||
3884 | if (!(rs->ctr_flags & RESUME_STAY_FROZEN_FLAGS)) | 3886 | if (!(rs->ctr_flags & RESUME_STAY_FROZEN_FLAGS)) |
3885 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 3887 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
3886 | 3888 | ||
3887 | if (mddev->suspended) | 3889 | if (test_and_clear_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags)) |
3888 | mddev_resume(mddev); | 3890 | mddev_resume(mddev); |
3889 | } | 3891 | } |
3890 | 3892 | ||