* [PATCH 0/2 -v3] ext4: scoped NOFS for the handle in nojournal mode
@ 2026-07-21 14:01 Theodore Ts'o
2026-07-21 14:01 ` [PATCH 1/2] ext4: enable scoped NOFS when starting a " Theodore Ts'o
2026-07-21 14:01 ` [PATCH 2/2] jbd2: align h_type and h_line_no in the handle structure on byte boundaries Theodore Ts'o
0 siblings, 2 replies; 4+ messages in thread
From: Theodore Ts'o @ 2026-07-21 14:01 UTC (permalink / raw)
To: linux-ext4; +Cc: Theodore Ts'o
This patch series makes it safe to remove the GFP_NOFS flag when an
active is handle and slightly optimized the data layout of the jbd2
handle.
Theodore Ts'o (2):
ext4: enable scoped NOFS when starting a handle in nojournal mode
jbd2: align h_type and h_line_no in the handle structure on byte
boundaries
fs/ext4/ext4_jbd2.c | 36 ++++++++++++++++++++++--------------
fs/ext4/ext4_jbd2.h | 6 +-----
fs/jbd2/journal.c | 1 +
include/linux/jbd2.h | 11 ++++++-----
4 files changed, 30 insertions(+), 24 deletions(-)
Changes in v3:
* Export ext4_handle_cache to fix a build break when ext4 is
compiled as module
* Add an optimization in how h_type and h_line_no is laid out
in the jbd2_journal_handle structure.
Link to v2: https://lore.kernel.org/r/20260716144831.41290-1-tytso@mit.edu
Changes in v2:
* Remove an unused variable in ext4_get_nojournal()
* Add a safety check in case ext4_handle_valid() is passed a NULL
pointer, even though the fucntion is documented that the caller
must not be called with a NULL handle.
Link to v1: https://lore.kernel.org/r/20260625172223.88878-1-tytso@mit.edu
--
2.53.0
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH 1/2] ext4: enable scoped NOFS when starting a handle in nojournal mode 2026-07-21 14:01 [PATCH 0/2 -v3] ext4: scoped NOFS for the handle in nojournal mode Theodore Ts'o @ 2026-07-21 14:01 ` Theodore Ts'o 2026-07-22 22:55 ` Andreas Dilger 2026-07-21 14:01 ` [PATCH 2/2] jbd2: align h_type and h_line_no in the handle structure on byte boundaries Theodore Ts'o 1 sibling, 1 reply; 4+ messages in thread From: Theodore Ts'o @ 2026-07-21 14:01 UTC (permalink / raw) To: linux-ext4; +Cc: Theodore Ts'o The jbd2 layer enables NOFS mode using memalloc_nofs_{save,restore}() while a handle is active. We need to do the same in nojournal mode so that it is safe to remove GFP_NOFS flags while a jbd2 handle is active. This will require that we actually allocate a real handle, but with an h_invalid flag set, so there is a place to put the saved memalloc context. Signed-off-by: Theodore Ts'o <tytso@mit.edu> --- fs/ext4/ext4_jbd2.c | 36 ++++++++++++++++++++++-------------- fs/ext4/ext4_jbd2.h | 6 +----- fs/jbd2/journal.c | 1 + include/linux/jbd2.h | 1 + 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c index 9a8c225f2753..b4dacd1a89e7 100644 --- a/fs/ext4/ext4_jbd2.c +++ b/fs/ext4/ext4_jbd2.c @@ -33,14 +33,22 @@ int ext4_inode_journal_mode(struct inode *inode) static handle_t *ext4_get_nojournal(void) { handle_t *handle = current->journal_info; - unsigned long ref_cnt = (unsigned long)handle; - BUG_ON(ref_cnt >= EXT4_NOJOURNAL_MAX_REF_COUNT); - - ref_cnt++; - handle = (handle_t *)ref_cnt; - - current->journal_info = handle; + BUG_ON(handle && !handle->h_invalid); + + if (!handle) { + handle = jbd2_alloc_handle(GFP_NOFS); + if (!handle) + return ERR_PTR(-ENOMEM); + handle->h_invalid = 1; + /* + * This is done by start_this_handle() if journalling + * is enabled. + */ + handle->saved_alloc_context = memalloc_nofs_save(); + current->journal_info = handle; + } + handle->h_ref++; return handle; } @@ -48,14 +56,14 @@ static handle_t *ext4_get_nojournal(void) /* Decrement the non-pointer handle value */ static void ext4_put_nojournal(handle_t *handle) { - unsigned long ref_cnt = (unsigned long)handle; + BUG_ON(handle->h_ref == 0); - BUG_ON(ref_cnt == 0); - - ref_cnt--; - handle = (handle_t *)ref_cnt; - - current->journal_info = handle; + handle->h_ref--; + if (handle->h_ref == 0) { + memalloc_nofs_restore(handle->saved_alloc_context); + jbd2_free_handle(handle); + current->journal_info = NULL; + } } /* diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h index 63d17c5201b5..2fbf48b3dfe2 100644 --- a/fs/ext4/ext4_jbd2.h +++ b/fs/ext4/ext4_jbd2.h @@ -182,15 +182,11 @@ handle_t *__ext4_journal_start_sb(struct inode *inode, struct super_block *sb, int rsv_blocks, int revoke_creds); int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle); -#define EXT4_NOJOURNAL_MAX_REF_COUNT ((unsigned long) 4096) - /* Note: Do not use this for NULL handles. This is only to determine if * a properly allocated handle is using a journal or not. */ static inline int ext4_handle_valid(handle_t *handle) { - if ((unsigned long)handle < EXT4_NOJOURNAL_MAX_REF_COUNT) - return 0; - return 1; + return (handle && !handle->h_invalid); } static inline void ext4_handle_sync(handle_t *handle) diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 4fdf089500f6..f0eab6151f48 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -94,6 +94,7 @@ EXPORT_SYMBOL(jbd2_journal_init_jbd_inode); EXPORT_SYMBOL(jbd2_journal_release_jbd_inode); EXPORT_SYMBOL(jbd2_journal_begin_ordered_truncate); EXPORT_SYMBOL(jbd2_inode_cache); +EXPORT_SYMBOL(jbd2_handle_cache); #ifdef CONFIG_JBD2_DEBUG void __jbd2_debug(int level, const char *file, const char *func, diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index b68561187e90..7348fdadc810 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -513,6 +513,7 @@ struct jbd2_journal_handle unsigned int h_sync: 1; unsigned int h_reserved: 1; unsigned int h_aborted: 1; + unsigned int h_invalid: 1; unsigned int h_type: 8; unsigned int h_line_no: 16; -- 2.53.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] ext4: enable scoped NOFS when starting a handle in nojournal mode 2026-07-21 14:01 ` [PATCH 1/2] ext4: enable scoped NOFS when starting a " Theodore Ts'o @ 2026-07-22 22:55 ` Andreas Dilger 0 siblings, 0 replies; 4+ messages in thread From: Andreas Dilger @ 2026-07-22 22:55 UTC (permalink / raw) To: Theodore Ts'o; +Cc: linux-ext4 On Jul 21, 2026, at 08:01, Theodore Ts'o <tytso@mit.edu> wrote: > > The jbd2 layer enables NOFS mode using memalloc_nofs_{save,restore}() > while a handle is active. We need to do the same in nojournal mode so > that it is safe to remove GFP_NOFS flags while a jbd2 handle is > active. > > This will require that we actually allocate a real handle, but with an > h_invalid flag set, so there is a place to put the saved memalloc > context. > > Signed-off-by: Theodore Ts'o <tytso@mit.edu> Reviewed-by: Andreas Dilger <adilger@dilger.ca <mailto:adilger@dilger.ca>> Cheers, Andreas ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/2] jbd2: align h_type and h_line_no in the handle structure on byte boundaries 2026-07-21 14:01 [PATCH 0/2 -v3] ext4: scoped NOFS for the handle in nojournal mode Theodore Ts'o 2026-07-21 14:01 ` [PATCH 1/2] ext4: enable scoped NOFS when starting a " Theodore Ts'o @ 2026-07-21 14:01 ` Theodore Ts'o 1 sibling, 0 replies; 4+ messages in thread From: Theodore Ts'o @ 2026-07-21 14:01 UTC (permalink / raw) To: linux-ext4; +Cc: Theodore Ts'o This makes starting handles a little more efficient, since it avoids requiring bitshifts when setting or getting the h_type and h_line_no fields in the jbd2_journal_handle structure. Signed-off-by: Theodore Ts'o <tytso@mit.edu> --- include/linux/jbd2.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 7348fdadc810..1b42fe47c26b 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -510,12 +510,12 @@ struct jbd2_journal_handle int h_err; /* Flags [no locking] */ - unsigned int h_sync: 1; - unsigned int h_reserved: 1; - unsigned int h_aborted: 1; - unsigned int h_invalid: 1; - unsigned int h_type: 8; - unsigned int h_line_no: 16; + unsigned char h_sync: 1; + unsigned char h_reserved: 1; + unsigned char h_aborted: 1; + unsigned char h_invalid: 1; + unsigned char h_type; + unsigned short h_line_no; unsigned long h_start_jiffies; unsigned int h_requested_credits; -- 2.53.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-07-22 22:55 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-07-21 14:01 [PATCH 0/2 -v3] ext4: scoped NOFS for the handle in nojournal mode Theodore Ts'o 2026-07-21 14:01 ` [PATCH 1/2] ext4: enable scoped NOFS when starting a " Theodore Ts'o 2026-07-22 22:55 ` Andreas Dilger 2026-07-21 14:01 ` [PATCH 2/2] jbd2: align h_type and h_line_no in the handle structure on byte boundaries Theodore Ts'o
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox