]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: always pass a UserPerm to the ll_* functions
authorGreg Farnum <gfarnum@redhat.com>
Wed, 27 Jul 2016 02:18:31 +0000 (19:18 -0700)
committerGreg Farnum <gfarnum@redhat.com>
Wed, 31 Aug 2016 21:38:49 +0000 (14:38 -0700)
And also _mknod, _symlink, _rmdir.

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 77cda8583c8e406b9336afdb47cdccc2f44efdf8..5cba208bffa2730aa12a2b363c7de8bb9d3dd614 100644 (file)
@@ -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)
index 290873ba2ac6fe688342f6d29e0b0978f7fac6a6..b6bd451390e6e8a3991a8c648a761f1300fca551 100644 (file)
@@ -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,
index 3950d4ad7620bb4eb76daed098b7ac059b53ad4a..17d978d01b5b61c353deaee37e419d7e5d96b631 100644 (file)
@@ -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) {
index b7c77dd23b4acccdd3b45b6a64997e7426a96410..42bd14431ce8ad3cfc225ab1bce0442774763150 100644 (file)
@@ -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);
index 8b33e90809a9952b150c9fbe6184d1e1e00283ff..eb1a8811d3e304edcef7e74501ad34eac0459ca9 100644 (file)
@@ -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,