From: Sage Weil Date: Tue, 22 Sep 2009 21:17:50 +0000 (-0700) Subject: uclient: don't readdir first frag on opendir X-Git-Tag: v0.16~94 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=2f1e6a9a12948c4ae3b65581dfd53e91d1549d4f;p=ceph.git uclient: don't readdir first frag on opendir This reorders things such that rm -r breaks. It was an old old optimization that doesn't make sense anymore anyway. --- diff --git a/src/client/Client.cc b/src/client/Client.cc index cecc40a1e63b5..b51995dce6b6e 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3587,20 +3587,12 @@ int Client::opendir(const char *relpath, DIR **dirpp) 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; } @@ -3766,6 +3758,11 @@ int Client::readdirplus_r(DIR *d, struct dirent *de, struct stat *st, int *stmas { 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; @@ -3782,7 +3779,8 @@ int Client::readdirplus_r(DIR *d, struct dirent *de, struct stat *st, int *stmas assert(dirp->buffer.count(fg)); vector &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; diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index 6bfc3a737aa81..aa917b66e1fc7 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -341,7 +341,7 @@ static void ceph_ll_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi) { (void) fi; - + // buffer char *buf; size_t pos = 0; @@ -368,12 +368,11 @@ static void ceph_ll_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, 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;