lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <aCxd8FndlnTd6DJe@li-dc0c254c-257c-11b2-a85c-98b6c1322444.ibm.com> Date: Tue, 20 May 2025 16:18:16 +0530 From: Ojaswin Mujoo <ojaswin@...ux.ibm.com> To: Zhang Yi <yi.zhang@...weicloud.com> Cc: linux-ext4@...r.kernel.org, linux-fsdevel@...r.kernel.org, linux-kernel@...r.kernel.org, willy@...radead.org, tytso@....edu, adilger.kernel@...ger.ca, jack@...e.cz, yi.zhang@...wei.com, libaokun1@...wei.com, yukuai3@...wei.com, yangerkun@...wei.com Subject: Re: [PATCH v2 8/8] ext4: enable large folio for regular file On Mon, May 12, 2025 at 02:33:19PM +0800, Zhang Yi wrote: > From: Zhang Yi <yi.zhang@...wei.com> > > Besides fsverity, fscrypt, and the data=journal mode, ext4 now supports > large folios for regular files. Enable this feature by default. However, > since we cannot change the folio order limitation of mappings on active > inodes, setting the journal=data mode via ioctl on an active inode will > not take immediate effect in non-delalloc mode. > Looks good: Reviewed-by: Ojaswin Mujoo <ojaswin@...ux.ibm.com> Thanks, Ojaswin > Signed-off-by: Zhang Yi <yi.zhang@...wei.com> > --- > fs/ext4/ext4.h | 1 + > fs/ext4/ext4_jbd2.c | 3 ++- > fs/ext4/ialloc.c | 3 +++ > fs/ext4/inode.c | 20 ++++++++++++++++++++ > 4 files changed, 26 insertions(+), 1 deletion(-) > > diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h > index 5a20e9cd7184..2fad90c30493 100644 > --- a/fs/ext4/ext4.h > +++ b/fs/ext4/ext4.h > @@ -2993,6 +2993,7 @@ int ext4_walk_page_buffers(handle_t *handle, > struct buffer_head *bh)); > int do_journal_get_write_access(handle_t *handle, struct inode *inode, > struct buffer_head *bh); > +bool ext4_should_enable_large_folio(struct inode *inode); > #define FALL_BACK_TO_NONDELALLOC 1 > #define CONVERT_INLINE_DATA 2 > > diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c > index 135e278c832e..b3e9b7bd7978 100644 > --- a/fs/ext4/ext4_jbd2.c > +++ b/fs/ext4/ext4_jbd2.c > @@ -16,7 +16,8 @@ int ext4_inode_journal_mode(struct inode *inode) > ext4_test_inode_flag(inode, EXT4_INODE_EA_INODE) || > test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA || > (ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA) && > - !test_opt(inode->i_sb, DELALLOC))) { > + !test_opt(inode->i_sb, DELALLOC) && > + !mapping_large_folio_support(inode->i_mapping))) { > /* We do not support data journalling for encrypted data */ > if (S_ISREG(inode->i_mode) && IS_ENCRYPTED(inode)) > return EXT4_INODE_ORDERED_DATA_MODE; /* ordered */ > diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c > index e7ecc7c8a729..4938e78cbadc 100644 > --- a/fs/ext4/ialloc.c > +++ b/fs/ext4/ialloc.c > @@ -1336,6 +1336,9 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap, > } > } > > + if (ext4_should_enable_large_folio(inode)) > + mapping_set_large_folios(inode->i_mapping); > + > ext4_update_inode_fsync_trans(handle, inode, 1); > > err = ext4_mark_inode_dirty(handle, inode); > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index 29eccdf8315a..7fd3921cfe46 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -4774,6 +4774,23 @@ static int check_igot_inode(struct inode *inode, ext4_iget_flags flags, > return -EFSCORRUPTED; > } > > +bool ext4_should_enable_large_folio(struct inode *inode) > +{ > + struct super_block *sb = inode->i_sb; > + > + if (!S_ISREG(inode->i_mode)) > + return false; > + if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA || > + ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA)) > + return false; > + if (ext4_has_feature_verity(sb)) > + return false; > + if (ext4_has_feature_encrypt(sb)) > + return false; > + > + return true; > +} > + > struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, > ext4_iget_flags flags, const char *function, > unsigned int line) > @@ -5096,6 +5113,9 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, > ret = -EFSCORRUPTED; > goto bad_inode; > } > + if (ext4_should_enable_large_folio(inode)) > + mapping_set_large_folios(inode->i_mapping); > + > ret = check_igot_inode(inode, flags, function, line); > /* > * -ESTALE here means there is nothing inherently wrong with the inode, > -- > 2.46.1 >
Powered by blists - more mailing lists