Skip to contentSkip to conversation

Fix quota evasion on xfs and add capable_noaudit

PATCH Superseded [email protected] 4 participants 16 messages Jul 2 – Jul 7

Subsystems (6)

v3 of 4 Superseded Latest is v4 →

lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

v3 cover Fix quota evasion on xfs and add capable_noaudit

From: Carlos Maiolino <[email protected]>

Hi there.

This is the (hopefully) final version of the series I've been working on to fix a quota evasion issue on xfs. This bug has originally been introduced by accident while turning off audit messages while checking quota limits in xfs by replacing capable() calls by has_capability_noaudit().

This series concatenates both series I sent for xfs and capabilities infrastructure as they are dependent.

The first patch fix the xfs bug in a way that makes it easily portable to older LTS kernels.

From second patch and beyond, it adds a new helper for the capabilities framework named capable_noaudit() which as the same semantics as capable() but without generating audit messages.
The following patches then replaces both generic quota call to capable() and properly update xfs code to use this new helper.

Last but not least this unexport has_capability_noaudit which had been previously exported.

Giving this affects different subsystems, I think it would be easier to pull everything from a single tree (as long as everything is properly reviewed of course).

Serge, Honza, are you guys ok if I pull those patches and send them to Linus through xfs tree so we don't need to split the series?

Christoph, this series moves back to pass the capable_noaudit() result straight back to xfs_trans_alloc_ichange() instead of moving the capability check into xfs_trans_dqresv() as Darrick was not in agreement with that (patch unreviewed and open for comments).

Changelog from the last state of these patches:

Patch2: removed the redundant external classifier from the declaration
in include/linux/capability.h.
Serge, I kept your RwB here as the external is redundant, please let me know if you are ok with it or not.

Patch4: Replace all ns_capable_noaudit() calls by capable_noaudit() and
keep the CAP_FOWNER (instead replacing it by SYS_RESOURCE)

Carlos Maiolino (5):
xfs: fix capability check in xfs
capability: Add new capable_noaudit
quota: Don't issue audit messages on quota enforcing
xfs: replace ns_capable_noaudit
capability: unexport has_capability_noaudit

 fs/quota/dquot.c           |  2 +-
 fs/xfs/xfs_fsmap.c         |  3 +--
 fs/xfs/xfs_ioctl.c         |  2 +-
 fs/xfs/xfs_iops.c          |  3 ++-
 include/linux/capability.h |  5 +++++
 kernel/capability.c        | 18 +++++++++++++++++-
 6 files changed, 27 insertions(+), 6 deletions(-)
Cc Jan Kara <[email protected]>
Cc Christoph Hellwig <[email protected]>
Cc Serge E. Hallyn <[email protected]>
Cc Darrick J. Wong <[email protected]>
Cc Dave Chinner <[email protected]>
Cc Eric Sandeen <[email protected]>
Cc Dr. Thomas Orgis" <[email protected]>
Signature · 1 line
2.54.0
author maintainer
#1 lore raw

PATCH v3 1/5 xfs: fix capability check in xfs

From: Carlos Maiolino <[email protected]>

An user reported a bug where he managed to evade group's quota by changing a file's gid to a different group id the same user belonged to, even though quotas were enforced on both gids and the file's size was big enough to exceed the quota's hardlimit.

Commit eba0549bc7d1 replaced a capable() call by a has_capability_noaudit() to prevent unnecessary selinux audit messages. Turns out that both calls have slightly different semantics even though their documentation seems similar. Where in a nutshell:

capable() - Tests the task's effective credentials has_ns_capability_noaudit() - Tests the task's real credentials

This most of the time has no practical difference but in some cases like changing attrs (specifically group id in this case) through a NFS client this will allow the quota code to use XFS_QMOPT_FORCE_RES, effectively bypassing quota accounting checks.

Using instead ns_capable_noaudit() should fix this issue and prevent selinux audit messages.

This also fix the remaining calls to has_capability_noaudit()

Fixes eba0549bc7d1 ("xfs: don't generate selinux audit messages for capability testing")
Cc <[email protected]> # v5.18
Cc Jan Kara <[email protected]>
Cc Christoph Hellwig <[email protected]>
Cc Serge E. Hallyn <[email protected]>
Cc Darrick J. Wong <[email protected]>
Cc Dave Chinner <[email protected]>
Cc Eric Sandeen <[email protected]>
Cc Dr. Thomas Orgis" <[email protected]>
---
 fs/xfs/xfs_fsmap.c | 2 +-
 fs/xfs/xfs_ioctl.c | 2 +-
 fs/xfs/xfs_iops.c  | 3 ++-
 3 files changed, 4 insertions(+), 3 deletions(-)
fs/xfs/xfs_fsmap.c +1 -1
index b6a3bc9f143c..7c79fbe0a74c 100644
@@ -1175,7 +1175,7 @@ xfs_getfsmap(
 		return -EINVAL;
 
 	use_rmap = xfs_has_rmapbt(mp) &&
-		   has_capability_noaudit(current, CAP_SYS_ADMIN);
+		   ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN);
 	head->fmh_entries = 0;
 
 	/* Set up our device handlers. */
fs/xfs/xfs_ioctl.c +1 -1
index 1b53701bebea..1a8af827dde1 100644
@@ -647,7 +647,7 @@ xfs_ioctl_setattr_get_trans(
 		goto out_error;
 
 	error = xfs_trans_alloc_ichange(ip, NULL, NULL, pdqp,
-			has_capability_noaudit(current, CAP_FOWNER), &tp);
+			ns_capable_noaudit(&init_user_ns, CAP_FOWNER), &tp);
 	if (error)
 		goto out_error;
 
fs/xfs/xfs_iops.c +2 -1
index 6339f4956ecb..205fe2dae732 100644
@@ -835,7 +835,8 @@ xfs_setattr_nonsize(
 	}
 
 	error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
-			has_capability_noaudit(current, CAP_FOWNER), &tp);
+					ns_capable_noaudit(&init_user_ns, CAP_FOWNER),
+					&tp);
 	if (error)
 		goto out_dqrele;
 
Signature · 1 line
2.54.0
#2 lore raw

Re: [PATCH v3 1/5] xfs: fix capability check in xfs

fs/xfs/xfs_iops.c xfs_setattr_nonsize( · line 838

Quoted 9 lines · On Thu, Jul 02, 2026 at 11:33:17AM +0200, [email protected] wrote:

index 6339f4956ecb..205fe2dae732 100644

fs/xfs/xfs_iops.c +1 -1
@@ -835,7 +835,8 @@ xfs_setattr_nonsize(
 	}
 
 	error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
-			has_capability_noaudit(current, CAP_FOWNER), &tp);
+					ns_capable_noaudit(&init_user_ns, CAP_FOWNER),

Extra indentation and an overly long line caused by that here.

Otherwise looks good.

author maintainer
#3 lore raw

Re: [PATCH v3 1/5] xfs: fix capability check in xfs

Quoted 11 lines · Christoph Hellwig

fs/xfs/xfs_iops.c xfs_setattr_nonsize( · line 838

Quoted 9 lines · On Thu, Jul 02, 2026 at 11:33:17AM +0200, [email protected] wrote:

index 6339f4956ecb..205fe2dae732 100644

fs/xfs/xfs_iops.c +1 -1
@@ -835,7 +835,8 @@ xfs_setattr_nonsize(
 	}
 
 	error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
-			has_capability_noaudit(current, CAP_FOWNER), &tp);
+					ns_capable_noaudit(&init_user_ns, CAP_FOWNER),

Thanks, I tried to keep the parameters aligned, but I can bring it one tab back. Do you mind if I fix it at commit time if -unlikely- no other change is required?

This is what it will look like:

error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
- has_capability_noaudit(current, CAP_FOWNER), &tp);
+ ns_capable_noaudit(&init_user_ns, CAP_FOWNER),
+ &tp);

Quoted 4 lines

Extra indentation and an overly long line caused by that here.

Otherwise looks good.

#4 lore raw

Re: [PATCH v3 1/5] xfs: fix capability check in xfs

Quoted 20 lines · Carlos Maiolino
Quoted 11 lines · Christoph Hellwig

fs/xfs/xfs_iops.c xfs_setattr_nonsize( · line 838

Quoted 9 lines · On Thu, Jul 02, 2026 at 11:33:17AM +0200, [email protected] wrote:

index 6339f4956ecb..205fe2dae732 100644

fs/xfs/xfs_iops.c +1 -1
@@ -835,7 +835,8 @@ xfs_setattr_nonsize(
 	}
 
 	error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
-			has_capability_noaudit(current, CAP_FOWNER), &tp);
+					ns_capable_noaudit(&init_user_ns, CAP_FOWNER),

Thanks, I tried to keep the parameters aligned, but I can bring it one tab back. Do you mind if I fix it at commit time if -unlikely- no other change is required?

This is what it will look like:

error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,

fs/xfs/xfs_iops.c xfs_setattr_nonsize( · line 839

Quoted 3 lines
fs/xfs/xfs_iops.c +2 -1
-                       has_capability_noaudit(current, CAP_FOWNER), &tp);
+                               ns_capable_noaudit(&init_user_ns, CAP_FOWNER),
+                               &tp);

This still adds an extra tab. Like much (but not all) of the kernel we use two-tabs by default, which is also in the other two hinks. This now adds a third. Just keep it as it was:

	error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
			ns_capable_noaudit(&init_user_ns, CAP_FOWNER), &tp);
author maintainer
#5 lore raw

Re: [PATCH v3 1/5] xfs: fix capability check in xfs

Quoted 25 lines · Christoph Hellwig
Quoted 20 lines · Carlos Maiolino
Quoted 11 lines · Christoph Hellwig

fs/xfs/xfs_iops.c xfs_setattr_nonsize( · line 838

Quoted 9 lines · On Thu, Jul 02, 2026 at 11:33:17AM +0200, [email protected] wrote:

index 6339f4956ecb..205fe2dae732 100644

fs/xfs/xfs_iops.c +1 -1
@@ -835,7 +835,8 @@ xfs_setattr_nonsize(
 	}
 
 	error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
-			has_capability_noaudit(current, CAP_FOWNER), &tp);
+					ns_capable_noaudit(&init_user_ns, CAP_FOWNER),

Thanks, I tried to keep the parameters aligned, but I can bring it one tab back. Do you mind if I fix it at commit time if -unlikely- no other change is required?

This is what it will look like:

error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,

fs/xfs/xfs_iops.c xfs_setattr_nonsize( · line 839

Quoted 3 lines
fs/xfs/xfs_iops.c +2 -1
-                       has_capability_noaudit(current, CAP_FOWNER), &tp);
+                               ns_capable_noaudit(&init_user_ns, CAP_FOWNER),
+                               &tp);
Quoted 8 lines

This still adds an extra tab. Like much (but not all) of the kernel we use two-tabs by default, which is also in the other two hinks. This now adds a third. Just keep it as it was:

	error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
			ns_capable_noaudit(&init_user_ns, CAP_FOWNER), &tp);

Ok, will do!

author maintainer
#6 lore raw

Re: [PATCH v3 1/5] xfs: fix capability check in xfs

In reply to Christoph Hellwig
Quoted 11 lines

fs/xfs/xfs_iops.c xfs_setattr_nonsize( · line 839

Quoted 2 lines
fs/xfs/xfs_iops.c +2 -0
+                               ns_capable_noaudit(&init_user_ns, CAP_FOWNER),
+                               &tp);

This still adds an extra tab. Like much (but not all) of the kernel we use two-tabs by default, which is also in the other two hinks. This now adds a third. Just keep it as it was:

	error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
			ns_capable_noaudit(&init_user_ns, CAP_FOWNER), &tp);

FWIW, I also fixed these in the patch 4 which I had screwed up too :)

author maintainer
#7 lore raw

PATCH v3 2/5 capability: Add new capable_noaudit

In reply to [email protected]

From: Carlos Maiolino <[email protected]>

In some situations (quota enforcement bypass in this case) we'd like to check for a specific capability without triggering spurious audit messages from security modules like selinux.

Add a new helper so we don't need to use ns_capable_noaudit() directly.

V3: remove the extern declaration

---
 include/linux/capability.h |  5 +++++
 kernel/capability.c        | 17 +++++++++++++++++
 2 files changed, 22 insertions(+)
include/linux/capability.h +5 -0
index 37db92b3d6f8..f8532d92fcad 100644
@@ -145,6 +145,7 @@ extern bool has_capability_noaudit(struct task_struct *t, int cap);
 extern bool has_ns_capability_noaudit(struct task_struct *t,
 				      struct user_namespace *ns, int cap);
 extern bool capable(int cap);
+bool capable_noaudit(int cap);
 extern bool ns_capable(struct user_namespace *ns, int cap);
 extern bool ns_capable_noaudit(struct user_namespace *ns, int cap);
 extern bool ns_capable_setid(struct user_namespace *ns, int cap);
@@ -167,6 +168,10 @@ static inline bool capable(int cap)
 {
 	return true;
 }
+static inline bool capable_noaudit(int cap)
+{
+	return true;
+}
 static inline bool ns_capable(struct user_namespace *ns, int cap)
 {
 	return true;
kernel/capability.c +17 -0
index 829f49ae07b9..2c2d1e8300bd 100644
@@ -416,6 +416,23 @@ bool capable(int cap)
 	return ns_capable(&init_user_ns, cap);
 }
 EXPORT_SYMBOL(capable);
+
+/**
+ * capable_noaudit - Determine if the current task has a superior
+ * capability in effect (unaudited).
+ * @cap: The capability to be tested for
+ *
+ * This is the same as capable(), except it uses CAP_OPT_NOAUDIT as to prevent
+ * issuing spurious audit messages.
+ *
+ * This sets PF_SUPERPRIV on the task if the capability is available on the
+ * assumption that it's about to be used.
+ */
+bool capable_noaudit(int cap)
+{
+	return ns_capable_noaudit(&init_user_ns, cap);
+}
+EXPORT_SYMBOL(capable_noaudit);
 #endif /* CONFIG_MULTIUSER */
 
 /**
Signature · 1 line
2.54.0
#8 lore raw

Re: [PATCH v3 2/5] capability: Add new capable_noaudit

Quoted 59 lines · On Thu, Jul 02, 2026 at 11:33:19AM +0200, [email protected] wrote:

From: Carlos Maiolino <[email protected]>

In some situations (quota enforcement bypass in this case) we'd like to check for a specific capability without triggering spurious audit messages from security modules like selinux.

Add a new helper so we don't need to use ns_capable_noaudit() directly.

V3: remove the extern declaration

---
 include/linux/capability.h |  5 +++++
 kernel/capability.c        | 17 +++++++++++++++++
 2 files changed, 22 insertions(+)
include/linux/capability.h +5 -0
index 37db92b3d6f8..f8532d92fcad 100644
@@ -145,6 +145,7 @@ extern bool has_capability_noaudit(struct task_struct *t, int cap);
 extern bool has_ns_capability_noaudit(struct task_struct *t,
 				      struct user_namespace *ns, int cap);
 extern bool capable(int cap);
+bool capable_noaudit(int cap);
 extern bool ns_capable(struct user_namespace *ns, int cap);
 extern bool ns_capable_noaudit(struct user_namespace *ns, int cap);
 extern bool ns_capable_setid(struct user_namespace *ns, int cap);
@@ -167,6 +168,10 @@ static inline bool capable(int cap)
 {
 	return true;
 }
+static inline bool capable_noaudit(int cap)
+{
+	return true;
+}
 static inline bool ns_capable(struct user_namespace *ns, int cap)
 {
 	return true;
kernel/capability.c +1 -0
index 829f49ae07b9..2c2d1e8300bd 100644
@@ -416,6 +416,23 @@ bool capable(int cap)
 	return ns_capable(&init_user_ns, cap);
 }
 EXPORT_SYMBOL(capable);
+

kernel/capability.c bool capable(int cap) · line 429

Quoted 10 lines
kernel/capability.c +10 -0
+/**
+ * capable_noaudit - Determine if the current task has a superior
+ * capability in effect (unaudited).
+ * @cap: The capability to be tested for
+ *
+ * This is the same as capable(), except it uses CAP_OPT_NOAUDIT as to prevent
+ * issuing spurious audit messages.
+ *
+ * This sets PF_SUPERPRIV on the task if the capability is available on the
+ * assumption that it's about to be used.

Same complaint about the documentation as last time:
https://lore.kernel.org/linux-fsdevel/20260626151656.GT6078@frogsfrogsfrogs/

--D

Quoted 13 lines
kernel/capability.c +6 -0
+ */
+bool capable_noaudit(int cap)
+{
+	return ns_capable_noaudit(&init_user_ns, cap);
+}
+EXPORT_SYMBOL(capable_noaudit);
 #endif /* CONFIG_MULTIUSER */
 
 /**
Signature · 1 line
2.54.0
author maintainer
#9 lore raw

Re: [PATCH v3 2/5] capability: Add new capable_noaudit

Quoted 65 lines · Darrick J. Wong
Quoted 64 lines · On Thu, Jul 02, 2026 at 11:33:19AM +0200, [email protected] wrote:

From: Carlos Maiolino <[email protected]>

In some situations (quota enforcement bypass in this case) we'd like to check for a specific capability without triggering spurious audit messages from security modules like selinux.

Add a new helper so we don't need to use ns_capable_noaudit() directly.

V3: remove the extern declaration

---
 include/linux/capability.h |  5 +++++
 kernel/capability.c        | 17 +++++++++++++++++
 2 files changed, 22 insertions(+)
include/linux/capability.h +5 -0
index 37db92b3d6f8..f8532d92fcad 100644
@@ -145,6 +145,7 @@ extern bool has_capability_noaudit(struct task_struct *t, int cap);
 extern bool has_ns_capability_noaudit(struct task_struct *t,
 				      struct user_namespace *ns, int cap);
 extern bool capable(int cap);
+bool capable_noaudit(int cap);
 extern bool ns_capable(struct user_namespace *ns, int cap);
 extern bool ns_capable_noaudit(struct user_namespace *ns, int cap);
 extern bool ns_capable_setid(struct user_namespace *ns, int cap);
@@ -167,6 +168,10 @@ static inline bool capable(int cap)
 {
 	return true;
 }
+static inline bool capable_noaudit(int cap)
+{
+	return true;
+}
 static inline bool ns_capable(struct user_namespace *ns, int cap)
 {
 	return true;
kernel/capability.c +6 -0
index 829f49ae07b9..2c2d1e8300bd 100644
@@ -416,6 +416,23 @@ bool capable(int cap)
 	return ns_capable(&init_user_ns, cap);
 }
 EXPORT_SYMBOL(capable);
+
+/**
+ * capable_noaudit - Determine if the current task has a superior
+ * capability in effect (unaudited).
+ * @cap: The capability to be tested for
+ *
Quoted 8 lines

kernel/capability.c bool capable(int cap) · line 429

Quoted 5 lines
kernel/capability.c +5 -0
+ * This is the same as capable(), except it uses CAP_OPT_NOAUDIT as to prevent
+ * issuing spurious audit messages.
+ *
+ * This sets PF_SUPERPRIV on the task if the capability is available on the
+ * assumption that it's about to be used.

Same complaint about the documentation as last time:
https://lore.kernel.org/linux-fsdevel/20260626151656.GT6078@frogsfrogsfrogs/

Right. I assumed "capability in effect" would suffice that, but I can add some extra comment here.

Quoted 17 lines

--D

Quoted 13 lines
kernel/capability.c +6 -0
+ */
+bool capable_noaudit(int cap)
+{
+	return ns_capable_noaudit(&init_user_ns, cap);
+}
+EXPORT_SYMBOL(capable_noaudit);
 #endif /* CONFIG_MULTIUSER */
 
 /**
Signature · 1 line
2.54.0
author maintainer
#10 lore raw

PATCH v3 3/5 quota: Don't issue audit messages on quota enforcing

In reply to [email protected]

From: Carlos Maiolino <[email protected]>

Calling capable() to determine if we can bypass quota enforcement or not can trigger spurious audit messages. We don't really require it here so just use the capable_noaudit() version.

---
 fs/quota/dquot.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/quota/dquot.c +1 -1
index 9850de3955d3..dab93422a57b 100644
@@ -1308,7 +1308,7 @@ static int ignore_hardlimit(struct dquot *dquot)
 {
 	struct mem_dqinfo *info = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type];
 
-	return capable(CAP_SYS_RESOURCE) &&
+	return capable_noaudit(CAP_SYS_RESOURCE) &&
 	       (info->dqi_format->qf_fmt_id != QFMT_VFS_OLD ||
 		!(info->dqi_flags & DQF_ROOT_SQUASH));
 }
Signature · 1 line
2.54.0
reviewer Acked-by on v3 3/5
#11 lore raw

Re: [PATCH v3 3/5] quota: Don't issue audit messages on quota enforcing

Quoted 6 lines · On Thu 02-07-26 11:33:21, [email protected] wrote:

From: Carlos Maiolino <[email protected]>

Calling capable() to determine if we can bypass quota enforcement or not can trigger spurious audit messages. We don't really require it here so just use the capable_noaudit() version.

Quoted 12 lines

Makes sense. Feel free to add:

Honza

Quoted 20 lines
---
 fs/quota/dquot.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/quota/dquot.c +1 -1
index 9850de3955d3..dab93422a57b 100644
@@ -1308,7 +1308,7 @@ static int ignore_hardlimit(struct dquot *dquot)
 {
 	struct mem_dqinfo *info = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type];
 
-	return capable(CAP_SYS_RESOURCE) &&
+	return capable_noaudit(CAP_SYS_RESOURCE) &&
 	       (info->dqi_format->qf_fmt_id != QFMT_VFS_OLD ||
 		!(info->dqi_flags & DQF_ROOT_SQUASH));
 }
Signature · 1 line
2.54.0
Signature · 2 lines
Jan Kara <[email protected]>
SUSE Labs, CR
author maintainer
#12 lore raw

PATCH v3 4/5 xfs: replace ns_capable_noaudit

In reply to [email protected]

From: Carlos Maiolino <[email protected]>

Now that capable_noaudit() is available, we don't need to keep using ns_capable_noaudit() and specifying the usernaspace every single time.

Cc Jan Kara <[email protected]>
Cc Christoph Hellwig <[email protected]>
Cc Serge E. Hallyn <[email protected]>
Cc Darrick J. Wong <[email protected]>
Cc Dave Chinner <[email protected]>
Cc Eric Sandeen <[email protected]>
Cc Dr. Thomas Orgis" <[email protected]>
---
 fs/xfs/xfs_fsmap.c | 3 +--
 fs/xfs/xfs_ioctl.c | 2 +-
 fs/xfs/xfs_iops.c  | 2 +-
 3 files changed, 3 insertions(+), 4 deletions(-)
fs/xfs/xfs_fsmap.c +1 -2
index 7c79fbe0a74c..041bb2105ec6 100644
@@ -1174,8 +1174,7 @@ xfs_getfsmap(
 	if (!xfs_getfsmap_check_keys(&head->fmh_keys[0], &head->fmh_keys[1]))
 		return -EINVAL;
 
-	use_rmap = xfs_has_rmapbt(mp) &&
-		   ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN);
+	use_rmap = xfs_has_rmapbt(mp) && capable_noaudit(CAP_SYS_ADMIN);
 	head->fmh_entries = 0;
 
 	/* Set up our device handlers. */
fs/xfs/xfs_ioctl.c +1 -1
index 1a8af827dde1..374b488f0416 100644
@@ -647,7 +647,7 @@ xfs_ioctl_setattr_get_trans(
 		goto out_error;
 
 	error = xfs_trans_alloc_ichange(ip, NULL, NULL, pdqp,
-			ns_capable_noaudit(&init_user_ns, CAP_FOWNER), &tp);
+					capable_noaudit(CAP_FOWNER), &tp);
 	if (error)
 		goto out_error;
 
fs/xfs/xfs_iops.c +1 -1
index 205fe2dae732..ce9f8b8468fc 100644
@@ -835,7 +835,7 @@ xfs_setattr_nonsize(
 	}
 
 	error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
-					ns_capable_noaudit(&init_user_ns, CAP_FOWNER),
+					capable_noaudit(CAP_FOWNER),
 					&tp);
 	if (error)
 		goto out_dqrele;
Signature · 1 line
2.54.0
#13 lore raw

Re: [PATCH v3 4/5] xfs: replace ns_capable_noaudit

Quoted 43 lines · On Thu, Jul 02, 2026 at 11:33:23AM +0200, [email protected] wrote:

From: Carlos Maiolino <[email protected]>

Now that capable_noaudit() is available, we don't need to keep using ns_capable_noaudit() and specifying the usernaspace every single time.

Cc Jan Kara <[email protected]>
Cc Christoph Hellwig <[email protected]>
Cc Serge E. Hallyn <[email protected]>
Cc Darrick J. Wong <[email protected]>
Cc Dave Chinner <[email protected]>
Cc Eric Sandeen <[email protected]>
Cc Dr. Thomas Orgis" <[email protected]>
---
 fs/xfs/xfs_fsmap.c | 3 +--
 fs/xfs/xfs_ioctl.c | 2 +-
 fs/xfs/xfs_iops.c  | 2 +-
 3 files changed, 3 insertions(+), 4 deletions(-)
fs/xfs/xfs_fsmap.c +1 -2
index 7c79fbe0a74c..041bb2105ec6 100644
@@ -1174,8 +1174,7 @@ xfs_getfsmap(
 	if (!xfs_getfsmap_check_keys(&head->fmh_keys[0], &head->fmh_keys[1]))
 		return -EINVAL;
 
-	use_rmap = xfs_has_rmapbt(mp) &&
-		   ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN);
+	use_rmap = xfs_has_rmapbt(mp) && capable_noaudit(CAP_SYS_ADMIN);
 	head->fmh_entries = 0;
 
 	/* Set up our device handlers. */
fs/xfs/xfs_ioctl.c +0 -0
index 1a8af827dde1..374b488f0416 100644

fs/xfs/xfs_ioctl.c xfs_ioctl_setattr_get_trans( · line 650

Quoted 5 lines
fs/xfs/xfs_ioctl.c +1 -1
@@ -647,7 +647,7 @@ xfs_ioctl_setattr_get_trans(
 		goto out_error;
 
 	error = xfs_trans_alloc_ichange(ip, NULL, NULL, pdqp,
-			ns_capable_noaudit(&init_user_ns, CAP_FOWNER), &tp);
+					capable_noaudit(CAP_FOWNER), &tp);

Not sure why the indentation changed, otherwise the patch looks fine to me.

--D

Quoted 20 lines
fs/xfs/xfs_ioctl.c +0 -0
 	if (error)
 		goto out_error;
 
fs/xfs/xfs_iops.c +1 -1
index 205fe2dae732..ce9f8b8468fc 100644
@@ -835,7 +835,7 @@ xfs_setattr_nonsize(
 	}
 
 	error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
-					ns_capable_noaudit(&init_user_ns, CAP_FOWNER),
+					capable_noaudit(CAP_FOWNER),
 					&tp);
 	if (error)
 		goto out_dqrele;
Signature · 1 line
2.54.0
author maintainer
#14 lore raw

Re: [PATCH v3 4/5] xfs: replace ns_capable_noaudit

Quoted 46 lines · Darrick J. Wong
Quoted 45 lines · On Thu, Jul 02, 2026 at 11:33:23AM +0200, [email protected] wrote:

From: Carlos Maiolino <[email protected]>

Now that capable_noaudit() is available, we don't need to keep using ns_capable_noaudit() and specifying the usernaspace every single time.

Cc Jan Kara <[email protected]>
Cc Christoph Hellwig <[email protected]>
Cc Serge E. Hallyn <[email protected]>
Cc Darrick J. Wong <[email protected]>
Cc Dave Chinner <[email protected]>
Cc Eric Sandeen <[email protected]>
Cc Dr. Thomas Orgis" <[email protected]>
---
 fs/xfs/xfs_fsmap.c | 3 +--
 fs/xfs/xfs_ioctl.c | 2 +-
 fs/xfs/xfs_iops.c  | 2 +-
 3 files changed, 3 insertions(+), 4 deletions(-)
fs/xfs/xfs_fsmap.c +1 -2
index 7c79fbe0a74c..041bb2105ec6 100644
@@ -1174,8 +1174,7 @@ xfs_getfsmap(
 	if (!xfs_getfsmap_check_keys(&head->fmh_keys[0], &head->fmh_keys[1]))
 		return -EINVAL;
 
-	use_rmap = xfs_has_rmapbt(mp) &&
-		   ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN);
+	use_rmap = xfs_has_rmapbt(mp) && capable_noaudit(CAP_SYS_ADMIN);
 	head->fmh_entries = 0;
 
 	/* Set up our device handlers. */
fs/xfs/xfs_ioctl.c +0 -0
index 1a8af827dde1..374b488f0416 100644
@@ -647,7 +647,7 @@ xfs_ioctl_setattr_get_trans(
 		goto out_error;
 
Quoted 6 lines

fs/xfs/xfs_ioctl.c xfs_ioctl_setattr_get_trans( · line 650

Quoted 3 lines
fs/xfs/xfs_ioctl.c +1 -1
 	error = xfs_trans_alloc_ichange(ip, NULL, NULL, pdqp,
-			ns_capable_noaudit(&init_user_ns, CAP_FOWNER), &tp);
+					capable_noaudit(CAP_FOWNER), &tp);

Not sure why the indentation changed, otherwise the patch looks fine to me.

Purely my screw up. I fixed it already to send to the next version. Was just waiting for more comments

Quoted 24 lines

--D

Quoted 20 lines
fs/xfs/xfs_ioctl.c +0 -0
 	if (error)
 		goto out_error;
 
fs/xfs/xfs_iops.c +1 -1
index 205fe2dae732..ce9f8b8468fc 100644
@@ -835,7 +835,7 @@ xfs_setattr_nonsize(
 	}
 
 	error = xfs_trans_alloc_ichange(ip, udqp, gdqp, NULL,
-					ns_capable_noaudit(&init_user_ns, CAP_FOWNER),
+					capable_noaudit(CAP_FOWNER),
 					&tp);
 	if (error)
 		goto out_dqrele;
Signature · 1 line
2.54.0
author maintainer
#15 lore raw

PATCH v3 5/5 capability: unexport has_capability_noaudit

In reply to [email protected]

From: Carlos Maiolino <[email protected]>

This has been originally exported to be used in xfs. Giving we are not using it anymore, unexport for consistency.

---
 kernel/capability.c | 1 -
 1 file changed, 1 deletion(-)
kernel/capability.c +0 -1
index 2c2d1e8300bd..3d0387fb93a3 100644
@@ -326,7 +326,6 @@ bool has_capability_noaudit(struct task_struct *t, int cap)
 {
 	return has_ns_capability_noaudit(t, &init_user_ns, cap);
 }
-EXPORT_SYMBOL(has_capability_noaudit);
 
 static bool ns_capable_common(struct user_namespace *ns,
 			      int cap,
Signature · 1 line
2.54.0