From: Yan, Zheng Date: Wed, 12 Aug 2015 07:36:06 +0000 (+0800) Subject: client: properly set caller_{uid,gid} of readdir request X-Git-Tag: v10.0.0~123^2~39 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8d78d5c6b44ef124fdd55d9198e73f6cf3433b1f;p=ceph.git client: properly set caller_{uid,gid} of readdir request save uid/gid of ll_opendir caller in dir_result_t, use the saved uid/gid for readdir request. Signed-off-by: Yan, Zheng --- diff --git a/src/client/Client.cc b/src/client/Client.cc index b81b5a0fa547..4f49bb425ab2 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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; diff --git a/src/client/Client.h b/src/client/Client.h index 8b418570e207..6a92a8a33e4b 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -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