]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/md/raid5.c
Merge branch 'for-3.10/core' of git://git.kernel.dk/linux-block
[mirror_ubuntu-artful-kernel.git] / drivers / md / raid5.c
index 2fefb9f2198e2269bafa26d62e60eb96dbb63aa0..9359828ffe264d3313ee77de993ea4c5147f1205 100644 (file)
@@ -184,6 +184,8 @@ static void return_io(struct bio *return_bi)
                return_bi = bi->bi_next;
                bi->bi_next = NULL;
                bi->bi_size = 0;
+               trace_block_bio_complete(bdev_get_queue(bi->bi_bdev),
+                                        bi, 0);
                bio_endio(bi, 0);
                bi = return_bi;
        }
@@ -1884,8 +1886,15 @@ static void raid5_end_write_request(struct bio *bi, int error)
                                        &rdev->mddev->recovery);
                } else if (is_badblock(rdev, sh->sector,
                                       STRIPE_SECTORS,
-                                      &first_bad, &bad_sectors))
+                                      &first_bad, &bad_sectors)) {
                        set_bit(R5_MadeGood, &sh->dev[i].flags);
+                       if (test_bit(R5_ReadError, &sh->dev[i].flags))
+                               /* That was a successful write so make
+                                * sure it looks like we already did
+                                * a re-write.
+                                */
+                               set_bit(R5_ReWrite, &sh->dev[i].flags);
+               }
        }
        rdev_dec_pending(rdev, conf->mddev);
 
@@ -3913,6 +3922,8 @@ static void raid5_align_endio(struct bio *bi, int error)
        rdev_dec_pending(rdev, conf->mddev);
 
        if (!error && uptodate) {
+               trace_block_bio_complete(bdev_get_queue(raid_bi->bi_bdev),
+                                        raid_bi, 0);
                bio_endio(raid_bi, 0);
                if (atomic_dec_and_test(&conf->active_aligned_reads))
                        wake_up(&conf->wait_for_stripe);
@@ -4381,6 +4392,8 @@ static void make_request(struct mddev *mddev, struct bio * bi)
                if ( rw == WRITE )
                        md_write_end(mddev);
 
+               trace_block_bio_complete(bdev_get_queue(bi->bi_bdev),
+                                        bi, 0);
                bio_endio(bi, 0);
        }
 }
@@ -4665,9 +4678,10 @@ static inline sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int
                *skipped = 1;
                return rv;
        }
-       if (!bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, 1) &&
-           !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) &&
-           !conf->fullsync && sync_blocks >= STRIPE_SECTORS) {
+       if (!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) &&
+           !conf->fullsync &&
+           !bitmap_start_sync(mddev->bitmap, sector_nr, &sync_blocks, 1) &&
+           sync_blocks >= STRIPE_SECTORS) {
                /* we can skip this block, and probably more */
                sync_blocks /= STRIPE_SECTORS;
                *skipped = 1;
@@ -4757,8 +4771,11 @@ static int  retry_aligned_read(struct r5conf *conf, struct bio *raid_bio)
                handled++;
        }
        remaining = raid5_dec_bi_active_stripes(raid_bio);
-       if (remaining == 0)
+       if (remaining == 0) {
+               trace_block_bio_complete(bdev_get_queue(raid_bio->bi_bdev),
+                                        raid_bio, 0);
                bio_endio(raid_bio, 0);
+       }
        if (atomic_dec_and_test(&conf->active_aligned_reads))
                wake_up(&conf->wait_for_stripe);
        return handled;