Commit e2568465 authored by Heinz Mauelshagen's avatar Heinz Mauelshagen Committed by Mike Snitzer

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: default avatarHeinz Mauelshagen <heinzm@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 63c32ed4
...@@ -1936,18 +1936,21 @@ static int rs_check_reshape(struct raid_set *rs) ...@@ -1936,18 +1936,21 @@ static int rs_check_reshape(struct raid_set *rs)
return -EPERM; return -EPERM;
} }
static int read_disk_sb(struct md_rdev *rdev, int size) static int read_disk_sb(struct md_rdev *rdev, int size, bool force_reload)
{ {
BUG_ON(!rdev->sb_page); BUG_ON(!rdev->sb_page);
if (rdev->sb_loaded) if (rdev->sb_loaded && !force_reload)
return 0; return 0;
rdev->sb_loaded = 0;
if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, true)) { if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, true)) {
DMERR("Failed to read superblock of device at position %d", DMERR("Failed to read superblock of device at position %d",
rdev->raid_disk); rdev->raid_disk);
md_error(rdev->mddev, rdev); md_error(rdev->mddev, rdev);
return -EINVAL; set_bit(Faulty, &rdev->flags);
return -EIO;
} }
rdev->sb_loaded = 1; rdev->sb_loaded = 1;
...@@ -2075,7 +2078,7 @@ static int super_load(struct md_rdev *rdev, struct md_rdev *refdev) ...@@ -2075,7 +2078,7 @@ static int super_load(struct md_rdev *rdev, struct md_rdev *refdev)
return -EINVAL; return -EINVAL;
} }
r = read_disk_sb(rdev, rdev->sb_size); r = read_disk_sb(rdev, rdev->sb_size, false);
if (r) if (r)
return r; return r;
...@@ -2453,7 +2456,6 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs) ...@@ -2453,7 +2456,6 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)
* The rdev has to stay on the same_set list to allow for * The rdev has to stay on the same_set list to allow for
* the attempt to restore faulty devices on second resume. * the attempt to restore faulty devices on second resume.
*/ */
set_bit(Faulty, &rdev->flags);
rdev->raid_disk = rdev->saved_raid_disk = -1; rdev->raid_disk = rdev->saved_raid_disk = -1;
break; break;
} }
...@@ -3548,9 +3550,8 @@ static void attempt_restore_of_faulty_devices(struct raid_set *rs) ...@@ -3548,9 +3550,8 @@ static void attempt_restore_of_faulty_devices(struct raid_set *rs)
if (test_bit(Journal, &r->flags)) if (test_bit(Journal, &r->flags))
continue; continue;
if (test_bit(Faulty, &r->flags) && r->sb_page && if (test_bit(Faulty, &r->flags) &&
sync_page_io(r, 0, r->sb_size, r->sb_page, r->meta_bdev && !read_disk_sb(r, r->sb_size, true)) {
REQ_OP_READ, 0, true)) {
DMINFO("Faulty %s device #%d has readable super block." DMINFO("Faulty %s device #%d has readable super block."
" Attempting to revive it.", " Attempting to revive it.",
rs->raid_type->name, i); rs->raid_type->name, i);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment