drbd: fix race on meta-data update
The race: drbd_md_mark_dirty() drbd_md_sync() if (!test_and_clear_bit(MD_DIRTY, &mdev->flags)) return; drbd_md_sync_page_io(mdev, mdev->ldev, sector, WRITE) ==> RACE clear_bit(MD_DIRTY, &mdev->flags); <== spurious Fixed by removing the spurious clear_bit. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
c518d04fde
commit
3f3a9b849d
1 changed files with 1 additions and 4 deletions
|
@ -3446,12 +3446,9 @@ void drbd_md_sync(struct drbd_conf *mdev)
|
||||||
D_ASSERT(drbd_md_ss__(mdev, mdev->ldev) == mdev->ldev->md.md_offset);
|
D_ASSERT(drbd_md_ss__(mdev, mdev->ldev) == mdev->ldev->md.md_offset);
|
||||||
sector = mdev->ldev->md.md_offset;
|
sector = mdev->ldev->md.md_offset;
|
||||||
|
|
||||||
if (drbd_md_sync_page_io(mdev, mdev->ldev, sector, WRITE)) {
|
if (!drbd_md_sync_page_io(mdev, mdev->ldev, sector, WRITE)) {
|
||||||
clear_bit(MD_DIRTY, &mdev->flags);
|
|
||||||
} else {
|
|
||||||
/* this was a try anyways ... */
|
/* this was a try anyways ... */
|
||||||
dev_err(DEV, "meta data update failed!\n");
|
dev_err(DEV, "meta data update failed!\n");
|
||||||
|
|
||||||
drbd_chk_io_error(mdev, 1, TRUE);
|
drbd_chk_io_error(mdev, 1, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue