From: Greg Farnum Date: Wed, 27 Jul 2016 02:18:31 +0000 (-0700) Subject: client: always pass a UserPerm to the ll_* functions X-Git-Tag: v11.0.1~36^2~87 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9a06306c34926133c66b1c175697816d5a4ed98c;p=ceph.git client: always pass a UserPerm to the ll_* functions And also _mknod, _symlink, _rmdir. Signed-off-by: Greg Farnum --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 77cda8583c8e..5cba208bffa2 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -6294,15 +6294,16 @@ int Client::rmdir(const char *relpath) 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) @@ -6316,15 +6317,16 @@ 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 @@ -6340,15 +6342,16 @@ int Client::symlink(const char *target, const char *relpath) 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) @@ -9437,16 +9440,17 @@ int Client::rmsnap(const char *relpath, const char *name) 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); } // ============================= @@ -9673,7 +9677,7 @@ Inode *Client::ll_get_inode(vinodeno_t vino) 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); @@ -9687,15 +9691,16 @@ int Client::ll_getattr(Inode *in, struct stat *attr, int uid, int gid) 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); @@ -9714,7 +9719,7 @@ int Client::ll_setattr(Inode *in, struct stat *attr, int mask, int uid, 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; } @@ -9722,7 +9727,7 @@ int Client::ll_setattr(Inode *in, struct stat *attr, int mask, int uid, 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); @@ -9912,7 +9917,7 @@ int Client::_getxattr(InodeRef &in, const char *name, void *value, size_t size) } 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); @@ -9929,7 +9934,7 @@ int Client::ll_getxattr(Inode *in, const char *name, void *value, 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) @@ -9976,8 +9981,8 @@ 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); @@ -9988,7 +9993,7 @@ int Client::ll_listxattr(Inode *in, char *names, size_t size, int uid, 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, @@ -10137,7 +10142,7 @@ int Client::check_data_pool_exist(string name, string value, const OSDMap *osdma } 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. @@ -10167,12 +10172,12 @@ int Client::ll_setxattr(Inode *in, const char *name, const void *value, 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) @@ -10218,7 +10223,7 @@ int Client::_removexattr(InodeRef &in, const char *name) 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); @@ -10230,12 +10235,12 @@ int Client::ll_removexattr(Inode *in, const char *name, int uid, int gid) 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) @@ -10456,7 +10461,7 @@ size_t Client::_vxattrs_calcu_name_size(const VXattr *vxattr) 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); @@ -10472,17 +10477,17 @@ int Client::ll_readlink(Inode *in, char *buf, size_t buflen, int uid, int gid) ++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; @@ -10506,7 +10511,7 @@ int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, 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; @@ -10519,7 +10524,7 @@ int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, goto fail; req->set_dentry(de); - res = make_request(req, uid, gid, inp); + res = make_request(req, perms, inp); trim_cache(); @@ -10533,7 +10538,7 @@ int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, 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); @@ -10547,13 +10552,13 @@ int Client::ll_mknod(Inode *parent, const char *name, mode_t mode, 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()); @@ -10746,11 +10751,12 @@ int Client::ll_mkdir(Inode *parent, const char *name, mode_t mode, 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; @@ -10779,7 +10785,7 @@ int Client::_symlink(Inode *dir, const char *name, const char *target, int uid, 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 << "\") = " << @@ -10792,7 +10798,7 @@ int Client::_symlink(Inode *dir, const char *name, const char *target, int uid, } 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); @@ -10806,13 +10812,13 @@ int Client::ll_symlink(Inode *parent, const char *name, const char *value, 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()); @@ -10889,10 +10895,10 @@ int Client::ll_unlink(Inode *in, const char *name, const UserPerm& perm) 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; @@ -10914,7 +10920,7 @@ int Client::_rmdir(Inode *dir, const char *name, int uid, int gid) 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) { @@ -10926,7 +10932,7 @@ int Client::_rmdir(Inode *dir, const char *name, int uid, int gid) 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; @@ -10937,7 +10943,7 @@ int Client::_rmdir(Inode *dir, const char *name, int uid, int gid) 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); @@ -10949,12 +10955,12 @@ int Client::ll_rmdir(Inode *in, const char *name, int uid, int gid) 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) diff --git a/src/client/Client.h b/src/client/Client.h index 290873ba2ac6..b6bd451390e6 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -791,9 +791,11 @@ private: 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, @@ -808,6 +810,9 @@ private: 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); @@ -1163,28 +1168,27 @@ public: 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, diff --git a/src/client/SyntheticClient.cc b/src/client/SyntheticClient.cc index 3950d4ad7620..17d978d01b5b 100644 --- a/src/client/SyntheticClient.cc +++ b/src/client/SyntheticClient.cc @@ -1245,7 +1245,7 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only) 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) { @@ -1261,7 +1261,7 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only) 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) { @@ -1269,7 +1269,7 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only) 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) { @@ -1281,7 +1281,7 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only) 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); } @@ -1305,7 +1305,7 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only) 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); } @@ -1322,7 +1322,7 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only) 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) { diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index b7c77dd23b4a..42bd14431ce8 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -143,10 +143,11 @@ static void fuse_ll_getattr(fuse_req_t req, fuse_ino_t ino, 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); @@ -163,6 +164,7 @@ static void fuse_ll_setattr(fuse_req_t req, fuse_ino_t ino, struct stat *attr, 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; @@ -176,7 +178,7 @@ static void fuse_ll_setattr(fuse_req_t req, fuse_ino_t ino, struct stat *attr, 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 @@ -198,9 +200,9 @@ static void fuse_ll_setxattr(fuse_req_t req, fuse_ino_t ino, const char *name, 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 @@ -212,8 +214,9 @@ static void fuse_ll_listxattr(fuse_req_t req, fuse_ino_t ino, size_t size) 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) @@ -235,8 +238,9 @@ static void fuse_ll_getxattr(fuse_req_t req, fuse_ino_t ino, const char *name, 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) @@ -253,9 +257,9 @@ static void fuse_ll_removexattr(fuse_req_t req, fuse_ino_t ino, 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 @@ -289,8 +293,9 @@ static void fuse_ll_readlink(fuse_req_t req, fuse_ino_t ino) 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); @@ -308,11 +313,12 @@ static void fuse_ll_mknod(fuse_req_t req, fuse_ino_t parent, const char *name, 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); @@ -390,8 +396,9 @@ static void fuse_ll_rmdir(fuse_req_t req, fuse_ino_t parent, const char *name) 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 @@ -404,11 +411,11 @@ static void fuse_ll_symlink(fuse_req_t req, const char *existing, 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); diff --git a/src/libcephfs.cc b/src/libcephfs.cc index 8b33e90809a9..eb1a8811d3e3 100644 --- a/src/libcephfs.cc +++ b/src/libcephfs.cc @@ -1409,14 +1409,16 @@ extern "C" int ceph_ll_getattr(class ceph_mount_info *cmount, 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, @@ -1526,8 +1528,9 @@ extern "C" int ceph_ll_mknod(class ceph_mount_info *cmount, 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, @@ -1554,9 +1557,9 @@ extern "C" int ceph_ll_truncate(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, @@ -1604,7 +1607,8 @@ extern "C" int ceph_ll_readlink(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, @@ -1612,28 +1616,31 @@ 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; @@ -1646,15 +1653,16 @@ extern "C" int ceph_ll_setxattr(class ceph_mount_info *cmount, 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,