diff options
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 5020b280a771..088358c8006b 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -257,9 +257,11 @@ static int filemap_check_errors(struct address_space *mapping) | |||
257 | { | 257 | { |
258 | int ret = 0; | 258 | int ret = 0; |
259 | /* Check for outstanding write errors */ | 259 | /* Check for outstanding write errors */ |
260 | if (test_and_clear_bit(AS_ENOSPC, &mapping->flags)) | 260 | if (test_bit(AS_ENOSPC, &mapping->flags) && |
261 | test_and_clear_bit(AS_ENOSPC, &mapping->flags)) | ||
261 | ret = -ENOSPC; | 262 | ret = -ENOSPC; |
262 | if (test_and_clear_bit(AS_EIO, &mapping->flags)) | 263 | if (test_bit(AS_EIO, &mapping->flags) && |
264 | test_and_clear_bit(AS_EIO, &mapping->flags)) | ||
263 | ret = -EIO; | 265 | ret = -EIO; |
264 | return ret; | 266 | return ret; |
265 | } | 267 | } |
@@ -906,8 +908,8 @@ EXPORT_SYMBOL(page_cache_prev_hole); | |||
906 | * Looks up the page cache slot at @mapping & @offset. If there is a | 908 | * Looks up the page cache slot at @mapping & @offset. If there is a |
907 | * page cache page, it is returned with an increased refcount. | 909 | * page cache page, it is returned with an increased refcount. |
908 | * | 910 | * |
909 | * If the slot holds a shadow entry of a previously evicted page, it | 911 | * If the slot holds a shadow entry of a previously evicted page, or a |
910 | * is returned. | 912 | * swap entry from shmem/tmpfs, it is returned. |
911 | * | 913 | * |
912 | * Otherwise, %NULL is returned. | 914 | * Otherwise, %NULL is returned. |
913 | */ | 915 | */ |
@@ -928,9 +930,9 @@ repeat: | |||
928 | if (radix_tree_deref_retry(page)) | 930 | if (radix_tree_deref_retry(page)) |
929 | goto repeat; | 931 | goto repeat; |
930 | /* | 932 | /* |
931 | * Otherwise, shmem/tmpfs must be storing a swap entry | 933 | * A shadow entry of a recently evicted page, |
932 | * here as an exceptional entry: so return it without | 934 | * or a swap entry from shmem/tmpfs. Return |
933 | * attempting to raise page count. | 935 | * it without attempting to raise page count. |
934 | */ | 936 | */ |
935 | goto out; | 937 | goto out; |
936 | } | 938 | } |
@@ -983,8 +985,8 @@ EXPORT_SYMBOL(find_get_page); | |||
983 | * page cache page, it is returned locked and with an increased | 985 | * page cache page, it is returned locked and with an increased |
984 | * refcount. | 986 | * refcount. |
985 | * | 987 | * |
986 | * If the slot holds a shadow entry of a previously evicted page, it | 988 | * If the slot holds a shadow entry of a previously evicted page, or a |
987 | * is returned. | 989 | * swap entry from shmem/tmpfs, it is returned. |
988 | * | 990 | * |
989 | * Otherwise, %NULL is returned. | 991 | * Otherwise, %NULL is returned. |
990 | * | 992 | * |
@@ -1099,8 +1101,8 @@ EXPORT_SYMBOL(find_or_create_page); | |||
1099 | * with ascending indexes. There may be holes in the indices due to | 1101 | * with ascending indexes. There may be holes in the indices due to |
1100 | * not-present pages. | 1102 | * not-present pages. |
1101 | * | 1103 | * |
1102 | * Any shadow entries of evicted pages are included in the returned | 1104 | * Any shadow entries of evicted pages, or swap entries from |
1103 | * array. | 1105 | * shmem/tmpfs, are included in the returned array. |
1104 | * | 1106 | * |
1105 | * find_get_entries() returns the number of pages and shadow entries | 1107 | * find_get_entries() returns the number of pages and shadow entries |
1106 | * which were found. | 1108 | * which were found. |
@@ -1128,9 +1130,9 @@ repeat: | |||
1128 | if (radix_tree_deref_retry(page)) | 1130 | if (radix_tree_deref_retry(page)) |
1129 | goto restart; | 1131 | goto restart; |
1130 | /* | 1132 | /* |
1131 | * Otherwise, we must be storing a swap entry | 1133 | * A shadow entry of a recently evicted page, |
1132 | * here as an exceptional entry: so return it | 1134 | * or a swap entry from shmem/tmpfs. Return |
1133 | * without attempting to raise page count. | 1135 | * it without attempting to raise page count. |
1134 | */ | 1136 | */ |
1135 | goto export; | 1137 | goto export; |
1136 | } | 1138 | } |
@@ -1198,9 +1200,9 @@ repeat: | |||
1198 | goto restart; | 1200 | goto restart; |
1199 | } | 1201 | } |
1200 | /* | 1202 | /* |
1201 | * Otherwise, shmem/tmpfs must be storing a swap entry | 1203 | * A shadow entry of a recently evicted page, |
1202 | * here as an exceptional entry: so skip over it - | 1204 | * or a swap entry from shmem/tmpfs. Skip |
1203 | * we only reach this from invalidate_mapping_pages(). | 1205 | * over it. |
1204 | */ | 1206 | */ |
1205 | continue; | 1207 | continue; |
1206 | } | 1208 | } |
@@ -1265,9 +1267,9 @@ repeat: | |||
1265 | goto restart; | 1267 | goto restart; |
1266 | } | 1268 | } |
1267 | /* | 1269 | /* |
1268 | * Otherwise, shmem/tmpfs must be storing a swap entry | 1270 | * A shadow entry of a recently evicted page, |
1269 | * here as an exceptional entry: so stop looking for | 1271 | * or a swap entry from shmem/tmpfs. Stop |
1270 | * contiguous pages. | 1272 | * looking for contiguous pages. |
1271 | */ | 1273 | */ |
1272 | break; | 1274 | break; |
1273 | } | 1275 | } |
@@ -1341,10 +1343,17 @@ repeat: | |||
1341 | goto restart; | 1343 | goto restart; |
1342 | } | 1344 | } |
1343 | /* | 1345 | /* |
1344 | * This function is never used on a shmem/tmpfs | 1346 | * A shadow entry of a recently evicted page. |
1345 | * mapping, so a swap entry won't be found here. | 1347 | * |
1348 | * Those entries should never be tagged, but | ||
1349 | * this tree walk is lockless and the tags are | ||
1350 | * looked up in bulk, one radix tree node at a | ||
1351 | * time, so there is a sizable window for page | ||
1352 | * reclaim to evict a page we saw tagged. | ||
1353 | * | ||
1354 | * Skip over it. | ||
1346 | */ | 1355 | */ |
1347 | BUG(); | 1356 | continue; |
1348 | } | 1357 | } |
1349 | 1358 | ||
1350 | if (!page_cache_get_speculative(page)) | 1359 | if (!page_cache_get_speculative(page)) |