|
@@ -479,9 +479,12 @@ static int bitmap_read_sb(struct bitmap *bitmap)
|
|
|
int err = -EINVAL;
|
|
|
|
|
|
/* page 0 is the superblock, read it... */
|
|
|
- if (bitmap->file)
|
|
|
- bitmap->sb_page = read_page(bitmap->file, 0, bitmap, PAGE_SIZE);
|
|
|
- else {
|
|
|
+ if (bitmap->file) {
|
|
|
+ loff_t isize = i_size_read(bitmap->file->f_mapping->host);
|
|
|
+ int bytes = isize > PAGE_SIZE ? PAGE_SIZE : isize;
|
|
|
+
|
|
|
+ bitmap->sb_page = read_page(bitmap->file, 0, bitmap, bytes);
|
|
|
+ } else {
|
|
|
bitmap->sb_page = read_sb_page(bitmap->mddev, bitmap->offset, 0);
|
|
|
}
|
|
|
if (IS_ERR(bitmap->sb_page)) {
|
|
@@ -877,7 +880,8 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
|
|
|
int count;
|
|
|
/* unmap the old page, we're done with it */
|
|
|
if (index == num_pages-1)
|
|
|
- count = bytes - index * PAGE_SIZE;
|
|
|
+ count = bytes + sizeof(bitmap_super_t)
|
|
|
+ - index * PAGE_SIZE;
|
|
|
else
|
|
|
count = PAGE_SIZE;
|
|
|
if (index == 0) {
|