On Mon, 2020-11-16 at 14:03 -0500, bfields wrote: > On Mon, Nov 16, 2020 at 11:38:44AM -0500, Jeff Layton wrote: > > Hmm, ok... nfsd4_change_attribute() is called from nfs4 code but also > > nfs3 code as well. The v4 caller (encode_change) only calls it when > > IS_I_VERSION is set, but the v3 callers don't seem to pay attention to > > that. > > Weird. Looking back.... That goes back to the original patch adding > support for ext4's i_version, c654b8a9cba6 "nfsd: support ext4 > i_version". > > It's in nfs3xdr.c, but the fields it's filling in, fh_pre_change and > fh_post_change, are only used in nfs4xdr.c. Maybe moving it someplace > else (vfs.c?) would save some confusion. > > Anyway, yes, that should be checking SB_I_VERSION too. > > > I think the basic issue here is that we're trying to use SB_I_VERSION > > for two different things. Its main purpose is to tell the kernel that > > when it's updating the file times that it should also (possibly) > > increment the i_version counter too. (Some of this is documented in > > include/linux/iversion.h too, fwiw) > > > > nfsd needs a way to tell whether the field should be consulted at all. > > For that we probably do need a different flag of some sort. Doing it at > > the fstype level seems a bit wrong though -- v2/3 don't have a real > > change attribute and it probably shouldn't be trusted when exporting > > them. > > Oops, good point. > > I suppose simplest is just another SB_ flag. > Another idea might be to add a new fetch_iversion export operation that returns a u64. Roll two generic functions -- one to handle the xfs/ext4/btrfs case and another for the NFS/AFS/Ceph case (where we just fetch it raw). When the op is a NULL pointer, treat it like the !IS_I_VERSION case today. -- Jeff Layton <jlayton@xxxxxxxxxx>