drbd: Fix adding of new minors with freshly created meta data
authorPhilipp Reisner <philipp.reisner@linbit.com>
Wed, 23 Oct 2013 08:59:17 +0000 (10:59 +0200)
committerJens Axboe <axboe@kernel.dk>
Fri, 8 Nov 2013 16:10:28 +0000 (09:10 -0700)
Online adding of new minors with freshly created meta data
to an resource with an established connection failed, with a
wrong state transition on one side on one side of the new minor.

Freshly created meta-data has a la_size (last agreed size) of 0.
When we online add such devices, the code wrongly got into
the code path for resyncing new storage that was added while
the disk was detached.

Fixed that by making the GREW from ZERO a special case.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/drbd/drbd_int.h
drivers/block/drbd/drbd_nl.c

index 2d7f608d181ce8cf2eb26ab3859dcccb0ec38474..0e06f0c5dd1e60d8d4a4656160f23ed0d6f4cde1 100644 (file)
@@ -1474,7 +1474,8 @@ enum determine_dev_size {
        DS_ERROR = -1,
        DS_UNCHANGED = 0,
        DS_SHRUNK = 1,
-       DS_GREW = 2
+       DS_GREW = 2,
+       DS_GREW_FROM_ZERO = 3,
 };
 extern enum determine_dev_size
 drbd_determine_dev_size(struct drbd_conf *, enum dds_flags, struct resize_parms *) __must_hold(local);
index 8cc1e640f485b4620ff39d8f3de915d36a38487e..37dad18ba153a8ec1004fc3ac1c7e84e979d1f56 100644 (file)
@@ -955,7 +955,7 @@ drbd_determine_dev_size(struct drbd_conf *mdev, enum dds_flags flags, struct res
        }
 
        if (size > la_size_sect)
-               rv = DS_GREW;
+               rv = la_size_sect ? DS_GREW : DS_GREW_FROM_ZERO;
        if (size < la_size_sect)
                rv = DS_SHRUNK;