diff options
| author | NeilBrown <neilb@suse.de> | 2012-05-22 13:55:11 +1000 | 
|---|---|---|
| committer | NeilBrown <neilb@suse.de> | 2012-05-22 13:55:11 +1000 | 
| commit | 9b1215c102d4b12f6c815d7fdd35d0628db35b28 (patch) | |
| tree | 52f04de53b1b7302535d66820d9f85b0610b0b1f | |
| parent | 1ec885cdd01a9ad867dbb9fd32a1bfcc0875c486 (diff) | |
md/bitmap: store bytes in file rather than just in last page.
This number is more generally useful, and bytes-in-last-page is
easily extracted from it.
Signed-off-by: NeilBrown <neilb@suse.de>
| -rw-r--r-- | drivers/md/bitmap.c | 16 | ||||
| -rw-r--r-- | drivers/md/bitmap.h | 2 | 
2 files changed, 10 insertions, 8 deletions
| diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index c98f2fee1bd0..7a3be0d4103e 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -203,9 +203,13 @@ static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)  		bdev = (rdev->meta_bdev) ? rdev->meta_bdev : rdev->bdev; -		if (page->index == store->file_pages-1) -			size = roundup(store->last_page_size, +		if (page->index == store->file_pages-1) { +			int last_page_size = store->bytes & (PAGE_SIZE-1); +			if (last_page_size == 0) +				last_page_size = PAGE_SIZE; +			size = roundup(last_page_size,  				       bdev_logical_block_size(bdev)); +		}  		/* Just make sure we aren't corrupting data or  		 * metadata  		 */ @@ -973,6 +977,8 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)  	if (!bitmap->mddev->bitmap_info.external)  		bytes += sizeof(bitmap_super_t); +	store->bytes = bytes; +  	num_pages = DIV_ROUND_UP(bytes, PAGE_SIZE);  	if (file && i_size_read(file->f_mapping->host) < bytes) { @@ -1042,8 +1048,6 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)  			oldindex = index; -			store->last_page_size = count; -  			if (outofdate) {  				/*  				 * if bitmap is out of date, dirty the @@ -1965,9 +1969,7 @@ space_store(struct mddev *mddev, const char *buf, size_t len)  		return -EINVAL;  	if (mddev->bitmap && -	    sectors  < ((mddev->bitmap->storage.file_pages - 1) -			      * PAGE_SIZE -			+ mddev->bitmap->storage.last_page_size + 511) >> 9) +	    sectors < (mddev->bitmap->storage.bytes + 511) >> 9)  		return -EFBIG; /* Bitmap is too big for this small space */  	/* could make sure it isn't too big, but that isn't really diff --git a/drivers/md/bitmap.h b/drivers/md/bitmap.h index 162ab095b866..26689260e179 100644 --- a/drivers/md/bitmap.h +++ b/drivers/md/bitmap.h @@ -197,7 +197,7 @@ struct bitmap {  		unsigned long *filemap_attr;	/* attributes associated  						 * w/ filemap pages */  		unsigned long file_pages;	/* number of pages in the file*/ -		int last_page_size;		/* bytes in the last page */ +		unsigned long bytes;		/* total bytes in the bitmap */  	} storage;  	unsigned long flags; | 
