drbd: fix regression: attach while connected failed
authorLars Ellenberg <lars.ellenberg@linbit.com>
Thu, 1 Apr 2010 13:13:19 +0000 (15:13 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Mon, 17 May 2010 23:06:07 +0000 (01:06 +0200)
commit e4f925e12ea5daaa9baf2dd5af9c4951721dae95
Author: Philipp Reisner <philipp.reisner@linbit.com>
Date:   Wed Mar 17 14:18:41 2010 +0100

    drbd: Do not upgrade state to Outdated if already Inconsistent

prevented the necessary state transition for attaching while connected
(Diskless -> Consistent respectively Outdated).
This is the fix for the fix.

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

index 8f84a9f58c99127cbc62484b2960bb8a1d8cf4a1..b1ce5dc7c60324f8ad7508589573792a6079d59b 100644 (file)
@@ -840,7 +840,12 @@ static union drbd_state sanitize_state(struct drbd_conf *mdev, union drbd_state
                        break;
                case C_WF_BITMAP_S:
                case C_PAUSED_SYNC_S:
-                       ns.pdsk = os.pdsk > D_OUTDATED ? D_OUTDATED : os.pdsk;
+                       /* remap any consistent state to D_OUTDATED,
+                        * but disallow "upgrade" of not even consistent states.
+                        */
+                       ns.pdsk =
+                               (D_DISKLESS < os.pdsk && os.pdsk < D_OUTDATED)
+                               ? os.pdsk : D_OUTDATED;
                        break;
                case C_SYNC_SOURCE:
                        ns.pdsk = D_INCONSISTENT;