diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-02-08 22:06:30 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-02-08 22:06:30 -0500 |
commit | 4d39aa1b998fffd481517c1dd03d83c38e1706f9 (patch) | |
tree | 76c4e4cf52b148ae035f71c7c30692b6634cd343 | |
parent | 4a68d54c983514f123e99fc720951a4ee4d84270 (diff) | |
parent | db91ff55bdf06736b849afc1b1fce5763bbb8d5d (diff) |
Merge tag 'md-3.3-fixes' of git://neil.brown.name/md
Some simple md-related fixes.
1/ two small fixes to ensure we handle an interrupted resync properly.
2/ avoid loading the bitmap multiple times in dm-raid
* tag 'md-3.3-fixes' of git://neil.brown.name/md:
md: two small fixes to handling interrupt resync.
Prevent DM RAID from loading bitmap twice.
-rw-r--r-- | drivers/md/dm-raid.c | 12 | ||||
-rw-r--r-- | drivers/md/md.c | 5 |
2 files changed, 12 insertions, 5 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index c2907d836e4e..86cb7e5d83d5 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c | |||
@@ -56,7 +56,8 @@ struct raid_dev { | |||
56 | struct raid_set { | 56 | struct raid_set { |
57 | struct dm_target *ti; | 57 | struct dm_target *ti; |
58 | 58 | ||
59 | uint64_t print_flags; | 59 | uint32_t bitmap_loaded; |
60 | uint32_t print_flags; | ||
60 | 61 | ||
61 | struct mddev md; | 62 | struct mddev md; |
62 | struct raid_type *raid_type; | 63 | struct raid_type *raid_type; |
@@ -1085,7 +1086,7 @@ static int raid_status(struct dm_target *ti, status_type_t type, | |||
1085 | raid_param_cnt += 2; | 1086 | raid_param_cnt += 2; |
1086 | } | 1087 | } |
1087 | 1088 | ||
1088 | raid_param_cnt += (hweight64(rs->print_flags & ~DMPF_REBUILD) * 2); | 1089 | raid_param_cnt += (hweight32(rs->print_flags & ~DMPF_REBUILD) * 2); |
1089 | if (rs->print_flags & (DMPF_SYNC | DMPF_NOSYNC)) | 1090 | if (rs->print_flags & (DMPF_SYNC | DMPF_NOSYNC)) |
1090 | raid_param_cnt--; | 1091 | raid_param_cnt--; |
1091 | 1092 | ||
@@ -1197,7 +1198,12 @@ static void raid_resume(struct dm_target *ti) | |||
1197 | { | 1198 | { |
1198 | struct raid_set *rs = ti->private; | 1199 | struct raid_set *rs = ti->private; |
1199 | 1200 | ||
1200 | bitmap_load(&rs->md); | 1201 | if (!rs->bitmap_loaded) { |
1202 | bitmap_load(&rs->md); | ||
1203 | rs->bitmap_loaded = 1; | ||
1204 | } else | ||
1205 | md_wakeup_thread(rs->md.thread); | ||
1206 | |||
1201 | mddev_resume(&rs->md); | 1207 | mddev_resume(&rs->md); |
1202 | } | 1208 | } |
1203 | 1209 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index 9417ae2fa0bb..ce88755baf4a 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -7333,7 +7333,8 @@ void md_do_sync(struct mddev *mddev) | |||
7333 | printk(KERN_INFO | 7333 | printk(KERN_INFO |
7334 | "md: checkpointing %s of %s.\n", | 7334 | "md: checkpointing %s of %s.\n", |
7335 | desc, mdname(mddev)); | 7335 | desc, mdname(mddev)); |
7336 | mddev->recovery_cp = mddev->curr_resync; | 7336 | mddev->recovery_cp = |
7337 | mddev->curr_resync_completed; | ||
7337 | } | 7338 | } |
7338 | } else | 7339 | } else |
7339 | mddev->recovery_cp = MaxSector; | 7340 | mddev->recovery_cp = MaxSector; |
@@ -7351,9 +7352,9 @@ void md_do_sync(struct mddev *mddev) | |||
7351 | rcu_read_unlock(); | 7352 | rcu_read_unlock(); |
7352 | } | 7353 | } |
7353 | } | 7354 | } |
7355 | skip: | ||
7354 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 7356 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
7355 | 7357 | ||
7356 | skip: | ||
7357 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { | 7358 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { |
7358 | /* We completed so min/max setting can be forgotten if used. */ | 7359 | /* We completed so min/max setting can be forgotten if used. */ |
7359 | if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) | 7360 | if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) |