diff options
-rw-r--r-- | drivers/block/drbd/drbd_actlog.c | 15 |
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 | } |
741 | out: | ||
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 | } |