summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-05-22 13:55:11 +1000
committerNeilBrown <neilb@suse.de>2012-05-22 13:55:11 +1000
commit9b1215c102d4b12f6c815d7fdd35d0628db35b28 (patch)
tree52f04de53b1b7302535d66820d9f85b0610b0b1f
parent1ec885cdd01a9ad867dbb9fd32a1bfcc0875c486 (diff)
downloadlinux-9b1215c102d4b12f6c815d7fdd35d0628db35b28.tar.gz
linux-9b1215c102d4b12f6c815d7fdd35d0628db35b28.tar.bz2
linux-9b1215c102d4b12f6c815d7fdd35d0628db35b28.zip
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.c16
-rw-r--r--drivers/md/bitmap.h2
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;