drbd: also bump UUIDs if a diskless primary connects
authorLars Ellenberg <lars.ellenberg@linbit.com>
Thu, 19 Feb 2015 13:01:50 +0000 (14:01 +0100)
committerJens Axboe <axboe@fb.com>
Wed, 25 Nov 2015 16:22:01 +0000 (09:22 -0700)
If for some reason the primary lost its disk *and* the replication link
before it is able to communicate the disk loss, probably blocked IO,
then later is able to re-establish the connection, the peer needs to
bump its UUIDs just like it does when peer only loses the disk
and is able to communicate this in time.

Otherwise, a later re-attach of the disk on the primary may start a
resync in the "wrong" direction.

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

index bc4b45bf9ace9aee6bccce2dfb16c0311e8d6b3b..06afd4df1b7b5a656740a50a63e5f7158abc5141 100644 (file)
@@ -1781,7 +1781,7 @@ static void after_state_ch(struct drbd_device *device, union drbd_state os,
        }
 
        if (ns.pdsk < D_INCONSISTENT && get_ldev(device)) {
-               if (os.peer == R_SECONDARY && ns.peer == R_PRIMARY &&
+               if (os.peer != R_PRIMARY && ns.peer == R_PRIMARY &&
                    device->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) {
                        drbd_uuid_new_current(device);
                        drbd_send_uuids(peer_device);