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 ---