drbd: fix regression, we need to close drbd epochs during normal operation
authorLars Ellenberg <lars.ellenberg@linbit.com>
Sun, 5 Dec 2010 13:11:14 +0000 (14:11 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 10 Mar 2011 10:35:20 +0000 (11:35 +0100)
commit e2041475e6ddb081734d161f6421977323f5a9b9
drbd: Starting with protocol 96 we can allow app-IO while receiving the bitmap

Contained a bad chunk that tried to optimize away drbd barriers during
bitmap exchange, but accidentally dropped them for normal mode as well.

Impact: depending on activity log size and access pattern, activity log
extents may not be recycled in time, causeing IO to block indefinetely.

Fix: skip drbd barriers only if there is no connection to send them on,
or the request being completed has not been on the network at all.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_req.c

index 4cb8247d83c919e7ea08a91f21aa36affc86bf7a..de5fe70f2b420761d440d25518712775276920c6 100644 (file)
@@ -140,9 +140,14 @@ static void _about_to_complete_local_write(struct drbd_conf *mdev,
        struct hlist_node *n;
        struct hlist_head *slot;
 
-       /* before we can signal completion to the upper layers,
-        * we may need to close the current epoch */
-       if (mdev->state.conn >= C_WF_BITMAP_T && mdev->state.conn < C_AHEAD &&
+       /* Before we can signal completion to the upper layers,
+        * we may need to close the current epoch.
+        * We can skip this, if this request has not even been sent, because we
+        * did not have a fully established connection yet/anymore, during
+        * bitmap exchange, or while we are C_AHEAD due to congestion policy.
+        */
+       if (mdev->state.conn >= C_CONNECTED &&
+           (s & RQ_NET_SENT) != 0 &&
            req->epoch == mdev->newest_tle->br_number)
                queue_barrier(mdev);