inode.c (c41d342b39f15acbdc61948bab0cb3c567ec992a) | inode.c (a056bdaae7a181f7dcc876cfab2f94538e508709) |
---|---|
1/* 2 * linux/fs/ext4/inode.c 3 * 4 * Copyright (C) 1992, 1993, 1994, 1995 5 * Remy Card (card@masi.ibp.fr) 6 * Laboratoire MASI - Institut Blaise Pascal 7 * Universite Pierre et Marie Curie (Paris VI) 8 * --- 2110 unchanged lines hidden (view full) --- 2119 /* Drop io_end reference we got from init */ 2120 ext4_put_io_end_defer(io_submit.io_end); 2121 return ret; 2122} 2123 2124static int mpage_submit_page(struct mpage_da_data *mpd, struct page *page) 2125{ 2126 int len; | 1/* 2 * linux/fs/ext4/inode.c 3 * 4 * Copyright (C) 1992, 1993, 1994, 1995 5 * Remy Card (card@masi.ibp.fr) 6 * Laboratoire MASI - Institut Blaise Pascal 7 * Universite Pierre et Marie Curie (Paris VI) 8 * --- 2110 unchanged lines hidden (view full) --- 2119 /* Drop io_end reference we got from init */ 2120 ext4_put_io_end_defer(io_submit.io_end); 2121 return ret; 2122} 2123 2124static int mpage_submit_page(struct mpage_da_data *mpd, struct page *page) 2125{ 2126 int len; |
2127 loff_t size = i_size_read(mpd->inode); | 2127 loff_t size; |
2128 int err; 2129 2130 BUG_ON(page->index != mpd->first_page); | 2128 int err; 2129 2130 BUG_ON(page->index != mpd->first_page); |
2131 clear_page_dirty_for_io(page); 2132 /* 2133 * We have to be very careful here! Nothing protects writeback path 2134 * against i_size changes and the page can be writeably mapped into 2135 * page tables. So an application can be growing i_size and writing 2136 * data through mmap while writeback runs. clear_page_dirty_for_io() 2137 * write-protects our page in page tables and the page cannot get 2138 * written to again until we release page lock. So only after 2139 * clear_page_dirty_for_io() we are safe to sample i_size for 2140 * ext4_bio_write_page() to zero-out tail of the written page. We rely 2141 * on the barrier provided by TestClearPageDirty in 2142 * clear_page_dirty_for_io() to make sure i_size is really sampled only 2143 * after page tables are updated. 2144 */ 2145 size = i_size_read(mpd->inode); |
|
2131 if (page->index == size >> PAGE_SHIFT) 2132 len = size & ~PAGE_MASK; 2133 else 2134 len = PAGE_SIZE; | 2146 if (page->index == size >> PAGE_SHIFT) 2147 len = size & ~PAGE_MASK; 2148 else 2149 len = PAGE_SIZE; |
2135 clear_page_dirty_for_io(page); | |
2136 err = ext4_bio_write_page(&mpd->io_submit, page, len, mpd->wbc, false); 2137 if (!err) 2138 mpd->wbc->nr_to_write--; 2139 mpd->first_page++; 2140 2141 return err; 2142} 2143 --- 3904 unchanged lines hidden --- | 2150 err = ext4_bio_write_page(&mpd->io_submit, page, len, mpd->wbc, false); 2151 if (!err) 2152 mpd->wbc->nr_to_write--; 2153 mpd->first_page++; 2154 2155 return err; 2156} 2157 --- 3904 unchanged lines hidden --- |