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);
|
||||
sector = mdev->ldev->md.md_offset;
|
||||
|
||||
if (drbd_md_sync_page_io(mdev, mdev->ldev, sector, WRITE)) {
|
||||
clear_bit(MD_DIRTY, &mdev->flags);
|
||||
} else {
|
||||
if (!drbd_md_sync_page_io(mdev, mdev->ldev, sector, WRITE)) {
|
||||
/* this was a try anyways ... */
|
||||
dev_err(DEV, "meta data update failed!\n");
|
||||
|
||||
drbd_chk_io_error(mdev, 1, TRUE);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue