diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/filemap.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index cb476e70cf19..a29318147365 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -863,9 +863,13 @@ repeat: | |||
863 | page = radix_tree_deref_slot((void **)pages[i]); | 863 | page = radix_tree_deref_slot((void **)pages[i]); |
864 | if (unlikely(!page)) | 864 | if (unlikely(!page)) |
865 | continue; | 865 | continue; |
866 | |||
867 | /* | ||
868 | * This can only trigger when the entry at index 0 moves out | ||
869 | * of or back to the root: none yet gotten, safe to restart. | ||
870 | */ | ||
866 | if (radix_tree_deref_retry(page)) { | 871 | if (radix_tree_deref_retry(page)) { |
867 | if (ret) | 872 | WARN_ON(start | i); |
868 | start = pages[ret-1]->index; | ||
869 | goto restart; | 873 | goto restart; |
870 | } | 874 | } |
871 | 875 | ||
@@ -915,6 +919,11 @@ repeat: | |||
915 | page = radix_tree_deref_slot((void **)pages[i]); | 919 | page = radix_tree_deref_slot((void **)pages[i]); |
916 | if (unlikely(!page)) | 920 | if (unlikely(!page)) |
917 | continue; | 921 | continue; |
922 | |||
923 | /* | ||
924 | * This can only trigger when the entry at index 0 moves out | ||
925 | * of or back to the root: none yet gotten, safe to restart. | ||
926 | */ | ||
918 | if (radix_tree_deref_retry(page)) | 927 | if (radix_tree_deref_retry(page)) |
919 | goto restart; | 928 | goto restart; |
920 | 929 | ||
@@ -975,6 +984,11 @@ repeat: | |||
975 | page = radix_tree_deref_slot((void **)pages[i]); | 984 | page = radix_tree_deref_slot((void **)pages[i]); |
976 | if (unlikely(!page)) | 985 | if (unlikely(!page)) |
977 | continue; | 986 | continue; |
987 | |||
988 | /* | ||
989 | * This can only trigger when the entry at index 0 moves out | ||
990 | * of or back to the root: none yet gotten, safe to restart. | ||
991 | */ | ||
978 | if (radix_tree_deref_retry(page)) | 992 | if (radix_tree_deref_retry(page)) |
979 | goto restart; | 993 | goto restart; |
980 | 994 | ||