Merge branch 'mymd/for-next' into mymd/for-linus
authorShaohua Li <shli@fb.com>
Thu, 28 Jul 2016 16:34:14 +0000 (09:34 -0700)
committerShaohua Li <shli@fb.com>
Thu, 28 Jul 2016 16:34:14 +0000 (09:34 -0700)
1  2 
drivers/md/md.c
drivers/md/md.h
drivers/md/multipath.c
drivers/md/raid1.c
drivers/md/raid10.c
drivers/md/raid5.c

diff --cc drivers/md/md.c
Simple merge
diff --cc drivers/md/md.h
Simple merge
Simple merge
@@@ -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) {
@@@ -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;
                                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;
                        }
                        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;
                        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:
Simple merge