Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'for-linus' of git://neil.brown.name/md

* 'for-linus' of git://neil.brown.name/md:
md: Don't read past end of bitmap when reading bitmap.

+17 -5
+17 -5
drivers/md/bitmap.c
··· 208 208 */ 209 209 210 210 /* IO operations when bitmap is stored near all superblocks */ 211 - static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long index) 211 + static struct page *read_sb_page(mddev_t *mddev, long offset, 212 + struct page *page, 213 + unsigned long index, int size) 212 214 { 213 215 /* choose a good rdev and read the page from there */ 214 216 215 217 mdk_rdev_t *rdev; 216 218 struct list_head *tmp; 217 - struct page *page = alloc_page(GFP_KERNEL); 218 219 sector_t target; 219 220 221 + if (!page) 222 + page = alloc_page(GFP_KERNEL); 220 223 if (!page) 221 224 return ERR_PTR(-ENOMEM); 222 225 ··· 230 227 231 228 target = rdev->sb_start + offset + index * (PAGE_SIZE/512); 232 229 233 - if (sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)) { 230 + if (sync_page_io(rdev->bdev, target, 231 + roundup(size, bdev_hardsect_size(rdev->bdev)), 232 + page, READ)) { 234 233 page->index = index; 235 234 attach_page_buffers(page, NULL); /* so that free_buffer will 236 235 * quietly no-op */ ··· 549 544 550 545 bitmap->sb_page = read_page(bitmap->file, 0, bitmap, bytes); 551 546 } else { 552 - bitmap->sb_page = read_sb_page(bitmap->mddev, bitmap->offset, 0); 547 + bitmap->sb_page = read_sb_page(bitmap->mddev, bitmap->offset, 548 + NULL, 549 + 0, sizeof(bitmap_super_t)); 553 550 } 554 551 if (IS_ERR(bitmap->sb_page)) { 555 552 err = PTR_ERR(bitmap->sb_page); ··· 964 957 */ 965 958 page = bitmap->sb_page; 966 959 offset = sizeof(bitmap_super_t); 960 + read_sb_page(bitmap->mddev, bitmap->offset, 961 + page, 962 + index, count); 967 963 } else if (file) { 968 964 page = read_page(file, index, bitmap, count); 969 965 offset = 0; 970 966 } else { 971 - page = read_sb_page(bitmap->mddev, bitmap->offset, index); 967 + page = read_sb_page(bitmap->mddev, bitmap->offset, 968 + NULL, 969 + index, count); 972 970 offset = 0; 973 971 } 974 972 if (IS_ERR(page)) { /* read error */