X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=fs%2Fmpage.c;h=fd56ca2ea55611314a841c9a65abba0c88b6ffa6;hb=b0fb75ad5c8ca205396d7a493c9be5a5da802747;hp=235e4d3873a88d17837f1a9551f09664c8ffcb54;hpb=78a4a50a86b0a54f7ecbc164267b6c762760254c;p=safe%2Fjmp%2Flinux-2.6 diff --git a/fs/mpage.c b/fs/mpage.c index 235e4d3..fd56ca2 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -6,7 +6,7 @@ * Contains functions related to preparing and submitting BIOs which contain * multiple pagecache pages. * - * 15May2002 akpm@zip.com.au + * 15May2002 Andrew Morton * Initial version * 27Jun2002 axboe@suse.de * use bio_add_page() to build bio's just the right size @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -240,7 +241,6 @@ do_mpage_readpage(struct bio *bio, struct page *page, unsigned nr_pages, first_hole = page_block; page_block++; block_in_file++; - clear_buffer_mapped(map_bh); continue; } @@ -307,7 +307,10 @@ alloc_new: goto alloc_new; } - if (buffer_boundary(map_bh) || (first_hole != blocks_per_page)) + relative_block = block_in_file - *first_logical_block; + nblocks = map_bh->b_size >> blkbits; + if ((buffer_boundary(map_bh) && relative_block == nblocks) || + (first_hole != blocks_per_page)) bio = mpage_bio_submit(READ, bio); else *last_block_in_bio = blocks[blocks_per_page - 1]; @@ -377,7 +380,8 @@ mpage_readpages(struct address_space *mapping, struct list_head *pages, struct buffer_head map_bh; unsigned long first_logical_block = 0; - clear_buffer_mapped(&map_bh); + map_bh.b_state = 0; + map_bh.b_size = 0; for (page_idx = 0; page_idx < nr_pages; page_idx++) { struct page *page = list_entry(pages->prev, struct page, lru); @@ -410,7 +414,8 @@ int mpage_readpage(struct page *page, get_block_t get_block) struct buffer_head map_bh; unsigned long first_logical_block = 0; - clear_buffer_mapped(&map_bh); + map_bh.b_state = 0; + map_bh.b_size = 0; bio = do_mpage_readpage(bio, page, 1, &last_block_in_bio, &map_bh, &first_logical_block, get_block); if (bio) @@ -435,6 +440,7 @@ EXPORT_SYMBOL(mpage_readpage); * written, so it can intelligently allocate a suitably-sized BIO. For now, * just allocate full-size (16-page) BIOs. */ + struct mpage_data { struct bio *bio; sector_t last_block_in_bio; @@ -443,7 +449,7 @@ struct mpage_data { }; static int __mpage_writepage(struct page *page, struct writeback_control *wbc, - void *data) + void *data) { struct mpage_data *mpd = data; struct bio *bio = mpd->bio; @@ -556,7 +562,7 @@ page_is_mapped: if (page->index >= end_index) { /* * The page straddles i_size. It must be zeroed out on each - * and every writepage invokation because it may be mmapped. + * and every writepage invocation because it may be mmapped. * "A file is mapped in multiples of the page size. For a file * that is not a multiple of the page size, the remaining memory * is zeroed when mapped, and writes to that region are not