Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'btrfs-3.0' of git://github.com/chrismason/linux

* 'btrfs-3.0' of git://github.com/chrismason/linux:
Btrfs: force a page fault if we have a shorty copy on a page boundary

+16 -8
+16 -8
fs/btrfs/file.c
··· 1036 1036 * on error we return an unlocked page and the error value 1037 1037 * on success we return a locked page and 0 1038 1038 */ 1039 - static int prepare_uptodate_page(struct page *page, u64 pos) 1039 + static int prepare_uptodate_page(struct page *page, u64 pos, 1040 + bool force_uptodate) 1040 1041 { 1041 1042 int ret = 0; 1042 1043 1043 - if ((pos & (PAGE_CACHE_SIZE - 1)) && !PageUptodate(page)) { 1044 + if (((pos & (PAGE_CACHE_SIZE - 1)) || force_uptodate) && 1045 + !PageUptodate(page)) { 1044 1046 ret = btrfs_readpage(NULL, page); 1045 1047 if (ret) 1046 1048 return ret; ··· 1063 1061 static noinline int prepare_pages(struct btrfs_root *root, struct file *file, 1064 1062 struct page **pages, size_t num_pages, 1065 1063 loff_t pos, unsigned long first_index, 1066 - size_t write_bytes) 1064 + size_t write_bytes, bool force_uptodate) 1067 1065 { 1068 1066 struct extent_state *cached_state = NULL; 1069 1067 int i; ··· 1088 1086 } 1089 1087 1090 1088 if (i == 0) 1091 - err = prepare_uptodate_page(pages[i], pos); 1089 + err = prepare_uptodate_page(pages[i], pos, 1090 + force_uptodate); 1092 1091 if (i == num_pages - 1) 1093 1092 err = prepare_uptodate_page(pages[i], 1094 - pos + write_bytes); 1093 + pos + write_bytes, false); 1095 1094 if (err) { 1096 1095 page_cache_release(pages[i]); 1097 1096 faili = i - 1; ··· 1161 1158 size_t num_written = 0; 1162 1159 int nrptrs; 1163 1160 int ret = 0; 1161 + bool force_page_uptodate = false; 1164 1162 1165 1163 nrptrs = min((iov_iter_count(i) + PAGE_CACHE_SIZE - 1) / 1166 1164 PAGE_CACHE_SIZE, PAGE_CACHE_SIZE / ··· 1204 1200 * contents of pages from loop to loop 1205 1201 */ 1206 1202 ret = prepare_pages(root, file, pages, num_pages, 1207 - pos, first_index, write_bytes); 1203 + pos, first_index, write_bytes, 1204 + force_page_uptodate); 1208 1205 if (ret) { 1209 1206 btrfs_delalloc_release_space(inode, 1210 1207 num_pages << PAGE_CACHE_SHIFT); ··· 1222 1217 if (copied < write_bytes) 1223 1218 nrptrs = 1; 1224 1219 1225 - if (copied == 0) 1220 + if (copied == 0) { 1221 + force_page_uptodate = true; 1226 1222 dirty_pages = 0; 1227 - else 1223 + } else { 1224 + force_page_uptodate = false; 1228 1225 dirty_pages = (copied + offset + 1229 1226 PAGE_CACHE_SIZE - 1) >> 1230 1227 PAGE_CACHE_SHIFT; 1228 + } 1231 1229 1232 1230 /* 1233 1231 * If we had a short copy we need to release the excess delaloc