Commit ab904d634625ef8dc590240b7ee06c7b724e636b

Authored by NeilBrown
Committed by Linus Torvalds
1 parent 71c0805cb4

[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

... ... @@ -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)