Commit 518a4d53 authored by Philipp Reisner's avatar Philipp Reisner

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: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent fd0017c1
...@@ -695,11 +695,15 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size, ...@@ -695,11 +695,15 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size,
(unsigned long long)sector, size); (unsigned long long)sector, size);
return; return;
} }
if (!get_ldev(mdev))
return; /* no disk, no metadata, no bitmap to clear bits in */
nr_sectors = drbd_get_capacity(mdev->this_bdev); nr_sectors = drbd_get_capacity(mdev->this_bdev);
esector = sector + (size >> 9) - 1; esector = sector + (size >> 9) - 1;
if (!expect(sector < nr_sectors)) if (!expect(sector < nr_sectors))
return; goto out;
if (!expect(esector < nr_sectors)) if (!expect(esector < nr_sectors))
esector = nr_sectors - 1; esector = nr_sectors - 1;
...@@ -709,7 +713,7 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size, ...@@ -709,7 +713,7 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size,
* round up start sector, round down end sector. we make sure we only * round up start sector, round down end sector. we make sure we only
* clear full, aligned, BM_BLOCK_SIZE (4K) blocks */ * clear full, aligned, BM_BLOCK_SIZE (4K) blocks */
if (unlikely(esector < BM_SECT_PER_BIT-1)) if (unlikely(esector < BM_SECT_PER_BIT-1))
return; goto out;
if (unlikely(esector == (nr_sectors-1))) if (unlikely(esector == (nr_sectors-1)))
ebnr = lbnr; ebnr = lbnr;
else else
...@@ -717,14 +721,14 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size, ...@@ -717,14 +721,14 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size,
sbnr = BM_SECT_TO_BIT(sector + BM_SECT_PER_BIT-1); sbnr = BM_SECT_TO_BIT(sector + BM_SECT_PER_BIT-1);
if (sbnr > ebnr) if (sbnr > ebnr)
return; goto out;
/* /*
* ok, (capacity & 7) != 0 sometimes, but who cares... * ok, (capacity & 7) != 0 sometimes, but who cares...
* we count rs_{total,left} in bits, not sectors. * we count rs_{total,left} in bits, not sectors.
*/ */
count = drbd_bm_clear_bits(mdev, sbnr, ebnr); count = drbd_bm_clear_bits(mdev, sbnr, ebnr);
if (count && get_ldev(mdev)) { if (count) {
drbd_advance_rs_marks(mdev, drbd_bm_total_weight(mdev)); drbd_advance_rs_marks(mdev, drbd_bm_total_weight(mdev));
spin_lock_irqsave(&mdev->al_lock, flags); spin_lock_irqsave(&mdev->al_lock, flags);
drbd_try_clear_on_disk_bm(mdev, sector, count, true); 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,8 +737,9 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size,
/* just wake_up unconditional now, various lc_chaged(), /* just wake_up unconditional now, various lc_chaged(),
* lc_put() in drbd_try_clear_on_disk_bm(). */ * lc_put() in drbd_try_clear_on_disk_bm(). */
wake_up = 1; wake_up = 1;
put_ldev(mdev);
} }
out:
put_ldev(mdev);
if (wake_up) if (wake_up)
wake_up(&mdev->al_wait); wake_up(&mdev->al_wait);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment