revert android-tegra-2.6.36-honeycomb-mr1-9001adc to v2.6.36
[firefly-linux-kernel-4.4.55.git] / mm / filemap.c
index 9701a501f7696b065b75c645945b386630009bc5..3d4df44e4221d25bb041995813823e00903161e5 100644 (file)
@@ -631,9 +631,7 @@ repeat:
        pagep = radix_tree_lookup_slot(&mapping->page_tree, offset);
        if (pagep) {
                page = radix_tree_deref_slot(pagep);
-               if (unlikely(!page))
-                       goto out;
-               if (radix_tree_deref_retry(page))
+               if (unlikely(!page || page == RADIX_TREE_RETRY))
                        goto repeat;
 
                if (!page_cache_get_speculative(page))
@@ -649,7 +647,6 @@ repeat:
                        goto repeat;
                }
        }
-out:
        rcu_read_unlock();
 
        return page;
@@ -767,11 +764,12 @@ repeat:
                page = radix_tree_deref_slot((void **)pages[i]);
                if (unlikely(!page))
                        continue;
-               if (radix_tree_deref_retry(page)) {
-                       if (ret)
-                               start = pages[ret-1]->index;
+               /*
+                * this can only trigger if nr_found == 1, making livelock
+                * a non issue.
+                */
+               if (unlikely(page == RADIX_TREE_RETRY))
                        goto restart;
-               }
 
                if (!page_cache_get_speculative(page))
                        goto repeat;
@@ -819,7 +817,11 @@ repeat:
                page = radix_tree_deref_slot((void **)pages[i]);
                if (unlikely(!page))
                        continue;
-               if (radix_tree_deref_retry(page))
+               /*
+                * this can only trigger if nr_found == 1, making livelock
+                * a non issue.
+                */
+               if (unlikely(page == RADIX_TREE_RETRY))
                        goto restart;
 
                if (page->mapping == NULL || page->index != index)
@@ -872,7 +874,11 @@ repeat:
                page = radix_tree_deref_slot((void **)pages[i]);
                if (unlikely(!page))
                        continue;
-               if (radix_tree_deref_retry(page))
+               /*
+                * this can only trigger if nr_found == 1, making livelock
+                * a non issue.
+                */
+               if (unlikely(page == RADIX_TREE_RETRY))
                        goto restart;
 
                if (!page_cache_get_speculative(page))
@@ -1010,9 +1016,6 @@ find_page:
                                goto page_not_up_to_date;
                        if (!trylock_page(page))
                                goto page_not_up_to_date;
-                       /* Did it get truncated before we got the lock? */
-                       if (!page->mapping)
-                               goto page_not_up_to_date_locked;
                        if (!mapping->a_ops->is_partially_uptodate(page,
                                                                desc, offset))
                                goto page_not_up_to_date_locked;