Commit fee0f298 authored by Miklos Szeredi's avatar Miklos Szeredi
Browse files

duplicate ovl_getxattr()



ovl_getattr() returns the value of an xattr in a kmalloced buffer.  There
are two callers:

 ovl_copy_up_meta_inode_data()	(copy_up.c)
 ovl_get_redirect_xattr()	(util.c)

This patch just copies ovl_getxattr() to copy_up.c, the following patches
will deal with the differences in idividual callers.

Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent c86243b0
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -784,6 +784,39 @@ static bool ovl_need_meta_copy_up(struct dentry *dentry, umode_t mode,
	return true;
}

static ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value,
			    size_t padding)
{
	ssize_t res;
	char *buf = NULL;

	res = vfs_getxattr(dentry, name, NULL, 0);
	if (res < 0) {
		if (res == -ENODATA || res == -EOPNOTSUPP)
			return -ENODATA;
		goto fail;
	}

	if (res != 0) {
		buf = kzalloc(res + padding, GFP_KERNEL);
		if (!buf)
			return -ENOMEM;

		res = vfs_getxattr(dentry, name, buf, res);
		if (res < 0)
			goto fail;
	}
	*value = buf;

	return res;

fail:
	pr_warn_ratelimited("failed to get xattr %s: err=%zi)\n",
			    name, res);
	kfree(buf);
	return res;
}

/* Copy up data of an inode which was copied up metadata only in the past. */
static int ovl_copy_up_meta_inode_data(struct ovl_copy_up_ctx *c)
{
+0 −2
Original line number Diff line number Diff line
@@ -299,8 +299,6 @@ int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir);
int ovl_check_metacopy_xattr(struct dentry *dentry);
bool ovl_is_metacopy_dentry(struct dentry *dentry);
char *ovl_get_redirect_xattr(struct dentry *dentry, int padding);
ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value,
		     size_t padding);

static inline bool ovl_is_impuredir(struct dentry *dentry)
{
+2 −2
Original line number Diff line number Diff line
@@ -882,7 +882,7 @@ bool ovl_is_metacopy_dentry(struct dentry *dentry)
	return (oe->numlower > 1);
}

ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value,
static ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value,
			    size_t padding)
{
	ssize_t res;