diff options
author | Heinz Mauelshagen <heinzm@redhat.com> | 2017-01-13 21:53:10 -0500 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2017-01-25 06:49:07 -0500 |
commit | e2568465bd55b3ee619d9ebd02cc330feffaae04 (patch) | |
tree | 7481cb1db2ff94717e1f5bc20e6797ec9e668377 /drivers/md/dm-raid.c | |
parent | 63c32ed4afc2afd6b5551a8fcdea5b546dcaca4f (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.c | 17 |
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 | ||
1939 | static int read_disk_sb(struct md_rdev *rdev, int size) | 1939 | static 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); |