diff options
author | Lukas Czerner <lczerner@redhat.com> | 2013-05-21 23:26:36 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2013-05-21 23:26:36 -0400 |
commit | d8c8900ac113d2b2b3d382acda198b4ae29b1b51 (patch) | |
tree | 7d5874b39bd61a2d31ff3dbf537cddd4b5b5e20a /fs | |
parent | ca99fdd26b450cfc1dbcb6b01e1753ee5e6c88e0 (diff) | |
download | linux-d8c8900ac113d2b2b3d382acda198b4ae29b1b51.tar.gz linux-d8c8900ac113d2b2b3d382acda198b4ae29b1b51.tar.bz2 linux-d8c8900ac113d2b2b3d382acda198b4ae29b1b51.zip |
jbd: change journal_invalidatepage() to accept length
->invalidatepage() aop now accepts range to invalidate so we can make
use of it in journal_invalidatepage() and all the users in ext3 file
system. Also update ext3 trace point to print out length argument.
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ext3/inode.c | 6 | ||||
-rw-r--r-- | fs/jbd/transaction.c | 19 |
2 files changed, 17 insertions, 8 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index b6e5934f5dd6..f67668f724ba 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c @@ -1830,15 +1830,15 @@ static void ext3_invalidatepage(struct page *page, unsigned int offset, { journal_t *journal = EXT3_JOURNAL(page->mapping->host); - trace_ext3_invalidatepage(page, offset); + trace_ext3_invalidatepage(page, offset, length); /* * If it's a full truncate we just forget about the pending dirtying */ - if (offset == 0) + if (offset == 0 && length == PAGE_CACHE_SIZE) ClearPageChecked(page); - journal_invalidatepage(journal, page, offset); + journal_invalidatepage(journal, page, offset, length); } static int ext3_releasepage(struct page *page, gfp_t wait) diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index e3e255c0a509..be0c39b66fe0 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c @@ -2019,16 +2019,20 @@ zap_buffer_unlocked: * void journal_invalidatepage() - invalidate a journal page * @journal: journal to use for flush * @page: page to flush - * @offset: length of page to invalidate. + * @offset: offset of the range to invalidate + * @length: length of the range to invalidate * - * Reap page buffers containing data after offset in page. + * Reap page buffers containing data in specified range in page. */ void journal_invalidatepage(journal_t *journal, struct page *page, - unsigned long offset) + unsigned int offset, + unsigned int length) { struct buffer_head *head, *bh, *next; + unsigned int stop = offset + length; unsigned int curr_off = 0; + int partial_page = (offset || length < PAGE_CACHE_SIZE); int may_free = 1; if (!PageLocked(page)) @@ -2036,6 +2040,8 @@ void journal_invalidatepage(journal_t *journal, if (!page_has_buffers(page)) return; + BUG_ON(stop > PAGE_CACHE_SIZE || stop < length); + /* We will potentially be playing with lists other than just the * data lists (especially for journaled data mode), so be * cautious in our locking. */ @@ -2045,11 +2051,14 @@ void journal_invalidatepage(journal_t *journal, unsigned int next_off = curr_off + bh->b_size; next = bh->b_this_page; + if (next_off > stop) + return; + if (offset <= curr_off) { /* This block is wholly outside the truncation point */ lock_buffer(bh); may_free &= journal_unmap_buffer(journal, bh, - offset > 0); + partial_page); unlock_buffer(bh); } curr_off = next_off; @@ -2057,7 +2066,7 @@ void journal_invalidatepage(journal_t *journal, } while (bh != head); - if (!offset) { + if (!partial_page) { if (may_free && try_to_free_buffers(page)) J_ASSERT(!page_has_buffers(page)); } |