aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2012-10-19 08:21:22 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-09 08:11:42 -0500
commit518a4d53b2985451a08cb4e5b79deacfe151a38a (patch)
treea2bbe91f62459f474417c1485912b1da7beaed10
parentfd0017c1243b2b9058525672b9ea13272fb51b30 (diff)
drbd: don't try to clear bits once the disk has failed
If the disk has failed already, there is no point trying to change the bitmap. drbd_set_out_of_sync() already had this safeguard, time to add it to drbd_set_in_sync() as well. This also prevents some warning messages, like FIXME asender in bm_change_bits_to, bitmap locked for 'detach' by worker if our disk fails during resync, while there are some resync acks queued up. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
-rw-r--r--drivers/block/drbd/drbd_actlog.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c
index bc6284ef21d5..92510f8ad013 100644
--- a/drivers/block/drbd/drbd_actlog.c
+++ b/drivers/block/drbd/drbd_actlog.c
@@ -695,11 +695,15 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size,
695 (unsigned long long)sector, size); 695 (unsigned long long)sector, size);
696 return; 696 return;
697 } 697 }
698
699 if (!get_ldev(mdev))
700 return; /* no disk, no metadata, no bitmap to clear bits in */
701
698 nr_sectors = drbd_get_capacity(mdev->this_bdev); 702 nr_sectors = drbd_get_capacity(mdev->this_bdev);
699 esector = sector + (size >> 9) - 1; 703 esector = sector + (size >> 9) - 1;
700 704
701 if (!expect(sector < nr_sectors)) 705 if (!expect(sector < nr_sectors))
702 return; 706 goto out;
703 if (!expect(esector < nr_sectors)) 707 if (!expect(esector < nr_sectors))
704 esector = nr_sectors - 1; 708 esector = nr_sectors - 1;
705 709
@@ -709,7 +713,7 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size,
709 * round up start sector, round down end sector. we make sure we only 713 * round up start sector, round down end sector. we make sure we only
710 * clear full, aligned, BM_BLOCK_SIZE (4K) blocks */ 714 * clear full, aligned, BM_BLOCK_SIZE (4K) blocks */
711 if (unlikely(esector < BM_SECT_PER_BIT-1)) 715 if (unlikely(esector < BM_SECT_PER_BIT-1))
712 return; 716 goto out;
713 if (unlikely(esector == (nr_sectors-1))) 717 if (unlikely(esector == (nr_sectors-1)))
714 ebnr = lbnr; 718 ebnr = lbnr;
715 else 719 else
@@ -717,14 +721,14 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size,
717 sbnr = BM_SECT_TO_BIT(sector + BM_SECT_PER_BIT-1); 721 sbnr = BM_SECT_TO_BIT(sector + BM_SECT_PER_BIT-1);
718 722
719 if (sbnr > ebnr) 723 if (sbnr > ebnr)
720 return; 724 goto out;
721 725
722 /* 726 /*
723 * ok, (capacity & 7) != 0 sometimes, but who cares... 727 * ok, (capacity & 7) != 0 sometimes, but who cares...
724 * we count rs_{total,left} in bits, not sectors. 728 * we count rs_{total,left} in bits, not sectors.
725 */ 729 */
726 count = drbd_bm_clear_bits(mdev, sbnr, ebnr); 730 count = drbd_bm_clear_bits(mdev, sbnr, ebnr);
727 if (count && get_ldev(mdev)) { 731 if (count) {
728 drbd_advance_rs_marks(mdev, drbd_bm_total_weight(mdev)); 732 drbd_advance_rs_marks(mdev, drbd_bm_total_weight(mdev));
729 spin_lock_irqsave(&mdev->al_lock, flags); 733 spin_lock_irqsave(&mdev->al_lock, flags);
730 drbd_try_clear_on_disk_bm(mdev, sector, count, true); 734 drbd_try_clear_on_disk_bm(mdev, sector, count, true);
@@ -733,8 +737,9 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size,
733 /* just wake_up unconditional now, various lc_chaged(), 737 /* just wake_up unconditional now, various lc_chaged(),
734 * lc_put() in drbd_try_clear_on_disk_bm(). */ 738 * lc_put() in drbd_try_clear_on_disk_bm(). */
735 wake_up = 1; 739 wake_up = 1;
736 put_ldev(mdev);
737 } 740 }
741out:
742 put_ldev(mdev);
738 if (wake_up) 743 if (wake_up)
739 wake_up(&mdev->al_wait); 744 wake_up(&mdev->al_wait);
740} 745}