diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/md/md-bitmap.c | 9 | 
1 files changed, 6 insertions, 3 deletions
| diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 9672f75c3050..a4976ceae868 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -234,7 +234,8 @@ static int __write_sb_page(struct md_rdev *rdev, struct bitmap *bitmap,  	sector_t doff;  	bdev = (rdev->meta_bdev) ? rdev->meta_bdev : rdev->bdev; -	if (pg_index == store->file_pages - 1) { +	/* we compare length (page numbers), not page offset. */ +	if ((pg_index - store->sb_index) == store->file_pages - 1) {  		unsigned int last_page_size = store->bytes & (PAGE_SIZE - 1);  		if (last_page_size == 0) @@ -438,8 +439,8 @@ static void filemap_write_page(struct bitmap *bitmap, unsigned long pg_index,  	struct page *page = store->filemap[pg_index];  	if (mddev_is_clustered(bitmap->mddev)) { -		pg_index += bitmap->cluster_slot * -			DIV_ROUND_UP(store->bytes, PAGE_SIZE); +		/* go to node bitmap area starting point */ +		pg_index += store->sb_index;  	}  	if (store->file) @@ -952,6 +953,7 @@ static void md_bitmap_file_set_bit(struct bitmap *bitmap, sector_t block)  	unsigned long index = file_page_index(store, chunk);  	unsigned long node_offset = 0; +	index += store->sb_index;  	if (mddev_is_clustered(bitmap->mddev))  		node_offset = bitmap->cluster_slot * store->file_pages; @@ -982,6 +984,7 @@ static void md_bitmap_file_clear_bit(struct bitmap *bitmap, sector_t block)  	unsigned long index = file_page_index(store, chunk);  	unsigned long node_offset = 0; +	index += store->sb_index;  	if (mddev_is_clustered(bitmap->mddev))  		node_offset = bitmap->cluster_slot * store->file_pages; | 
