md/raid10: submit bio directly to replacement disk
authorShaohua Li <shli@fb.com>
Thu, 23 Feb 2017 20:26:41 +0000 (12:26 -0800)
committerWilly Tarreau <w@1wt.eu>
Thu, 2 Nov 2017 06:16:19 +0000 (07:16 +0100)
commit 6d399783e9d4e9bd44931501948059d24ad96ff8 upstream.

Commit 57c67df(md/raid10: submit IO from originating thread instead of
md thread) submits bio directly for normal disks but not for replacement
disks. There is no point we shouldn't do this for replacement disks.

Cc: NeilBrown <neilb@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: Willy Tarreau <w@1wt.eu>
drivers/md/raid10.c

index f53f4f8955026e70628dbd023685e5811bb7fac6..b4de9c3e5ca4f9b4aa8afe46dcffa74951b76e4e 100644 (file)
@@ -1569,11 +1569,24 @@ retry_write:
                        mbio->bi_private = r10_bio;
 
                        atomic_inc(&r10_bio->remaining);
+
+                       cb = blk_check_plugged(raid10_unplug, mddev,
+                                              sizeof(*plug));
+                       if (cb)
+                               plug = container_of(cb, struct raid10_plug_cb,
+                                                   cb);
+                       else
+                               plug = NULL;
                        spin_lock_irqsave(&conf->device_lock, flags);
-                       bio_list_add(&conf->pending_bio_list, mbio);
-                       conf->pending_count++;
+                       if (plug) {
+                               bio_list_add(&plug->pending, mbio);
+                               plug->pending_cnt++;
+                       } else {
+                               bio_list_add(&conf->pending_bio_list, mbio);
+                               conf->pending_count++;
+                       }
                        spin_unlock_irqrestore(&conf->device_lock, flags);
-                       if (!mddev_check_plugged(mddev))
+                       if (!plug)
                                md_wakeup_thread(mddev->thread);
                }
        }