]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: always pass a UserPerm to ll_lookup
authorGreg Farnum <gfarnum@redhat.com>
Wed, 27 Jul 2016 01:24:05 +0000 (18:24 -0700)
committerGreg Farnum <gfarnum@redhat.com>
Wed, 31 Aug 2016 21:38:23 +0000 (14:38 -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 dd21a26deda025874c30bcf3769f4fde715569de..209c32e190854727accc223dd116ab2919e11200 100644 (file)
@@ -9508,7 +9508,7 @@ Inode *Client::open_snapdir(Inode *diri)
 }
 
 int Client::ll_lookup(Inode *parent, const char *name, struct stat *attr,
-                     Inode **out, int uid, int gid)
+                     Inode **out, const UserPerm& perms)
 {
   Mutex::Locker lock(client_lock);
   ldout(cct, 3) << "ll_lookup " << parent << " " << name << dendl;
@@ -9517,7 +9517,7 @@ int Client::ll_lookup(Inode *parent, const char *name, struct stat *attr,
 
   int r = 0;
   if (!cct->_conf->fuse_default_permissions) {
-    r = may_lookup(parent, uid, gid);
+    r = may_lookup(parent, perms);
     if (r < 0)
       return r;
   }
@@ -9525,7 +9525,7 @@ int Client::ll_lookup(Inode *parent, const char *name, struct stat *attr,
   string dname(name);
   InodeRef in;
 
-  r = _lookup(parent, dname, CEPH_STAT_CAP_INODE_ALL, &in, uid, gid);
+  r = _lookup(parent, dname, CEPH_STAT_CAP_INODE_ALL, &in, perms);
   if (r < 0) {
     attr->st_ino = 0;
     goto out;
index 977bdc454889bc5050063e59867b5f5f2696219e..0d1199cf648cafe2a74f965bd1bea49f8af345a9 100644 (file)
@@ -1137,7 +1137,7 @@ public:
   Inode *ll_get_inode(ino_t ino);
   Inode *ll_get_inode(vinodeno_t vino);
   int ll_lookup(Inode *parent, const char *name, struct stat *attr,
-               Inode **out, 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);
index ca18cc0ba182c2db37cc15d48445cb46c7cef125..3950d4ad7620bb4eb76daed098b7ac059b53ad4a 100644 (file)
@@ -1024,7 +1024,7 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
     client->mkdir(prefix.c_str(), 0755, perms);
     struct stat attr;
     i1 = client->ll_get_inode(vinodeno_t(1, CEPH_NOSNAP));
-    if (client->ll_lookup(i1, prefix.c_str(), &attr, &i2) == 0) {
+    if (client->ll_lookup(i1, prefix.c_str(), &attr, &i2, perms) == 0) {
       ll_inos[1] = attr.st_ino;
       dout(5) << "'root' ino is " << inodeno_t(attr.st_ino) << dendl;
       client->ll_put(i1);
@@ -1229,7 +1229,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_lookup(i1, name, &attr, &i2) == 0)
+         if (client->ll_lookup(i1, name, &attr, &i2, perms) == 0)
            ll_inos[r] = attr.st_ino;
          client->ll_put(i1);
       }
index e08b73a3445677bce3a92ce987a3199061cb0fa8..b7c77dd23b4acccdd3b45b6a64997e7426a96410 100644 (file)
@@ -111,9 +111,10 @@ static void fuse_ll_lookup(fuse_req_t req, fuse_ino_t parent, const char *name)
   struct fuse_entry_param fe;
   Inode *i2, *i1 = cfuse->iget(parent); // see below
   int r;
+  UserPerm perms(ctx->uid, ctx->gid);
 
   memset(&fe, 0, sizeof(fe));
-  r = cfuse->client->ll_lookup(i1, name, &fe.attr, &i2, ctx->uid, ctx->gid);
+  r = cfuse->client->ll_lookup(i1, name, &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);
index dd50890e2e724958e048387c15f70fa4166f82b0..8b33e90809a9952b150c9fbe6184d1e1e00283ff 100644 (file)
@@ -1383,7 +1383,8 @@ extern "C" int ceph_ll_lookup(class ceph_mount_info *cmount,
                              struct stat *attr, Inode **out,
                              int uid, int gid)
 {
-  return (cmount->get_client())->ll_lookup(parent, name, attr, out, uid, gid);
+  UserPerm perms(uid, gid);  
+  return (cmount->get_client())->ll_lookup(parent, name, attr, out, perms);
 }
 
 extern "C" int ceph_ll_put(class ceph_mount_info *cmount, Inode *in)