• R
    [PATCH] md: allow reads that have bypassed the cache to be retried on failure · 46031f9a
    Raz Ben-Jehuda(caro) 提交于
    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: NNeil Brown <neilb@suse.de>
    Signed-off-by: NAndrew Morton <akpm@osdl.org>
    Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
    46031f9a
raid5.c 114.2 KB