]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: store UserPerms in dir_result_t and use on MDS requests
authorGreg Farnum <gfarnum@redhat.com>
Sat, 30 Jul 2016 01:52:13 +0000 (18:52 -0700)
committerGreg Farnum <gfarnum@redhat.com>
Wed, 21 Sep 2016 23:33:50 +0000 (16:33 -0700)
Signed-off-by: Greg Farnum <gfarnum@redhat.com>
src/client/Client.cc
src/client/Client.h

index 7b3bd23fe8b12368964802e14fef15c593f72836..0f4beff9dbc72d1d7e7cb11a0db41a9696c40406 100644 (file)
@@ -162,9 +162,10 @@ bool Client::CommandHook::call(std::string command, cmdmap_t& cmdmap,
 
 // -------------
 
-dir_result_t::dir_result_t(Inode *in)
+dir_result_t::dir_result_t(Inode *in, const UserPerm& perms)
   : inode(in), owner_uid(-1), owner_gid(-1), offset(0), next_offset(2),
-    release_count(0), ordered_count(0), cache_index(0), start_shared_gen(0)
+    release_count(0), ordered_count(0), cache_index(0), start_shared_gen(0),
+    perms(perms)
   { }
 
 void Client::_reset_faked_inos()
@@ -6870,7 +6871,7 @@ int Client::_opendir(Inode *in, dir_result_t **dirpp, const UserPerm& perms)
 {
   if (!in->is_dir())
     return -ENOTDIR;
-  *dirpp = new dir_result_t(in);
+  *dirpp = new dir_result_t(in, perms);
   opened_dirs.insert(*dirpp);
   (*dirpp)->owner_uid = perms.uid();
   (*dirpp)->owner_gid = perms.gid();
@@ -7057,9 +7058,7 @@ int Client::_readdir_get_frag(dir_result_t *dirp)
   req->dirp = dirp;
   
   bufferlist dirbl;
-  // FIXME
-  UserPerm perms(dirp->owner_uid, dirp->owner_gid);
-  int res = make_request(req, perms, NULL, NULL, -1, &dirbl);
+  int res = make_request(req, dirp->perms, NULL, NULL, -1, &dirbl);
   
   if (res == -EAGAIN) {
     ldout(cct, 10) << "_readdir_get_frag got EAGAIN, retrying" << dendl;
index 0a5ecb85656e25ac4ffd11d214951048ddb46aaa..f42d5244bf25693f84cbf63dda23604d589f769e 100644 (file)
@@ -91,6 +91,7 @@ private:
 public:
   UserPerm() : m_uid(-1), m_gid(-1) {}
   UserPerm(int uid, int gid) : m_uid(uid), m_gid(gid) {}
+  // the readdir code relies on UserPerm copy-constructor being a deep copy!
   uid_t uid() const { return m_uid; }
   gid_t gid() const { return m_gid; }
 };
@@ -213,6 +214,7 @@ struct dir_result_t {
   uint64_t ordered_count;
   unsigned cache_index;
   int start_shared_gen;  // dir shared_gen at start of readdir
+  UserPerm perms;
 
   frag_t buffer_frag;
 
@@ -231,7 +233,7 @@ struct dir_result_t {
   };
   vector<dentry> buffer;
 
-  explicit dir_result_t(Inode *in);
+  explicit dir_result_t(Inode *in, const UserPerm& perms);
 
   unsigned offset_high() { return fpos_high(offset); }
   unsigned offset_low() { return fpos_low(offset); }