diff options
Diffstat (limited to 'drivers/md/bitmap.c')
| -rw-r--r-- | drivers/md/bitmap.c | 7 | 
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 8f681da0027..15dbe03117e 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -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;  |