diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ocfs2/aops.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 742893ea7390..356e976772bf 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
@@ -1100,23 +1100,37 @@ out: | |||
1100 | */ | 1100 | */ |
1101 | static int ocfs2_grab_pages_for_write(struct address_space *mapping, | 1101 | static int ocfs2_grab_pages_for_write(struct address_space *mapping, |
1102 | struct ocfs2_write_ctxt *wc, | 1102 | struct ocfs2_write_ctxt *wc, |
1103 | u32 cpos, loff_t user_pos, int new, | 1103 | u32 cpos, loff_t user_pos, |
1104 | unsigned user_len, int new, | ||
1104 | struct page *mmap_page) | 1105 | struct page *mmap_page) |
1105 | { | 1106 | { |
1106 | int ret = 0, i; | 1107 | int ret = 0, i; |
1107 | unsigned long start, target_index, index; | 1108 | unsigned long start, target_index, end_index, index; |
1108 | struct inode *inode = mapping->host; | 1109 | struct inode *inode = mapping->host; |
1110 | loff_t last_byte; | ||
1109 | 1111 | ||
1110 | target_index = user_pos >> PAGE_CACHE_SHIFT; | 1112 | target_index = user_pos >> PAGE_CACHE_SHIFT; |
1111 | 1113 | ||
1112 | /* | 1114 | /* |
1113 | * Figure out how many pages we'll be manipulating here. For | 1115 | * Figure out how many pages we'll be manipulating here. For |
1114 | * non allocating write, we just change the one | 1116 | * non allocating write, we just change the one |
1115 | * page. Otherwise, we'll need a whole clusters worth. | 1117 | * page. Otherwise, we'll need a whole clusters worth. If we're |
1118 | * writing past i_size, we only need enough pages to cover the | ||
1119 | * last page of the write. | ||
1116 | */ | 1120 | */ |
1117 | if (new) { | 1121 | if (new) { |
1118 | wc->w_num_pages = ocfs2_pages_per_cluster(inode->i_sb); | 1122 | wc->w_num_pages = ocfs2_pages_per_cluster(inode->i_sb); |
1119 | start = ocfs2_align_clusters_to_page_index(inode->i_sb, cpos); | 1123 | start = ocfs2_align_clusters_to_page_index(inode->i_sb, cpos); |
1124 | /* | ||
1125 | * We need the index *past* the last page we could possibly | ||
1126 | * touch. This is the page past the end of the write or | ||
1127 | * i_size, whichever is greater. | ||
1128 | */ | ||
1129 | last_byte = max(user_pos + user_len, i_size_read(inode)); | ||
1130 | BUG_ON(last_byte < 1); | ||
1131 | end_index = ((last_byte - 1) >> PAGE_CACHE_SHIFT) + 1; | ||
1132 | if ((start + wc->w_num_pages) > end_index) | ||
1133 | wc->w_num_pages = end_index - start; | ||
1120 | } else { | 1134 | } else { |
1121 | wc->w_num_pages = 1; | 1135 | wc->w_num_pages = 1; |
1122 | start = target_index; | 1136 | start = target_index; |
@@ -1773,7 +1787,7 @@ int ocfs2_write_begin_nolock(struct address_space *mapping, | |||
1773 | * that we can zero and flush if we error after adding the | 1787 | * that we can zero and flush if we error after adding the |
1774 | * extent. | 1788 | * extent. |
1775 | */ | 1789 | */ |
1776 | ret = ocfs2_grab_pages_for_write(mapping, wc, wc->w_cpos, pos, | 1790 | ret = ocfs2_grab_pages_for_write(mapping, wc, wc->w_cpos, pos, len, |
1777 | cluster_of_pages, mmap_page); | 1791 | cluster_of_pages, mmap_page); |
1778 | if (ret) { | 1792 | if (ret) { |
1779 | mlog_errno(ret); | 1793 | mlog_errno(ret); |