And also _mknod, _symlink, _rmdir.
Signed-off-by: Greg Farnum <gfarnum@redhat.com>
string name = path.last_dentry();
path.pop_dentry();
InodeRef dir;
- int r = path_walk(path, &dir);
+ UserPerm perms = pick_my_perms();
+ int r = path_walk(path, &dir, perms);
if (r < 0)
return r;
if (cct->_conf->client_permissions) {
- int r = may_delete(dir.get(), name.c_str());
+ int r = may_delete(dir.get(), name.c_str(), perms);
if (r < 0)
return r;
}
- return _rmdir(dir.get(), name.c_str());
+ return _rmdir(dir.get(), name.c_str(), perms);
}
int Client::mknod(const char *relpath, mode_t mode, dev_t rdev)
string name = path.last_dentry();
path.pop_dentry();
InodeRef dir;
- int r = path_walk(path, &dir);
+ UserPerm perms = pick_my_perms();
+ int r = path_walk(path, &dir, perms);
if (r < 0)
return r;
if (cct->_conf->client_permissions) {
- int r = may_create(dir.get());
+ int r = may_create(dir.get(), perms);
if (r < 0)
return r;
}
- return _mknod(dir.get(), name.c_str(), mode, rdev);
+ return _mknod(dir.get(), name.c_str(), mode, rdev, perms);
}
// symlinks
string name = path.last_dentry();
path.pop_dentry();
InodeRef dir;
- int r = path_walk(path, &dir);
+ UserPerm perms = pick_my_perms();
+ int r = path_walk(path, &dir, perms);
if (r < 0)
return r;
if (cct->_conf->client_permissions) {
- int r = may_create(dir.get());
+ int r = may_create(dir.get(), perms);
if (r < 0)
return r;
}
- return _symlink(dir.get(), name.c_str(), target);
+ return _symlink(dir.get(), name.c_str(), target, perms);
}
int Client::readlink(const char *relpath, char *buf, loff_t size)
Mutex::Locker l(client_lock);
filepath path(relpath);
InodeRef in;
- int r = path_walk(path, &in);
+ UserPerm perms = pick_my_perms();
+ int r = path_walk(path, &in, perms);
if (r < 0)
return r;
if (cct->_conf->client_permissions) {
- r = may_delete(in.get(), NULL);
+ r = may_delete(in.get(), NULL, perms);
if (r < 0)
return r;
}
Inode *snapdir = open_snapdir(in.get());
- return _rmdir(snapdir, name);
+ return _rmdir(snapdir, name, perms);
}
// =============================
return in;
}
-int Client::ll_getattr(Inode *in, struct stat *attr, int uid, int gid)
+int Client::ll_getattr(Inode *in, struct stat *attr, const UserPerm& perms)
{
Mutex::Locker lock(client_lock);
if (vino.snapid < CEPH_NOSNAP)
res = 0;
else
- res = _getattr(in, CEPH_STAT_CAP_INODE_ALL, uid, gid);
+ res = _getattr(in, CEPH_STAT_CAP_INODE_ALL, perms);
if (res == 0)
fill_stat(in, attr);
ldout(cct, 3) << "ll_getattr " << vino << " = " << res << dendl;
return res;
}
-int Client::ll_setattr(Inode *in, struct stat *attr, int mask, int uid,
- int gid)
+int Client::ll_setattr(Inode *in, struct stat *attr, int mask,
+ const UserPerm& perms)
+
{
Mutex::Locker lock(client_lock);
tout(cct) << mask << std::endl;
if (!cct->_conf->fuse_default_permissions) {
- int res = may_setattr(in, attr, mask, uid, gid);
+ int res = may_setattr(in, attr, mask, perms);
if (res < 0)
return res;
}
mask &= ~(CEPH_SETATTR_MTIME_NOW | CEPH_SETATTR_ATIME_NOW);
InodeRef target(in);
- int res = _setattr(in, attr, mask, uid, gid, &target);
+ int res = _setattr(in, attr, mask, perms, &target);
if (res == 0) {
assert(in == target.get());
fill_stat(in, attr);
}
int Client::ll_getxattr(Inode *in, const char *name, void *value,
- size_t size, int uid, int gid)
+ size_t size, const UserPerm& perms)
{
Mutex::Locker lock(client_lock);
return r;
}
- return _getxattr(in, name, value, size, uid, gid);
+ return _getxattr(in, name, value, size, perms);
}
int Client::_listxattr(Inode *in, char *name, size_t size, int uid, int gid)
return r;
}
-int Client::ll_listxattr(Inode *in, char *names, size_t size, int uid,
- int gid)
+int Client::ll_listxattr(Inode *in, char *names, size_t size,
+ const UserPerm& perms)
{
Mutex::Locker lock(client_lock);
tout(cct) << vino.ino.val << std::endl;
tout(cct) << size << std::endl;
- return _listxattr(in, names, size, uid, gid);
+ return _listxattr(in, names, size, perms);
}
int Client::_do_setxattr(Inode *in, const char *name, const void *value,
}
int Client::ll_setxattr(Inode *in, const char *name, const void *value,
- size_t size, int flags, int uid, int gid)
+ size_t size, int flags, const UserPerm& perms)
{
// For setting pool of layout, MetaRequest need osdmap epoch.
// There is a race which create a new data pool but client and mds both don't have.
tout(cct) << name << std::endl;
if (!cct->_conf->fuse_default_permissions) {
- int r = xattr_permission(in, name, MAY_WRITE, uid, gid);
+ int r = xattr_permission(in, name, MAY_WRITE, perms);
if (r < 0)
return r;
}
- return _setxattr(in, name, value, size, flags, uid, gid);
+ return _setxattr(in, name, value, size, flags, perms);
}
int Client::_removexattr(Inode *in, const char *name, int uid, int gid)
return _removexattr(in.get(), name, perms);
}
-int Client::ll_removexattr(Inode *in, const char *name, int uid, int gid)
+int Client::ll_removexattr(Inode *in, const char *name, const UserPerm& perms)
{
Mutex::Locker lock(client_lock);
tout(cct) << name << std::endl;
if (!cct->_conf->fuse_default_permissions) {
- int r = xattr_permission(in, name, MAY_WRITE, uid, gid);
+ int r = xattr_permission(in, name, MAY_WRITE, perms);
if (r < 0)
return r;
}
- return _removexattr(in, name, uid, gid);
+ return _removexattr(in, name, perms);
}
bool Client::_vxattrcb_quota_exists(Inode *in)
return len;
}
-int Client::ll_readlink(Inode *in, char *buf, size_t buflen, int uid, int gid)
+int Client::ll_readlink(Inode *in, char *buf, size_t buflen, const UserPerm& perms)
{
Mutex::Locker lock(client_lock);
++dn;
}
- int r = _readlink(in, buf, buflen);
+ int r = _readlink(in, buf, buflen); // FIXME: no permission checking!
ldout(cct, 3) << "ll_readlink " << vino << " = " << r << dendl;
return r;
}
int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev,
- int uid, int gid, InodeRef *inp)
+ const UserPerm& perms, InodeRef *inp)
{
ldout(cct, 3) << "_mknod(" << dir->ino << " " << name << ", 0" << oct
- << mode << dec << ", " << rdev << ", uid " << uid << ", gid "
- << gid << ")" << dendl;
+ << mode << dec << ", " << rdev << ", uid " << perms.uid()
+ << ", gid " << perms.gid() << ")" << dendl;
if (strlen(name) > NAME_MAX)
return -ENAMETOOLONG;
req->dentry_unless = CEPH_CAP_FILE_EXCL;
bufferlist xattrs_bl;
- int res = _posix_acl_create(dir, &mode, xattrs_bl, uid, gid);
+ int res = _posix_acl_create(dir, &mode, xattrs_bl, perms.uid(), perms.gid());
if (res < 0)
goto fail;
req->head.args.mknod.mode = mode;
goto fail;
req->set_dentry(de);
- res = make_request(req, uid, gid, inp);
+ res = make_request(req, perms, inp);
trim_cache();
int Client::ll_mknod(Inode *parent, const char *name, mode_t mode,
dev_t rdev, struct stat *attr, Inode **out,
- int uid, int gid)
+ const UserPerm& perms)
{
Mutex::Locker lock(client_lock);
tout(cct) << rdev << std::endl;
if (!cct->_conf->fuse_default_permissions) {
- int r = may_create(parent, uid, gid);
+ int r = may_create(parent, perms);
if (r < 0)
return r;
}
InodeRef in;
- int r = _mknod(parent, name, mode, rdev, uid, gid, &in);
+ int r = _mknod(parent, name, mode, rdev, perms, &in);
if (r == 0) {
fill_stat(in, attr);
_ll_get(in.get());
return r;
}
-int Client::_symlink(Inode *dir, const char *name, const char *target, int uid,
- int gid, InodeRef *inp)
+int Client::_symlink(Inode *dir, const char *name, const char *target,
+ const UserPerm& perms, InodeRef *inp)
{
ldout(cct, 3) << "_symlink(" << dir->ino << " " << name << ", " << target
- << ", uid " << uid << ", gid " << gid << ")" << dendl;
+ << ", uid " << perms.uid() << ", gid " << perms.gid() << ")"
+ << dendl;
if (strlen(name) > NAME_MAX)
return -ENAMETOOLONG;
goto fail;
req->set_dentry(de);
- res = make_request(req, uid, gid, inp);
+ res = make_request(req, perms, inp);
trim_cache();
ldout(cct, 3) << "_symlink(\"" << path << "\", \"" << target << "\") = " <<
}
int Client::ll_symlink(Inode *parent, const char *name, const char *value,
- struct stat *attr, Inode **out, int uid, int gid)
+ struct stat *attr, Inode **out, const UserPerm& perms)
{
Mutex::Locker lock(client_lock);
tout(cct) << value << std::endl;
if (!cct->_conf->fuse_default_permissions) {
- int r = may_create(parent, uid, gid);
+ int r = may_create(parent, perms);
if (r < 0)
return r;
}
InodeRef in;
- int r = _symlink(parent, name, value, uid, gid, &in);
+ int r = _symlink(parent, name, value, perms, &in);
if (r == 0) {
fill_stat(in, attr);
_ll_get(in.get());
return _unlink(in, name, perm);
}
-int Client::_rmdir(Inode *dir, const char *name, int uid, int gid)
+int Client::_rmdir(Inode *dir, const char *name, const UserPerm& perms)
{
- ldout(cct, 3) << "_rmdir(" << dir->ino << " " << name << " uid " << uid <<
- " gid " << gid << ")" << dendl;
+ ldout(cct, 3) << "_rmdir(" << dir->ino << " " << name << " uid "
+ << perms.uid() << " gid " << perms.gid() << ")" << dendl;
if (dir->snapid != CEPH_NOSNAP && dir->snapid != CEPH_SNAPDIR) {
return -EROFS;
int res = get_or_create(dir, name, &de);
if (res < 0)
goto fail;
- res = _lookup(dir, name, 0, &in, uid, gid);
+ res = _lookup(dir, name, 0, &in, perms);
if (res < 0)
goto fail;
if (req->get_op() == CEPH_MDS_OP_RMDIR) {
req->set_other_inode(in.get());
}
- res = make_request(req, uid, gid);
+ res = make_request(req, perms);
trim_cache();
ldout(cct, 3) << "rmdir(" << path << ") = " << res << dendl;
return res;
}
-int Client::ll_rmdir(Inode *in, const char *name, int uid, int gid)
+int Client::ll_rmdir(Inode *in, const char *name, const UserPerm& perms)
{
Mutex::Locker lock(client_lock);
tout(cct) << name << std::endl;
if (!cct->_conf->fuse_default_permissions) {
- int r = may_delete(in, name, uid, gid);
+ int r = may_delete(in, name, perms);
if (r < 0)
return r;
}
- return _rmdir(in, name, uid, gid);
+ return _rmdir(in, name, perms);
}
int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const char *toname, const UserPerm& perm)
int _rename(Inode *olddir, const char *oname, Inode *ndir, const char *nname, const UserPerm& perm);
int _mkdir(Inode *dir, const char *name, mode_t mode, const UserPerm& perm,
InodeRef *inp = 0);
- int _rmdir(Inode *dir, const char *name, int uid=-1, int gid=-1);
- int _symlink(Inode *dir, const char *name, const char *target, int uid=-1, int gid=-1, InodeRef *inp = 0);
- int _mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, int uid=-1, int gid=-1, InodeRef *inp = 0);
+ int _rmdir(Inode *dir, const char *name, const UserPerm& perms);
+ int _symlink(Inode *dir, const char *name, const char *target,
+ const UserPerm& perms, InodeRef *inp = 0);
+ int _mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev,
+ const UserPerm& perms, InodeRef *inp = 0);
int _do_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid, InodeRef *inp);
int _setattr(Inode *in, struct stat *attr, int mask, int uid=-1, int gid=-1, InodeRef *inp = 0);
int _setattr(Inode *in, struct stat *attr, int mask, const UserPerm& perms,
int _getattr(InodeRef &in, int mask, const UserPerm& perms, bool force=false) {
return _getattr(in, mask, perms, force);
}
+ int _getattr(Inode *in, int mask, const UserPerm& perms, bool force=false) {
+ return _getattr(in, mask, perms.uid(), perms.gid(), force);
+ }
int _readlink(Inode *in, char *buf, size_t size);
int _getxattr(Inode *in, const char *name, void *value, size_t len,
int uid=-1, int gid=-1);
Inode **out, const UserPerm& perms);
bool ll_forget(Inode *in, int count);
bool ll_put(Inode *in);
- int ll_getattr(Inode *in, struct stat *st, int uid = -1, int gid = -1);
- int ll_setattr(Inode *in, struct stat *st, int mask, int uid = -1,
- int gid = -1);
+ int ll_getattr(Inode *in, struct stat *st, const UserPerm& perms);
+ int ll_setattr(Inode *in, struct stat *st, int mask, const UserPerm& perms);
int ll_getxattr(Inode *in, const char *name, void *value, size_t size,
- int uid=-1, int gid=-1);
+ const UserPerm& perms);
int ll_setxattr(Inode *in, const char *name, const void *value, size_t size,
- int flags, int uid=-1, int gid=-1);
- int ll_removexattr(Inode *in, const char *name, int uid=-1, int gid=-1);
- int ll_listxattr(Inode *in, char *list, size_t size, int uid=-1, int gid=-1);
+ int flags, const UserPerm& perms);
+ int ll_removexattr(Inode *in, const char *name, const UserPerm& perms);
+ int ll_listxattr(Inode *in, char *list, size_t size, const UserPerm& perms);
int ll_opendir(Inode *in, int flags, dir_result_t **dirpp,
const UserPerm& perms);
int ll_releasedir(dir_result_t* dirp);
int ll_fsyncdir(dir_result_t* dirp);
- int ll_readlink(Inode *in, char *buf, size_t bufsize, int uid = -1, int gid = -1);
+ int ll_readlink(Inode *in, char *buf, size_t bufsize, const UserPerm& perms);
int ll_mknod(Inode *in, const char *name, mode_t mode, dev_t rdev,
- struct stat *attr, Inode **out, int uid = -1, int gid = -1);
+ struct stat *attr, Inode **out, const UserPerm& perms);
int ll_mkdir(Inode *in, const char *name, mode_t mode, struct stat *attr,
Inode **out, const UserPerm& perm);
int ll_symlink(Inode *in, const char *name, const char *value,
- struct stat *attr, Inode **out, int uid = -1, int gid = -1);
+ struct stat *attr, Inode **out, const UserPerm& perms);
int ll_unlink(Inode *in, const char *name, const UserPerm& perm);
- int ll_rmdir(Inode *in, const char *name, int uid = -1, int gid = -1);
+ int ll_rmdir(Inode *in, const char *name, const UserPerm& perms);
int ll_rename(Inode *parent, const char *name, Inode *newparent,
const char *newname, const UserPerm& perm);
int ll_link(Inode *in, Inode *newparent, const char *newname,
struct stat attr;
if (ll_inos.count(i)) {
i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
- client->ll_getattr(i1, &attr);
+ client->ll_getattr(i1, &attr, perms);
client->ll_put(i1);
}
} else if (strcmp(op, "ll_setattr") == 0) {
int mask = t.get_int();
if (ll_inos.count(i)) {
i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
- client->ll_setattr(i1, &attr, mask);
+ client->ll_setattr(i1, &attr, mask, perms);
client->ll_put(i1);
}
} else if (strcmp(op, "ll_readlink") == 0) {
if (ll_inos.count(i)) {
char buf[PATH_MAX];
i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
- client->ll_readlink(i1, buf, sizeof(buf));
+ client->ll_readlink(i1, buf, sizeof(buf), perms);
client->ll_put(i1);
}
} else if (strcmp(op, "ll_mknod") == 0) {
struct stat attr;
if (ll_inos.count(i)) {
i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
- if (client->ll_mknod(i1, n, m, r, &attr, &i2) == 0)
+ if (client->ll_mknod(i1, n, m, r, &attr, &i2, perms) == 0)
ll_inos[ri] = attr.st_ino;
client->ll_put(i1);
}
struct stat attr;
if (ll_inos.count(i)) {
i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
- if (client->ll_symlink(i1, n, v, &attr, &i2) == 0)
+ if (client->ll_symlink(i1, n, v, &attr, &i2, perms) == 0)
ll_inos[ri] = attr.st_ino;
client->ll_put(i1);
}
const char *n = t.get_string(buf, p);
if (ll_inos.count(i)) {
i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
- client->ll_rmdir(i1, n);
+ client->ll_rmdir(i1, n, perms);
client->ll_put(i1);
}
} else if (strcmp(op, "ll_rename") == 0) {
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(ino);
struct stat stbuf;
+ UserPerm perms(ctx->uid, ctx->gid);
(void) fi; // XXX
- if (cfuse->client->ll_getattr(in, &stbuf, ctx->uid, ctx->gid)
+ if (cfuse->client->ll_getattr(in, &stbuf, perms)
== 0) {
stbuf.st_ino = cfuse->make_fake_ino(stbuf.st_ino, stbuf.st_dev);
stbuf.st_rdev = new_encode_dev(stbuf.st_rdev);
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(ino);
+ UserPerm perms(ctx->uid, ctx->gid);
int mask = 0;
if (to_set & FUSE_SET_ATTR_MODE) mask |= CEPH_SETATTR_MODE;
if (to_set & FUSE_SET_ATTR_ATIME_NOW) mask |= CEPH_SETATTR_ATIME_NOW;
#endif
- int r = cfuse->client->ll_setattr(in, attr, mask, ctx->uid, ctx->gid);
+ int r = cfuse->client->ll_setattr(in, attr, mask, perms);
if (r == 0)
fuse_reply_attr(req, attr, 0);
else
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(ino);
+ UserPerm perms(ctx->uid, ctx->gid);
- int r = cfuse->client->ll_setxattr(in, name, value, size, flags, ctx->uid,
- ctx->gid);
+ int r = cfuse->client->ll_setxattr(in, name, value, size, flags, perms);
fuse_reply_err(req, -r);
cfuse->iput(in); // iput required
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(ino);
char buf[size];
+ UserPerm perms(ctx->uid, ctx->gid);
- int r = cfuse->client->ll_listxattr(in, buf, size, ctx->uid, ctx->gid);
+ int r = cfuse->client->ll_listxattr(in, buf, size, perms);
if (size == 0 && r >= 0)
fuse_reply_xattr(req, r);
else if (r >= 0)
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(ino);
char buf[size];
+ UserPerm perms(ctx->uid, ctx->gid);
- int r = cfuse->client->ll_getxattr(in, name, buf, size, ctx->uid, ctx->gid);
+ int r = cfuse->client->ll_getxattr(in, name, buf, size, perms);
if (size == 0 && r >= 0)
fuse_reply_xattr(req, r);
else if (r >= 0)
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(ino);
+ UserPerm perms(ctx->uid, ctx->gid);
- int r = cfuse->client->ll_removexattr(in, name, ctx->uid,
- ctx->gid);
+ int r = cfuse->client->ll_removexattr(in, name, perms);
fuse_reply_err(req, -r);
cfuse->iput(in); // iput required
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(ino);
char buf[PATH_MAX + 1]; // leave room for a null terminator
+ UserPerm perms(ctx->uid, ctx->gid);
- int r = cfuse->client->ll_readlink(in, buf, sizeof(buf) - 1, ctx->uid, ctx->gid);
+ int r = cfuse->client->ll_readlink(in, buf, sizeof(buf) - 1, perms);
if (r >= 0) {
buf[r] = '\0';
fuse_reply_readlink(req, buf);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *i2, *i1 = cfuse->iget(parent);
struct fuse_entry_param fe;
+ UserPerm perms(ctx->uid, ctx->gid);
memset(&fe, 0, sizeof(fe));
int r = cfuse->client->ll_mknod(i1, name, mode, new_decode_dev(rdev),
- &fe.attr, &i2, ctx->uid, ctx->gid);
+ &fe.attr, &i2, perms);
if (r == 0) {
fe.ino = cfuse->make_fake_ino(fe.attr.st_ino, fe.attr.st_dev);
fe.attr.st_rdev = new_encode_dev(fe.attr.st_rdev);
CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *in = cfuse->iget(parent);
+ UserPerm perms(ctx->uid, ctx->gid);
- int r = cfuse->client->ll_rmdir(in, name, ctx->uid, ctx->gid);
+ int r = cfuse->client->ll_rmdir(in, name, perms);
fuse_reply_err(req, -r);
cfuse->iput(in); // iput required
const struct fuse_ctx *ctx = fuse_req_ctx(req);
Inode *i2, *i1 = cfuse->iget(parent);
struct fuse_entry_param fe;
+ UserPerm perms(ctx->uid, ctx->gid);
memset(&fe, 0, sizeof(fe));
- int r = cfuse->client->ll_symlink(i1, name, existing, &fe.attr, &i2, ctx->uid,
- ctx->gid);
+ int r = cfuse->client->ll_symlink(i1, name, existing, &fe.attr, &i2, perms);
if (r == 0) {
fe.ino = cfuse->make_fake_ino(fe.attr.st_ino, fe.attr.st_dev);
fe.attr.st_rdev = new_encode_dev(fe.attr.st_rdev);
Inode *in, struct stat *attr,
int uid, int gid)
{
- return (cmount->get_client()->ll_getattr(in, attr, uid, gid));
+ UserPerm perms(uid, gid);
+ return (cmount->get_client()->ll_getattr(in, attr, perms));
}
extern "C" int ceph_ll_setattr(class ceph_mount_info *cmount,
Inode *in, struct stat *st,
int mask, int uid, int gid)
{
- return (cmount->get_client()->ll_setattr(in, st, mask, uid, gid));
+ UserPerm perms(uid, gid);
+ return (cmount->get_client()->ll_setattr(in, st, mask, perms));
}
extern "C" int ceph_ll_open(class ceph_mount_info *cmount, Inode *in,
mode_t mode, dev_t rdev, struct stat *attr,
struct Inode **out, int uid, int gid)
{
+ UserPerm perms(uid, gid);
return (cmount->get_client())->ll_mknod(parent, name, mode, rdev,
- attr, out, uid, gid);
+ attr, out, perms);
}
extern "C" int ceph_ll_mkdir(class ceph_mount_info *cmount,
{
struct stat st;
st.st_size=length;
+ UserPerm perms(uid, gid);
- return(cmount->get_client()->ll_setattr(in, &st, CEPH_SETATTR_SIZE, uid,
- gid));
+ return(cmount->get_client()->ll_setattr(in, &st, CEPH_SETATTR_SIZE, perms));
}
extern "C" int ceph_ll_opendir(class ceph_mount_info *cmount,
Inode *in, char *buf, size_t bufsiz, int uid,
int gid)
{
- return (cmount->get_client()->ll_readlink(in, buf, bufsiz, uid, gid));
+ UserPerm perms(uid, gid);
+ return (cmount->get_client()->ll_readlink(in, buf, bufsiz, perms));
}
extern "C" int ceph_ll_symlink(class ceph_mount_info *cmount,
const char *value, struct stat *attr,
Inode **out, int uid, int gid)
{
- return (cmount->get_client()->ll_symlink(in, name, value, attr, out, uid,
- gid));
+ UserPerm perms(uid, gid);
+ return (cmount->get_client()->ll_symlink(in, name, value, attr, out, perms));
}
extern "C" int ceph_ll_rmdir(class ceph_mount_info *cmount,
Inode *in, const char *name,
int uid, int gid)
{
- return (cmount->get_client()->ll_rmdir(in, name, uid, gid));
+ UserPerm perms(uid, gid);
+ return (cmount->get_client()->ll_rmdir(in, name, perms));
}
extern "C" int ceph_ll_getxattr(class ceph_mount_info *cmount,
Inode *in, const char *name, void *value,
size_t size, int uid, int gid)
{
- return (cmount->get_client()->ll_getxattr(in, name, value, size, uid, gid));
+ UserPerm perms(uid, gid);
+ return (cmount->get_client()->ll_getxattr(in, name, value, size, perms));
}
extern "C" int ceph_ll_listxattr(struct ceph_mount_info *cmount,
Inode *in, char *list,
size_t buf_size, size_t *list_size, int uid, int gid)
{
- int res = cmount->get_client()->ll_listxattr(in, list, buf_size, uid, gid);
+ UserPerm perms(uid, gid);
+ int res = cmount->get_client()->ll_listxattr(in, list, buf_size, perms);
if (res >= 0) {
*list_size = (size_t)res;
return 0;
const void *value, size_t size,
int flags, int uid, int gid)
{
- return (cmount->get_client()->ll_setxattr(in, name, value, size, flags, uid,
- gid));
+ UserPerm perms(uid, gid);
+ return (cmount->get_client()->ll_setxattr(in, name, value, size, flags, perms));
}
extern "C" int ceph_ll_removexattr(class ceph_mount_info *cmount,
Inode *in, const char *name,
int uid, int gid)
{
- return (cmount->get_client()->ll_removexattr(in, name, uid, gid));
+ UserPerm perms(uid, gid);
+ return (cmount->get_client()->ll_removexattr(in, name, perms));
}
extern "C" int ceph_ll_getlk(struct ceph_mount_info *cmount,