diff options
-rw-r--r-- | fs/drop_caches.c | 2 | ||||
-rw-r--r-- | include/linux/fs.h | 3 | ||||
-rw-r--r-- | mm/truncate.c | 38 |
3 files changed, 27 insertions, 16 deletions
diff --git a/fs/drop_caches.c b/fs/drop_caches.c index 03ea7696fe39..59375efcf39d 100644 --- a/fs/drop_caches.c +++ b/fs/drop_caches.c | |||
@@ -20,7 +20,7 @@ static void drop_pagecache_sb(struct super_block *sb) | |||
20 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { | 20 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
21 | if (inode->i_state & (I_FREEING|I_WILL_FREE)) | 21 | if (inode->i_state & (I_FREEING|I_WILL_FREE)) |
22 | continue; | 22 | continue; |
23 | invalidate_mapping_pages(inode->i_mapping, 0, -1); | 23 | __invalidate_mapping_pages(inode->i_mapping, 0, -1, true); |
24 | } | 24 | } |
25 | spin_unlock(&inode_lock); | 25 | spin_unlock(&inode_lock); |
26 | } | 26 | } |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 4f0b3bf5983c..51c938a71dec 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -1610,6 +1610,9 @@ extern int __invalidate_device(struct block_device *); | |||
1610 | extern int invalidate_partition(struct gendisk *, int); | 1610 | extern int invalidate_partition(struct gendisk *, int); |
1611 | #endif | 1611 | #endif |
1612 | extern int invalidate_inodes(struct super_block *); | 1612 | extern int invalidate_inodes(struct super_block *); |
1613 | unsigned long __invalidate_mapping_pages(struct address_space *mapping, | ||
1614 | pgoff_t start, pgoff_t end, | ||
1615 | bool be_atomic); | ||
1613 | unsigned long invalidate_mapping_pages(struct address_space *mapping, | 1616 | unsigned long invalidate_mapping_pages(struct address_space *mapping, |
1614 | pgoff_t start, pgoff_t end); | 1617 | pgoff_t start, pgoff_t end); |
1615 | 1618 | ||
diff --git a/mm/truncate.c b/mm/truncate.c index af3dcf0e48e6..7c994f2d6145 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
@@ -253,21 +253,8 @@ void truncate_inode_pages(struct address_space *mapping, loff_t lstart) | |||
253 | } | 253 | } |
254 | EXPORT_SYMBOL(truncate_inode_pages); | 254 | EXPORT_SYMBOL(truncate_inode_pages); |
255 | 255 | ||
256 | /** | 256 | unsigned long __invalidate_mapping_pages(struct address_space *mapping, |
257 | * invalidate_mapping_pages - Invalidate all the unlocked pages of one inode | 257 | pgoff_t start, pgoff_t end, bool be_atomic) |
258 | * @mapping: the address_space which holds the pages to invalidate | ||
259 | * @start: the offset 'from' which to invalidate | ||
260 | * @end: the offset 'to' which to invalidate (inclusive) | ||
261 | * | ||
262 | * This function only removes the unlocked pages, if you want to | ||
263 | * remove all the pages of one inode, you must call truncate_inode_pages. | ||
264 | * | ||
265 | * invalidate_mapping_pages() will not block on IO activity. It will not | ||
266 | * invalidate pages which are dirty, locked, under writeback or mapped into | ||
267 | * pagetables. | ||
268 | */ | ||
269 | unsigned long invalidate_mapping_pages(struct address_space *mapping, | ||
270 | pgoff_t start, pgoff_t end) | ||
271 | { | 258 | { |
272 | struct pagevec pvec; | 259 | struct pagevec pvec; |
273 | pgoff_t next = start; | 260 | pgoff_t next = start; |
@@ -308,9 +295,30 @@ unlock: | |||
308 | break; | 295 | break; |
309 | } | 296 | } |
310 | pagevec_release(&pvec); | 297 | pagevec_release(&pvec); |
298 | if (likely(!be_atomic)) | ||
299 | cond_resched(); | ||
311 | } | 300 | } |
312 | return ret; | 301 | return ret; |
313 | } | 302 | } |
303 | |||
304 | /** | ||
305 | * invalidate_mapping_pages - Invalidate all the unlocked pages of one inode | ||
306 | * @mapping: the address_space which holds the pages to invalidate | ||
307 | * @start: the offset 'from' which to invalidate | ||
308 | * @end: the offset 'to' which to invalidate (inclusive) | ||
309 | * | ||
310 | * This function only removes the unlocked pages, if you want to | ||
311 | * remove all the pages of one inode, you must call truncate_inode_pages. | ||
312 | * | ||
313 | * invalidate_mapping_pages() will not block on IO activity. It will not | ||
314 | * invalidate pages which are dirty, locked, under writeback or mapped into | ||
315 | * pagetables. | ||
316 | */ | ||
317 | unsigned long invalidate_mapping_pages(struct address_space *mapping, | ||
318 | pgoff_t start, pgoff_t end) | ||
319 | { | ||
320 | return __invalidate_mapping_pages(mapping, start, end, false); | ||
321 | } | ||
314 | EXPORT_SYMBOL(invalidate_mapping_pages); | 322 | EXPORT_SYMBOL(invalidate_mapping_pages); |
315 | 323 | ||
316 | /* | 324 | /* |