CEPH_REQ(ceph_ll_create, req, 1, ans, 1);
int32_t err;
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.parent = ptr_value(parent);
req.v0.mode = mode;
req.v0.oflags = oflags;
{
CEPH_REQ(ceph_ll_getattr, req, 0, ans, 1);
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.inode = ptr_value(in);
req.v0.want = want;
req.v0.flags = flags;
{
CEPH_REQ(ceph_ll_getxattr, req, 1, ans, 1);
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.inode = ptr_value(in);
req.v0.size = size;
CEPH_STR_ADD(req, v0.name, name);
{
CEPH_REQ(ceph_ll_link, req, 1, ans, 0);
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.inode = ptr_value(in);
req.v0.parent = ptr_value(newparent);
CEPH_STR_ADD(req, v0.name, name);
CEPH_REQ(ceph_ll_listxattr, req, 0, ans, 1);
int32_t err;
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.inode = ptr_value(in);
req.v0.size = buf_size;
CEPH_REQ(ceph_ll_lookup, req, 1, ans, 1);
int32_t err;
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.parent = ptr_value(parent);
req.v0.want = want;
req.v0.flags = flags;
CEPH_REQ(ceph_ll_mkdir, req, 1, ans, 1);
int32_t err;
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.parent = ptr_value(parent);
req.v0.mode = mode;
req.v0.want = want;
CEPH_REQ(ceph_ll_mknod, req, 1, ans, 1);
int32_t err;
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.parent = ptr_value(parent);
req.v0.mode = mode;
req.v0.rdev = rdev;
CEPH_REQ(ceph_ll_open, req, 0, ans, 0);
int32_t err;
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.inode = ptr_value(in);
req.v0.flags = flags;
CEPH_REQ(ceph_ll_opendir, req, 0, ans, 0);
int32_t err;
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.inode = ptr_value(in);
err = CEPH_PROCESS(cmount, LIBCEPHFSD_OP_LL_OPENDIR, req, ans);
{
CEPH_REQ(ceph_ll_readlink, req, 0, ans, 1);
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.inode = ptr_value(in);
req.v0.size = bufsize;
{
CEPH_REQ(ceph_ll_removexattr, req, 1, ans, 0);
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.inode = ptr_value(in);
CEPH_STR_ADD(req, v0.name, name);
{
CEPH_REQ(ceph_ll_rename, req, 2, ans, 0);
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.old_parent = ptr_value(parent);
req.v0.new_parent = ptr_value(newparent);
CEPH_STR_ADD(req, v0.old_name, name);
{
CEPH_REQ(ceph_ll_rmdir, req, 1, ans, 0);
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.parent = ptr_value(in);
CEPH_STR_ADD(req, v0.name, name);
{
CEPH_REQ(ceph_ll_setattr, req, 1, ans, 0);
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.inode = ptr_value(in);
req.v0.mask = mask;
CEPH_BUFF_ADD(req, stx, sizeof(*stx));
{
CEPH_REQ(ceph_ll_setxattr, req, 2, ans, 0);
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.inode = ptr_value(in);
req.v0.size = size;
req.v0.flags = flags;
CEPH_REQ(ceph_ll_symlink, req, 2, ans, 1);
int32_t err;
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.parent = ptr_value(in);
req.v0.want = want;
req.v0.flags = flags;
{
CEPH_REQ(ceph_ll_unlink, req, 1, ans, 0);
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.parent = ptr_value(in);
CEPH_STR_ADD(req, v0.name, name);
CEPH_REQ(ceph_ll_walk, req, 1, ans, 1);
int32_t err;
- req.v0.userperm = ptr_value(perms);
+ req.v0.userperm.ptr = ptr_value(perms);
req.v0.want = want;
req.v0.flags = flags;
CEPH_STR_ADD(req, v0.path, name);
#define TRACE(_fmt, _args...) do { } while (0)
#endif
+static int32_t validate_perms(proxy_client_t *client, embedded_perms_t *embed,
+ uint32_t count, const gid_t *groups,
+ UserPerm **pperms, bool *embedded)
+{
+ UserPerm *perms;
+
+ if ((client->neg.v1.enabled & PROXY_FEAT_EMBEDDED_PERMS) == 0) {
+ *embedded = false;
+ return ptr_check(&client->random, embed->ptr, (void **)pperms);
+ }
+
+ perms = ceph_userperm_new(embed->uid, embed->gid, count,
+ (gid_t *)groups);
+ if (perms == NULL) {
+ return -ENOMEM;
+ }
+
+ *embedded = true;
+ *pperms = perms;
+
+ return 0;
+}
+
static int32_t libcephfsd_version(proxy_client_t *client, proxy_req_t *req,
const void *data, int32_t data_size)
{
UserPerm *userperm;
int32_t err;
+ if ((client->neg.v1.enabled & PROXY_FEAT_EMBEDDED_PERMS) != 0) {
+ return -EOPNOTSUPP;
+ }
+
userperm = ceph_userperm_new(req->userperm_new.v0.uid,
req->userperm_new.v0.gid,
req->userperm_new.v0.groups,
UserPerm *perms;
int32_t err;
+ if ((client->neg.v1.enabled & PROXY_FEAT_EMBEDDED_PERMS) != 0) {
+ return -EOPNOTSUPP;
+ }
+
err = ptr_check(&global_random, req->userperm_destroy.v0.userperm,
(void **)&perms);
UserPerm *perms;
uint32_t want, flags;
int32_t err;
+ bool embedded;
+
+ embedded = false;
+
+ name = CEPH_STR_GET(req->ll_lookup, v0.name, data);
+ data = (const char *)data + req->ll_lookup.v0.name;
err = ptr_check(&client->random, req->ll_lookup.v0.cmount,
(void **)&mount);
(void **)&parent);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_lookup.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_lookup.v0.userperm,
+ req->ll_lookup.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
want = req->ll_lookup.v0.want;
flags = req->ll_lookup.v0.flags;
- name = CEPH_STR_GET(req->ll_lookup, v0.name, data);
CEPH_BUFF_ADD(ans, &stx, sizeof(stx));
}
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
UserPerm *perms;
uint32_t want, flags;
int32_t err;
+ bool embedded;
+
+ embedded = false;
+
+ path = CEPH_STR_GET(req->ll_walk, v0.path, data);
+ data = (const char *)data + req->ll_walk.v0.path;
err = ptr_check(&client->random, req->ll_walk.v0.cmount,
(void **)&mount);
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_walk.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_walk.v0.userperm,
+ req->ll_walk.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
want = req->ll_walk.v0.want;
flags = req->ll_walk.v0.flags;
- path = CEPH_STR_GET(req->ll_walk, v0.path, data);
CEPH_BUFF_ADD(ans, &stx, sizeof(stx));
}
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
UserPerm *perms;
struct Fh *fh;
int32_t flags, err;
+ bool embedded;
+
+ embedded = false;
err = ptr_check(&client->random, req->ll_open.v0.cmount,
(void **)&mount);
(void **)&inode);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_open.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_open.v0.userperm,
+ req->ll_open.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
flags = req->ll_open.v0.flags;
}
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
mode_t mode;
uint32_t want, flags;
int32_t oflags, err;
+ bool embedded;
+
+ embedded = false;
+
+ name = CEPH_STR_GET(req->ll_create, v0.name, data);
+ data = (const char *)data + req->ll_create.v0.name;
err = ptr_check(&client->random, req->ll_create.v0.cmount,
(void **)&mount);
(void **)&parent);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_create.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_create.v0.userperm,
+ req->ll_create.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
mode = req->ll_create.v0.mode;
oflags = req->ll_create.v0.oflags;
want = req->ll_create.v0.want;
flags = req->ll_create.v0.flags;
- name = CEPH_STR_GET(req->ll_create, v0.name, data);
CEPH_BUFF_ADD(ans, &stx, sizeof(stx));
}
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
mode_t mode;
uint32_t want, flags;
int32_t err;
+ bool embedded;
+
+ embedded = false;
+
+ name = CEPH_STR_GET(req->ll_mknod, v0.name, data);
+ data = (const char *)data + req->ll_mknod.v0.name;
err = ptr_check(&client->random, req->ll_mknod.v0.cmount,
(void **)&mount);
(void **)&parent);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_mknod.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_mknod.v0.userperm,
+ req->ll_mknod.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
mode = req->ll_mknod.v0.mode;
rdev = req->ll_mknod.v0.rdev;
want = req->ll_mknod.v0.want;
flags = req->ll_mknod.v0.flags;
- name = CEPH_STR_GET(req->ll_mknod, v0.name, data);
CEPH_BUFF_ADD(ans, &stx, sizeof(stx));
}
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
const char *old_name, *new_name;
UserPerm *perms;
int32_t err;
+ bool embedded;
+
+ embedded = false;
+
+ old_name = CEPH_STR_GET(req->ll_rename, v0.old_name, data);
+ data = (const char *)data + req->ll_rename.v0.old_name;
+ new_name = CEPH_STR_GET(req->ll_rename, v0.new_name, data);
+ data = (const char *)data + req->ll_rename.v0.new_name;
err = ptr_check(&client->random, req->ll_rename.v0.cmount,
(void **)&mount);
(void **)&new_parent);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_rename.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_rename.v0.userperm,
+ req->ll_rename.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
- old_name = CEPH_STR_GET(req->ll_rename, v0.old_name, data);
- new_name = CEPH_STR_GET(req->ll_rename, v0.new_name,
- (const char *)data + req->ll_rename.v0.old_name);
-
err = ceph_ll_rename(proxy_cmount(mount), old_parent, old_name,
new_parent, new_name, perms);
TRACE("ceph_ll_rename(%p, %p, '%s', %p, '%s', %p) -> %d", mount,
old_parent, old_name, new_parent, new_name, perms, err);
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
const char *name;
UserPerm *perms;
int32_t err;
+ bool embedded;
+
+ embedded = false;
+
+ name = CEPH_STR_GET(req->ll_link, v0.name, data);
+ data = (const char *)data + req->ll_link.v0.name;
err = ptr_check(&client->random, req->ll_link.v0.cmount,
(void **)&mount);
(void **)&parent);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_link.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_link.v0.userperm,
+ req->ll_link.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
- name = CEPH_STR_GET(req->ll_link, v0.name, data);
-
err = ceph_ll_link(proxy_cmount(mount), inode, parent, name,
perms);
TRACE("ceph_ll_link(%p, %p, %p, '%s', %p) -> %d", mount, inode,
parent, name, perms, err);
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
const char *name;
UserPerm *perms;
int32_t err;
+ bool embedded;
+
+ embedded = false;
+
+ name = CEPH_STR_GET(req->ll_unlink, v0.name, data);
+ data = (const char *)data + req->ll_unlink.v0.name;
err = ptr_check(&client->random, req->ll_unlink.v0.cmount,
(void **)&mount);
(void **)&parent);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_unlink.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_unlink.v0.userperm,
+ req->ll_unlink.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
- name = CEPH_STR_GET(req->ll_unlink, v0.name, data);
-
err = ceph_ll_unlink(proxy_cmount(mount), parent, name, perms);
TRACE("ceph_ll_unlink(%p, %p, '%s', %p) -> %d", mount, parent,
name, perms, err);
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
UserPerm *perms;
uint32_t want, flags;
int32_t err;
+ bool embedded;
+
+ embedded = false;
err = ptr_check(&client->random, req->ll_getattr.v0.cmount,
(void **)&mount);
(void **)&inode);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_getattr.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_getattr.v0.userperm,
+ req->ll_getattr.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
want = req->ll_getattr.v0.want;
want, flags, perms, err);
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
struct Inode *inode;
UserPerm *perms;
int32_t mask, err;
+ bool embedded;
+
+ embedded = false;
err = ptr_check(&client->random, req->ll_setattr.v0.cmount,
(void **)&mount);
(void **)&inode);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_setattr.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_setattr.v0.userperm,
+ req->ll_setattr.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
mask = req->ll_setattr.v0.mask;
mask, perms, err);
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
UserPerm *perms;
size_t size;
int32_t err;
+ bool embedded;
+
+ embedded = false;
err = ptr_check(&client->random, req->ll_listxattr.v0.cmount,
(void **)&mount);
(void **)&inode);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_listxattr.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_listxattr.v0.userperm,
+ req->ll_listxattr.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
size = req->ll_listxattr.v0.size;
}
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
UserPerm *perms;
size_t size;
int32_t err;
+ bool embedded;
+
+ embedded = false;
+
+ name = CEPH_STR_GET(req->ll_getxattr, v0.name, data);
+ data = (const char *)data + req->ll_getxattr.v0.name;
err = ptr_check(&client->random, req->ll_getxattr.v0.cmount,
(void **)&mount);
(void **)&inode);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_getxattr.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_getxattr.v0.userperm,
+ req->ll_getxattr.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
size = req->ll_getxattr.v0.size;
- name = CEPH_STR_GET(req->ll_getxattr, v0.name, data);
if (size > client->buffer_size) {
size = client->buffer_size;
}
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
UserPerm *perms;
size_t size;
int32_t flags, err;
+ bool embedded;
+
+ embedded = false;
+
+ name = CEPH_STR_GET(req->ll_setxattr, v0.name, data);
+ data = (const char *)data + req->ll_setxattr.v0.name;
+ value = data;
+ size = req->ll_setxattr.v0.size;
+ data = (const char *)data + size;
err = ptr_check(&client->random, req->ll_setxattr.v0.cmount,
(void **)&mount);
(void **)&inode);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_setxattr.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_setxattr.v0.userperm,
+ req->ll_setxattr.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
- name = CEPH_STR_GET(req->ll_setxattr, v0.name, data);
- value = (const char *)data + req->ll_setxattr.v0.name;
- size = req->ll_setxattr.v0.size;
flags = req->ll_setxattr.v0.flags;
err = ceph_ll_setxattr(proxy_cmount(mount), inode, name, value,
inode, name, value, flags, perms, err);
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
const char *name;
UserPerm *perms;
int32_t err;
+ bool embedded;
+
+ embedded = false;
+
+ name = CEPH_STR_GET(req->ll_removexattr, v0.name, data);
+ data = (const char *)data + req->ll_removexattr.v0.name;
err = ptr_check(&client->random, req->ll_removexattr.v0.cmount,
(void **)&mount);
(void **)&inode);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_removexattr.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_removexattr.v0.userperm,
+ req->ll_removexattr.v1.ngroups, data,
+ &perms, &embedded);
}
if (err >= 0) {
- name = CEPH_STR_GET(req->ll_removexattr, v0.name, data);
-
err = ceph_ll_removexattr(proxy_cmount(mount), inode, name,
perms);
TRACE("ceph_ll_removexattr(%p, %p, '%s', %p) -> %d", mount,
inode, name, perms, err);
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
UserPerm *perms;
size_t size;
int32_t err;
+ bool embedded;
+
+ embedded = false;
err = ptr_check(&client->random, req->ll_readlink.v0.cmount,
(void **)&mount);
(void **)&inode);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_readlink.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_readlink.v0.userperm,
+ req->ll_readlink.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
size = req->ll_readlink.v0.size;
err);
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
const char *name, *value;
uint32_t want, flags;
int32_t err;
+ bool embedded;
+
+ embedded = false;
+
+ name = CEPH_STR_GET(req->ll_symlink, v0.name, data);
+ data = (const char *)data + req->ll_symlink.v0.name;
+ value = CEPH_STR_GET(req->ll_symlink, v0.target, data);
+ data = (const char *)data + req->ll_symlink.v0.target;
err = ptr_check(&client->random, req->ll_symlink.v0.cmount,
(void **)&mount);
(void **)&parent);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_symlink.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_symlink.v0.userperm,
+ req->ll_symlink.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
- name = CEPH_STR_GET(req->ll_symlink, v0.name, data);
- value = CEPH_STR_GET(req->ll_symlink, v0.target,
- (const char *)data + req->ll_symlink.v0.name);
want = req->ll_symlink.v0.want;
flags = req->ll_symlink.v0.flags;
}
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
struct ceph_dir_result *dirp;
UserPerm *perms;
int32_t err;
+ bool embedded;
+
+ embedded = false;
err = ptr_check(&client->random, req->ll_opendir.v0.cmount,
(void **)&mount);
(void **)&inode);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_opendir.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_opendir.v0.userperm,
+ req->ll_opendir.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
}
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
mode_t mode;
uint32_t want, flags;
int32_t err;
+ bool embedded;
+
+ embedded = false;
+
+ name = CEPH_STR_GET(req->ll_mkdir, v0.name, data);
+ data = (const char *)data + req->ll_mkdir.v0.name;
err = ptr_check(&client->random, req->ll_mkdir.v0.cmount, (void **)&mount);
if (err >= 0) {
(void **)&parent);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_mkdir.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_mkdir.v0.userperm,
+ req->ll_mkdir.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
mode = req->ll_mkdir.v0.mode;
want = req->ll_mkdir.v0.want;
flags = req->ll_mkdir.v0.flags;
- name = CEPH_STR_GET(req->ll_mkdir, v0.name, data);
CEPH_BUFF_ADD(ans, &stx, sizeof(stx));
}
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
const char *name;
UserPerm *perms;
int32_t err;
+ bool embedded;
+
+ embedded = false;
+
+ name = CEPH_STR_GET(req->ll_rmdir, v0.name, data);
+ data = (const char *)data + req->ll_rmdir.v0.name;
err = ptr_check(&client->random, req->ll_rmdir.v0.cmount,
(void **)&mount);
(void **)&parent);
}
if (err >= 0) {
- err = ptr_check(&global_random, req->ll_rmdir.v0.userperm,
- (void **)&perms);
+ err = validate_perms(client, &req->ll_rmdir.v0.userperm,
+ req->ll_rmdir.v1.ngroups, data, &perms,
+ &embedded);
}
if (err >= 0) {
- name = CEPH_STR_GET(req->ll_rmdir, v0.name, data);
-
err = ceph_ll_rmdir(proxy_cmount(mount), parent, name, perms);
TRACE("ceph_ll_rmdir(%p, %p, '%s', %p) -> %d", mount, parent,
name, perms, err);
}
+ if (embedded) {
+ ceph_userperm_destroy(perms);
+ }
+
return CEPH_COMPLETE(client, err, ans);
}
UserPerm *perms;
int32_t err;
+ if ((client->neg.v1.enabled & PROXY_FEAT_EMBEDDED_PERMS) != 0) {
+ return -EOPNOTSUPP;
+ }
+
err = ptr_check(&client->random, req->mount_perms.v0.cmount,
(void **)&mount);
if (err >= 0) {