public inbox for linux-fsdevel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCHES][RFC] statx-related stuff
@ 2024-11-12 20:21 Al Viro
  2024-11-12 20:25 ` [PATCH 1/5] io_statx_prep(): use getname_uflags() Al Viro
  0 siblings, 1 reply; 12+ messages in thread
From: Al Viro @ 2024-11-12 20:21 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: Christian Brauner, Jan Kara, Jens Axboe

Assorted statx-related stuff; I hoped there would be more of that, but
the things got stalled.

Currently in there:
	* partial untangling of io_uring interactions (separating
the damn LOOKUP_EMPTY from the rest of flags, at least)
	* struct fd converions in the area (separated from #work.fd
to reduce conflicts)
	* getting rid of AT_GETATTR_NOSEC [Stefan Berger]; depending
upon the desired semantics for LSM shite around ->getattr() we might
want to pass some kind of flag to instances, but in the current form
it's been completely pointless - all calls ended up with that thing
passed to them.
	* getting rid of pointless empty_dir_getattr() - it's used
only as ->getattr() instance and it had been an equivalent of what
we do with NULL ->getattr all along.

Branch is on top of viro/vfs.git#base.getname-fixed; it lives in
git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git #work.statx2
individual patches in followups.

Shortlog:
Al Viro (4):
      io_statx_prep(): use getname_uflags()
      kill getname_statx_lookup_flags()
      fs/stat.c: switch to CLASS(fd_raw)
      libfs: kill empty_dir_getattr()

Stefan Berger (1):
      fs: Simplify getattr interface function checking AT_GETATTR_NOSEC flag

Diffstat:
 fs/ecryptfs/inode.c        | 12 ++----------
 fs/internal.h              |  1 -
 fs/libfs.c                 | 11 -----------
 fs/overlayfs/inode.c       | 10 +++++-----
 fs/overlayfs/overlayfs.h   |  8 --------
 fs/stat.c                  | 24 +++++++-----------------
 include/uapi/linux/fcntl.h |  4 ----
 io_uring/statx.c           |  3 +--
 8 files changed, 15 insertions(+), 58 deletions(-)

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/5] io_statx_prep(): use getname_uflags()
  2024-11-12 20:21 [PATCHES][RFC] statx-related stuff Al Viro
@ 2024-11-12 20:25 ` Al Viro
  2024-11-12 20:25   ` [PATCH 2/5] kill getname_statx_lookup_flags() Al Viro
                     ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: Al Viro @ 2024-11-12 20:25 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: viro, Christian Brauner, Jan Kara, Jens Axboe

the only thing in flags getname_flags() ever cares about is
LOOKUP_EMPTY; anything else is none of its damn business.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
 io_uring/statx.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/io_uring/statx.c b/io_uring/statx.c
index f7f9b202eec0..6bc4651700a2 100644
--- a/io_uring/statx.c
+++ b/io_uring/statx.c
@@ -36,8 +36,7 @@ int io_statx_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
 	sx->buffer = u64_to_user_ptr(READ_ONCE(sqe->addr2));
 	sx->flags = READ_ONCE(sqe->statx_flags);
 
-	sx->filename = getname_flags(path,
-				     getname_statx_lookup_flags(sx->flags));
+	sx->filename = getname_uflags(path, sx->flags);
 
 	if (IS_ERR(sx->filename)) {
 		int ret = PTR_ERR(sx->filename);
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/5] kill getname_statx_lookup_flags()
  2024-11-12 20:25 ` [PATCH 1/5] io_statx_prep(): use getname_uflags() Al Viro
@ 2024-11-12 20:25   ` Al Viro
  2024-11-13 10:20     ` Christian Brauner
  2024-11-12 20:25   ` [PATCH 3/5] fs/stat.c: switch to CLASS(fd_raw) Al Viro
                     ` (4 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: Al Viro @ 2024-11-12 20:25 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: viro, Christian Brauner, Jan Kara, Jens Axboe

LOOKUP_EMPTY is ignored by the only remaining user, and without
that 'getname_' prefix makes no sense.

Remove LOOKUP_EMPTY part, rename to statx_lookup_flags() and make
static.  It most likely is _not_ statx() specific, either, but
that's the next step.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
 fs/internal.h | 1 -
 fs/stat.c     | 6 ++----
 2 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/fs/internal.h b/fs/internal.h
index 8c1b7acbbe8f..8cf42b327e5e 100644
--- a/fs/internal.h
+++ b/fs/internal.h
@@ -246,7 +246,6 @@ int open_namespace(struct ns_common *ns);
  * fs/stat.c:
  */
 
-int getname_statx_lookup_flags(int flags);
 int do_statx(int dfd, struct filename *filename, unsigned int flags,
 	     unsigned int mask, struct statx __user *buffer);
 int do_statx_fd(int fd, unsigned int flags, unsigned int mask,
diff --git a/fs/stat.c b/fs/stat.c
index b74831dc7ae6..4e8698fa932f 100644
--- a/fs/stat.c
+++ b/fs/stat.c
@@ -231,7 +231,7 @@ int vfs_fstat(int fd, struct kstat *stat)
 	return error;
 }
 
-int getname_statx_lookup_flags(int flags)
+static int statx_lookup_flags(int flags)
 {
 	int lookup_flags = 0;
 
@@ -239,8 +239,6 @@ int getname_statx_lookup_flags(int flags)
 		lookup_flags |= LOOKUP_FOLLOW;
 	if (!(flags & AT_NO_AUTOMOUNT))
 		lookup_flags |= LOOKUP_AUTOMOUNT;
-	if (flags & AT_EMPTY_PATH)
-		lookup_flags |= LOOKUP_EMPTY;
 
 	return lookup_flags;
 }
@@ -301,7 +299,7 @@ static int vfs_statx(int dfd, struct filename *filename, int flags,
 	      struct kstat *stat, u32 request_mask)
 {
 	struct path path;
-	unsigned int lookup_flags = getname_statx_lookup_flags(flags);
+	unsigned int lookup_flags = statx_lookup_flags(flags);
 	int error;
 
 	if (flags & ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT | AT_EMPTY_PATH |
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/5] fs/stat.c: switch to CLASS(fd_raw)
  2024-11-12 20:25 ` [PATCH 1/5] io_statx_prep(): use getname_uflags() Al Viro
  2024-11-12 20:25   ` [PATCH 2/5] kill getname_statx_lookup_flags() Al Viro
@ 2024-11-12 20:25   ` Al Viro
  2024-11-13 10:20     ` Christian Brauner
  2024-11-12 20:25   ` [PATCH 4/5] fs: Simplify getattr interface function checking AT_GETATTR_NOSEC flag Al Viro
                     ` (3 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: Al Viro @ 2024-11-12 20:25 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: viro, Christian Brauner, Jan Kara, Jens Axboe

... and use fd_empty() consistently

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
 fs/stat.c | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/fs/stat.c b/fs/stat.c
index 4e8698fa932f..855b995ad09b 100644
--- a/fs/stat.c
+++ b/fs/stat.c
@@ -220,15 +220,10 @@ EXPORT_SYMBOL(vfs_getattr);
  */
 int vfs_fstat(int fd, struct kstat *stat)
 {
-	struct fd f;
-	int error;
-
-	f = fdget_raw(fd);
-	if (!fd_file(f))
+	CLASS(fd_raw, f)(fd);
+	if (fd_empty(f))
 		return -EBADF;
-	error = vfs_getattr(&fd_file(f)->f_path, stat, STATX_BASIC_STATS, 0);
-	fdput(f);
-	return error;
+	return vfs_getattr(&fd_file(f)->f_path, stat, STATX_BASIC_STATS, 0);
 }
 
 static int statx_lookup_flags(int flags)
@@ -275,7 +270,7 @@ static int vfs_statx_fd(int fd, int flags, struct kstat *stat,
 			  u32 request_mask)
 {
 	CLASS(fd_raw, f)(fd);
-	if (!fd_file(f))
+	if (fd_empty(f))
 		return -EBADF;
 	return vfs_statx_path(&fd_file(f)->f_path, flags, stat, request_mask);
 }
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/5] fs: Simplify getattr interface function checking AT_GETATTR_NOSEC flag
  2024-11-12 20:25 ` [PATCH 1/5] io_statx_prep(): use getname_uflags() Al Viro
  2024-11-12 20:25   ` [PATCH 2/5] kill getname_statx_lookup_flags() Al Viro
  2024-11-12 20:25   ` [PATCH 3/5] fs/stat.c: switch to CLASS(fd_raw) Al Viro
@ 2024-11-12 20:25   ` Al Viro
  2024-11-13 10:22     ` Christian Brauner
  2024-11-12 20:25   ` [PATCH 5/5] libfs: kill empty_dir_getattr() Al Viro
                     ` (2 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: Al Viro @ 2024-11-12 20:25 UTC (permalink / raw)
  To: linux-fsdevel
  Cc: viro, Christian Brauner, Jan Kara, Jens Axboe, Stefan Berger,
	Tyler Hicks, ecryptfs, Miklos Szeredi, Amir Goldstein,
	linux-unionfs

From: Stefan Berger <stefanb@linux.ibm.com>

Commit 8a924db2d7b5 ("fs: Pass AT_GETATTR_NOSEC flag to getattr interface
function")' introduced the AT_GETATTR_NOSEC flag to ensure that the
call paths only call vfs_getattr_nosec if it is set instead of vfs_getattr.
Now, simplify the getattr interface functions of filesystems where the flag
AT_GETATTR_NOSEC is checked.

There is only a single caller of inode_operations getattr function and it
is located in fs/stat.c in vfs_getattr_nosec. The caller there is the only
one from which the AT_GETATTR_NOSEC flag is passed from.

Two filesystems are checking this flag in .getattr and the flag is always
passed to them unconditionally from only vfs_getattr_nosec:

- ecryptfs:  Simplify by always calling vfs_getattr_nosec in
             ecryptfs_getattr. From there the flag is passed to no other
             function and this function is not called otherwise.

- overlayfs: Simplify by always calling vfs_getattr_nosec in
             ovl_getattr. From there the flag is passed to no other
             function and this function is not called otherwise.

The query_flags in vfs_getattr_nosec will mask-out AT_GETATTR_NOSEC from
any caller using AT_STATX_SYNC_TYPE as mask so that the flag is not
important inside this function. Also, since no filesystem is checking the
flag anymore, remove the flag entirely now, including the BUG_ON check that
never triggered.

The net change of the changes here combined with the original commit is
that ecryptfs and overlayfs do not call vfs_getattr but only
vfs_getattr_nosec.

Fixes: 8a924db2d7b5 ("fs: Pass AT_GETATTR_NOSEC flag to getattr interface function")
Reported-by: Al Viro <viro@zeniv.linux.org.uk>
Closes: https://lore.kernel.org/linux-fsdevel/20241101011724.GN1350452@ZenIV/T/#u
Cc: Tyler Hicks <code@tyhicks.com>
Cc: ecryptfs@vger.kernel.org
Cc: Miklos Szeredi <miklos@szeredi.hu>
Cc: Amir Goldstein <amir73il@gmail.com>
Cc: linux-unionfs@vger.kernel.org
Cc: Christian Brauner <brauner@kernel.org>
Cc: linux-fsdevel@vger.kernel.org
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
 fs/ecryptfs/inode.c        | 12 ++----------
 fs/overlayfs/inode.c       | 10 +++++-----
 fs/overlayfs/overlayfs.h   |  8 --------
 fs/stat.c                  |  5 +----
 include/uapi/linux/fcntl.h |  4 ----
 5 files changed, 8 insertions(+), 31 deletions(-)

diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
index 5ed1e4cf6c0b..644e973d5a77 100644
--- a/fs/ecryptfs/inode.c
+++ b/fs/ecryptfs/inode.c
@@ -1008,14 +1008,6 @@ static int ecryptfs_getattr_link(struct mnt_idmap *idmap,
 	return rc;
 }
 
-static int ecryptfs_do_getattr(const struct path *path, struct kstat *stat,
-			       u32 request_mask, unsigned int flags)
-{
-	if (flags & AT_GETATTR_NOSEC)
-		return vfs_getattr_nosec(path, stat, request_mask, flags);
-	return vfs_getattr(path, stat, request_mask, flags);
-}
-
 static int ecryptfs_getattr(struct mnt_idmap *idmap,
 			    const struct path *path, struct kstat *stat,
 			    u32 request_mask, unsigned int flags)
@@ -1024,8 +1016,8 @@ static int ecryptfs_getattr(struct mnt_idmap *idmap,
 	struct kstat lower_stat;
 	int rc;
 
-	rc = ecryptfs_do_getattr(ecryptfs_dentry_to_lower_path(dentry),
-				 &lower_stat, request_mask, flags);
+	rc = vfs_getattr_nosec(ecryptfs_dentry_to_lower_path(dentry),
+			       &lower_stat, request_mask, flags);
 	if (!rc) {
 		fsstack_copy_attr_all(d_inode(dentry),
 				      ecryptfs_inode_to_lower(d_inode(dentry)));
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index 35fd3e3e1778..8b31f44c12cd 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -170,7 +170,7 @@ int ovl_getattr(struct mnt_idmap *idmap, const struct path *path,
 
 	type = ovl_path_real(dentry, &realpath);
 	old_cred = ovl_override_creds(dentry->d_sb);
-	err = ovl_do_getattr(&realpath, stat, request_mask, flags);
+	err = vfs_getattr_nosec(&realpath, stat, request_mask, flags);
 	if (err)
 		goto out;
 
@@ -195,8 +195,8 @@ int ovl_getattr(struct mnt_idmap *idmap, const struct path *path,
 					(!is_dir ? STATX_NLINK : 0);
 
 			ovl_path_lower(dentry, &realpath);
-			err = ovl_do_getattr(&realpath, &lowerstat, lowermask,
-					     flags);
+			err = vfs_getattr_nosec(&realpath, &lowerstat, lowermask,
+						flags);
 			if (err)
 				goto out;
 
@@ -248,8 +248,8 @@ int ovl_getattr(struct mnt_idmap *idmap, const struct path *path,
 
 			ovl_path_lowerdata(dentry, &realpath);
 			if (realpath.dentry) {
-				err = ovl_do_getattr(&realpath, &lowerdatastat,
-						     lowermask, flags);
+				err = vfs_getattr_nosec(&realpath, &lowerdatastat,
+							lowermask, flags);
 				if (err)
 					goto out;
 			} else {
diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
index 0bfe35da4b7b..910dbbb2bb7b 100644
--- a/fs/overlayfs/overlayfs.h
+++ b/fs/overlayfs/overlayfs.h
@@ -412,14 +412,6 @@ static inline bool ovl_open_flags_need_copy_up(int flags)
 	return ((OPEN_FMODE(flags) & FMODE_WRITE) || (flags & O_TRUNC));
 }
 
-static inline int ovl_do_getattr(const struct path *path, struct kstat *stat,
-				 u32 request_mask, unsigned int flags)
-{
-	if (flags & AT_GETATTR_NOSEC)
-		return vfs_getattr_nosec(path, stat, request_mask, flags);
-	return vfs_getattr(path, stat, request_mask, flags);
-}
-
 /* util.c */
 int ovl_get_write_access(struct dentry *dentry);
 void ovl_put_write_access(struct dentry *dentry);
diff --git a/fs/stat.c b/fs/stat.c
index 855b995ad09b..011d2160b7af 100644
--- a/fs/stat.c
+++ b/fs/stat.c
@@ -165,7 +165,7 @@ int vfs_getattr_nosec(const struct path *path, struct kstat *stat,
 	if (inode->i_op->getattr)
 		return inode->i_op->getattr(idmap, path, stat,
 					    request_mask,
-					    query_flags | AT_GETATTR_NOSEC);
+					    query_flags);
 
 	generic_fillattr(idmap, request_mask, inode, stat);
 	return 0;
@@ -198,9 +198,6 @@ int vfs_getattr(const struct path *path, struct kstat *stat,
 {
 	int retval;
 
-	if (WARN_ON_ONCE(query_flags & AT_GETATTR_NOSEC))
-		return -EPERM;
-
 	retval = security_inode_getattr(path);
 	if (retval)
 		return retval;
diff --git a/include/uapi/linux/fcntl.h b/include/uapi/linux/fcntl.h
index 87e2dec79fea..a40833bf2855 100644
--- a/include/uapi/linux/fcntl.h
+++ b/include/uapi/linux/fcntl.h
@@ -154,8 +154,4 @@
 					   usable with open_by_handle_at(2). */
 #define AT_HANDLE_MNT_ID_UNIQUE	0x001	/* Return the u64 unique mount ID. */
 
-#if defined(__KERNEL__)
-#define AT_GETATTR_NOSEC	0x80000000
-#endif
-
 #endif /* _UAPI_LINUX_FCNTL_H */
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/5] libfs: kill empty_dir_getattr()
  2024-11-12 20:25 ` [PATCH 1/5] io_statx_prep(): use getname_uflags() Al Viro
                     ` (2 preceding siblings ...)
  2024-11-12 20:25   ` [PATCH 4/5] fs: Simplify getattr interface function checking AT_GETATTR_NOSEC flag Al Viro
@ 2024-11-12 20:25   ` Al Viro
  2024-11-13 10:22     ` Christian Brauner
  2024-11-13 10:20   ` [PATCH 1/5] io_statx_prep(): use getname_uflags() Christian Brauner
  2024-11-13 14:07   ` Jens Axboe
  5 siblings, 1 reply; 12+ messages in thread
From: Al Viro @ 2024-11-12 20:25 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: viro, Christian Brauner, Jan Kara, Jens Axboe

It's used only to initialize ->getattr in one inode_operations instance
(empty_dir_inode_operations) and its behaviour had always been equivalent
to what we get with NULL ->getattr.

Just remove that initializer, along with empty_dir_getattr() itself.
While we are at it, the same instance has ->permission initialized to
generic_permission, which is what NULL ->permission ends up doing.
Again, no point keeping it.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
 fs/libfs.c | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/fs/libfs.c b/fs/libfs.c
index 46966fd8bcf9..12f5185f3fa9 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1711,15 +1711,6 @@ static struct dentry *empty_dir_lookup(struct inode *dir, struct dentry *dentry,
 	return ERR_PTR(-ENOENT);
 }
 
-static int empty_dir_getattr(struct mnt_idmap *idmap,
-			     const struct path *path, struct kstat *stat,
-			     u32 request_mask, unsigned int query_flags)
-{
-	struct inode *inode = d_inode(path->dentry);
-	generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
-	return 0;
-}
-
 static int empty_dir_setattr(struct mnt_idmap *idmap,
 			     struct dentry *dentry, struct iattr *attr)
 {
@@ -1733,9 +1724,7 @@ static ssize_t empty_dir_listxattr(struct dentry *dentry, char *list, size_t siz
 
 static const struct inode_operations empty_dir_inode_operations = {
 	.lookup		= empty_dir_lookup,
-	.permission	= generic_permission,
 	.setattr	= empty_dir_setattr,
-	.getattr	= empty_dir_getattr,
 	.listxattr	= empty_dir_listxattr,
 };
 
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/5] io_statx_prep(): use getname_uflags()
  2024-11-12 20:25 ` [PATCH 1/5] io_statx_prep(): use getname_uflags() Al Viro
                     ` (3 preceding siblings ...)
  2024-11-12 20:25   ` [PATCH 5/5] libfs: kill empty_dir_getattr() Al Viro
@ 2024-11-13 10:20   ` Christian Brauner
  2024-11-13 14:07   ` Jens Axboe
  5 siblings, 0 replies; 12+ messages in thread
From: Christian Brauner @ 2024-11-13 10:20 UTC (permalink / raw)
  To: Al Viro; +Cc: linux-fsdevel, Jan Kara, Jens Axboe

On Tue, Nov 12, 2024 at 08:25:48PM +0000, Al Viro wrote:
> the only thing in flags getname_flags() ever cares about is
> LOOKUP_EMPTY; anything else is none of its damn business.
> 
> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
> ---

Reviewed-by: Christian Brauner <brauner@kernel.org>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/5] kill getname_statx_lookup_flags()
  2024-11-12 20:25   ` [PATCH 2/5] kill getname_statx_lookup_flags() Al Viro
@ 2024-11-13 10:20     ` Christian Brauner
  0 siblings, 0 replies; 12+ messages in thread
From: Christian Brauner @ 2024-11-13 10:20 UTC (permalink / raw)
  To: Al Viro; +Cc: linux-fsdevel, Jan Kara, Jens Axboe

On Tue, Nov 12, 2024 at 08:25:49PM +0000, Al Viro wrote:
> LOOKUP_EMPTY is ignored by the only remaining user, and without
> that 'getname_' prefix makes no sense.
> 
> Remove LOOKUP_EMPTY part, rename to statx_lookup_flags() and make
> static.  It most likely is _not_ statx() specific, either, but
> that's the next step.
> 
> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
> ---

Reviewed-by: Christian Brauner <brauner@kernel.org>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/5] fs/stat.c: switch to CLASS(fd_raw)
  2024-11-12 20:25   ` [PATCH 3/5] fs/stat.c: switch to CLASS(fd_raw) Al Viro
@ 2024-11-13 10:20     ` Christian Brauner
  0 siblings, 0 replies; 12+ messages in thread
From: Christian Brauner @ 2024-11-13 10:20 UTC (permalink / raw)
  To: Al Viro; +Cc: linux-fsdevel, Jan Kara, Jens Axboe

On Tue, Nov 12, 2024 at 08:25:50PM +0000, Al Viro wrote:
> ... and use fd_empty() consistently
> 
> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
> ---

Reviewed-by: Christian Brauner <brauner@kernel.org>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/5] fs: Simplify getattr interface function checking AT_GETATTR_NOSEC flag
  2024-11-12 20:25   ` [PATCH 4/5] fs: Simplify getattr interface function checking AT_GETATTR_NOSEC flag Al Viro
@ 2024-11-13 10:22     ` Christian Brauner
  0 siblings, 0 replies; 12+ messages in thread
From: Christian Brauner @ 2024-11-13 10:22 UTC (permalink / raw)
  To: Al Viro
  Cc: linux-fsdevel, Jan Kara, Jens Axboe, Stefan Berger, Tyler Hicks,
	ecryptfs, Miklos Szeredi, Amir Goldstein, linux-unionfs

On Tue, Nov 12, 2024 at 08:25:51PM +0000, Al Viro wrote:
> From: Stefan Berger <stefanb@linux.ibm.com>
> 
> Commit 8a924db2d7b5 ("fs: Pass AT_GETATTR_NOSEC flag to getattr interface
> function")' introduced the AT_GETATTR_NOSEC flag to ensure that the
> call paths only call vfs_getattr_nosec if it is set instead of vfs_getattr.
> Now, simplify the getattr interface functions of filesystems where the flag
> AT_GETATTR_NOSEC is checked.
> 
> There is only a single caller of inode_operations getattr function and it
> is located in fs/stat.c in vfs_getattr_nosec. The caller there is the only
> one from which the AT_GETATTR_NOSEC flag is passed from.
> 
> Two filesystems are checking this flag in .getattr and the flag is always
> passed to them unconditionally from only vfs_getattr_nosec:
> 
> - ecryptfs:  Simplify by always calling vfs_getattr_nosec in
>              ecryptfs_getattr. From there the flag is passed to no other
>              function and this function is not called otherwise.
> 
> - overlayfs: Simplify by always calling vfs_getattr_nosec in
>              ovl_getattr. From there the flag is passed to no other
>              function and this function is not called otherwise.
> 
> The query_flags in vfs_getattr_nosec will mask-out AT_GETATTR_NOSEC from
> any caller using AT_STATX_SYNC_TYPE as mask so that the flag is not
> important inside this function. Also, since no filesystem is checking the
> flag anymore, remove the flag entirely now, including the BUG_ON check that
> never triggered.
> 
> The net change of the changes here combined with the original commit is
> that ecryptfs and overlayfs do not call vfs_getattr but only
> vfs_getattr_nosec.
> 
> Fixes: 8a924db2d7b5 ("fs: Pass AT_GETATTR_NOSEC flag to getattr interface function")
> Reported-by: Al Viro <viro@zeniv.linux.org.uk>
> Closes: https://lore.kernel.org/linux-fsdevel/20241101011724.GN1350452@ZenIV/T/#u
> Cc: Tyler Hicks <code@tyhicks.com>
> Cc: ecryptfs@vger.kernel.org
> Cc: Miklos Szeredi <miklos@szeredi.hu>
> Cc: Amir Goldstein <amir73il@gmail.com>
> Cc: linux-unionfs@vger.kernel.org
> Cc: Christian Brauner <brauner@kernel.org>
> Cc: linux-fsdevel@vger.kernel.org
> Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
> ---

Reviewed-by: Christian Brauner <brauner@kernel.org>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 5/5] libfs: kill empty_dir_getattr()
  2024-11-12 20:25   ` [PATCH 5/5] libfs: kill empty_dir_getattr() Al Viro
@ 2024-11-13 10:22     ` Christian Brauner
  0 siblings, 0 replies; 12+ messages in thread
From: Christian Brauner @ 2024-11-13 10:22 UTC (permalink / raw)
  To: Al Viro; +Cc: linux-fsdevel, Jan Kara, Jens Axboe

On Tue, Nov 12, 2024 at 08:25:52PM +0000, Al Viro wrote:
> It's used only to initialize ->getattr in one inode_operations instance
> (empty_dir_inode_operations) and its behaviour had always been equivalent
> to what we get with NULL ->getattr.
> 
> Just remove that initializer, along with empty_dir_getattr() itself.
> While we are at it, the same instance has ->permission initialized to
> generic_permission, which is what NULL ->permission ends up doing.
> Again, no point keeping it.
> 
> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
> ---

Reviewed-by: Christian Brauner <brauner@kernel.org>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/5] io_statx_prep(): use getname_uflags()
  2024-11-12 20:25 ` [PATCH 1/5] io_statx_prep(): use getname_uflags() Al Viro
                     ` (4 preceding siblings ...)
  2024-11-13 10:20   ` [PATCH 1/5] io_statx_prep(): use getname_uflags() Christian Brauner
@ 2024-11-13 14:07   ` Jens Axboe
  5 siblings, 0 replies; 12+ messages in thread
From: Jens Axboe @ 2024-11-13 14:07 UTC (permalink / raw)
  To: Al Viro, linux-fsdevel; +Cc: Christian Brauner, Jan Kara

Looks fine to me:

Reviewed-by: Jens Axboe <axboe@kernel.dk>

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2024-11-13 14:07 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-12 20:21 [PATCHES][RFC] statx-related stuff Al Viro
2024-11-12 20:25 ` [PATCH 1/5] io_statx_prep(): use getname_uflags() Al Viro
2024-11-12 20:25   ` [PATCH 2/5] kill getname_statx_lookup_flags() Al Viro
2024-11-13 10:20     ` Christian Brauner
2024-11-12 20:25   ` [PATCH 3/5] fs/stat.c: switch to CLASS(fd_raw) Al Viro
2024-11-13 10:20     ` Christian Brauner
2024-11-12 20:25   ` [PATCH 4/5] fs: Simplify getattr interface function checking AT_GETATTR_NOSEC flag Al Viro
2024-11-13 10:22     ` Christian Brauner
2024-11-12 20:25   ` [PATCH 5/5] libfs: kill empty_dir_getattr() Al Viro
2024-11-13 10:22     ` Christian Brauner
2024-11-13 10:20   ` [PATCH 1/5] io_statx_prep(): use getname_uflags() Christian Brauner
2024-11-13 14:07   ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox