From: Greg Farnum Date: Sat, 30 Jul 2016 01:52:13 +0000 (-0700) Subject: client: store UserPerms in dir_result_t and use on MDS requests X-Git-Tag: v11.0.1~36^2~54 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=56bd07bdc21a0a734cdd5e5553b26bf68046eba4;p=ceph.git client: store UserPerms in dir_result_t and use on MDS requests Signed-off-by: Greg Farnum --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 7b3bd23fe8b1..0f4beff9dbc7 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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; diff --git a/src/client/Client.h b/src/client/Client.h index 0a5ecb85656e..f42d5244bf25 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -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 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); }