Commit 92f0d6c9 authored by Miklos Szeredi's avatar Miklos Szeredi

ovl: fold ovl_getxattr() into ovl_get_redirect_xattr()

This is a partial revert (with some cleanups) of commit 993a0b2a ("ovl:
Do not lose security.capability xattr over metadata file copy-up"), which
introduced ovl_getxattr() in the first place.
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent de7a52c9
...@@ -882,49 +882,26 @@ bool ovl_is_metacopy_dentry(struct dentry *dentry) ...@@ -882,49 +882,26 @@ bool ovl_is_metacopy_dentry(struct dentry *dentry)
return (oe->numlower > 1); return (oe->numlower > 1);
} }
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;
}
char *ovl_get_redirect_xattr(struct dentry *dentry, int padding) char *ovl_get_redirect_xattr(struct dentry *dentry, int padding)
{ {
int res; int res;
char *s, *next, *buf = NULL; char *s, *next, *buf = NULL;
res = ovl_getxattr(dentry, OVL_XATTR_REDIRECT, &buf, padding + 1); res = vfs_getxattr(dentry, OVL_XATTR_REDIRECT, NULL, 0);
if (res == -ENODATA) if (res == -ENODATA || res == -EOPNOTSUPP)
return NULL; return NULL;
if (res < 0) if (res < 0)
return ERR_PTR(res); goto fail;
if (res == 0)
goto invalid;
buf = kzalloc(res + padding + 1, GFP_KERNEL);
if (!buf)
return ERR_PTR(-ENOMEM);
res = vfs_getxattr(dentry, OVL_XATTR_REDIRECT, buf, res);
if (res < 0)
goto fail;
if (res == 0) if (res == 0)
goto invalid; goto invalid;
...@@ -943,6 +920,10 @@ char *ovl_get_redirect_xattr(struct dentry *dentry, int padding) ...@@ -943,6 +920,10 @@ char *ovl_get_redirect_xattr(struct dentry *dentry, int padding)
invalid: invalid:
pr_warn_ratelimited("invalid redirect (%s)\n", buf); pr_warn_ratelimited("invalid redirect (%s)\n", buf);
res = -EINVAL; res = -EINVAL;
goto err_free;
fail:
pr_warn_ratelimited("failed to get redirect (%i)\n", res);
err_free:
kfree(buf); kfree(buf);
return ERR_PTR(res); return ERR_PTR(res);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment