|
@@ -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);
|
|
|
}
|
|
|
}
|
|
|
|