162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include "reiserfs.h"
362306a36Sopenharmony_ci#include <linux/capability.h>
462306a36Sopenharmony_ci#include <linux/errno.h>
562306a36Sopenharmony_ci#include <linux/fs.h>
662306a36Sopenharmony_ci#include <linux/pagemap.h>
762306a36Sopenharmony_ci#include <linux/xattr.h>
862306a36Sopenharmony_ci#include "xattr.h"
962306a36Sopenharmony_ci#include <linux/uaccess.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistatic int
1262306a36Sopenharmony_citrusted_get(const struct xattr_handler *handler, struct dentry *unused,
1362306a36Sopenharmony_ci	    struct inode *inode, const char *name, void *buffer, size_t size)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci	if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(inode))
1662306a36Sopenharmony_ci		return -EPERM;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	return reiserfs_xattr_get(inode, xattr_full_name(handler, name),
1962306a36Sopenharmony_ci				  buffer, size);
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic int
2362306a36Sopenharmony_citrusted_set(const struct xattr_handler *handler,
2462306a36Sopenharmony_ci	    struct mnt_idmap *idmap, struct dentry *unused,
2562306a36Sopenharmony_ci	    struct inode *inode, const char *name, const void *buffer,
2662306a36Sopenharmony_ci	    size_t size, int flags)
2762306a36Sopenharmony_ci{
2862306a36Sopenharmony_ci	if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(inode))
2962306a36Sopenharmony_ci		return -EPERM;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	return reiserfs_xattr_set(inode,
3262306a36Sopenharmony_ci				  xattr_full_name(handler, name),
3362306a36Sopenharmony_ci				  buffer, size, flags);
3462306a36Sopenharmony_ci}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cistatic bool trusted_list(struct dentry *dentry)
3762306a36Sopenharmony_ci{
3862306a36Sopenharmony_ci	return capable(CAP_SYS_ADMIN) && !IS_PRIVATE(d_inode(dentry));
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ciconst struct xattr_handler reiserfs_xattr_trusted_handler = {
4262306a36Sopenharmony_ci	.prefix = XATTR_TRUSTED_PREFIX,
4362306a36Sopenharmony_ci	.get = trusted_get,
4462306a36Sopenharmony_ci	.set = trusted_set,
4562306a36Sopenharmony_ci	.list = trusted_list,
4662306a36Sopenharmony_ci};
47