aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/raid5.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 74dcf19cfe68..758b77296404 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -547,7 +547,7 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)
547 rw = WRITE_FUA; 547 rw = WRITE_FUA;
548 else 548 else
549 rw = WRITE; 549 rw = WRITE;
550 if (test_and_clear_bit(R5_Discard, &sh->dev[i].flags)) 550 if (test_bit(R5_Discard, &sh->dev[i].flags))
551 rw |= REQ_DISCARD; 551 rw |= REQ_DISCARD;
552 } else if (test_and_clear_bit(R5_Wantread, &sh->dev[i].flags)) 552 } else if (test_and_clear_bit(R5_Wantread, &sh->dev[i].flags))
553 rw = READ; 553 rw = READ;
@@ -1172,11 +1172,9 @@ ops_run_biodrain(struct stripe_head *sh, struct dma_async_tx_descriptor *tx)
1172 set_bit(R5_WantFUA, &dev->flags); 1172 set_bit(R5_WantFUA, &dev->flags);
1173 if (wbi->bi_rw & REQ_SYNC) 1173 if (wbi->bi_rw & REQ_SYNC)
1174 set_bit(R5_SyncIO, &dev->flags); 1174 set_bit(R5_SyncIO, &dev->flags);
1175 if (wbi->bi_rw & REQ_DISCARD) { 1175 if (wbi->bi_rw & REQ_DISCARD)
1176 memset(page_address(dev->page), 0,
1177 STRIPE_SECTORS << 9);
1178 set_bit(R5_Discard, &dev->flags); 1176 set_bit(R5_Discard, &dev->flags);
1179 } else 1177 else
1180 tx = async_copy_data(1, wbi, dev->page, 1178 tx = async_copy_data(1, wbi, dev->page,
1181 dev->sector, tx); 1179 dev->sector, tx);
1182 wbi = r5_next_bio(wbi, dev->sector); 1180 wbi = r5_next_bio(wbi, dev->sector);
@@ -1194,7 +1192,7 @@ static void ops_complete_reconstruct(void *stripe_head_ref)
1194 int pd_idx = sh->pd_idx; 1192 int pd_idx = sh->pd_idx;
1195 int qd_idx = sh->qd_idx; 1193 int qd_idx = sh->qd_idx;
1196 int i; 1194 int i;
1197 bool fua = false, sync = false; 1195 bool fua = false, sync = false, discard = false;
1198 1196
1199 pr_debug("%s: stripe %llu\n", __func__, 1197 pr_debug("%s: stripe %llu\n", __func__,
1200 (unsigned long long)sh->sector); 1198 (unsigned long long)sh->sector);
@@ -1202,13 +1200,15 @@ static void ops_complete_reconstruct(void *stripe_head_ref)
1202 for (i = disks; i--; ) { 1200 for (i = disks; i--; ) {
1203 fua |= test_bit(R5_WantFUA, &sh->dev[i].flags); 1201 fua |= test_bit(R5_WantFUA, &sh->dev[i].flags);
1204 sync |= test_bit(R5_SyncIO, &sh->dev[i].flags); 1202 sync |= test_bit(R5_SyncIO, &sh->dev[i].flags);
1203 discard |= test_bit(R5_Discard, &sh->dev[i].flags);
1205 } 1204 }
1206 1205
1207 for (i = disks; i--; ) { 1206 for (i = disks; i--; ) {
1208 struct r5dev *dev = &sh->dev[i]; 1207 struct r5dev *dev = &sh->dev[i];
1209 1208
1210 if (dev->written || i == pd_idx || i == qd_idx) { 1209 if (dev->written || i == pd_idx || i == qd_idx) {
1211 set_bit(R5_UPTODATE, &dev->flags); 1210 if (!discard)
1211 set_bit(R5_UPTODATE, &dev->flags);
1212 if (fua) 1212 if (fua)
1213 set_bit(R5_WantFUA, &dev->flags); 1213 set_bit(R5_WantFUA, &dev->flags);
1214 if (sync) 1214 if (sync)
@@ -1252,8 +1252,6 @@ ops_run_reconstruct5(struct stripe_head *sh, struct raid5_percpu *percpu,
1252 } 1252 }
1253 if (i >= sh->disks) { 1253 if (i >= sh->disks) {
1254 atomic_inc(&sh->count); 1254 atomic_inc(&sh->count);
1255 memset(page_address(sh->dev[pd_idx].page), 0,
1256 STRIPE_SECTORS << 9);
1257 set_bit(R5_Discard, &sh->dev[pd_idx].flags); 1255 set_bit(R5_Discard, &sh->dev[pd_idx].flags);
1258 ops_complete_reconstruct(sh); 1256 ops_complete_reconstruct(sh);
1259 return; 1257 return;
@@ -1314,10 +1312,6 @@ ops_run_reconstruct6(struct stripe_head *sh, struct raid5_percpu *percpu,
1314 } 1312 }
1315 if (i >= sh->disks) { 1313 if (i >= sh->disks) {
1316 atomic_inc(&sh->count); 1314 atomic_inc(&sh->count);
1317 memset(page_address(sh->dev[sh->pd_idx].page), 0,
1318 STRIPE_SECTORS << 9);
1319 memset(page_address(sh->dev[sh->qd_idx].page), 0,
1320 STRIPE_SECTORS << 9);
1321 set_bit(R5_Discard, &sh->dev[sh->pd_idx].flags); 1315 set_bit(R5_Discard, &sh->dev[sh->pd_idx].flags);
1322 set_bit(R5_Discard, &sh->dev[sh->qd_idx].flags); 1316 set_bit(R5_Discard, &sh->dev[sh->qd_idx].flags);
1323 ops_complete_reconstruct(sh); 1317 ops_complete_reconstruct(sh);
@@ -2775,7 +2769,8 @@ static void handle_stripe_clean_event(struct r5conf *conf,
2775 if (sh->dev[i].written) { 2769 if (sh->dev[i].written) {
2776 dev = &sh->dev[i]; 2770 dev = &sh->dev[i];
2777 if (!test_bit(R5_LOCKED, &dev->flags) && 2771 if (!test_bit(R5_LOCKED, &dev->flags) &&
2778 test_bit(R5_UPTODATE, &dev->flags)) { 2772 (test_bit(R5_UPTODATE, &dev->flags) ||
2773 test_and_clear_bit(R5_Discard, &dev->flags))) {
2779 /* We can return any write requests */ 2774 /* We can return any write requests */
2780 struct bio *wbi, *wbi2; 2775 struct bio *wbi, *wbi2;
2781 pr_debug("Return write for disc %d\n", i); 2776 pr_debug("Return write for disc %d\n", i);
@@ -3493,10 +3488,12 @@ static void handle_stripe(struct stripe_head *sh)
3493 if (s.written && 3488 if (s.written &&
3494 (s.p_failed || ((test_bit(R5_Insync, &pdev->flags) 3489 (s.p_failed || ((test_bit(R5_Insync, &pdev->flags)
3495 && !test_bit(R5_LOCKED, &pdev->flags) 3490 && !test_bit(R5_LOCKED, &pdev->flags)
3496 && test_bit(R5_UPTODATE, &pdev->flags)))) && 3491 && (test_bit(R5_UPTODATE, &pdev->flags) ||
3492 test_bit(R5_Discard, &pdev->flags))))) &&
3497 (s.q_failed || ((test_bit(R5_Insync, &qdev->flags) 3493 (s.q_failed || ((test_bit(R5_Insync, &qdev->flags)
3498 && !test_bit(R5_LOCKED, &qdev->flags) 3494 && !test_bit(R5_LOCKED, &qdev->flags)
3499 && test_bit(R5_UPTODATE, &qdev->flags))))) 3495 && (test_bit(R5_UPTODATE, &qdev->flags) ||
3496 test_bit(R5_Discard, &qdev->flags))))))
3500 handle_stripe_clean_event(conf, sh, disks, &s.return_bi); 3497 handle_stripe_clean_event(conf, sh, disks, &s.return_bi);
3501 3498
3502 /* Now we might consider reading some blocks, either to check/generate 3499 /* Now we might consider reading some blocks, either to check/generate
@@ -3523,9 +3520,11 @@ static void handle_stripe(struct stripe_head *sh)
3523 /* All the 'written' buffers and the parity block are ready to 3520 /* All the 'written' buffers and the parity block are ready to
3524 * be written back to disk 3521 * be written back to disk
3525 */ 3522 */
3526 BUG_ON(!test_bit(R5_UPTODATE, &sh->dev[sh->pd_idx].flags)); 3523 BUG_ON(!test_bit(R5_UPTODATE, &sh->dev[sh->pd_idx].flags) &&
3524 !test_bit(R5_Discard, &sh->dev[sh->pd_idx].flags));
3527 BUG_ON(sh->qd_idx >= 0 && 3525 BUG_ON(sh->qd_idx >= 0 &&
3528 !test_bit(R5_UPTODATE, &sh->dev[sh->qd_idx].flags)); 3526 !test_bit(R5_UPTODATE, &sh->dev[sh->qd_idx].flags) &&
3527 !test_bit(R5_Discard, &sh->dev[sh->qd_idx].flags));
3529 for (i = disks; i--; ) { 3528 for (i = disks; i--; ) {
3530 struct r5dev *dev = &sh->dev[i]; 3529 struct r5dev *dev = &sh->dev[i];
3531 if (test_bit(R5_LOCKED, &dev->flags) && 3530 if (test_bit(R5_LOCKED, &dev->flags) &&