drbd: Implemented the set_new_bits parameter for drbd_bm_resize()
authorPhilipp Reisner <philipp.reisner@linbit.com>
Wed, 24 Mar 2010 15:23:03 +0000 (16:23 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Mon, 17 May 2010 23:14:43 +0000 (01:14 +0200)
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_bitmap.c
drivers/block/drbd/drbd_int.h
drivers/block/drbd/drbd_main.c
drivers/block/drbd/drbd_nl.c

index 3390716898d5aaf429b8c08db34cd28ff68ed569..695fb64cba00c49a5c4510153c1bb180e8aed44d 100644 (file)
@@ -441,7 +441,7 @@ static void bm_memset(struct drbd_bitmap *b, size_t offset, int c, size_t len)
  * In case this is actually a resize, we copy the old bitmap into the new one.
  * Otherwise, the bitmap is initialized to all bits set.
  */
-int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity)
+int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity, int set_new_bits)
 {
        struct drbd_bitmap *b = mdev->bitmap;
        unsigned long bits, words, owords, obits, *p_addr, *bm;
@@ -526,8 +526,12 @@ int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity)
        b->bm_dev_capacity = capacity;
 
        if (growing) {
-               bm_memset(b, owords, 0xff, words-owords);
-               b->bm_set += bits - obits;
+               if (set_new_bits) {
+                       bm_memset(b, owords, 0xff, words-owords);
+                       b->bm_set += bits - obits;
+               } else
+                       bm_memset(b, owords, 0x00, words-owords);
+
        }
 
        if (want < have) {
index f5c56f4fd2a3f5bae4201f86a57b28ba27d5a4cb..37a25a6084dd4e588c8ce0c2191ffdf8ac071ded 100644 (file)
@@ -1311,7 +1311,7 @@ struct bm_extent {
 #define APP_R_HSIZE 15
 
 extern int  drbd_bm_init(struct drbd_conf *mdev);
-extern int  drbd_bm_resize(struct drbd_conf *mdev, sector_t sectors);
+extern int  drbd_bm_resize(struct drbd_conf *mdev, sector_t sectors, int set_new_bits);
 extern void drbd_bm_cleanup(struct drbd_conf *mdev);
 extern void drbd_bm_set_all(struct drbd_conf *mdev);
 extern void drbd_bm_clear_all(struct drbd_conf *mdev);
index e181e405e24405707e24984ac54c2d6cc7f4c592..65c2a65d3d64065d09cfd0ad219a07852be8b552 100644 (file)
@@ -2688,7 +2688,7 @@ void drbd_mdev_cleanup(struct drbd_conf *mdev)
        drbd_set_my_capacity(mdev, 0);
        if (mdev->bitmap) {
                /* maybe never allocated. */
-               drbd_bm_resize(mdev, 0);
+               drbd_bm_resize(mdev, 0, 1);
                drbd_bm_cleanup(mdev);
        }
 
index 97abbc2acc5c30a6b0f232e3a28b73de79b7268e..360e506426b0e3b43886ec13eeef000a70bd21c5 100644 (file)
@@ -546,7 +546,7 @@ enum determine_dev_size drbd_determin_dev_size(struct drbd_conf *mdev, enum dds_
        if (drbd_get_capacity(mdev->this_bdev) != size ||
            drbd_bm_capacity(mdev) != size) {
                int err;
-               err = drbd_bm_resize(mdev, size);
+               err = drbd_bm_resize(mdev, size, !(flags & DDSF_NO_RESYNC));
                if (unlikely(err)) {
                        /* currently there is only one error: ENOMEM! */
                        size = drbd_bm_capacity(mdev)>>1;