Raz Ben-Jehuda(caro) 46031f9a38 [PATCH] md: allow reads that have bypassed the cache to be retried on failure
If a bypass-the-cache read fails, we simply try again through the cache.  If
it fails again it will trigger normal recovery precedures.

update 1:

From: NeilBrown <neilb@suse.de>

1/
  chunk_aligned_read and retry_aligned_read assume that
      data_disks == raid_disks - 1
  which is not true for raid6.
  So when an aligned read request bypasses the cache, we can get the wrong data.

2/ The cloned bio is being used-after-free in raid5_align_endio
   (to test BIO_UPTODATE).

3/ We forgot to add rdev->data_offset when submitting
   a bio for aligned-read

4/ clone_bio calls blk_recount_segments and then we change bi_bdev,
   so we need to invalidate the segment counts.

5/ We don't de-reference the rdev when the read completes.
   This means we need to record the rdev to so it is still
   available in the end_io routine.  Fortunately
   bi_next in the original bio is unused at this point so
   we can stuff it in there.

6/ We leak a cloned bio if the target rdev is not usable.

From: NeilBrown <neilb@suse.de>

update 2:

1/ When aligned requests fail (read error) they need to be retried
   via the normal method (stripe cache).  As we cannot be sure that
   we can process a single read in one go (we may not be able to
   allocate all the stripes needed) we store a bio-being-retried
   and a list of bioes-that-still-need-to-be-retried.
   When find a bio that needs to be retried, we should add it to
   the list, not to single-bio...

2/ We were never incrementing 'scnt' when resubmitting failed
   aligned requests.

[akpm@osdl.org: build fix]
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-12-10 09:57:20 -08:00
..
2006-12-08 08:28:40 -08:00
2006-12-08 08:28:47 -08:00
2006-11-22 14:57:56 +00:00
2006-12-10 09:55:40 -08:00
2006-12-07 08:39:24 -08:00
2006-10-11 11:14:25 -07:00
2006-12-08 10:43:20 -08:00
2006-12-07 08:39:36 -08:00
2006-12-08 08:28:50 -08:00
2006-12-07 08:39:33 -08:00
2006-12-07 08:39:24 -08:00
2006-11-30 05:24:39 +01:00
2006-12-08 08:28:46 -08:00
2006-10-03 22:31:37 +02:00
2006-12-10 09:55:40 -08:00
2006-12-08 08:28:49 -08:00
2006-10-17 08:18:42 -07:00
2006-12-08 08:28:57 -08:00
2006-12-08 10:43:20 -08:00
2006-12-08 08:28:50 -08:00
2006-12-08 10:43:20 -08:00
2006-12-08 10:43:20 -08:00