diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/filemap.c | 23 |
1 files changed, 3 insertions, 20 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index b418405903bc..9665b1d4f318 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -114,14 +114,11 @@ static void page_cache_tree_delete(struct address_space *mapping, | |||
114 | struct page *page, void *shadow) | 114 | struct page *page, void *shadow) |
115 | { | 115 | { |
116 | struct radix_tree_node *node; | 116 | struct radix_tree_node *node; |
117 | unsigned long index; | ||
118 | unsigned int offset; | ||
119 | unsigned int tag; | ||
120 | void **slot; | ||
121 | 117 | ||
122 | VM_BUG_ON(!PageLocked(page)); | 118 | VM_BUG_ON(!PageLocked(page)); |
123 | 119 | ||
124 | __radix_tree_lookup(&mapping->page_tree, page->index, &node, &slot); | 120 | node = radix_tree_replace_clear_tags(&mapping->page_tree, page->index, |
121 | shadow); | ||
125 | 122 | ||
126 | if (shadow) { | 123 | if (shadow) { |
127 | mapping->nrexceptional++; | 124 | mapping->nrexceptional++; |
@@ -135,23 +132,9 @@ static void page_cache_tree_delete(struct address_space *mapping, | |||
135 | } | 132 | } |
136 | mapping->nrpages--; | 133 | mapping->nrpages--; |
137 | 134 | ||
138 | if (!node) { | 135 | if (!node) |
139 | /* Clear direct pointer tags in root node */ | ||
140 | mapping->page_tree.gfp_mask &= __GFP_BITS_MASK; | ||
141 | radix_tree_replace_slot(slot, shadow); | ||
142 | return; | 136 | return; |
143 | } | ||
144 | |||
145 | /* Clear tree tags for the removed page */ | ||
146 | index = page->index; | ||
147 | offset = index & RADIX_TREE_MAP_MASK; | ||
148 | for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) { | ||
149 | if (test_bit(offset, node->tags[tag])) | ||
150 | radix_tree_tag_clear(&mapping->page_tree, index, tag); | ||
151 | } | ||
152 | 137 | ||
153 | /* Delete page, swap shadow entry */ | ||
154 | radix_tree_replace_slot(slot, shadow); | ||
155 | workingset_node_pages_dec(node); | 138 | workingset_node_pages_dec(node); |
156 | if (shadow) | 139 | if (shadow) |
157 | workingset_node_shadows_inc(node); | 140 | workingset_node_shadows_inc(node); |