|
@@ -1100,23 +1100,37 @@ out:
|
|
|
*/
|
|
|
static int ocfs2_grab_pages_for_write(struct address_space *mapping,
|
|
|
struct ocfs2_write_ctxt *wc,
|
|
|
- u32 cpos, loff_t user_pos, int new,
|
|
|
+ u32 cpos, loff_t user_pos,
|
|
|
+ unsigned user_len, int new,
|
|
|
struct page *mmap_page)
|
|
|
{
|
|
|
int ret = 0, i;
|
|
|
- unsigned long start, target_index, index;
|
|
|
+ unsigned long start, target_index, end_index, index;
|
|
|
struct inode *inode = mapping->host;
|
|
|
+ loff_t last_byte;
|
|
|
|
|
|
target_index = user_pos >> PAGE_CACHE_SHIFT;
|
|
|
|
|
|
/*
|
|
|
* Figure out how many pages we'll be manipulating here. For
|
|
|
* non allocating write, we just change the one
|
|
|
- * page. Otherwise, we'll need a whole clusters worth.
|
|
|
+ * page. Otherwise, we'll need a whole clusters worth. If we're
|
|
|
+ * writing past i_size, we only need enough pages to cover the
|
|
|
+ * last page of the write.
|
|
|
*/
|
|
|
if (new) {
|
|
|
wc->w_num_pages = ocfs2_pages_per_cluster(inode->i_sb);
|
|
|
start = ocfs2_align_clusters_to_page_index(inode->i_sb, cpos);
|
|
|
+ /*
|
|
|
+ * We need the index *past* the last page we could possibly
|
|
|
+ * touch. This is the page past the end of the write or
|
|
|
+ * i_size, whichever is greater.
|
|
|
+ */
|
|
|
+ last_byte = max(user_pos + user_len, i_size_read(inode));
|
|
|
+ BUG_ON(last_byte < 1);
|
|
|
+ end_index = ((last_byte - 1) >> PAGE_CACHE_SHIFT) + 1;
|
|
|
+ if ((start + wc->w_num_pages) > end_index)
|
|
|
+ wc->w_num_pages = end_index - start;
|
|
|
} else {
|
|
|
wc->w_num_pages = 1;
|
|
|
start = target_index;
|
|
@@ -1773,7 +1787,7 @@ int ocfs2_write_begin_nolock(struct address_space *mapping,
|
|
|
* that we can zero and flush if we error after adding the
|
|
|
* extent.
|
|
|
*/
|
|
|
- ret = ocfs2_grab_pages_for_write(mapping, wc, wc->w_cpos, pos,
|
|
|
+ ret = ocfs2_grab_pages_for_write(mapping, wc, wc->w_cpos, pos, len,
|
|
|
cluster_of_pages, mmap_page);
|
|
|
if (ret) {
|
|
|
mlog_errno(ret);
|