@@ -94,26 +94,29 @@ __bpf_kfunc int bpf_path_d_path(struct path *path, char *buf, size_t buf__sz)
9494}
9595
9696/**
97- * bpf_get_file_xattr - get xattr of a file
98- * @file: file to get xattr from
97+ * bpf_get_dentry_xattr - get xattr of a dentry
98+ * @dentry: dentry to get xattr from
9999 * @name__str: name of the xattr
100100 * @value_p: output buffer of the xattr value
101101 *
102- * Get xattr *name__str* of *file * and store the output in *value_ptr*.
102+ * Get xattr *name__str* of *dentry * and store the output in *value_ptr*.
103103 *
104104 * For security reasons, only *name__str* with prefix "user." is allowed.
105105 *
106106 * Return: 0 on success, a negative value on error.
107107 */
108- __bpf_kfunc int bpf_get_file_xattr (struct file * file , const char * name__str ,
109- struct bpf_dynptr * value_p )
108+ __bpf_kfunc int bpf_get_dentry_xattr (struct dentry * dentry , const char * name__str ,
109+ struct bpf_dynptr * value_p )
110110{
111111 struct bpf_dynptr_kern * value_ptr = (struct bpf_dynptr_kern * )value_p ;
112- struct dentry * dentry ;
112+ struct inode * inode = d_inode ( dentry ) ;
113113 u32 value_len ;
114114 void * value ;
115115 int ret ;
116116
117+ if (WARN_ON (!inode ))
118+ return - EINVAL ;
119+
117120 if (strncmp (name__str , XATTR_USER_PREFIX , XATTR_USER_PREFIX_LEN ))
118121 return - EPERM ;
119122
@@ -122,11 +125,31 @@ __bpf_kfunc int bpf_get_file_xattr(struct file *file, const char *name__str,
122125 if (!value )
123126 return - EINVAL ;
124127
125- dentry = file_dentry (file );
126- ret = inode_permission (& nop_mnt_idmap , dentry -> d_inode , MAY_READ );
128+ ret = inode_permission (& nop_mnt_idmap , inode , MAY_READ );
127129 if (ret )
128130 return ret ;
129- return __vfs_getxattr (dentry , dentry -> d_inode , name__str , value , value_len );
131+ return __vfs_getxattr (dentry , inode , name__str , value , value_len );
132+ }
133+
134+ /**
135+ * bpf_get_file_xattr - get xattr of a file
136+ * @file: file to get xattr from
137+ * @name__str: name of the xattr
138+ * @value_p: output buffer of the xattr value
139+ *
140+ * Get xattr *name__str* of *file* and store the output in *value_ptr*.
141+ *
142+ * For security reasons, only *name__str* with prefix "user." is allowed.
143+ *
144+ * Return: 0 on success, a negative value on error.
145+ */
146+ __bpf_kfunc int bpf_get_file_xattr (struct file * file , const char * name__str ,
147+ struct bpf_dynptr * value_p )
148+ {
149+ struct dentry * dentry ;
150+
151+ dentry = file_dentry (file );
152+ return bpf_get_dentry_xattr (dentry , name__str , value_p );
130153}
131154
132155__bpf_kfunc_end_defs ();
@@ -136,6 +159,7 @@ BTF_ID_FLAGS(func, bpf_get_task_exe_file,
136159 KF_ACQUIRE | KF_TRUSTED_ARGS | KF_RET_NULL )
137160BTF_ID_FLAGS (func , bpf_put_file , KF_RELEASE )
138161BTF_ID_FLAGS (func , bpf_path_d_path , KF_TRUSTED_ARGS )
162+ BTF_ID_FLAGS (func , bpf_get_dentry_xattr , KF_SLEEPABLE | KF_TRUSTED_ARGS )
139163BTF_ID_FLAGS (func , bpf_get_file_xattr , KF_SLEEPABLE | KF_TRUSTED_ARGS )
140164BTF_KFUNCS_END (bpf_fs_kfunc_set_ids )
141165
0 commit comments