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 | /* |
