]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: properly set caller_{uid,gid} of readdir request
authorYan, Zheng <zyan@redhat.com>
Wed, 12 Aug 2015 07:36:06 +0000 (15:36 +0800)
committerSage Weil <sage@redhat.com>
Thu, 1 Oct 2015 13:39:34 +0000 (09:39 -0400)
save uid/gid of ll_opendir caller in dir_result_t, use the saved
uid/gid for readdir request.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/client/Client.cc
src/client/Client.h

index b81b5a0fa5472a6661b574a111de9bc7e2c56906..4f49bb425ab2ba7fce715891ded9b78c53292412 100644 (file)
@@ -6208,6 +6208,8 @@ int Client::_opendir(Inode *in, dir_result_t **dirpp, int uid, int gid)
     (*dirpp)->ordered_count = in->dir->ordered_count;
   }
   (*dirpp)->start_shared_gen = in->shared_gen;
+  (*dirpp)->owner_uid = uid;
+  (*dirpp)->owner_gid = gid;
   ldout(cct, 10) << "_opendir " << in->ino << ", our cache says the first dirfrag is " << (*dirpp)->frag() << dendl;
   ldout(cct, 3) << "_opendir(" << in->ino << ") = " << 0 << " (" << *dirpp << ")" << dendl;
   return 0;
@@ -6369,7 +6371,7 @@ int Client::_readdir_get_frag(dir_result_t *dirp)
   
   
   bufferlist dirbl;
-  int res = make_request(req, -1, -1, NULL, NULL, -1, &dirbl);
+  int res = make_request(req, dirp->owner_uid, dirp->owner_gid, NULL, NULL, -1, &dirbl);
   
   if (res == -EAGAIN) {
     ldout(cct, 10) << "_readdir_get_frag got EAGAIN, retrying" << dendl;
@@ -10254,7 +10256,7 @@ int Client::ll_opendir(Inode *in, dir_result_t** dirpp, int uid, int gid)
   if (vino.snapid == CEPH_SNAPDIR) {
     *dirpp = new dir_result_t(in);
   } else {
-    r = _opendir(in, dirpp);
+    r = _opendir(in, dirpp, uid, gid);
   }
 
   tout(cct) << (unsigned long)*dirpp << std::endl;
index 8b418570e207f4662640189d4177e623eb8c52a0..6a92a8a33e4b03edfa8bd36e488f6b94c859d412 100644 (file)
@@ -171,6 +171,8 @@ struct dir_result_t {
 
 
   InodeRef inode;
+  int owner_uid;
+  int owner_gid;
 
   int64_t offset;        // high bits: frag_t, low bits: an offset