From 59638a164abe5fc9bb68450ea71dd9e17534f0b4 Mon Sep 17 00:00:00 2001 From: Simon P. Graham Date: Thu, 24 Jan 2008 18:09:19 -0500 Subject: [PATCH] Make sure we dont set CREATE_BARRIER flag when connection is not active, otherwise we can send up sending a barrier when we shouldn't when reconnected. --- drbd/drbd_main.c | 5 +++++ drbd/drbd_nl.c | 2 +- drbd/drbd_receiver.c | 4 ++++ drbd/drbd_req.c | 3 ++- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c index c74e442..6e4c5f8 100644 --- a/drbd/drbd_main.c +++ b/drbd/drbd_main.c @@ -277,6 +277,7 @@ void tl_clear(drbd_dev *mdev) WARN("tl_clear()\n"); spin_lock_irq(&mdev->req_lock); + b = mdev->oldest_barrier; while ( b ) { struct list_head *le, *tle; @@ -310,6 +311,10 @@ void tl_clear(drbd_dev *mdev) } D_ASSERT(mdev->newest_barrier == mdev->oldest_barrier); D_ASSERT(mdev->newest_barrier->br_number == 4711); + + // ensure bit indicating barrier is required is clear + clear_bit(CREATE_BARRIER, &mdev->flags); + spin_unlock_irq(&mdev->req_lock); } diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c index 01a2f6d..5c038f3 100644 --- a/drbd/drbd_nl.c +++ b/drbd/drbd_nl.c @@ -1787,7 +1787,7 @@ void drbd_bcast_split_brain(drbd_dev *mdev,int flag) *tl++ = T_split_brain; *tl++ = sizeof(int); - memcpy(tl, &val, sizeof(int)); + memcpy(tl, &val, sizeof(int)); tl=(unsigned short*)((char*)tl + sizeof(int)); *tl++ = TT_END; /* Close the tag list */ diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c index 17cb99d..447b52f 100644 --- a/drbd/drbd_receiver.c +++ b/drbd/drbd_receiver.c @@ -718,6 +718,10 @@ int drbd_connect(drbd_dev *mdev) D_ASSERT(!mdev->data.socket); + if (test_and_clear_bit(CREATE_BARRIER,&mdev->flags)) { + ERR("CREATE_BARRIER flag was set in drbd_connect - now cleared!\n"); + } + if (drbd_request_state(mdev,NS(conn,WFConnection)) < SS_Success ) return -2; diff --git a/drbd/drbd_req.c b/drbd/drbd_req.c index 3ff7c32..b4981ab 100644 --- a/drbd/drbd_req.c +++ b/drbd/drbd_req.c @@ -210,7 +210,8 @@ static void _about_to_complete_local_write(drbd_dev *mdev, drbd_request_t *req) /* before we can signal completion to the upper layers, * we may need to close the current epoch */ - if (req->epoch == mdev->newest_barrier->br_number) + if (mdev->state.conn >= Connected && + req->epoch == mdev->newest_barrier->br_number) queue_barrier(mdev); /* we need to do the conflict detection stuff, -- 1.5.4.rc1