]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - mm/page-writeback.c
rtc: armada38x: Prepare driver to manage different versions
[karo-tx-linux.git] / mm / page-writeback.c
index 52e2f8e3b4721c1fe04a802bbed0571add5ef1a6..290e8b7d3181f69c5d5f3e44d410a056e0b1f354 100644 (file)
@@ -2106,18 +2106,26 @@ void tag_pages_for_writeback(struct address_space *mapping,
                             pgoff_t start, pgoff_t end)
 {
 #define WRITEBACK_TAG_BATCH 4096
-       unsigned long tagged;
-
-       do {
-               spin_lock_irq(&mapping->tree_lock);
-               tagged = radix_tree_range_tag_if_tagged(&mapping->page_tree,
-                               &start, end, WRITEBACK_TAG_BATCH,
-                               PAGECACHE_TAG_DIRTY, PAGECACHE_TAG_TOWRITE);
+       unsigned long tagged = 0;
+       struct radix_tree_iter iter;
+       void **slot;
+
+       spin_lock_irq(&mapping->tree_lock);
+       radix_tree_for_each_tagged(slot, &mapping->page_tree, &iter, start,
+                                                       PAGECACHE_TAG_DIRTY) {
+               if (iter.index > end)
+                       break;
+               radix_tree_iter_tag_set(&mapping->page_tree, &iter,
+                                                       PAGECACHE_TAG_TOWRITE);
+               tagged++;
+               if ((tagged % WRITEBACK_TAG_BATCH) != 0)
+                       continue;
+               slot = radix_tree_iter_resume(slot, &iter);
                spin_unlock_irq(&mapping->tree_lock);
-               WARN_ON_ONCE(tagged > WRITEBACK_TAG_BATCH);
                cond_resched();
-               /* We check 'start' to handle wrapping when end == ~0UL */
-       } while (tagged >= WRITEBACK_TAG_BATCH && start);
+               spin_lock_irq(&mapping->tree_lock);
+       }
+       spin_unlock_irq(&mapping->tree_lock);
 }
 EXPORT_SYMBOL(tag_pages_for_writeback);