|
@@ -255,19 +255,25 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde
|
|
|
|
|
|
}
|
|
|
|
|
|
-static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait)
|
|
|
+static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
|
|
|
{
|
|
|
mdk_rdev_t *rdev;
|
|
|
struct list_head *tmp;
|
|
|
+ mddev_t *mddev = bitmap->mddev;
|
|
|
|
|
|
ITERATE_RDEV(mddev, rdev, tmp)
|
|
|
if (test_bit(In_sync, &rdev->flags)
|
|
|
- && !test_bit(Faulty, &rdev->flags))
|
|
|
+ && !test_bit(Faulty, &rdev->flags)) {
|
|
|
+ int size = PAGE_SIZE;
|
|
|
+ if (page->index == bitmap->file_pages-1)
|
|
|
+ size = roundup(bitmap->last_page_size,
|
|
|
+ bdev_hardsect_size(rdev->bdev));
|
|
|
md_super_write(mddev, rdev,
|
|
|
- (rdev->sb_offset<<1) + offset
|
|
|
+ (rdev->sb_offset<<1) + bitmap->offset
|
|
|
+ page->index * (PAGE_SIZE/512),
|
|
|
- PAGE_SIZE,
|
|
|
+ size,
|
|
|
page);
|
|
|
+ }
|
|
|
|
|
|
if (wait)
|
|
|
md_super_wait(mddev);
|
|
@@ -282,7 +288,7 @@ static int write_page(struct bitmap *bitmap, struct page *page, int wait)
|
|
|
struct buffer_head *bh;
|
|
|
|
|
|
if (bitmap->file == NULL)
|
|
|
- return write_sb_page(bitmap->mddev, bitmap->offset, page, wait);
|
|
|
+ return write_sb_page(bitmap, page, wait);
|
|
|
|
|
|
bh = page_buffers(page);
|
|
|
|
|
@@ -923,6 +929,7 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
|
|
|
}
|
|
|
|
|
|
bitmap->filemap[bitmap->file_pages++] = page;
|
|
|
+ bitmap->last_page_size = count;
|
|
|
}
|
|
|
paddr = kmap_atomic(page, KM_USER0);
|
|
|
if (bitmap->flags & BITMAP_HOSTENDIAN)
|