Commit 4520fb3c3690f2643006d85f09ecb74554c10e95
Committed by
Theodore Ts'o
1 parent
d7961c7fa4
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
ext4: split off ext4_journalled_invalidatepage()
In data=journal mode we don't need delalloc or DIO handling in invalidatepage and similarly in other modes we don't need the journal handling. So split invalidatepage implementations. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Showing 2 changed files with 29 additions and 8 deletions Side-by-side Diff
fs/ext4/inode.c
... | ... | @@ -2880,8 +2880,6 @@ |
2880 | 2880 | |
2881 | 2881 | static void ext4_invalidatepage(struct page *page, unsigned long offset) |
2882 | 2882 | { |
2883 | - journal_t *journal = EXT4_JOURNAL(page->mapping->host); | |
2884 | - | |
2885 | 2883 | trace_ext4_invalidatepage(page, offset); |
2886 | 2884 | |
2887 | 2885 | /* |
2888 | 2886 | |
... | ... | @@ -2889,16 +2887,27 @@ |
2889 | 2887 | */ |
2890 | 2888 | if (ext4_should_dioread_nolock(page->mapping->host)) |
2891 | 2889 | ext4_invalidatepage_free_endio(page, offset); |
2890 | + | |
2891 | + /* No journalling happens on data buffers when this function is used */ | |
2892 | + WARN_ON(page_has_buffers(page) && buffer_jbd(page_buffers(page))); | |
2893 | + | |
2894 | + block_invalidatepage(page, offset); | |
2895 | +} | |
2896 | + | |
2897 | +static void ext4_journalled_invalidatepage(struct page *page, | |
2898 | + unsigned long offset) | |
2899 | +{ | |
2900 | + journal_t *journal = EXT4_JOURNAL(page->mapping->host); | |
2901 | + | |
2902 | + trace_ext4_journalled_invalidatepage(page, offset); | |
2903 | + | |
2892 | 2904 | /* |
2893 | 2905 | * If it's a full truncate we just forget about the pending dirtying |
2894 | 2906 | */ |
2895 | 2907 | if (offset == 0) |
2896 | 2908 | ClearPageChecked(page); |
2897 | 2909 | |
2898 | - if (journal) | |
2899 | - jbd2_journal_invalidatepage(journal, page, offset); | |
2900 | - else | |
2901 | - block_invalidatepage(page, offset); | |
2910 | + jbd2_journal_invalidatepage(journal, page, offset); | |
2902 | 2911 | } |
2903 | 2912 | |
2904 | 2913 | static int ext4_releasepage(struct page *page, gfp_t wait) |
... | ... | @@ -3264,7 +3273,7 @@ |
3264 | 3273 | .write_end = ext4_journalled_write_end, |
3265 | 3274 | .set_page_dirty = ext4_journalled_set_page_dirty, |
3266 | 3275 | .bmap = ext4_bmap, |
3267 | - .invalidatepage = ext4_invalidatepage, | |
3276 | + .invalidatepage = ext4_journalled_invalidatepage, | |
3268 | 3277 | .releasepage = ext4_releasepage, |
3269 | 3278 | .direct_IO = ext4_direct_IO, |
3270 | 3279 | .is_partially_uptodate = block_is_partially_uptodate, |
include/trace/events/ext4.h
... | ... | @@ -451,7 +451,7 @@ |
451 | 451 | TP_ARGS(page) |
452 | 452 | ); |
453 | 453 | |
454 | -TRACE_EVENT(ext4_invalidatepage, | |
454 | +DECLARE_EVENT_CLASS(ext4_invalidatepage_op, | |
455 | 455 | TP_PROTO(struct page *page, unsigned long offset), |
456 | 456 | |
457 | 457 | TP_ARGS(page, offset), |
... | ... | @@ -475,6 +475,18 @@ |
475 | 475 | MAJOR(__entry->dev), MINOR(__entry->dev), |
476 | 476 | (unsigned long) __entry->ino, |
477 | 477 | (unsigned long) __entry->index, __entry->offset) |
478 | +); | |
479 | + | |
480 | +DEFINE_EVENT(ext4_invalidatepage_op, ext4_invalidatepage, | |
481 | + TP_PROTO(struct page *page, unsigned long offset), | |
482 | + | |
483 | + TP_ARGS(page, offset) | |
484 | +); | |
485 | + | |
486 | +DEFINE_EVENT(ext4_invalidatepage_op, ext4_journalled_invalidatepage, | |
487 | + TP_PROTO(struct page *page, unsigned long offset), | |
488 | + | |
489 | + TP_ARGS(page, offset) | |
478 | 490 | ); |
479 | 491 | |
480 | 492 | TRACE_EVENT(ext4_discard_blocks, |