]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: always pass a UserPerm to rename functions
authorGreg Farnum <gfarnum@redhat.com>
Tue, 12 Jul 2016 00:10:21 +0000 (17:10 -0700)
committerGreg Farnum <gfarnum@redhat.com>
Wed, 31 Aug 2016 21:37:09 +0000 (14:37 -0700)
Signed-off-by: Greg Farnum <gfarnum@redhat.com>
src/client/Client.cc
src/client/Client.h
src/client/SyntheticClient.cc
src/client/fuse_ll.cc
src/libcephfs.cc

index f29d8a04bc68a3cfb0fc05bd7d6b40966709741c..2f0c3aeb5cc493534c5569b26023969550fc3e89 100644 (file)
@@ -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)
index 0c243610b6500131e77547c7dca6a85362ddfcb9..137586b28ef6601744ff16da033423c57a1e8e70 100644 (file)
@@ -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);
index 255870f302583f9cac75f5b473d25b8dc766e007..355bb4d70f6e78131dfe6c70b3a131159f081dad 100644 (file)
@@ -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); 
index 9f1139cb389fa180273dfeae7bf7ce75343e2587..31783af400086f537600ccad2fea90a8d66d5be4 100644 (file)
@@ -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
index 12a51e8f09f7145feb2e08752d53ff3f75b8621a..9e728543240b828d78897341e00fd4b89ba6e330 100644 (file)
@@ -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,