Existing kernfs_xattr_get() locks iattr_mutex, so it cannot be used in RCU critical sections. Introduce __kernfs_xattr_get(), which reads xattr under RCU read lock. This can be used by BPF programs to access cgroupfs xattrs. Signed-off-by: Song Liu <song@xxxxxxxxxx> --- fs/kernfs/inode.c | 14 ++++++++++++++ include/linux/kernfs.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c index b83054da68b3..0ca231d2012c 100644 --- a/fs/kernfs/inode.c +++ b/fs/kernfs/inode.c @@ -302,6 +302,20 @@ int kernfs_xattr_get(struct kernfs_node *kn, const char *name, return simple_xattr_get(&attrs->xattrs, name, value, size); } +int __kernfs_xattr_get(struct kernfs_node *kn, const char *name, + void *value, size_t size) +{ + struct kernfs_iattrs *attrs; + + WARN_ON_ONCE(!rcu_read_lock_held()); + + attrs = rcu_dereference(kn->iattr); + if (!attrs) + return -ENODATA; + + return simple_xattr_get(&attrs->xattrs, name, value, size); +} + int kernfs_xattr_set(struct kernfs_node *kn, const char *name, const void *value, size_t size, int flags) { diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h index b5a5f32fdfd1..8536ffc5c9f1 100644 --- a/include/linux/kernfs.h +++ b/include/linux/kernfs.h @@ -456,6 +456,8 @@ void kernfs_notify(struct kernfs_node *kn); int kernfs_xattr_get(struct kernfs_node *kn, const char *name, void *value, size_t size); +int __kernfs_xattr_get(struct kernfs_node *kn, const char *name, + void *value, size_t size); int kernfs_xattr_set(struct kernfs_node *kn, const char *name, const void *value, size_t size, int flags); -- 2.47.1