From: Shaohua Li Date: Thu, 28 Jul 2016 16:34:14 +0000 (-0700) Subject: Merge branch 'mymd/for-next' into mymd/for-linus X-Git-Tag: v4.8-rc1~113^2 X-Git-Url: http://git.cascardo.eti.br/?a=commitdiff_plain;h=3f35e210ed4617a68b6baa9b7ac6c72bf7e313d9;p=cascardo%2Flinux.git Merge branch 'mymd/for-next' into mymd/for-linus --- 3f35e210ed4617a68b6baa9b7ac6c72bf7e313d9 diff --cc drivers/md/raid1.c index 4e6da4497553,5027ef4752ac..46168ef2e279 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@@ -2086,15 -2069,20 +2067,20 @@@ static void fix_read_error(struct r1con (!test_bit(Faulty, &rdev->flags) && rdev->recovery_offset >= sect + s)) && is_badblock(rdev, sect, s, - &first_bad, &bad_sectors) == 0 && - sync_page_io(rdev, sect, s<<9, + &first_bad, &bad_sectors) == 0) { + atomic_inc(&rdev->nr_pending); + rcu_read_unlock(); + if (sync_page_io(rdev, sect, s<<9, - conf->tmppage, READ, false)) + conf->tmppage, REQ_OP_READ, 0, false)) - success = 1; - else { - d++; - if (d == conf->raid_disks * 2) - d = 0; - } + success = 1; + rdev_dec_pending(rdev, mddev); + if (success) + break; + } else + rcu_read_unlock(); + d++; + if (d == conf->raid_disks * 2) + d = 0; } while (!success && d != read_disk); if (!success) { diff --cc drivers/md/raid10.c index 26ae74fd0d01,cb1d88709ff0..ed29fc899f06 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@@ -3063,10 -3093,10 +3092,10 @@@ static sector_t raid10_sync_request(str biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio_set_op_attrs(bio, REQ_OP_WRITE, 0); bio->bi_iter.bi_sector = to_addr - + rdev->data_offset; - bio->bi_bdev = rdev->bdev; + + mrdev->data_offset; + bio->bi_bdev = mrdev->bdev; atomic_inc(&r10_bio->remaining); } else r10_bio->devs[1].bio->bi_end_io = NULL; @@@ -3092,10 -3121,10 +3120,10 @@@ biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio_set_op_attrs(bio, REQ_OP_WRITE, 0); bio->bi_iter.bi_sector = to_addr + - rdev->data_offset; - bio->bi_bdev = rdev->bdev; + mreplace->data_offset; + bio->bi_bdev = mreplace->bdev; atomic_inc(&r10_bio->remaining); break; } @@@ -3212,16 -3252,18 +3251,18 @@@ biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_read; - bio->bi_rw = READ; + bio_set_op_attrs(bio, REQ_OP_READ, 0); - bio->bi_iter.bi_sector = sector + - conf->mirrors[d].rdev->data_offset; - bio->bi_bdev = conf->mirrors[d].rdev->bdev; + bio->bi_iter.bi_sector = sector + rdev->data_offset; + bio->bi_bdev = rdev->bdev; count++; - if (conf->mirrors[d].replacement == NULL || - test_bit(Faulty, - &conf->mirrors[d].replacement->flags)) + rdev = rcu_dereference(conf->mirrors[d].replacement); + if (rdev == NULL || test_bit(Faulty, &rdev->flags)) { + rcu_read_unlock(); continue; + } + atomic_inc(&rdev->nr_pending); + rcu_read_unlock(); /* Need to set up for writing to the replacement */ bio = r10_bio->devs[i].repl_bio; @@@ -3234,10 -3275,9 +3274,9 @@@ biolist = bio; bio->bi_private = r10_bio; bio->bi_end_io = end_sync_write; - bio->bi_rw = WRITE; + bio_set_op_attrs(bio, REQ_OP_WRITE, 0); - bio->bi_iter.bi_sector = sector + - conf->mirrors[d].replacement->data_offset; - bio->bi_bdev = conf->mirrors[d].replacement->bdev; + bio->bi_iter.bi_sector = sector + rdev->data_offset; + bio->bi_bdev = rdev->bdev; count++; } @@@ -4521,7 -4571,9 +4570,9 @@@ static int handle_reshape_read_error(st addr, s << 9, bvec[idx].bv_page, - READ, false); + REQ_OP_READ, 0, false); + rdev_dec_pending(rdev, mddev); + rcu_read_lock(); if (success) break; failed: