]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/md/bitmap.c
md/bitmap: record the space available for the bitmap in the superblock.
[karo-tx-linux.git] / drivers / md / bitmap.c
index 8f681da00277aa262322f8a31f62186efcae58d7..15dbe03117e473da9ce6166b6978b7f496b7bc2a 100644 (file)
@@ -423,6 +423,8 @@ void bitmap_update_sb(struct bitmap *bitmap)
        /* This might have been changed by a reshape */
        sb->sync_size = cpu_to_le64(bitmap->mddev->resync_max_sectors);
        sb->chunksize = cpu_to_le32(bitmap->mddev->bitmap_info.chunksize);
+       sb->sectors_reserved = cpu_to_le32(bitmap->mddev->
+                                          bitmap_info.space);
        kunmap_atomic(sb);
        write_page(bitmap, bitmap->storage.sb_page, 1);
 }
@@ -536,6 +538,7 @@ static int bitmap_read_sb(struct bitmap *bitmap)
        bitmap_super_t *sb;
        unsigned long chunksize, daemon_sleep, write_behind;
        unsigned long long events;
+       unsigned long sectors_reserved = 0;
        int err = -EINVAL;
        struct page *sb_page;
 
@@ -573,6 +576,7 @@ static int bitmap_read_sb(struct bitmap *bitmap)
        chunksize = le32_to_cpu(sb->chunksize);
        daemon_sleep = le32_to_cpu(sb->daemon_sleep) * HZ;
        write_behind = le32_to_cpu(sb->write_behind);
+       sectors_reserved = le32_to_cpu(sb->sectors_reserved);
 
        /* verify that the bitmap-specific fields are valid */
        if (sb->magic != cpu_to_le32(BITMAP_MAGIC))
@@ -633,6 +637,9 @@ out_no_sb:
        bitmap->mddev->bitmap_info.chunksize = chunksize;
        bitmap->mddev->bitmap_info.daemon_sleep = daemon_sleep;
        bitmap->mddev->bitmap_info.max_write_behind = write_behind;
+       if (bitmap->mddev->bitmap_info.space == 0 ||
+           bitmap->mddev->bitmap_info.space > sectors_reserved)
+               bitmap->mddev->bitmap_info.space = sectors_reserved;
        if (err)
                bitmap_print_sb(bitmap);
        return err;