diff options
author | Lukas Czerner <lczerner@redhat.com> | 2013-05-21 23:25:01 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2013-05-21 23:25:01 -0400 |
commit | ca99fdd26b450cfc1dbcb6b01e1753ee5e6c88e0 (patch) | |
tree | fc7e0a320bef39c8ad13f21f89dd81145d26c72b /fs/ext4 | |
parent | 259709b07da103edc40b8c5bdb2d5c0e77374f94 (diff) |
ext4: use ->invalidatepage() length argument
->invalidatepage() aop now accepts range to invalidate so we can make
use of it in all ext4 invalidatepage routines.
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/inode.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 694645e51fe0..11638d7982c9 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -1416,21 +1416,28 @@ static void ext4_da_release_space(struct inode *inode, int to_free) | |||
1416 | } | 1416 | } |
1417 | 1417 | ||
1418 | static void ext4_da_page_release_reservation(struct page *page, | 1418 | static void ext4_da_page_release_reservation(struct page *page, |
1419 | unsigned long offset) | 1419 | unsigned int offset, |
1420 | unsigned int length) | ||
1420 | { | 1421 | { |
1421 | int to_release = 0; | 1422 | int to_release = 0; |
1422 | struct buffer_head *head, *bh; | 1423 | struct buffer_head *head, *bh; |
1423 | unsigned int curr_off = 0; | 1424 | unsigned int curr_off = 0; |
1424 | struct inode *inode = page->mapping->host; | 1425 | struct inode *inode = page->mapping->host; |
1425 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | 1426 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
1427 | unsigned int stop = offset + length; | ||
1426 | int num_clusters; | 1428 | int num_clusters; |
1427 | ext4_fsblk_t lblk; | 1429 | ext4_fsblk_t lblk; |
1428 | 1430 | ||
1431 | BUG_ON(stop > PAGE_CACHE_SIZE || stop < length); | ||
1432 | |||
1429 | head = page_buffers(page); | 1433 | head = page_buffers(page); |
1430 | bh = head; | 1434 | bh = head; |
1431 | do { | 1435 | do { |
1432 | unsigned int next_off = curr_off + bh->b_size; | 1436 | unsigned int next_off = curr_off + bh->b_size; |
1433 | 1437 | ||
1438 | if (next_off > stop) | ||
1439 | break; | ||
1440 | |||
1434 | if ((offset <= curr_off) && (buffer_delay(bh))) { | 1441 | if ((offset <= curr_off) && (buffer_delay(bh))) { |
1435 | to_release++; | 1442 | to_release++; |
1436 | clear_buffer_delay(bh); | 1443 | clear_buffer_delay(bh); |
@@ -2840,7 +2847,7 @@ static void ext4_da_invalidatepage(struct page *page, unsigned int offset, | |||
2840 | if (!page_has_buffers(page)) | 2847 | if (!page_has_buffers(page)) |
2841 | goto out; | 2848 | goto out; |
2842 | 2849 | ||
2843 | ext4_da_page_release_reservation(page, offset); | 2850 | ext4_da_page_release_reservation(page, offset, length); |
2844 | 2851 | ||
2845 | out: | 2852 | out: |
2846 | ext4_invalidatepage(page, offset, length); | 2853 | ext4_invalidatepage(page, offset, length); |
@@ -2994,29 +3001,29 @@ ext4_readpages(struct file *file, struct address_space *mapping, | |||
2994 | static void ext4_invalidatepage(struct page *page, unsigned int offset, | 3001 | static void ext4_invalidatepage(struct page *page, unsigned int offset, |
2995 | unsigned int length) | 3002 | unsigned int length) |
2996 | { | 3003 | { |
2997 | trace_ext4_invalidatepage(page, offset); | 3004 | trace_ext4_invalidatepage(page, offset, length); |
2998 | 3005 | ||
2999 | /* No journalling happens on data buffers when this function is used */ | 3006 | /* No journalling happens on data buffers when this function is used */ |
3000 | WARN_ON(page_has_buffers(page) && buffer_jbd(page_buffers(page))); | 3007 | WARN_ON(page_has_buffers(page) && buffer_jbd(page_buffers(page))); |
3001 | 3008 | ||
3002 | block_invalidatepage(page, offset, PAGE_CACHE_SIZE - offset); | 3009 | block_invalidatepage(page, offset, length); |
3003 | } | 3010 | } |
3004 | 3011 | ||
3005 | static int __ext4_journalled_invalidatepage(struct page *page, | 3012 | static int __ext4_journalled_invalidatepage(struct page *page, |
3006 | unsigned long offset) | 3013 | unsigned int offset, |
3014 | unsigned int length) | ||
3007 | { | 3015 | { |
3008 | journal_t *journal = EXT4_JOURNAL(page->mapping->host); | 3016 | journal_t *journal = EXT4_JOURNAL(page->mapping->host); |
3009 | 3017 | ||
3010 | trace_ext4_journalled_invalidatepage(page, offset); | 3018 | trace_ext4_journalled_invalidatepage(page, offset, length); |
3011 | 3019 | ||
3012 | /* | 3020 | /* |
3013 | * If it's a full truncate we just forget about the pending dirtying | 3021 | * If it's a full truncate we just forget about the pending dirtying |
3014 | */ | 3022 | */ |
3015 | if (offset == 0) | 3023 | if (offset == 0 && length == PAGE_CACHE_SIZE) |
3016 | ClearPageChecked(page); | 3024 | ClearPageChecked(page); |
3017 | 3025 | ||
3018 | return jbd2_journal_invalidatepage(journal, page, offset, | 3026 | return jbd2_journal_invalidatepage(journal, page, offset, length); |
3019 | PAGE_CACHE_SIZE - offset); | ||
3020 | } | 3027 | } |
3021 | 3028 | ||
3022 | /* Wrapper for aops... */ | 3029 | /* Wrapper for aops... */ |
@@ -3024,7 +3031,7 @@ static void ext4_journalled_invalidatepage(struct page *page, | |||
3024 | unsigned int offset, | 3031 | unsigned int offset, |
3025 | unsigned int length) | 3032 | unsigned int length) |
3026 | { | 3033 | { |
3027 | WARN_ON(__ext4_journalled_invalidatepage(page, offset) < 0); | 3034 | WARN_ON(__ext4_journalled_invalidatepage(page, offset, length) < 0); |
3028 | } | 3035 | } |
3029 | 3036 | ||
3030 | static int ext4_releasepage(struct page *page, gfp_t wait) | 3037 | static int ext4_releasepage(struct page *page, gfp_t wait) |
@@ -4628,7 +4635,8 @@ static void ext4_wait_for_tail_page_commit(struct inode *inode) | |||
4628 | inode->i_size >> PAGE_CACHE_SHIFT); | 4635 | inode->i_size >> PAGE_CACHE_SHIFT); |
4629 | if (!page) | 4636 | if (!page) |
4630 | return; | 4637 | return; |
4631 | ret = __ext4_journalled_invalidatepage(page, offset); | 4638 | ret = __ext4_journalled_invalidatepage(page, offset, |
4639 | PAGE_CACHE_SIZE - offset); | ||
4632 | unlock_page(page); | 4640 | unlock_page(page); |
4633 | page_cache_release(page); | 4641 | page_cache_release(page); |
4634 | if (ret != -EBUSY) | 4642 | if (ret != -EBUSY) |