From: Greg Farnum Date: Tue, 12 Jul 2016 00:10:21 +0000 (-0700) Subject: client: always pass a UserPerm to rename functions X-Git-Tag: v11.0.1~36^2~91 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7f03b86e168872cc2f7b7be1af08efc521d877b9;p=ceph.git client: always pass a UserPerm to rename functions Signed-off-by: Greg Farnum --- diff --git a/src/client/Client.cc b/src/client/Client.cc index f29d8a04bc6..2f0c3aeb5cc 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -6174,7 +6174,7 @@ int Client::unlink(const char *relpath, const UserPerm& perm) return _unlink(dir.get(), name.c_str(), perm); } -int Client::rename(const char *relfrom, const char *relto) +int Client::rename(const char *relfrom, const char *relto, const UserPerm& perm) { Mutex::Locker lock(client_lock); tout(cct) << "rename" << std::endl; @@ -6189,22 +6189,22 @@ int Client::rename(const char *relfrom, const char *relto) to.pop_dentry(); InodeRef fromdir, todir; - int r = path_walk(from, &fromdir); + int r = path_walk(from, &fromdir, perm); if (r < 0) goto out; - r = path_walk(to, &todir); + r = path_walk(to, &todir, perm); if (r < 0) goto out; if (cct->_conf->client_permissions) { - int r = may_delete(fromdir.get(), fromname.c_str()); + int r = may_delete(fromdir.get(), fromname.c_str(), perm); if (r < 0) return r; - r = may_delete(todir.get(), toname.c_str()); + r = may_delete(todir.get(), toname.c_str(), perm); if (r < 0 && r != -ENOENT) return r; } - r = _rename(fromdir.get(), fromname.c_str(), todir.get(), toname.c_str()); + r = _rename(fromdir.get(), fromname.c_str(), todir.get(), toname.c_str(), perm); out: return r; } @@ -10955,10 +10955,12 @@ int Client::ll_rmdir(Inode *in, const char *name, int uid, int gid) return _rmdir(in, name, uid, gid); } -int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const char *toname, int uid, int gid) +int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const char *toname, const UserPerm& perm) { - ldout(cct, 3) << "_rename(" << fromdir->ino << " " << fromname << " to " << todir->ino << " " << toname - << " uid " << uid << " gid " << gid << ")" << dendl; + ldout(cct, 3) << "_rename(" << fromdir->ino << " " << fromname << " to " + << todir->ino << " " << toname + << " uid " << perm.uid() << " gid " << perm.gid() << ")" + << dendl; if (fromdir->snapid != todir->snapid) return -EXDEV; @@ -11009,13 +11011,13 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch req->dentry_unless = CEPH_CAP_FILE_EXCL; InodeRef oldin, otherin; - res = _lookup(fromdir, fromname, 0, &oldin, uid, gid); + res = _lookup(fromdir, fromname, 0, &oldin, perm); if (res < 0) goto fail; req->set_old_inode(oldin.get()); req->old_inode_drop = CEPH_CAP_LINK_SHARED; - res = _lookup(todir, toname, 0, &otherin, uid, gid); + res = _lookup(todir, toname, 0, &otherin, perm); if (res != 0 && res != -ENOENT) { goto fail; } else if (res == 0) { @@ -11031,7 +11033,7 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch unlink(de, true, true); } - res = make_request(req, uid, gid, &target); + res = make_request(req, perm, &target); ldout(cct, 10) << "rename result is " << res << dendl; // renamed item from our cache @@ -11046,7 +11048,7 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch } int Client::ll_rename(Inode *parent, const char *name, Inode *newparent, - const char *newname, int uid, int gid) + const char *newname, const UserPerm& perm) { Mutex::Locker lock(client_lock); @@ -11062,15 +11064,15 @@ int Client::ll_rename(Inode *parent, const char *name, Inode *newparent, tout(cct) << newname << std::endl; if (!cct->_conf->fuse_default_permissions) { - int r = may_delete(parent, name, uid, gid); + int r = may_delete(parent, name, perm); if (r < 0) return r; - r = may_delete(newparent, newname, uid, gid); + r = may_delete(newparent, newname, perm); if (r < 0 && r != -ENOENT) return r; } - return _rename(parent, name, newparent, newname, uid, gid); + return _rename(parent, name, newparent, newname, perm); } int Client::_link(Inode *in, Inode *dir, const char *newname, const UserPerm& perm, InodeRef *inp) diff --git a/src/client/Client.h b/src/client/Client.h index 0c243610b65..137586b28ef 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -788,7 +788,7 @@ private: int _link(Inode *in, Inode *dir, const char *name, const UserPerm& perm, InodeRef *inp = 0); int _unlink(Inode *dir, const char *name, const UserPerm& perm); - int _rename(Inode *olddir, const char *oname, Inode *ndir, const char *nname, int uid=-1, int gid=-1); + 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, int uid=-1, int gid=-1, 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); @@ -1027,7 +1027,7 @@ public: int link(const char *existing, const char *newname, const UserPerm& perm); int unlink(const char *path, const UserPerm& perm); - int rename(const char *from, const char *to); + int rename(const char *from, const char *to, const UserPerm& perm); // dirs int mkdir(const char *path, mode_t mode); @@ -1162,7 +1162,7 @@ public: 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_rename(Inode *parent, const char *name, Inode *newparent, - const char *newname, int uid = -1, int gid = -1); + const char *newname, const UserPerm& perm); int ll_link(Inode *in, Inode *newparent, const char *newname, struct stat *attr, const UserPerm& perm); int ll_open(Inode *in, int flags, Fh **fh, int uid = -1, int gid = -1); diff --git a/src/client/SyntheticClient.cc b/src/client/SyntheticClient.cc index 255870f3025..355bb4d70f6 100644 --- a/src/client/SyntheticClient.cc +++ b/src/client/SyntheticClient.cc @@ -1079,7 +1079,7 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only) } else if (strcmp(op, "rename") == 0) { const char *a = t.get_string(buf, p); const char *b = t.get_string(buf2, p); - client->rename(a,b); + client->rename(a,b, perms); } else if (strcmp(op, "mkdir") == 0) { const char *a = t.get_string(buf, p); int64_t b = t.get_int(); @@ -1331,7 +1331,7 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only) ll_inos.count(ni)) { i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP)); i2 = client->ll_get_inode(vinodeno_t(ll_inos[ni],CEPH_NOSNAP)); - client->ll_rename(i1, n, i2, nn); + client->ll_rename(i1, n, i2, nn, perms); client->ll_put(i1); client->ll_put(i2); } @@ -2697,7 +2697,7 @@ int SyntheticClient::random_walk(int num_req) if (contents.empty()) op = CEPH_MDS_OP_READDIR; else { - r = client->rename( get_random_sub(), make_sub("ren") ); + r = client->rename(get_random_sub(), make_sub("ren"), perms); } } @@ -2961,7 +2961,7 @@ void SyntheticClient::foo() char dst[80]; snprintf(src, sizeof(src), "syn.0.0/dir.%d/dir.%d/file.%d", a, b, c); snprintf(dst, sizeof(dst), "syn.0.0/dir.%d/dir.%d/file.%d", d, e, f); - client->rename(src, dst); + client->rename(src, dst, perms); } return; } @@ -3024,32 +3024,32 @@ void SyntheticClient::foo() // rename fun client->mknod("p1", 0644); client->mknod("p2", 0644); - client->rename("p1","p2"); + client->rename("p1","p2", perms); client->mknod("p3", 0644); - client->rename("p3","p4"); + client->rename("p3","p4", perms); // check dest dir ambiguity thing client->mkdir("dir1", 0755); client->mkdir("dir2", 0755); - client->rename("p2","dir1/p2"); - client->rename("dir1/p2","dir2/p2"); - client->rename("dir2/p2","/p2"); + client->rename("p2", "dir1/p2", perms); + client->rename("dir1/p2", "dir2/p2", perms); + client->rename("dir2/p2", "/p2", perms); // check primary+remote link merging client->link("p2","p2.l", perms); client->link("p4","p4.l", perms); - client->rename("p2.l","p2"); - client->rename("p4","p4.l"); + client->rename("p2.l", "p2", perms); + client->rename("p4", "p4.l", perms); // check anchor updates client->mknod("dir1/a", 0644); client->link("dir1/a", "da1", perms); client->link("dir1/a", "da2", perms); client->link("da2","da3", perms); - client->rename("dir1/a","dir2/a"); - client->rename("dir2/a","da2"); - client->rename("da1","da2"); - client->rename("da2","da3"); + client->rename("dir1/a", "dir2/a", perms); + client->rename("dir2/a", "da2", perms); + client->rename("da1", "da2", perms); + client->rename("da2", "da3", perms); // check directory renames client->mkdir("dir3", 0755); @@ -3057,8 +3057,8 @@ void SyntheticClient::foo() client->mkdir("dir4", 0755); client->mkdir("dir5", 0755); client->mknod("dir5/asdf", 0644); - client->rename("dir3","dir4"); // ok - client->rename("dir4","dir5"); // fail + client->rename("dir3", "dir4", perms); // ok + client->rename("dir4", "dir5", perms); // fail } int SyntheticClient::thrash_links(const char *basedir, int dirs, int files, int depth, int n) @@ -3098,9 +3098,9 @@ int SyntheticClient::thrash_links(const char *basedir, int dirs, int files, int } } - if (client->rename(dst.c_str(), "/tmp") == 0) { - client->rename(src.c_str(), dst.c_str()); - client->rename("/tmp", src.c_str()); + if (client->rename(dst.c_str(), "/tmp", perms) == 0) { + client->rename(src.c_str(), dst.c_str(), perms); + client->rename("/tmp", src.c_str(), perms); } continue; } @@ -3135,7 +3135,7 @@ int SyntheticClient::thrash_links(const char *basedir, int dirs, int files, int switch (o) { case 0: client->mknod(src.c_str(), 0755); - if (renames) client->rename(src.c_str(), dst.c_str()); + if (renames) client->rename(src.c_str(), dst.c_str(), perms); break; case 1: client->mknod(src.c_str(), 0755); diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index 9f1139cb389..31783af4000 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -429,8 +429,9 @@ static void fuse_ll_rename(fuse_req_t req, fuse_ino_t parent, const char *name, const struct fuse_ctx *ctx = fuse_req_ctx(req); Inode *in = cfuse->iget(parent); Inode *nin = cfuse->iget(newparent); + UserPerm perm(ctx->uid, ctx->gid); - int r = cfuse->client->ll_rename(in, name, nin, newname, ctx->uid, ctx->gid); + int r = cfuse->client->ll_rename(in, name, nin, newname, perm); fuse_reply_err(req, -r); cfuse->iput(in); // iputs required diff --git a/src/libcephfs.cc b/src/libcephfs.cc index 12a51e8f09f..9e728543240 100644 --- a/src/libcephfs.cc +++ b/src/libcephfs.cc @@ -562,7 +562,8 @@ extern "C" int ceph_rename(struct ceph_mount_info *cmount, const char *from, { if (!cmount->is_mounted()) return -ENOTCONN; - return cmount->get_client()->rename(from, to); + UserPerm perms = cmount->get_client()->pick_my_perms(); + return cmount->get_client()->rename(from, to, perms); } // dirs @@ -1578,8 +1579,9 @@ extern "C" int ceph_ll_rename(class ceph_mount_info *cmount, Inode *newparent, const char *newname, int uid, int gid) { - return (cmount->get_client()->ll_rename(parent, name, newparent, newname, - uid, gid)); + UserPerm perms(uid, gid); + return (cmount->get_client()->ll_rename(parent, name, + newparent, newname, perms)); } extern "C" int ceph_ll_unlink(class ceph_mount_info *cmount,