Commit ab904d63 authored by NeilBrown's avatar NeilBrown Committed by Linus Torvalds

[PATCH] md: fix bitmap/read_sb_page so that it handles errors properly.

read_sb_page() assumed that if sync_page_io fails, the device would be marked
faultly.  However it isn't.  So in the face of error, read_sb_page would loop
forever.

Redo the logic so that this cannot happen.
Signed-off-by: default avatarNeil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 71c0805c
...@@ -270,19 +270,20 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde ...@@ -270,19 +270,20 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde
if (!page) if (!page)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
do {
ITERATE_RDEV(mddev, rdev, tmp)
if (rdev->in_sync && !rdev->faulty)
goto found;
return ERR_PTR(-EIO);
found: ITERATE_RDEV(mddev, rdev, tmp) {
if (! rdev->in_sync || rdev->faulty)
continue;
target = (rdev->sb_offset << 1) + offset + index * (PAGE_SIZE/512); target = (rdev->sb_offset << 1) + offset + index * (PAGE_SIZE/512);
} while (!sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)); if (sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)) {
page->index = index;
return page;
}
}
return ERR_PTR(-EIO);
page->index = index;
return page;
} }
static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait) static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait)
......
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