raid5: support sync request
authorShaohua Li <shli@kernel.org>
Tue, 22 May 2012 03:55:05 +0000 (13:55 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 22 May 2012 03:55:05 +0000 (13:55 +1000)
REQ_SYNC is ignored in current raid5 code. Block layer does use it to do
policy,
for example ioscheduler. This patch adds it.

Signed-off-by: Shaohua Li <shli@fusionio.com>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid5.c
drivers/md/raid5.h

index 962c8f40908f384b09b8a60b7b28298763faf90d..7bfd59b313d756f67fe392b6d0bb020ab7098cf6 100644 (file)
@@ -539,6 +539,8 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)
                        replace_only = 1;
                } else
                        continue;
+               if (test_and_clear_bit(R5_SyncIO, &sh->dev[i].flags))
+                       rw |= REQ_SYNC;
 
                bi = &sh->dev[i].req;
                rbi = &sh->dev[i].rreq; /* For writing to replacement */
@@ -1145,6 +1147,8 @@ ops_run_biodrain(struct stripe_head *sh, struct dma_async_tx_descriptor *tx)
                                dev->sector + STRIPE_SECTORS) {
                                if (wbi->bi_rw & REQ_FUA)
                                        set_bit(R5_WantFUA, &dev->flags);
+                               if (wbi->bi_rw & REQ_SYNC)
+                                       set_bit(R5_SyncIO, &dev->flags);
                                tx = async_copy_data(1, wbi, dev->page,
                                        dev->sector, tx);
                                wbi = r5_next_bio(wbi, dev->sector);
@@ -1162,13 +1166,15 @@ static void ops_complete_reconstruct(void *stripe_head_ref)
        int pd_idx = sh->pd_idx;
        int qd_idx = sh->qd_idx;
        int i;
-       bool fua = false;
+       bool fua = false, sync = false;
 
        pr_debug("%s: stripe %llu\n", __func__,
                (unsigned long long)sh->sector);
 
-       for (i = disks; i--; )
+       for (i = disks; i--; ) {
                fua |= test_bit(R5_WantFUA, &sh->dev[i].flags);
+               sync |= test_bit(R5_SyncIO, &sh->dev[i].flags);
+       }
 
        for (i = disks; i--; ) {
                struct r5dev *dev = &sh->dev[i];
@@ -1177,6 +1183,8 @@ static void ops_complete_reconstruct(void *stripe_head_ref)
                        set_bit(R5_UPTODATE, &dev->flags);
                        if (fua)
                                set_bit(R5_WantFUA, &dev->flags);
+                       if (sync)
+                               set_bit(R5_SyncIO, &dev->flags);
                }
        }
 
index c6bdfa01d9872d60068579e71c242181d9b944a6..2164021f3b5f6548b96ac067aac67bd7874dcd10 100644 (file)
@@ -285,6 +285,7 @@ enum r5dev_flags {
                         */
        R5_Wantdrain,   /* dev->towrite needs to be drained */
        R5_WantFUA,     /* Write should be FUA */
+       R5_SyncIO,      /* The IO is sync */
        R5_WriteError,  /* got a write error - need to record it */
        R5_MadeGood,    /* A bad block has been fixed by writing to it */
        R5_ReadRepl,    /* Will/did read from replacement rather than orig */