Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -270,20 +270,21 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde

	if (!page)
		return ERR_PTR(-ENOMEM);
	do {
		ITERATE_RDEV(mddev, rdev, tmp)
			if (rdev->in_sync && !rdev->faulty)
				goto found;
		return ERR_PTR(-EIO);

	found:
		target = (rdev->sb_offset << 1) + offset + index * (PAGE_SIZE/512);
	ITERATE_RDEV(mddev, rdev, tmp) {
		if (! rdev->in_sync || rdev->faulty)
			continue;

	} while (!sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ));
		target = (rdev->sb_offset << 1) + offset + index * (PAGE_SIZE/512);

		if (sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)) {
			page->index = index;
			return page;
		}
	}
	return ERR_PTR(-EIO);

}

static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait)
{