// -------------
-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()
{
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();
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;
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; }
};
uint64_t ordered_count;
unsigned cache_index;
int start_shared_gen; // dir shared_gen at start of readdir
+ UserPerm perms;
frag_t buffer_frag;
};
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); }