mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Christian Brauner <brauner@kernel.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Christian Brauner <brauner@kernel.org>,
	linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [GIT PULL 09/18 for v7.3] vfs kfunc
Date: Fri, 14 Aug 2026 15:12:38 +0200	[thread overview]
Message-ID: <20260814-vfs-7.3-rc1.kfunc-15aa56837afc@brauner> (raw)
In-Reply-To: <20260814-vfs-v73-6e884cb31ac9@brauner>

Hey Linus,

/* Summary */

This adds a bpf_sock_read_xattr() kfunc so a BPF LSM program can read
a user.* extended attribute from a socket's sockfs inode locklessly.

userspace already uses user.* xattrs on sockets to implement socket rate
limiting and to tag sockets for other purposes such as a varlink
registry. There has been no efficient way for a BPF program to read
those labels back. With this a listening socket marked from userspace
with fsetxattr() can be read back during bind or connect and acted upon
on the connecting socket. That lets userspace mark sockets and later
rediscover them or implement policy on them.

/* Testing */

No build failures or warnings were observed.

/* Conflicts */

Merge conflicts with mainline
=============================

This conflicts with commit 3f8c65b06fafc ("bpf: have
bpf_real_data_inode() take a struct file") in fs/bpf_fs_kfuncs.c. That
commit renamed bpf_real_inode() to bpf_real_data_inode() and switched it
to take a struct file, while commit b4e124d168552 ("fs: Add
bpf_sock_read_xattr() kfunc to read socket xattrs") from this tree adds
a new kfunc immediately above it. Here's a proposed conflict resolution:

[1]: https://lore.kernel.org/linux-next/ak4zoqJsFCyOQXyh@sirena.org.uk

diff --cc fs/bpf_fs_kfuncs.c
index 5b7d03e4fc6d,9a4ea5c9b0c9..6cb877267978
--- a/fs/bpf_fs_kfuncs.c
+++ b/fs/bpf_fs_kfuncs.c
@@@ -360,24 -360,52 +361,57 @@@ __bpf_kfunc int bpf_cgroup_read_xattr(s
  }
  #endif /* CONFIG_CGROUPS */
  
+ #ifdef CONFIG_NET
+ /**
+  * bpf_sock_read_xattr - read xattr of a socket's inode in sockfs
+  * @sock: socket to get xattr from
+  * @name__str: name of the xattr
+  * @value_p: output buffer of the xattr value
+  *
+  * Get xattr *name__str* of *sock* and store the output in *value_p*.
+  *
+  * For security reasons, only *name__str* with prefix "user." is allowed.
+  *
+  * Return: length of the xattr value on success, a negative value on error.
+  */
+ __bpf_kfunc int bpf_sock_read_xattr(struct socket *sock, const char *name__str,
+ 				    struct bpf_dynptr *value_p)
+ {
+ 	struct bpf_dynptr_kern *value_ptr = (struct bpf_dynptr_kern *)value_p;
+ 	u32 value_len;
+ 	void *value;
+ 
+ 	/* Only allow reading "user.*" xattrs */
+ 	if (strncmp(name__str, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN))
+ 		return -EPERM;
+ 
+ 	value_len = __bpf_dynptr_size(value_ptr);
+ 	value = __bpf_dynptr_data_rw(value_ptr, value_len);
+ 	if (!value)
+ 		return -EINVAL;
+ 
+ 	return sock_read_xattr(sock, name__str, value, value_len);
+ }
+ #endif /* CONFIG_NET */
+ 
  /**
 - * bpf_real_inode - get the real inode backing a dentry
 - * @dentry: dentry to resolve
 + * bpf_real_data_inode - get the real inode hosting a file's data
 + * @file: file to resolve
   *
 - * If the dentry is on a union/overlay filesystem, return the underlying, real
 - * inode that hosts the data.  Otherwise return the inode attached to the
 - * dentry itself.
 + * Resolve @file to the inode that hosts its data. For a regular file on a
 + * union/overlay filesystem this is the underlying (upper or lower) inode that
 + * stores the data, not the overlay inode.
   *
 - * Return: The real inode backing the dentry, or NULL for a negative dentry.
 + * Data resolution only applies to regular files. For a non-regular file (e.g.
 + * a device node, fifo or socket) on a union/overlay filesystem the overlay
 + * inode itself is returned; for any file on a non-union filesystem the inode
 + * attached to @file is returned.
 + *
 + * Return: The inode hosting @file's data, or NULL.
   */
 -__bpf_kfunc struct inode *bpf_real_inode(struct dentry *dentry)
 +__bpf_kfunc struct inode *bpf_real_data_inode(struct file *file)
  {
 -	return d_real_inode(dentry);
 +	return d_real_inode(file_dentry(file));
  }
  
  __bpf_kfunc_end_defs();
@@@ -390,28 -418,16 +424,31 @@@ BTF_ID_FLAGS(func, bpf_get_dentry_xattr
  BTF_ID_FLAGS(func, bpf_get_file_xattr, KF_SLEEPABLE)
  BTF_ID_FLAGS(func, bpf_set_dentry_xattr, KF_SLEEPABLE)
  BTF_ID_FLAGS(func, bpf_remove_dentry_xattr, KF_SLEEPABLE)
 -BTF_ID_FLAGS(func, bpf_real_inode, KF_SLEEPABLE | KF_RET_NULL)
 +BTF_ID_FLAGS(func, bpf_real_data_inode, KF_SLEEPABLE | KF_RET_NULL)
+ #ifdef CONFIG_NET
+ BTF_ID_FLAGS(func, bpf_sock_read_xattr, KF_RCU)
+ #endif
  BTF_KFUNCS_END(bpf_fs_kfunc_set_ids)
  
 +/* Side-effecting kfuncs that stay exclusive to LSM programs. */
 +BTF_SET_START(bpf_fs_kfunc_lsm_only_ids)
 +BTF_ID(func, bpf_set_dentry_xattr)
 +BTF_ID(func, bpf_remove_dentry_xattr)
 +BTF_SET_END(bpf_fs_kfunc_lsm_only_ids)
 +
  static int bpf_fs_kfuncs_filter(const struct bpf_prog *prog, u32 kfunc_id)
  {
 -	if (!btf_id_set8_contains(&bpf_fs_kfunc_set_ids, kfunc_id) ||
 -	    prog->type == BPF_PROG_TYPE_LSM)
 +	if (!btf_id_set8_contains(&bpf_fs_kfunc_set_ids, kfunc_id))
 +		return 0;
 +	if (prog->type == BPF_PROG_TYPE_LSM)
 +		return 0;
 +	if (prog->type != BPF_PROG_TYPE_STRUCT_OPS)
 +		return -EACCES;
 +	/* ->st_ops is unset during the cfg pass; enforced once it is set. */
 +	if (!prog->aux->st_ops)
 +		return 0;
 +	if (bpf_prog_is_binfmt_misc_ops(prog) &&
 +	    !btf_id_set_contains(&bpf_fs_kfunc_lsm_only_ids, kfunc_id))
  		return 0;
  	return -EACCES;
  }

Merge conflicts with other trees
================================

No known conflicts.

The following changes since commit dc59e4fea9d83f03bad6bddf3fa2e52491777482:

  Linux 7.2-rc1 (2026-06-28 12:01:31 -0700)

are available in the Git repository at:

  git@gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs tags/vfs-7.3-rc1.kfunc

for you to fetch changes up to 8abc1c8badc11c859bb4ba43211611347e59c55c:

  Merge patch series "Add bpf_sock_read_xattr() kfunc to read socket xattrs" (2026-06-29 10:31:17 +0200)

----------------------------------------------------------------
vfs-7.3-rc1.kfunc

Please consider pulling these changes from the signed vfs-7.3-rc1.kfunc tag.

Thanks!
Christian

----------------------------------------------------------------
Christian Brauner (3):
      fs: Add bpf_sock_read_xattr() kfunc to read socket xattrs
      selftests/bpf: Add test for bpf_sock_read_xattr() kfunc
      Merge patch series "Add bpf_sock_read_xattr() kfunc to read socket xattrs"

 fs/bpf_fs_kfuncs.c                                 | 37 ++++++++++++
 include/linux/net.h                                |  1 +
 net/socket.c                                       | 25 ++++++++
 tools/testing/selftests/bpf/bpf_experimental.h     |  3 +
 .../testing/selftests/bpf/prog_tests/sock_xattr.c  | 67 ++++++++++++++++++++++
 .../testing/selftests/bpf/progs/sock_read_xattr.c  | 54 +++++++++++++++++
 6 files changed, 187 insertions(+)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/sock_xattr.c
 create mode 100644 tools/testing/selftests/bpf/progs/sock_read_xattr.c

  parent reply	other threads:[~2026-08-14 13:12 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-14 13:07 [GIT PULL 00/18 for v7.3] v7.3 Christian Brauner
2026-08-14 13:10 ` [GIT PULL 01/18 for v7.3] ipc misc Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:11 ` [GIT PULL 02/18 for v7.3] kernel misc Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:11 ` [GIT PULL 03/18 for v7.3] vfs binfmt Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:11 ` [GIT PULL 04/18 for v7.3] vfs efs Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:11 ` [GIT PULL 05/18 for v7.3] vfs failfs Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:12 ` [GIT PULL 06/18 for v7.3] vfs fat Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:12 ` [GIT PULL 07/18 for v7.3] vfs freevxfs Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:12 ` [GIT PULL 08/18 for v7.3] vfs iomap Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:12 ` Christian Brauner [this message]
2026-08-17 22:25   ` [GIT PULL 09/18 for v7.3] vfs kfunc pr-tracker-bot
2026-08-14 13:12 ` [GIT PULL 10/18 for v7.3] vfs kthread Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:13 ` [GIT PULL 11/18 for v7.3] vfs lookup Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:13 ` [GIT PULL 12/18 for v7.3] vfs misc Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:13 ` [GIT PULL 13/18 for v7.3] vfs mount Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:14 ` [GIT PULL 14/18 for v7.3] vfs netfs Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:14 ` [GIT PULL 15/18 for v7.3] vfs nilfs2 Christian Brauner
2026-08-14 17:26   ` Viacheslav Dubeyko
2026-08-17  7:30     ` Christian Brauner
2026-08-14 13:14 ` [GIT PULL 16/18 for v7.3] vfs ovl Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:14 ` [GIT PULL 17/18 for v7.3] vfs super Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot
2026-08-14 13:15 ` [GIT PULL 18/18 for v7.3] vfs sync Christian Brauner
2026-08-17 22:25   ` pr-tracker-bot

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=20260814-vfs-7.3-rc1.kfunc-15aa56837afc@brauner \
    --to=brauner@kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®