posix: fill glusterfs.posix.* acl xattrs at dict

Change-Id: I0730a037f96c4386c72ecf2f61c71ec17ffbc1b0
Updates: bz#1634220
Signed-off-by: Kinglong Mee <mijinlong@open-fs.com>
This commit is contained in:
Kinglong Mee 2018-09-29 11:58:42 +08:00 committed by Amar Tumballi
parent 826e03db09
commit 9eab065769
3 changed files with 86 additions and 10 deletions

View File

@ -429,6 +429,10 @@ _posix_xattr_get_set(dict_t *xattr_req, char *key, data_t *data,
ssize_t remaining_size = 0;
char *xattr = NULL;
inode_t *inode = NULL;
char *value = NULL;
struct iatt stbuf = {
0,
};
if (posix_xattr_ignorable(key))
goto out;
@ -546,6 +550,47 @@ _posix_xattr_get_set(dict_t *xattr_req, char *key, data_t *data,
ret = dict_set_uint64(filler->xattr, GF_GET_SIZE,
filler->stbuf->ia_size);
}
} else if (GF_POSIX_ACL_REQUEST(key)) {
if (filler->real_path)
ret = posix_pstat(filler->this, NULL, NULL, filler->real_path,
&stbuf, _gf_false);
else
ret = posix_fdstat(filler->this, filler->fd->inode, filler->fdnum,
&stbuf);
if (ret < 0) {
gf_msg(filler->this->name, GF_LOG_ERROR, errno,
P_MSG_XDATA_GETXATTR, "lstat on %s failed",
filler->real_path ?: uuid_utoa(filler->fd->inode->gfid));
goto out;
}
/* Avoid link follow in virt_pacl_get, donot fill acl for symlink.*/
if (IA_ISLNK(stbuf.ia_type))
goto out;
/* ACL_TYPE_DEFAULT is not supported for non-directory, skip */
if (!IA_ISDIR(stbuf.ia_type) &&
!strncmp(key, GF_POSIX_ACL_DEFAULT, strlen(GF_POSIX_ACL_DEFAULT)))
goto out;
ret = posix_pacl_get(filler->real_path, filler->fdnum, key, &value);
if (ret || !value) {
gf_msg(filler->this->name, GF_LOG_ERROR, errno,
P_MSG_XDATA_GETXATTR, "could not get acl (%s) for %s, %d",
key, filler->real_path ?: uuid_utoa(filler->fd->inode->gfid),
ret);
goto out;
}
ret = dict_set_dynstr(filler->xattr, (char *)key, value);
if (ret < 0) {
GF_FREE(value);
gf_msg(filler->this->name, GF_LOG_ERROR, errno,
P_MSG_XDATA_GETXATTR,
"could not set acl (%s) for %s in dictionary", key,
filler->real_path ?: uuid_utoa(filler->fd->inode->gfid));
goto out;
}
} else {
remaining_size = filler->list_size;
while (remaining_size > 0) {
@ -1010,16 +1055,34 @@ out:
#ifdef HAVE_SYS_ACL_H
int
posix_pacl_set(const char *path, const char *key, const char *acl_s)
posix_pacl_set(const char *path, int fdnum, const char *key, const char *acl_s)
{
int ret = -1;
acl_t acl = NULL;
acl_type_t type = 0;
if ((!path) && (fdnum < 0)) {
errno = -EINVAL;
return -1;
}
type = gf_posix_acl_get_type(key);
if (!type)
return -1;
acl = acl_from_text(acl_s);
ret = acl_set_file(path, type, acl);
if (!acl)
return -1;
if (path)
ret = acl_set_file(path, type, acl);
else if (type == ACL_TYPE_ACCESS)
ret = acl_set_fd(fdnum, acl);
else {
errno = -EINVAL;
return -1;
}
if (ret)
/* posix_handle_pair expects ret to be the errno */
ret = -errno;
@ -1030,18 +1093,31 @@ posix_pacl_set(const char *path, const char *key, const char *acl_s)
}
int
posix_pacl_get(const char *path, const char *key, char **acl_s)
posix_pacl_get(const char *path, int fdnum, const char *key, char **acl_s)
{
int ret = -1;
acl_t acl = NULL;
acl_type_t type = 0;
char *acl_tmp = NULL;
if ((!path) && (fdnum < 0)) {
errno = -EINVAL;
return -1;
}
type = gf_posix_acl_get_type(key);
if (!type)
return -1;
acl = acl_get_file(path, type);
if (path)
acl = acl_get_file(path, type);
else if (type == ACL_TYPE_ACCESS)
acl = acl_get_fd(fdnum);
else {
errno = -EINVAL;
return -1;
}
if (!acl)
return -1;
@ -1066,14 +1142,14 @@ free_acl:
}
#else /* !HAVE_SYS_ACL_H (NetBSD) */
int
posix_pacl_set(const char *path, const char *key, const char *acl_s)
posix_pacl_set(const char *path, int fdnum, const char *key, const char *acl_s)
{
errno = ENOTSUP;
return -1;
}
int
posix_pacl_get(const char *path, const char *key, char **acl_s)
posix_pacl_get(const char *path, int fdnum, const char *key, char **acl_s)
{
errno = ENOTSUP;
return -1;
@ -1121,7 +1197,7 @@ posix_handle_pair(xlator_t *this, const char *real_path, char *key,
} else if (GF_POSIX_ACL_REQUEST(key)) {
if (stbuf && IS_DHT_LINKFILE_MODE(stbuf))
goto out;
ret = posix_pacl_set(real_path, key, value->data);
ret = posix_pacl_set(real_path, -1, key, value->data);
} else if (!strncmp(key, POSIX_ACL_ACCESS_XATTR, strlen(key)) && stbuf &&
IS_DHT_LINKFILE_MODE(stbuf)) {
goto out;

View File

@ -3015,7 +3015,7 @@ posix_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,
}
if (loc->inode && name && GF_POSIX_ACL_REQUEST(name)) {
ret = posix_pacl_get(real_path, name, &value);
ret = posix_pacl_get(real_path, -1, name, &value);
if (ret || !value) {
op_errno = errno;
gf_msg(this->name, GF_LOG_WARNING, errno, P_MSG_ACL_FAILED,

View File

@ -387,10 +387,10 @@ void
posix_gfid_unset(xlator_t *this, dict_t *xdata);
int
posix_pacl_set(const char *path, const char *key, const char *acl_s);
posix_pacl_set(const char *path, int fdnum, const char *key, const char *acl_s);
int
posix_pacl_get(const char *path, const char *key, char **acl_s);
posix_pacl_get(const char *path, int fdnum, const char *key, char **acl_s);
int32_t
posix_get_objectsignature(char *, dict_t *);