md/bitmap: store bytes in file rather than just in last page.
authorNeilBrown <neilb@suse.de>
Tue, 22 May 2012 03:55:11 +0000 (13:55 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 22 May 2012 03:55:11 +0000 (13:55 +1000)
This number is more generally useful, and bytes-in-last-page is
easily extracted from it.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/bitmap.c
drivers/md/bitmap.h

index c98f2fee1bd0c7eb7b4d06934047582c0763251a..7a3be0d4103e0bb2d9455148d59dc99736547a71 100644 (file)
@@ -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
index 162ab095b866001d7589328197c43b6e87b9969c..26689260e1794446277eece9b9459733d266ee20 100644 (file)
@@ -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;