All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@kernel.org>
To: Jan Kara <jack@suse.cz>
Cc: tytso@mit.edu, adilger.kernel@dilger.ca,
	linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	Lukas Czerner <lczerner@redhat.com>,
	Christian Brauner <brauner@kernel.org>
Subject: Re: [PATCH] ext4: fix i_version handling in ext4
Date: Wed, 17 Aug 2022 09:09:58 -0400	[thread overview]
Message-ID: <e822b39e120332f88cbfe5d02d69c217bac74419.camel@kernel.org> (raw)
In-Reply-To: <20220817130441.qigqv62wj6lrvxfc@quack3>

On Wed, 2022-08-17 at 15:04 +0200, Jan Kara wrote:
> On Tue 16-08-22 09:15:22, Jeff Layton wrote:
> > ext4 currently updates the i_version counter when the atime is updated
> > during a read. This is less than ideal as it can cause unnecessary cache
> > invalidations with NFSv4. The increment in ext4_mark_iloc_dirty is also
> > problematic since it can also corrupt the i_version counter for
> > ea_inodes.
> > 
> > We aren't bumping the file times in ext4_mark_iloc_dirty, so changing
> > the i_version there seems wrong, and is the cause of both problems.
> > Remove that callsite and add increments to the setattr and setxattr
> > codepaths (at the same time that we update the ctime). The i_version
> > bump that already happens during timestamp updates should take care of
> > the rest.
> > 
> > Cc: Lukas Czerner <lczerner@redhat.com>
> > Cc: Jan Kara <jack@suse.cz>
> > Cc: Christian Brauner <brauner@kernel.org>
> > Signed-off-by: Jeff Layton <jlayton@kernel.org>
> 
> After some verification (which was not completely trivial e.g. for
> directories) I agree all cases should be covered. Feel free to add:
> 
> Reviewed-by: Jan Kara <jack@suse.cz>
> 
> 								Honza
> 

Thanks.

I think this covers the typical cases, but there are some places I
missed:

The setacl codepath, for one, and there are a number of places that set
the ctime explicitly for hole punching and the like. I'm planning to
send a v2 once I do a bit more testing. I'll hold off on adding your
Reviewed-by just yet, since the final patch may be quite a bit
different.


> > ---
> >  fs/ext4/inode.c | 10 +++++-----
> >  fs/ext4/xattr.c |  2 ++
> >  2 files changed, 7 insertions(+), 5 deletions(-)
> > 
> > I think this patch should probably supersede Lukas' patch entitled:
> > 
> >     ext4: don't increase iversion counter for ea_inodes
> > 
> > This will also mean that we'll need to respin the patch to turn on the
> > i_version counter unconditionally in ext4 (though that should be
> > trivial).
> > 
> > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> > index 601214453c3a..a70921df89a5 100644
> > --- a/fs/ext4/inode.c
> > +++ b/fs/ext4/inode.c
> > @@ -5342,6 +5342,7 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
> >  	int error, rc = 0;
> >  	int orphan = 0;
> >  	const unsigned int ia_valid = attr->ia_valid;
> > +	bool inc_ivers = IS_IVERSION(inode);
> >  
> >  	if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb))))
> >  		return -EIO;
> > @@ -5425,8 +5426,8 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
> >  			return -EINVAL;
> >  		}
> >  
> > -		if (IS_I_VERSION(inode) && attr->ia_size != inode->i_size)
> > -			inode_inc_iversion(inode);
> > +		if (attr->ia_size == inode->i_size)
> > +			inc_ivers = false;
> >  
> >  		if (shrink) {
> >  			if (ext4_should_order_data(inode)) {
> > @@ -5528,6 +5529,8 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
> >  	}
> >  
> >  	if (!error) {
> > +		if (inc_ivers)
> > +			inode_inc_iversion(inode);
> >  		setattr_copy(mnt_userns, inode, attr);
> >  		mark_inode_dirty(inode);
> >  	}
> > @@ -5731,9 +5734,6 @@ int ext4_mark_iloc_dirty(handle_t *handle,
> >  	}
> >  	ext4_fc_track_inode(handle, inode);
> >  
> > -	if (IS_I_VERSION(inode))
> > -		inode_inc_iversion(inode);
> > -
> >  	/* the do_update_inode consumes one bh->b_count */
> >  	get_bh(iloc->bh);
> >  
> > diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
> > index 533216e80fa2..4d84919d1c9c 100644
> > --- a/fs/ext4/xattr.c
> > +++ b/fs/ext4/xattr.c
> > @@ -2412,6 +2412,8 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
> >  	if (!error) {
> >  		ext4_xattr_update_super_block(handle, inode->i_sb);
> >  		inode->i_ctime = current_time(inode);
> > +		if (IS_IVERSION(inode))
> > +			inode_inc_iversion(inode);
> >  		if (!value)
> >  			no_expand = 0;
> >  		error = ext4_mark_iloc_dirty(handle, inode, &is.iloc);
> > -- 
> > 2.37.2
> > 

-- 
Jeff Layton <jlayton@kernel.org>

  reply	other threads:[~2022-08-17 13:11 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-16 13:15 [PATCH] ext4: fix i_version handling in ext4 Jeff Layton
2022-08-16 13:33 ` Christian Brauner
2022-08-16 13:43   ` Jeff Layton
2022-08-16 13:46     ` Christian Brauner
2022-08-17 13:04 ` Jan Kara
2022-08-17 13:09   ` Jeff Layton [this message]
2022-08-17 13:25     ` Jan Kara
2022-08-17 13:28       ` Jeff Layton
2022-08-17 13:47         ` Jan Kara
2022-08-19 11:36 Jeff Layton
2022-08-19 11:40 ` Jeff Layton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e822b39e120332f88cbfe5d02d69c217bac74419.camel@kernel.org \
    --to=jlayton@kernel.org \
    --cc=adilger.kernel@dilger.ca \
    --cc=brauner@kernel.org \
    --cc=jack@suse.cz \
    --cc=lczerner@redhat.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.