Commit ab904d634625ef8dc590240b7ee06c7b724e636b
Committed by
Linus Torvalds
1 parent
71c0805cb4
Exists in
master
and in
7 other branches
[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: Neil Brown <neilb@cse.unsw.edu.au> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Showing 1 changed file with 10 additions and 9 deletions Side-by-side Diff
drivers/md/bitmap.c
... | ... | @@ -270,19 +270,20 @@ |
270 | 270 | |
271 | 271 | if (!page) |
272 | 272 | return ERR_PTR(-ENOMEM); |
273 | - do { | |
274 | - ITERATE_RDEV(mddev, rdev, tmp) | |
275 | - if (rdev->in_sync && !rdev->faulty) | |
276 | - goto found; | |
277 | - return ERR_PTR(-EIO); | |
278 | 273 | |
279 | - found: | |
274 | + ITERATE_RDEV(mddev, rdev, tmp) { | |
275 | + if (! rdev->in_sync || rdev->faulty) | |
276 | + continue; | |
277 | + | |
280 | 278 | target = (rdev->sb_offset << 1) + offset + index * (PAGE_SIZE/512); |
281 | 279 | |
282 | - } while (!sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)); | |
280 | + if (sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)) { | |
281 | + page->index = index; | |
282 | + return page; | |
283 | + } | |
284 | + } | |
285 | + return ERR_PTR(-EIO); | |
283 | 286 | |
284 | - page->index = index; | |
285 | - return page; | |
286 | 287 | } |
287 | 288 | |
288 | 289 | static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait) |