aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@cse.unsw.edu.au>2005-09-09 19:23:52 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-09-09 19:39:11 -0400
commitab904d634625ef8dc590240b7ee06c7b724e636b (patch)
tree3ecd6a17dd99f2f1879b3e1fed58f52e6d35633c
parent71c0805cb48462c99fbe0e5fcc6c12d7b9929c09 (diff)
[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>
-rw-r--r--drivers/md/bitmap.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index c971d38f3a05..90fe70d76a31 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -270,19 +270,20 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde
270 270
271 if (!page) 271 if (!page)
272 return ERR_PTR(-ENOMEM); 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 target = (rdev->sb_offset << 1) + offset + index * (PAGE_SIZE/512); 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
288static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait) 289static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait)