int Client::_opendir(Inode *in, DirResult **dirpp, int uid, int gid)
{
+ int r = 0;
*dirpp = new DirResult(in);
(*dirpp)->set_frag(in->dirfragtree[0]);
if (in->dir)
(*dirpp)->release_count = in->dir->release_count;
dout(10) << "_opendir " << in->ino << ", our cache says the first dirfrag is " << (*dirpp)->frag() << dendl;
-
- // get the first frag
- int r = _readdir_get_frag(*dirpp);
- if (r < 0) {
- _closedir(*dirpp);
- *dirpp = 0;
- } else {
- r = 0;
- }
dout(3) << "_opendir(" << in->ino << ") = " << r << " (" << *dirpp << ")" << dendl;
return r;
}
{
DirResult *dirp = (DirResult*)d;
+ dout(10) << "readdirplus_r " << *dirp->inode << " offset " << dirp->offset
+ << " frag " << dirp->frag() << " fragpos " << dirp->fragpos()
+ << " at_end=" << dirp->at_end()
+ << dendl;
+
while (1) {
if (dirp->at_end())
return 0;
assert(dirp->buffer.count(fg));
vector<DirEntry> &ent = dirp->buffer[fg];
- if (ent.empty()) {
+ if (ent.empty() ||
+ pos >= ent.size()) {
dout(10) << "empty frag " << fg << ", moving on to next" << dendl;
_readdir_next_frag(dirp);
continue;
off_t off, struct fuse_file_info *fi)
{
(void) fi;
-
+
// buffer
char *buf;
size_t pos = 0;
st.st_ino = make_fake_ino(de.d_ino, snap);
st.st_mode = DT_TO_MODE(de.d_type);
- off_t off = client->telldir(dirp);
+ off_t off = de.d_off;
size_t entrysize = fuse_add_direntry(req, buf + pos, size - pos,
de.d_name, &st, off);
-
/*
- cout << "ceph_ll_readdir added " << de.d_name << " at " << pos << " len " << entrysize
+ cout << "ceph_ll_readdir ino " << ino << " added " << de.d_name << " at " << pos << " len " << entrysize
<< " (buffer size is " << size << ")"
<< " .. off = " << off
<< std::endl;