Unverified Commit 387b96a5 authored by Christian Brauner's avatar Christian Brauner Committed by Christian Brauner (Microsoft)
Browse files

reiserfs: rework ->listxattr() implementation



Rework reiserfs so it doesn't have to rely on the dummy xattr handlers
in its s_xattr list anymore as this is completely unused for setting and
getting posix acls.

Cc: reiserfs-devel@vger.kernel.org
Signed-off-by: default avatarChristian Brauner (Microsoft) <brauner@kernel.org>
parent a5488f29
Loading
Loading
Loading
Loading
+25 −21
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@
#include <linux/quotaops.h>
#include <linux/security.h>
#include <linux/posix_acl_xattr.h>
#include <linux/xattr.h>

#define PRIVROOT_NAME ".reiserfs_priv"
#define XAROOT_NAME   "xattrs"
@@ -770,23 +771,34 @@ reiserfs_xattr_get(struct inode *inode, const char *name, void *buffer,
			(handler) != NULL;			\
			(handler) = *(handlers)++)

/* This is the implementation for the xattr plugin infrastructure */
static inline const struct xattr_handler *
find_xattr_handler_prefix(const struct xattr_handler **handlers,
			   const char *name)
static inline bool reiserfs_posix_acl_list(const char *name,
					   struct dentry *dentry)
{
	const struct xattr_handler *xah;
	return (posix_acl_type(name) >= 0) &&
	       IS_POSIXACL(d_backing_inode(dentry));
}

	if (!handlers)
		return NULL;
/* This is the implementation for the xattr plugin infrastructure */
static inline bool reiserfs_xattr_list(const struct xattr_handler **handlers,
				       const char *name, struct dentry *dentry)
{
	if (handlers) {
		const struct xattr_handler *xah = NULL;

		for_each_xattr_handler(handlers, xah) {
			const char *prefix = xattr_prefix(xah);
		if (strncmp(prefix, name, strlen(prefix)) == 0)
			break;

			if (strncmp(prefix, name, strlen(prefix)))
				continue;

			if (!xattr_handler_can_list(xah, dentry))
				return false;

			return true;
		}
	}

	return xah;
	return reiserfs_posix_acl_list(name, dentry);
}

struct listxattr_buf {
@@ -807,12 +819,8 @@ static bool listxattr_filler(struct dir_context *ctx, const char *name,

	if (name[0] != '.' ||
	    (namelen != 1 && (name[1] != '.' || namelen != 2))) {
		const struct xattr_handler *handler;

		handler = find_xattr_handler_prefix(b->dentry->d_sb->s_xattr,
						    name);
		if (!handler /* Unsupported xattr name */ ||
		    (handler->list && !handler->list(b->dentry)))
		if (!reiserfs_xattr_list(b->dentry->d_sb->s_xattr, name,
					 b->dentry))
			return true;
		size = namelen + 1;
		if (b->buf) {
@@ -910,10 +918,6 @@ const struct xattr_handler *reiserfs_xattr_handlers[] = {
#endif
#ifdef CONFIG_REISERFS_FS_SECURITY
	&reiserfs_xattr_security_handler,
#endif
#ifdef CONFIG_REISERFS_FS_POSIX_ACL
	&posix_acl_access_xattr_handler,
	&posix_acl_default_xattr_handler,
#endif
	NULL
};