aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorLukas Czerner <lczerner@redhat.com>2013-05-21 23:25:01 -0400
committerTheodore Ts'o <tytso@mit.edu>2013-05-21 23:25:01 -0400
commitca99fdd26b450cfc1dbcb6b01e1753ee5e6c88e0 (patch)
treefc7e0a320bef39c8ad13f21f89dd81145d26c72b /fs/ext4
parent259709b07da103edc40b8c5bdb2d5c0e77374f94 (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.c30
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
1418static void ext4_da_page_release_reservation(struct page *page, 1418static 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
2845out: 2852out:
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,
2994static void ext4_invalidatepage(struct page *page, unsigned int offset, 3001static 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
3005static int __ext4_journalled_invalidatepage(struct page *page, 3012static 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
3030static int ext4_releasepage(struct page *page, gfp_t wait) 3037static 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)