aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2008-06-27 18:31:58 -0400
committerNeil Brown <neilb@notabene.brown>2008-06-27 18:31:58 -0400
commit83de75cc92be599850e5ef3928e07cd840833499 (patch)
tree19995f66767debc27bf207ad1ec73280c31ca8fc /drivers
parentecc65c9b3f9b9d740a5deade3d85b39be56401b6 (diff)
md: replace STRIPE_OP_BIOFILL with STRIPE_BIOFILL_RUN
From: Dan Williams <dan.j.williams@intel.com> Track the state of read operations (copying data from the stripe cache to bio buffers outside the lock) with a state flag. Reduce the scope of the STRIPE_OP_BIOFILL flag to only tracking whether a biofill operation has been requested via the ops_request field of struct stripe_head_state. This is another step towards the removal of ops.{pending,ack,complete,count}, i.e. STRIPE_OP_BIOFILL only requests an operation and does not track the state of the operation. Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Neil Brown <neilb@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/md/raid5.c33
1 files changed, 12 insertions, 21 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 544e1600f208..b9c0a32a4f95 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -523,38 +523,34 @@ static void ops_complete_biofill(void *stripe_head_ref)
523 (unsigned long long)sh->sector); 523 (unsigned long long)sh->sector);
524 524
525 /* clear completed biofills */ 525 /* clear completed biofills */
526 spin_lock_irq(&conf->device_lock);
526 for (i = sh->disks; i--; ) { 527 for (i = sh->disks; i--; ) {
527 struct r5dev *dev = &sh->dev[i]; 528 struct r5dev *dev = &sh->dev[i];
528 529
529 /* acknowledge completion of a biofill operation */ 530 /* acknowledge completion of a biofill operation */
530 /* and check if we need to reply to a read request, 531 /* and check if we need to reply to a read request,
531 * new R5_Wantfill requests are held off until 532 * new R5_Wantfill requests are held off until
532 * !test_bit(STRIPE_OP_BIOFILL, &sh->ops.pending) 533 * !STRIPE_BIOFILL_RUN
533 */ 534 */
534 if (test_and_clear_bit(R5_Wantfill, &dev->flags)) { 535 if (test_and_clear_bit(R5_Wantfill, &dev->flags)) {
535 struct bio *rbi, *rbi2; 536 struct bio *rbi, *rbi2;
536 537
537 /* The access to dev->read is outside of the
538 * spin_lock_irq(&conf->device_lock), but is protected
539 * by the STRIPE_OP_BIOFILL pending bit
540 */
541 BUG_ON(!dev->read); 538 BUG_ON(!dev->read);
542 rbi = dev->read; 539 rbi = dev->read;
543 dev->read = NULL; 540 dev->read = NULL;
544 while (rbi && rbi->bi_sector < 541 while (rbi && rbi->bi_sector <
545 dev->sector + STRIPE_SECTORS) { 542 dev->sector + STRIPE_SECTORS) {
546 rbi2 = r5_next_bio(rbi, dev->sector); 543 rbi2 = r5_next_bio(rbi, dev->sector);
547 spin_lock_irq(&conf->device_lock);
548 if (--rbi->bi_phys_segments == 0) { 544 if (--rbi->bi_phys_segments == 0) {
549 rbi->bi_next = return_bi; 545 rbi->bi_next = return_bi;
550 return_bi = rbi; 546 return_bi = rbi;
551 } 547 }
552 spin_unlock_irq(&conf->device_lock);
553 rbi = rbi2; 548 rbi = rbi2;
554 } 549 }
555 } 550 }
556 } 551 }
557 set_bit(STRIPE_OP_BIOFILL, &sh->ops.complete); 552 spin_unlock_irq(&conf->device_lock);
553 clear_bit(STRIPE_BIOFILL_RUN, &sh->state);
558 554
559 return_io(return_bi); 555 return_io(return_bi);
560 556
@@ -880,7 +876,7 @@ static void raid5_run_ops(struct stripe_head *sh, unsigned long pending,
880 int overlap_clear = 0, i, disks = sh->disks; 876 int overlap_clear = 0, i, disks = sh->disks;
881 struct dma_async_tx_descriptor *tx = NULL; 877 struct dma_async_tx_descriptor *tx = NULL;
882 878
883 if (test_bit(STRIPE_OP_BIOFILL, &pending)) { 879 if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) {
884 ops_run_biofill(sh); 880 ops_run_biofill(sh);
885 overlap_clear++; 881 overlap_clear++;
886 } 882 }
@@ -2630,15 +2626,8 @@ static void handle_stripe5(struct stripe_head *sh)
2630 s.syncing = test_bit(STRIPE_SYNCING, &sh->state); 2626 s.syncing = test_bit(STRIPE_SYNCING, &sh->state);
2631 s.expanding = test_bit(STRIPE_EXPAND_SOURCE, &sh->state); 2627 s.expanding = test_bit(STRIPE_EXPAND_SOURCE, &sh->state);
2632 s.expanded = test_bit(STRIPE_EXPAND_READY, &sh->state); 2628 s.expanded = test_bit(STRIPE_EXPAND_READY, &sh->state);
2633 /* Now to look around and see what can be done */
2634
2635 /* clean-up completed biofill operations */
2636 if (test_bit(STRIPE_OP_BIOFILL, &sh->ops.complete)) {
2637 clear_bit(STRIPE_OP_BIOFILL, &sh->ops.pending);
2638 clear_bit(STRIPE_OP_BIOFILL, &sh->ops.ack);
2639 clear_bit(STRIPE_OP_BIOFILL, &sh->ops.complete);
2640 }
2641 2629
2630 /* Now to look around and see what can be done */
2642 rcu_read_lock(); 2631 rcu_read_lock();
2643 for (i=disks; i--; ) { 2632 for (i=disks; i--; ) {
2644 mdk_rdev_t *rdev; 2633 mdk_rdev_t *rdev;
@@ -2652,10 +2641,10 @@ static void handle_stripe5(struct stripe_head *sh)
2652 /* maybe we can request a biofill operation 2641 /* maybe we can request a biofill operation
2653 * 2642 *
2654 * new wantfill requests are only permitted while 2643 * new wantfill requests are only permitted while
2655 * STRIPE_OP_BIOFILL is clear 2644 * ops_complete_biofill is guaranteed to be inactive
2656 */ 2645 */
2657 if (test_bit(R5_UPTODATE, &dev->flags) && dev->toread && 2646 if (test_bit(R5_UPTODATE, &dev->flags) && dev->toread &&
2658 !test_bit(STRIPE_OP_BIOFILL, &sh->ops.pending)) 2647 !test_bit(STRIPE_BIOFILL_RUN, &sh->state))
2659 set_bit(R5_Wantfill, &dev->flags); 2648 set_bit(R5_Wantfill, &dev->flags);
2660 2649
2661 /* now count some things */ 2650 /* now count some things */
@@ -2699,8 +2688,10 @@ static void handle_stripe5(struct stripe_head *sh)
2699 goto unlock; 2688 goto unlock;
2700 } 2689 }
2701 2690
2702 if (s.to_fill && !test_and_set_bit(STRIPE_OP_BIOFILL, &sh->ops.pending)) 2691 if (s.to_fill && !test_bit(STRIPE_BIOFILL_RUN, &sh->state)) {
2703 sh->ops.count++; 2692 set_bit(STRIPE_OP_BIOFILL, &s.ops_request);
2693 set_bit(STRIPE_BIOFILL_RUN, &sh->state);
2694 }
2704 2695
2705 pr_debug("locked=%d uptodate=%d to_read=%d" 2696 pr_debug("locked=%d uptodate=%d to_read=%d"
2706 " to_write=%d failed=%d failed_num=%d\n", 2697 " to_write=%d failed=%d failed_num=%d\n",