dir_result_t::dir_result_t(Inode *in)
: inode(in), offset(0), next_offset(2),
- release_count(0),
+ release_count(0), start_shared_gen(0),
buffer(0) {
inode->get();
}
if (!in->is_dir())
return -ENOTDIR;
(*dirpp)->set_frag(in->dirfragtree[0]);
- if(in->dir)
+ if (in->dir)
(*dirpp)->release_count = in->dir->release_count;
+ (*dirpp)->start_shared_gen = in->shared_gen;
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;
continue;
}
- if (diri->dir && diri->dir->release_count == dirp->release_count) {
+ if (diri->dir &&
+ diri->dir->release_count == dirp->release_count &&
+ diri->shared_gen == dirp->start_shared_gen) {
ldout(cct, 10) << " marking I_COMPLETE on " << *diri << dendl;
diri->flags |= I_COMPLETE;
if (diri->dir)
string last_name; // last entry in previous chunk
uint64_t release_count;
+ int start_shared_gen; // dir shared_gen at start of readdir
frag_t buffer_frag;
vector<pair<string,Inode*> > *buffer;