aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-raid.c
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2017-01-13 21:53:10 -0500
committerMike Snitzer <snitzer@redhat.com>2017-01-25 06:49:07 -0500
commite2568465bd55b3ee619d9ebd02cc330feffaae04 (patch)
tree7481cb1db2ff94717e1f5bc20e6797ec9e668377 /drivers/md/dm-raid.c
parent63c32ed4afc2afd6b5551a8fcdea5b546dcaca4f (diff)
dm raid: use read_disk_sb() throughout
For consistency, call read_disk_sb() from attempt_restore_of_faulty_devices() instead of calling sync_page_io() directly. Explicitly set device to faulty on superblock read error. 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.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index e52c493212d0..c982649497a5 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -1936,18 +1936,21 @@ static int rs_check_reshape(struct raid_set *rs)
1936 return -EPERM; 1936 return -EPERM;
1937} 1937}
1938 1938
1939static int read_disk_sb(struct md_rdev *rdev, int size) 1939static int read_disk_sb(struct md_rdev *rdev, int size, bool force_reload)
1940{ 1940{
1941 BUG_ON(!rdev->sb_page); 1941 BUG_ON(!rdev->sb_page);
1942 1942
1943 if (rdev->sb_loaded) 1943 if (rdev->sb_loaded && !force_reload)
1944 return 0; 1944 return 0;
1945 1945
1946 rdev->sb_loaded = 0;
1947
1946 if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, true)) { 1948 if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, true)) {
1947 DMERR("Failed to read superblock of device at position %d", 1949 DMERR("Failed to read superblock of device at position %d",
1948 rdev->raid_disk); 1950 rdev->raid_disk);
1949 md_error(rdev->mddev, rdev); 1951 md_error(rdev->mddev, rdev);
1950 return -EINVAL; 1952 set_bit(Faulty, &rdev->flags);
1953 return -EIO;
1951 } 1954 }
1952 1955
1953 rdev->sb_loaded = 1; 1956 rdev->sb_loaded = 1;
@@ -2075,7 +2078,7 @@ static int super_load(struct md_rdev *rdev, struct md_rdev *refdev)
2075 return -EINVAL; 2078 return -EINVAL;
2076 } 2079 }
2077 2080
2078 r = read_disk_sb(rdev, rdev->sb_size); 2081 r = read_disk_sb(rdev, rdev->sb_size, false);
2079 if (r) 2082 if (r)
2080 return r; 2083 return r;
2081 2084
@@ -2453,7 +2456,6 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)
2453 * The rdev has to stay on the same_set list to allow for 2456 * The rdev has to stay on the same_set list to allow for
2454 * the attempt to restore faulty devices on second resume. 2457 * the attempt to restore faulty devices on second resume.
2455 */ 2458 */
2456 set_bit(Faulty, &rdev->flags);
2457 rdev->raid_disk = rdev->saved_raid_disk = -1; 2459 rdev->raid_disk = rdev->saved_raid_disk = -1;
2458 break; 2460 break;
2459 } 2461 }
@@ -3548,9 +3550,8 @@ static void attempt_restore_of_faulty_devices(struct raid_set *rs)
3548 if (test_bit(Journal, &r->flags)) 3550 if (test_bit(Journal, &r->flags))
3549 continue; 3551 continue;
3550 3552
3551 if (test_bit(Faulty, &r->flags) && r->sb_page && 3553 if (test_bit(Faulty, &r->flags) &&
3552 sync_page_io(r, 0, r->sb_size, r->sb_page, 3554 r->meta_bdev && !read_disk_sb(r, r->sb_size, true)) {
3553 REQ_OP_READ, 0, true)) {
3554 DMINFO("Faulty %s device #%d has readable super block." 3555 DMINFO("Faulty %s device #%d has readable super block."
3555 " Attempting to revive it.", 3556 " Attempting to revive it.",
3556 rs->raid_type->name, i); 3557 rs->raid_type->name, i);