Re: [f2fs-dev] [PATCH v6 1/7] fs: pass the request_mask to generic_fillattr

2023-08-29 Thread Al Viro
On Tue, Aug 29, 2023 at 08:43:31PM -0400, Jeff Layton wrote:
> On Wed, 2023-08-30 at 01:02 +0100, Al Viro wrote:
> > On Tue, Aug 29, 2023 at 06:58:47PM -0400, Jeff Layton wrote:
> > > On Tue, 2023-08-29 at 23:44 +0100, Al Viro wrote:
> > > > On Tue, Jul 25, 2023 at 10:58:14AM -0400, Jeff Layton wrote:
> > > > > generic_fillattr just fills in the entire stat struct indiscriminately
> > > > > today, copying data from the inode. There is at least one attribute
> > > > > (STATX_CHANGE_COOKIE) that can have side effects when it is reported,
> > > > > and we're looking at adding more with the addition of multigrain
> > > > > timestamps.
> > > > > 
> > > > > Add a request_mask argument to generic_fillattr and have most callers
> > > > > just pass in the value that is passed to getattr. Have other callers
> > > > > (e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of
> > > > > STATX_CHANGE_COOKIE into generic_fillattr.
> > > > 
> > > > Out of curiosity - how much PITA would it be to put request_mask into
> > > > kstat?  Set it in vfs_getattr_nosec() (and those get_file_..._info()
> > > > on smbd side) and don't bother with that kind of propagation boilerplate
> > > > - just have generic_fillattr() pick it there...
> > > > 
> > > > Reduces the patchset size quite a bit...
> > > 
> > > It could be done. To do that right, I think we'd want to drop
> > > request_mask from the ->getattr prototype as well and just have
> > > everything use the mask in the kstat.
> > > 
> > > I don't think it'd reduce the size of the patchset in any meaningful
> > > way, but it might make for a more sensible API over the long haul.
> > 
> > ->getattr() prototype change would be decoupled from that - for your
> > patchset you'd only need the field addition + setting in vfs_getattr_nosec()
> > (and possibly in ksmbd), with the remainders of both series being
> > independent from each other.
> > 
> > What I suggest is
> > 
> > branchpoint -> field addition (trivial commit) -> argument removal
> > |
> > V
> > your series, starting with "use stat->request_mask in generic_fillattr()"
> > 
> > Total size would be about the same, but it would be easier to follow
> > the less trivial part of that.  Nothing in your branch downstream of
> > that touches any ->getattr() instances, so it should have no
> > conflicts with the argument removal side of things.
> 
> The only problem with this plan is that Linus has already merged this.
> I've no issue with adding the request_mask to the kstat and removing it
> as a separate parameter elsewhere, but I think we'll need to do it on
> top of what's already been merged.

D'oh...  My apologies; I'll do a branch on top of that (and rebase on
top of -rc1 once the window closes).


___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


Re: [f2fs-dev] [PATCH v6 1/7] fs: pass the request_mask to generic_fillattr

2023-08-29 Thread Jeff Layton
On Wed, 2023-08-30 at 01:02 +0100, Al Viro wrote:
> On Tue, Aug 29, 2023 at 06:58:47PM -0400, Jeff Layton wrote:
> > On Tue, 2023-08-29 at 23:44 +0100, Al Viro wrote:
> > > On Tue, Jul 25, 2023 at 10:58:14AM -0400, Jeff Layton wrote:
> > > > generic_fillattr just fills in the entire stat struct indiscriminately
> > > > today, copying data from the inode. There is at least one attribute
> > > > (STATX_CHANGE_COOKIE) that can have side effects when it is reported,
> > > > and we're looking at adding more with the addition of multigrain
> > > > timestamps.
> > > > 
> > > > Add a request_mask argument to generic_fillattr and have most callers
> > > > just pass in the value that is passed to getattr. Have other callers
> > > > (e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of
> > > > STATX_CHANGE_COOKIE into generic_fillattr.
> > > 
> > > Out of curiosity - how much PITA would it be to put request_mask into
> > > kstat?  Set it in vfs_getattr_nosec() (and those get_file_..._info()
> > > on smbd side) and don't bother with that kind of propagation boilerplate
> > > - just have generic_fillattr() pick it there...
> > > 
> > > Reduces the patchset size quite a bit...
> > 
> > It could be done. To do that right, I think we'd want to drop
> > request_mask from the ->getattr prototype as well and just have
> > everything use the mask in the kstat.
> > 
> > I don't think it'd reduce the size of the patchset in any meaningful
> > way, but it might make for a more sensible API over the long haul.
> 
> ->getattr() prototype change would be decoupled from that - for your
> patchset you'd only need the field addition + setting in vfs_getattr_nosec()
> (and possibly in ksmbd), with the remainders of both series being
> independent from each other.
> 
> What I suggest is
> 
> branchpoint -> field addition (trivial commit) -> argument removal
>   |
>   V
> your series, starting with "use stat->request_mask in generic_fillattr()"
> 
> Total size would be about the same, but it would be easier to follow
> the less trivial part of that.  Nothing in your branch downstream of
> that touches any ->getattr() instances, so it should have no
> conflicts with the argument removal side of things.

The only problem with this plan is that Linus has already merged this.
I've no issue with adding the request_mask to the kstat and removing it
as a separate parameter elsewhere, but I think we'll need to do it on
top of what's already been merged.
-- 
Jeff Layton 


___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


Re: [f2fs-dev] [PATCH v6 1/7] fs: pass the request_mask to generic_fillattr

2023-08-29 Thread Al Viro
On Tue, Aug 29, 2023 at 06:58:47PM -0400, Jeff Layton wrote:
> On Tue, 2023-08-29 at 23:44 +0100, Al Viro wrote:
> > On Tue, Jul 25, 2023 at 10:58:14AM -0400, Jeff Layton wrote:
> > > generic_fillattr just fills in the entire stat struct indiscriminately
> > > today, copying data from the inode. There is at least one attribute
> > > (STATX_CHANGE_COOKIE) that can have side effects when it is reported,
> > > and we're looking at adding more with the addition of multigrain
> > > timestamps.
> > > 
> > > Add a request_mask argument to generic_fillattr and have most callers
> > > just pass in the value that is passed to getattr. Have other callers
> > > (e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of
> > > STATX_CHANGE_COOKIE into generic_fillattr.
> > 
> > Out of curiosity - how much PITA would it be to put request_mask into
> > kstat?  Set it in vfs_getattr_nosec() (and those get_file_..._info()
> > on smbd side) and don't bother with that kind of propagation boilerplate
> > - just have generic_fillattr() pick it there...
> > 
> > Reduces the patchset size quite a bit...
> 
> It could be done. To do that right, I think we'd want to drop
> request_mask from the ->getattr prototype as well and just have
> everything use the mask in the kstat.
> 
> I don't think it'd reduce the size of the patchset in any meaningful
> way, but it might make for a more sensible API over the long haul.

->getattr() prototype change would be decoupled from that - for your
patchset you'd only need the field addition + setting in vfs_getattr_nosec()
(and possibly in ksmbd), with the remainders of both series being
independent from each other.

What I suggest is

branchpoint -> field addition (trivial commit) -> argument removal
|
V
your series, starting with "use stat->request_mask in generic_fillattr()"

Total size would be about the same, but it would be easier to follow
the less trivial part of that.  Nothing in your branch downstream of
that touches any ->getattr() instances, so it should have no
conflicts with the argument removal side of things.


___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


Re: [f2fs-dev] [PATCH v6 1/7] fs: pass the request_mask to generic_fillattr

2023-08-29 Thread Jeff Layton
On Tue, 2023-08-29 at 23:44 +0100, Al Viro wrote:
> On Tue, Jul 25, 2023 at 10:58:14AM -0400, Jeff Layton wrote:
> > generic_fillattr just fills in the entire stat struct indiscriminately
> > today, copying data from the inode. There is at least one attribute
> > (STATX_CHANGE_COOKIE) that can have side effects when it is reported,
> > and we're looking at adding more with the addition of multigrain
> > timestamps.
> > 
> > Add a request_mask argument to generic_fillattr and have most callers
> > just pass in the value that is passed to getattr. Have other callers
> > (e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of
> > STATX_CHANGE_COOKIE into generic_fillattr.
> 
> Out of curiosity - how much PITA would it be to put request_mask into
> kstat?  Set it in vfs_getattr_nosec() (and those get_file_..._info()
> on smbd side) and don't bother with that kind of propagation boilerplate
> - just have generic_fillattr() pick it there...
> 
> Reduces the patchset size quite a bit...

It could be done. To do that right, I think we'd want to drop
request_mask from the ->getattr prototype as well and just have
everything use the mask in the kstat.

I don't think it'd reduce the size of the patchset in any meaningful
way, but it might make for a more sensible API over the long haul.
-- 
Jeff Layton 


___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


Re: [f2fs-dev] [PATCH v6 1/7] fs: pass the request_mask to generic_fillattr

2023-08-29 Thread Al Viro
On Tue, Jul 25, 2023 at 10:58:14AM -0400, Jeff Layton wrote:
> generic_fillattr just fills in the entire stat struct indiscriminately
> today, copying data from the inode. There is at least one attribute
> (STATX_CHANGE_COOKIE) that can have side effects when it is reported,
> and we're looking at adding more with the addition of multigrain
> timestamps.
> 
> Add a request_mask argument to generic_fillattr and have most callers
> just pass in the value that is passed to getattr. Have other callers
> (e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of
> STATX_CHANGE_COOKIE into generic_fillattr.

Out of curiosity - how much PITA would it be to put request_mask into
kstat?  Set it in vfs_getattr_nosec() (and those get_file_..._info()
on smbd side) and don't bother with that kind of propagation boilerplate
- just have generic_fillattr() pick it there...

Reduces the patchset size quite a bit...


___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


Re: [f2fs-dev] [PATCH v6 1/7] fs: pass the request_mask to generic_fillattr

2023-08-02 Thread Paulo Alcantara via Linux-f2fs-devel
Jeff Layton  writes:

> generic_fillattr just fills in the entire stat struct indiscriminately
> today, copying data from the inode. There is at least one attribute
> (STATX_CHANGE_COOKIE) that can have side effects when it is reported,
> and we're looking at adding more with the addition of multigrain
> timestamps.
>
> Add a request_mask argument to generic_fillattr and have most callers
> just pass in the value that is passed to getattr. Have other callers
> (e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of
> STATX_CHANGE_COOKIE into generic_fillattr.
>
> Signed-off-by: Jeff Layton 
> ---
>  fs/9p/vfs_inode.c   |  4 ++--
>  fs/9p/vfs_inode_dotl.c  |  4 ++--
>  fs/afs/inode.c  |  2 +-
>  fs/btrfs/inode.c|  2 +-
>  fs/ceph/inode.c |  2 +-
>  fs/coda/inode.c |  3 ++-
>  fs/ecryptfs/inode.c |  5 +++--
>  fs/erofs/inode.c|  2 +-
>  fs/exfat/file.c |  2 +-
>  fs/ext2/inode.c |  2 +-
>  fs/ext4/inode.c |  2 +-
>  fs/f2fs/file.c  |  2 +-
>  fs/fat/file.c   |  2 +-
>  fs/fuse/dir.c   |  2 +-
>  fs/gfs2/inode.c |  2 +-
>  fs/hfsplus/inode.c  |  2 +-
>  fs/kernfs/inode.c   |  2 +-
>  fs/libfs.c  |  4 ++--
>  fs/minix/inode.c|  2 +-
>  fs/nfs/inode.c  |  2 +-
>  fs/nfs/namespace.c  |  3 ++-
>  fs/ntfs3/file.c |  2 +-
>  fs/ocfs2/file.c |  2 +-
>  fs/orangefs/inode.c |  2 +-
>  fs/proc/base.c  |  4 ++--
>  fs/proc/fd.c|  2 +-
>  fs/proc/generic.c   |  2 +-
>  fs/proc/proc_net.c  |  2 +-
>  fs/proc/proc_sysctl.c   |  2 +-
>  fs/proc/root.c  |  3 ++-
>  fs/smb/client/inode.c   |  2 +-
>  fs/smb/server/smb2pdu.c | 22 +++---
>  fs/smb/server/vfs.c |  3 ++-
>  fs/stat.c   | 18 ++
>  fs/sysv/itree.c |  3 ++-
>  fs/ubifs/dir.c  |  2 +-
>  fs/udf/symlink.c|  2 +-
>  fs/vboxsf/utils.c   |  2 +-
>  include/linux/fs.h  |  2 +-
>  mm/shmem.c  |  2 +-
>  40 files changed, 70 insertions(+), 62 deletions(-)
>
> [...]
>
> diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c
> index 218f03dd3f52..93fe43789d7a 100644
> --- a/fs/smb/client/inode.c
> +++ b/fs/smb/client/inode.c
> @@ -2540,7 +2540,7 @@ int cifs_getattr(struct mnt_idmap *idmap, const struct 
> path *path,
>   return rc;
>   }
>  
> - generic_fillattr(_mnt_idmap, inode, stat);
> + generic_fillattr(_mnt_idmap, request_mask, inode, stat);
>   stat->blksize = cifs_sb->ctx->bsize;
>   stat->ino = CIFS_I(inode)->uniqueid;

Reviewed-by: Paulo Alcantara (SUSE) 


___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


Re: [f2fs-dev] [PATCH v6 1/7] fs: pass the request_mask to generic_fillattr

2023-08-02 Thread Jan Kara
On Tue 25-07-23 10:58:14, Jeff Layton wrote:
> generic_fillattr just fills in the entire stat struct indiscriminately
> today, copying data from the inode. There is at least one attribute
> (STATX_CHANGE_COOKIE) that can have side effects when it is reported,
> and we're looking at adding more with the addition of multigrain
> timestamps.
> 
> Add a request_mask argument to generic_fillattr and have most callers
> just pass in the value that is passed to getattr. Have other callers
> (e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of
> STATX_CHANGE_COOKIE into generic_fillattr.
> 
> Signed-off-by: Jeff Layton 

Looks good. Feel free to add:

Reviewed-by: Jan Kara 

Honza

> ---
>  fs/9p/vfs_inode.c   |  4 ++--
>  fs/9p/vfs_inode_dotl.c  |  4 ++--
>  fs/afs/inode.c  |  2 +-
>  fs/btrfs/inode.c|  2 +-
>  fs/ceph/inode.c |  2 +-
>  fs/coda/inode.c |  3 ++-
>  fs/ecryptfs/inode.c |  5 +++--
>  fs/erofs/inode.c|  2 +-
>  fs/exfat/file.c |  2 +-
>  fs/ext2/inode.c |  2 +-
>  fs/ext4/inode.c |  2 +-
>  fs/f2fs/file.c  |  2 +-
>  fs/fat/file.c   |  2 +-
>  fs/fuse/dir.c   |  2 +-
>  fs/gfs2/inode.c |  2 +-
>  fs/hfsplus/inode.c  |  2 +-
>  fs/kernfs/inode.c   |  2 +-
>  fs/libfs.c  |  4 ++--
>  fs/minix/inode.c|  2 +-
>  fs/nfs/inode.c  |  2 +-
>  fs/nfs/namespace.c  |  3 ++-
>  fs/ntfs3/file.c |  2 +-
>  fs/ocfs2/file.c |  2 +-
>  fs/orangefs/inode.c |  2 +-
>  fs/proc/base.c  |  4 ++--
>  fs/proc/fd.c|  2 +-
>  fs/proc/generic.c   |  2 +-
>  fs/proc/proc_net.c  |  2 +-
>  fs/proc/proc_sysctl.c   |  2 +-
>  fs/proc/root.c  |  3 ++-
>  fs/smb/client/inode.c   |  2 +-
>  fs/smb/server/smb2pdu.c | 22 +++---
>  fs/smb/server/vfs.c |  3 ++-
>  fs/stat.c   | 18 ++
>  fs/sysv/itree.c |  3 ++-
>  fs/ubifs/dir.c  |  2 +-
>  fs/udf/symlink.c|  2 +-
>  fs/vboxsf/utils.c   |  2 +-
>  include/linux/fs.h  |  2 +-
>  mm/shmem.c  |  2 +-
>  40 files changed, 70 insertions(+), 62 deletions(-)
> 
> diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
> index 16d85e6033a3..d24d1f20e922 100644
> --- a/fs/9p/vfs_inode.c
> +++ b/fs/9p/vfs_inode.c
> @@ -1016,7 +1016,7 @@ v9fs_vfs_getattr(struct mnt_idmap *idmap, const struct 
> path *path,
>   p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
>   v9ses = v9fs_dentry2v9ses(dentry);
>   if (v9ses->cache & (CACHE_META|CACHE_LOOSE)) {
> - generic_fillattr(_mnt_idmap, inode, stat);
> + generic_fillattr(_mnt_idmap, request_mask, inode, stat);
>   return 0;
>   } else if (v9ses->cache & CACHE_WRITEBACK) {
>   if (S_ISREG(inode->i_mode)) {
> @@ -1037,7 +1037,7 @@ v9fs_vfs_getattr(struct mnt_idmap *idmap, const struct 
> path *path,
>   return PTR_ERR(st);
>  
>   v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb, 0);
> - generic_fillattr(_mnt_idmap, d_inode(dentry), stat);
> + generic_fillattr(_mnt_idmap, request_mask, d_inode(dentry), stat);
>  
>   p9stat_free(st);
>   kfree(st);
> diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c
> index 464ea73d1bf8..8e8d5d2a13d8 100644
> --- a/fs/9p/vfs_inode_dotl.c
> +++ b/fs/9p/vfs_inode_dotl.c
> @@ -451,7 +451,7 @@ v9fs_vfs_getattr_dotl(struct mnt_idmap *idmap,
>   p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
>   v9ses = v9fs_dentry2v9ses(dentry);
>   if (v9ses->cache & (CACHE_META|CACHE_LOOSE)) {
> - generic_fillattr(_mnt_idmap, inode, stat);
> + generic_fillattr(_mnt_idmap, request_mask, inode, stat);
>   return 0;
>   } else if (v9ses->cache) {
>   if (S_ISREG(inode->i_mode)) {
> @@ -476,7 +476,7 @@ v9fs_vfs_getattr_dotl(struct mnt_idmap *idmap,
>   return PTR_ERR(st);
>  
>   v9fs_stat2inode_dotl(st, d_inode(dentry), 0);
> - generic_fillattr(_mnt_idmap, d_inode(dentry), stat);
> + generic_fillattr(_mnt_idmap, request_mask, d_inode(dentry), stat);
>   /* Change block size to what the server returned */
>   stat->blksize = st->st_blksize;
>  
> diff --git a/fs/afs/inode.c b/fs/afs/inode.c
> index 6b636f43f548..1c794a1896aa 100644
> --- a/fs/afs/inode.c
> +++ b/fs/afs/inode.c
> @@ -773,7 +773,7 @@ int afs_getattr(struct mnt_idmap *idmap, const struct 
> path *path,
>  
>   do {
>   read_seqbegin_or_lock(>cb_lock, );
> - generic_fillattr(_mnt_idmap, inode, stat);
> + generic_fillattr(_mnt_idmap, request_mask, inode, stat);
>   if (test_bit(AFS_VNODE_SILLY_DELETED, >flags) &&
>   stat->nlink > 0)
>   stat->nlink -= 1;
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 

Re: [f2fs-dev] [PATCH v6 1/7] fs: pass the request_mask to generic_fillattr

2023-07-26 Thread Jeff Layton
On Wed, 2023-07-26 at 17:40 +0800, Joseph Qi wrote:
> 
> On 7/25/23 10:58 PM, Jeff Layton wrote:
> > generic_fillattr just fills in the entire stat struct indiscriminately
> > today, copying data from the inode. There is at least one attribute
> > (STATX_CHANGE_COOKIE) that can have side effects when it is reported,
> > and we're looking at adding more with the addition of multigrain
> > timestamps.
> > 
> > Add a request_mask argument to generic_fillattr and have most callers
> > just pass in the value that is passed to getattr. Have other callers
> > (e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of
> > STATX_CHANGE_COOKIE into generic_fillattr.
> > 
> > Signed-off-by: Jeff Layton 
> > ---
> >  fs/9p/vfs_inode.c   |  4 ++--
> >  fs/9p/vfs_inode_dotl.c  |  4 ++--
> >  fs/afs/inode.c  |  2 +-
> >  fs/btrfs/inode.c|  2 +-
> >  fs/ceph/inode.c |  2 +-
> >  fs/coda/inode.c |  3 ++-
> >  fs/ecryptfs/inode.c |  5 +++--
> >  fs/erofs/inode.c|  2 +-
> >  fs/exfat/file.c |  2 +-
> >  fs/ext2/inode.c |  2 +-
> >  fs/ext4/inode.c |  2 +-
> >  fs/f2fs/file.c  |  2 +-
> >  fs/fat/file.c   |  2 +-
> >  fs/fuse/dir.c   |  2 +-
> >  fs/gfs2/inode.c |  2 +-
> >  fs/hfsplus/inode.c  |  2 +-
> >  fs/kernfs/inode.c   |  2 +-
> >  fs/libfs.c  |  4 ++--
> >  fs/minix/inode.c|  2 +-
> >  fs/nfs/inode.c  |  2 +-
> >  fs/nfs/namespace.c  |  3 ++-
> >  fs/ntfs3/file.c |  2 +-
> >  fs/ocfs2/file.c |  2 +-
> >  fs/orangefs/inode.c |  2 +-
> >  fs/proc/base.c  |  4 ++--
> >  fs/proc/fd.c|  2 +-
> >  fs/proc/generic.c   |  2 +-
> >  fs/proc/proc_net.c  |  2 +-
> >  fs/proc/proc_sysctl.c   |  2 +-
> >  fs/proc/root.c  |  3 ++-
> >  fs/smb/client/inode.c   |  2 +-
> >  fs/smb/server/smb2pdu.c | 22 +++---
> >  fs/smb/server/vfs.c |  3 ++-
> >  fs/stat.c   | 18 ++
> >  fs/sysv/itree.c |  3 ++-
> >  fs/ubifs/dir.c  |  2 +-
> >  fs/udf/symlink.c|  2 +-
> >  fs/vboxsf/utils.c   |  2 +-
> >  include/linux/fs.h  |  2 +-
> >  mm/shmem.c  |  2 +-
> >  40 files changed, 70 insertions(+), 62 deletions(-)
> > 
> 
> ...
> 
> > diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
> > index 1b337ebce4df..8184499ae7a5 100644
> > --- a/fs/ocfs2/file.c
> > +++ b/fs/ocfs2/file.c
> > @@ -1319,7 +1319,7 @@ int ocfs2_getattr(struct mnt_idmap *idmap, const 
> > struct path *path,
> > goto bail;
> > }
> >  
> > -   generic_fillattr(_mnt_idmap, inode, stat);
> > +   generic_fillattr(_mnt_idmap, request_mask, inode, stat);
> 
> For ocfs2 part, looks fine to me.
> 
> Acked-by: Joseph Qi 
> 
> > /*
> >  * If there is inline data in the inode, the inode will normally not
> >  * have data blocks allocated (it may have an external xattr block).
> 
> ...
> 
> > diff --git a/fs/stat.c b/fs/stat.c
> > index 8c2b30af19f5..062f311b5386 100644
> > --- a/fs/stat.c
> > +++ b/fs/stat.c
> > @@ -29,6 +29,7 @@
> >  /**
> >   * generic_fillattr - Fill in the basic attributes from the inode struct
> >   * @idmap: idmap of the mount the inode was found from
> > + * @req_mask   statx request_mask
> 
> s/req_mask/request_mask
> 

Thanks. Fixed in my tree.

> >   * @inode: Inode to use as the source
> >   * @stat:  Where to fill in the attributes
> >   *
> > @@ -42,8 +43,8 @@
> >   * uid and gid filds. On non-idmapped mounts or if permission checking is 
> > to be
> >   * performed on the raw inode simply passs @nop_mnt_idmap.
> >   */
> > -void generic_fillattr(struct mnt_idmap *idmap, struct inode *inode,
> > - struct kstat *stat)
> > +void generic_fillattr(struct mnt_idmap *idmap, u32 request_mask,
> > + struct inode *inode, struct kstat *stat)
> >  {
> > vfsuid_t vfsuid = i_uid_into_vfsuid(idmap, inode);
> > vfsgid_t vfsgid = i_gid_into_vfsgid(idmap, inode);
> > @@ -61,6 +62,12 @@ void generic_fillattr(struct mnt_idmap *idmap, struct 
> > inode *inode,
> > stat->ctime = inode_get_ctime(inode);
> > stat->blksize = i_blocksize(inode);
> > stat->blocks = inode->i_blocks;
> > +
> > +   if ((request_mask & STATX_CHANGE_COOKIE) && IS_I_VERSION(inode)) {
> > +   stat->result_mask |= STATX_CHANGE_COOKIE;
> > +   stat->change_cookie = inode_query_iversion(inode);
> > +   }
> > +
> >  }
> >  EXPORT_SYMBOL(generic_fillattr);
> >  
> > @@ -123,17 +130,12 @@ int vfs_getattr_nosec(const struct path *path, struct 
> > kstat *stat,
> > stat->attributes_mask |= (STATX_ATTR_AUTOMOUNT |
> >   STATX_ATTR_DAX);
> >  
> > -   if ((request_mask & STATX_CHANGE_COOKIE) && IS_I_VERSION(inode)) {
> > -   stat->result_mask |= STATX_CHANGE_COOKIE;
> > -   stat->change_cookie = inode_query_iversion(inode);
> > -   }
> > -
> > idmap = mnt_idmap(path->mnt);
> >  

Re: [f2fs-dev] [PATCH v6 1/7] fs: pass the request_mask to generic_fillattr

2023-07-26 Thread Joseph Qi



On 7/25/23 10:58 PM, Jeff Layton wrote:
> generic_fillattr just fills in the entire stat struct indiscriminately
> today, copying data from the inode. There is at least one attribute
> (STATX_CHANGE_COOKIE) that can have side effects when it is reported,
> and we're looking at adding more with the addition of multigrain
> timestamps.
> 
> Add a request_mask argument to generic_fillattr and have most callers
> just pass in the value that is passed to getattr. Have other callers
> (e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of
> STATX_CHANGE_COOKIE into generic_fillattr.
> 
> Signed-off-by: Jeff Layton 
> ---
>  fs/9p/vfs_inode.c   |  4 ++--
>  fs/9p/vfs_inode_dotl.c  |  4 ++--
>  fs/afs/inode.c  |  2 +-
>  fs/btrfs/inode.c|  2 +-
>  fs/ceph/inode.c |  2 +-
>  fs/coda/inode.c |  3 ++-
>  fs/ecryptfs/inode.c |  5 +++--
>  fs/erofs/inode.c|  2 +-
>  fs/exfat/file.c |  2 +-
>  fs/ext2/inode.c |  2 +-
>  fs/ext4/inode.c |  2 +-
>  fs/f2fs/file.c  |  2 +-
>  fs/fat/file.c   |  2 +-
>  fs/fuse/dir.c   |  2 +-
>  fs/gfs2/inode.c |  2 +-
>  fs/hfsplus/inode.c  |  2 +-
>  fs/kernfs/inode.c   |  2 +-
>  fs/libfs.c  |  4 ++--
>  fs/minix/inode.c|  2 +-
>  fs/nfs/inode.c  |  2 +-
>  fs/nfs/namespace.c  |  3 ++-
>  fs/ntfs3/file.c |  2 +-
>  fs/ocfs2/file.c |  2 +-
>  fs/orangefs/inode.c |  2 +-
>  fs/proc/base.c  |  4 ++--
>  fs/proc/fd.c|  2 +-
>  fs/proc/generic.c   |  2 +-
>  fs/proc/proc_net.c  |  2 +-
>  fs/proc/proc_sysctl.c   |  2 +-
>  fs/proc/root.c  |  3 ++-
>  fs/smb/client/inode.c   |  2 +-
>  fs/smb/server/smb2pdu.c | 22 +++---
>  fs/smb/server/vfs.c |  3 ++-
>  fs/stat.c   | 18 ++
>  fs/sysv/itree.c |  3 ++-
>  fs/ubifs/dir.c  |  2 +-
>  fs/udf/symlink.c|  2 +-
>  fs/vboxsf/utils.c   |  2 +-
>  include/linux/fs.h  |  2 +-
>  mm/shmem.c  |  2 +-
>  40 files changed, 70 insertions(+), 62 deletions(-)
> 

...

> diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
> index 1b337ebce4df..8184499ae7a5 100644
> --- a/fs/ocfs2/file.c
> +++ b/fs/ocfs2/file.c
> @@ -1319,7 +1319,7 @@ int ocfs2_getattr(struct mnt_idmap *idmap, const struct 
> path *path,
>   goto bail;
>   }
>  
> - generic_fillattr(_mnt_idmap, inode, stat);
> + generic_fillattr(_mnt_idmap, request_mask, inode, stat);

For ocfs2 part, looks fine to me.

Acked-by: Joseph Qi 

>   /*
>* If there is inline data in the inode, the inode will normally not
>* have data blocks allocated (it may have an external xattr block).

...

> diff --git a/fs/stat.c b/fs/stat.c
> index 8c2b30af19f5..062f311b5386 100644
> --- a/fs/stat.c
> +++ b/fs/stat.c
> @@ -29,6 +29,7 @@
>  /**
>   * generic_fillattr - Fill in the basic attributes from the inode struct
>   * @idmap:   idmap of the mount the inode was found from
> + * @req_mask statx request_mask

s/req_mask/request_mask

>   * @inode:   Inode to use as the source
>   * @stat:Where to fill in the attributes
>   *
> @@ -42,8 +43,8 @@
>   * uid and gid filds. On non-idmapped mounts or if permission checking is to 
> be
>   * performed on the raw inode simply passs @nop_mnt_idmap.
>   */
> -void generic_fillattr(struct mnt_idmap *idmap, struct inode *inode,
> -   struct kstat *stat)
> +void generic_fillattr(struct mnt_idmap *idmap, u32 request_mask,
> +   struct inode *inode, struct kstat *stat)
>  {
>   vfsuid_t vfsuid = i_uid_into_vfsuid(idmap, inode);
>   vfsgid_t vfsgid = i_gid_into_vfsgid(idmap, inode);
> @@ -61,6 +62,12 @@ void generic_fillattr(struct mnt_idmap *idmap, struct 
> inode *inode,
>   stat->ctime = inode_get_ctime(inode);
>   stat->blksize = i_blocksize(inode);
>   stat->blocks = inode->i_blocks;
> +
> + if ((request_mask & STATX_CHANGE_COOKIE) && IS_I_VERSION(inode)) {
> + stat->result_mask |= STATX_CHANGE_COOKIE;
> + stat->change_cookie = inode_query_iversion(inode);
> + }
> +
>  }
>  EXPORT_SYMBOL(generic_fillattr);
>  
> @@ -123,17 +130,12 @@ int vfs_getattr_nosec(const struct path *path, struct 
> kstat *stat,
>   stat->attributes_mask |= (STATX_ATTR_AUTOMOUNT |
> STATX_ATTR_DAX);
>  
> - if ((request_mask & STATX_CHANGE_COOKIE) && IS_I_VERSION(inode)) {
> - stat->result_mask |= STATX_CHANGE_COOKIE;
> - stat->change_cookie = inode_query_iversion(inode);
> - }
> -
>   idmap = mnt_idmap(path->mnt);
>   if (inode->i_op->getattr)
>   return inode->i_op->getattr(idmap, path, stat,
>   request_mask, query_flags);
>  
> - generic_fillattr(idmap, inode, stat);
> + generic_fillattr(idmap, request_mask, inode, stat);
>   return 0;
>  

Re: [f2fs-dev] [PATCH v6 1/7] fs: pass the request_mask to generic_fillattr

2023-07-25 Thread Xiubo Li



On 7/25/23 22:58, Jeff Layton wrote:

generic_fillattr just fills in the entire stat struct indiscriminately
today, copying data from the inode. There is at least one attribute
(STATX_CHANGE_COOKIE) that can have side effects when it is reported,
and we're looking at adding more with the addition of multigrain
timestamps.

Add a request_mask argument to generic_fillattr and have most callers
just pass in the value that is passed to getattr. Have other callers
(e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of
STATX_CHANGE_COOKIE into generic_fillattr.

Signed-off-by: Jeff Layton 
---
  fs/9p/vfs_inode.c   |  4 ++--
  fs/9p/vfs_inode_dotl.c  |  4 ++--
  fs/afs/inode.c  |  2 +-
  fs/btrfs/inode.c|  2 +-
  fs/ceph/inode.c |  2 +-


The ceph change looks good to me.

Reviewed-by: Xiubo Li 



  fs/coda/inode.c |  3 ++-
  fs/ecryptfs/inode.c |  5 +++--
  fs/erofs/inode.c|  2 +-
  fs/exfat/file.c |  2 +-
  fs/ext2/inode.c |  2 +-
  fs/ext4/inode.c |  2 +-
  fs/f2fs/file.c  |  2 +-
  fs/fat/file.c   |  2 +-
  fs/fuse/dir.c   |  2 +-
  fs/gfs2/inode.c |  2 +-
  fs/hfsplus/inode.c  |  2 +-
  fs/kernfs/inode.c   |  2 +-
  fs/libfs.c  |  4 ++--
  fs/minix/inode.c|  2 +-
  fs/nfs/inode.c  |  2 +-
  fs/nfs/namespace.c  |  3 ++-
  fs/ntfs3/file.c |  2 +-
  fs/ocfs2/file.c |  2 +-
  fs/orangefs/inode.c |  2 +-
  fs/proc/base.c  |  4 ++--
  fs/proc/fd.c|  2 +-
  fs/proc/generic.c   |  2 +-
  fs/proc/proc_net.c  |  2 +-
  fs/proc/proc_sysctl.c   |  2 +-
  fs/proc/root.c  |  3 ++-
  fs/smb/client/inode.c   |  2 +-
  fs/smb/server/smb2pdu.c | 22 +++---
  fs/smb/server/vfs.c |  3 ++-
  fs/stat.c   | 18 ++
  fs/sysv/itree.c |  3 ++-
  fs/ubifs/dir.c  |  2 +-
  fs/udf/symlink.c|  2 +-
  fs/vboxsf/utils.c   |  2 +-
  include/linux/fs.h  |  2 +-
  mm/shmem.c  |  2 +-
  40 files changed, 70 insertions(+), 62 deletions(-)

diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index 16d85e6033a3..d24d1f20e922 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c
@@ -1016,7 +1016,7 @@ v9fs_vfs_getattr(struct mnt_idmap *idmap, const struct 
path *path,
p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
v9ses = v9fs_dentry2v9ses(dentry);
if (v9ses->cache & (CACHE_META|CACHE_LOOSE)) {
-   generic_fillattr(_mnt_idmap, inode, stat);
+   generic_fillattr(_mnt_idmap, request_mask, inode, stat);
return 0;
} else if (v9ses->cache & CACHE_WRITEBACK) {
if (S_ISREG(inode->i_mode)) {
@@ -1037,7 +1037,7 @@ v9fs_vfs_getattr(struct mnt_idmap *idmap, const struct 
path *path,
return PTR_ERR(st);
  
  	v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb, 0);

-   generic_fillattr(_mnt_idmap, d_inode(dentry), stat);
+   generic_fillattr(_mnt_idmap, request_mask, d_inode(dentry), stat);
  
  	p9stat_free(st);

kfree(st);
diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c
index 464ea73d1bf8..8e8d5d2a13d8 100644
--- a/fs/9p/vfs_inode_dotl.c
+++ b/fs/9p/vfs_inode_dotl.c
@@ -451,7 +451,7 @@ v9fs_vfs_getattr_dotl(struct mnt_idmap *idmap,
p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
v9ses = v9fs_dentry2v9ses(dentry);
if (v9ses->cache & (CACHE_META|CACHE_LOOSE)) {
-   generic_fillattr(_mnt_idmap, inode, stat);
+   generic_fillattr(_mnt_idmap, request_mask, inode, stat);
return 0;
} else if (v9ses->cache) {
if (S_ISREG(inode->i_mode)) {
@@ -476,7 +476,7 @@ v9fs_vfs_getattr_dotl(struct mnt_idmap *idmap,
return PTR_ERR(st);
  
  	v9fs_stat2inode_dotl(st, d_inode(dentry), 0);

-   generic_fillattr(_mnt_idmap, d_inode(dentry), stat);
+   generic_fillattr(_mnt_idmap, request_mask, d_inode(dentry), stat);
/* Change block size to what the server returned */
stat->blksize = st->st_blksize;
  
diff --git a/fs/afs/inode.c b/fs/afs/inode.c

index 6b636f43f548..1c794a1896aa 100644
--- a/fs/afs/inode.c
+++ b/fs/afs/inode.c
@@ -773,7 +773,7 @@ int afs_getattr(struct mnt_idmap *idmap, const struct path 
*path,
  
  	do {

read_seqbegin_or_lock(>cb_lock, );
-   generic_fillattr(_mnt_idmap, inode, stat);
+   generic_fillattr(_mnt_idmap, request_mask, inode, stat);
if (test_bit(AFS_VNODE_SILLY_DELETED, >flags) &&
stat->nlink > 0)
stat->nlink -= 1;
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index bcccd551f547..7346059209aa 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -8773,7 +8773,7 @@ static int btrfs_getattr(struct mnt_idmap *idmap,
  STATX_ATTR_IMMUTABLE |
 

[f2fs-dev] [PATCH v6 1/7] fs: pass the request_mask to generic_fillattr

2023-07-25 Thread Jeff Layton
generic_fillattr just fills in the entire stat struct indiscriminately
today, copying data from the inode. There is at least one attribute
(STATX_CHANGE_COOKIE) that can have side effects when it is reported,
and we're looking at adding more with the addition of multigrain
timestamps.

Add a request_mask argument to generic_fillattr and have most callers
just pass in the value that is passed to getattr. Have other callers
(e.g. ksmbd) just pass in STATX_BASIC_STATS. Also move the setting of
STATX_CHANGE_COOKIE into generic_fillattr.

Signed-off-by: Jeff Layton 
---
 fs/9p/vfs_inode.c   |  4 ++--
 fs/9p/vfs_inode_dotl.c  |  4 ++--
 fs/afs/inode.c  |  2 +-
 fs/btrfs/inode.c|  2 +-
 fs/ceph/inode.c |  2 +-
 fs/coda/inode.c |  3 ++-
 fs/ecryptfs/inode.c |  5 +++--
 fs/erofs/inode.c|  2 +-
 fs/exfat/file.c |  2 +-
 fs/ext2/inode.c |  2 +-
 fs/ext4/inode.c |  2 +-
 fs/f2fs/file.c  |  2 +-
 fs/fat/file.c   |  2 +-
 fs/fuse/dir.c   |  2 +-
 fs/gfs2/inode.c |  2 +-
 fs/hfsplus/inode.c  |  2 +-
 fs/kernfs/inode.c   |  2 +-
 fs/libfs.c  |  4 ++--
 fs/minix/inode.c|  2 +-
 fs/nfs/inode.c  |  2 +-
 fs/nfs/namespace.c  |  3 ++-
 fs/ntfs3/file.c |  2 +-
 fs/ocfs2/file.c |  2 +-
 fs/orangefs/inode.c |  2 +-
 fs/proc/base.c  |  4 ++--
 fs/proc/fd.c|  2 +-
 fs/proc/generic.c   |  2 +-
 fs/proc/proc_net.c  |  2 +-
 fs/proc/proc_sysctl.c   |  2 +-
 fs/proc/root.c  |  3 ++-
 fs/smb/client/inode.c   |  2 +-
 fs/smb/server/smb2pdu.c | 22 +++---
 fs/smb/server/vfs.c |  3 ++-
 fs/stat.c   | 18 ++
 fs/sysv/itree.c |  3 ++-
 fs/ubifs/dir.c  |  2 +-
 fs/udf/symlink.c|  2 +-
 fs/vboxsf/utils.c   |  2 +-
 include/linux/fs.h  |  2 +-
 mm/shmem.c  |  2 +-
 40 files changed, 70 insertions(+), 62 deletions(-)

diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index 16d85e6033a3..d24d1f20e922 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c
@@ -1016,7 +1016,7 @@ v9fs_vfs_getattr(struct mnt_idmap *idmap, const struct 
path *path,
p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
v9ses = v9fs_dentry2v9ses(dentry);
if (v9ses->cache & (CACHE_META|CACHE_LOOSE)) {
-   generic_fillattr(_mnt_idmap, inode, stat);
+   generic_fillattr(_mnt_idmap, request_mask, inode, stat);
return 0;
} else if (v9ses->cache & CACHE_WRITEBACK) {
if (S_ISREG(inode->i_mode)) {
@@ -1037,7 +1037,7 @@ v9fs_vfs_getattr(struct mnt_idmap *idmap, const struct 
path *path,
return PTR_ERR(st);
 
v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb, 0);
-   generic_fillattr(_mnt_idmap, d_inode(dentry), stat);
+   generic_fillattr(_mnt_idmap, request_mask, d_inode(dentry), stat);
 
p9stat_free(st);
kfree(st);
diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c
index 464ea73d1bf8..8e8d5d2a13d8 100644
--- a/fs/9p/vfs_inode_dotl.c
+++ b/fs/9p/vfs_inode_dotl.c
@@ -451,7 +451,7 @@ v9fs_vfs_getattr_dotl(struct mnt_idmap *idmap,
p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
v9ses = v9fs_dentry2v9ses(dentry);
if (v9ses->cache & (CACHE_META|CACHE_LOOSE)) {
-   generic_fillattr(_mnt_idmap, inode, stat);
+   generic_fillattr(_mnt_idmap, request_mask, inode, stat);
return 0;
} else if (v9ses->cache) {
if (S_ISREG(inode->i_mode)) {
@@ -476,7 +476,7 @@ v9fs_vfs_getattr_dotl(struct mnt_idmap *idmap,
return PTR_ERR(st);
 
v9fs_stat2inode_dotl(st, d_inode(dentry), 0);
-   generic_fillattr(_mnt_idmap, d_inode(dentry), stat);
+   generic_fillattr(_mnt_idmap, request_mask, d_inode(dentry), stat);
/* Change block size to what the server returned */
stat->blksize = st->st_blksize;
 
diff --git a/fs/afs/inode.c b/fs/afs/inode.c
index 6b636f43f548..1c794a1896aa 100644
--- a/fs/afs/inode.c
+++ b/fs/afs/inode.c
@@ -773,7 +773,7 @@ int afs_getattr(struct mnt_idmap *idmap, const struct path 
*path,
 
do {
read_seqbegin_or_lock(>cb_lock, );
-   generic_fillattr(_mnt_idmap, inode, stat);
+   generic_fillattr(_mnt_idmap, request_mask, inode, stat);
if (test_bit(AFS_VNODE_SILLY_DELETED, >flags) &&
stat->nlink > 0)
stat->nlink -= 1;
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index bcccd551f547..7346059209aa 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -8773,7 +8773,7 @@ static int btrfs_getattr(struct mnt_idmap *idmap,
  STATX_ATTR_IMMUTABLE |
  STATX_ATTR_NODUMP);
 
-   generic_fillattr(idmap, inode, stat);
+   generic_fillattr(idmap, request_mask,