]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
uclient: don't readdir first frag on opendir
authorSage Weil <sage@newdream.net>
Tue, 22 Sep 2009 21:17:50 +0000 (14:17 -0700)
committerSage Weil <sage@newdream.net>
Tue, 22 Sep 2009 21:18:50 +0000 (14:18 -0700)
This reorders things such that rm -r breaks.  It was an old old
optimization that doesn't make sense anymore anyway.

src/client/Client.cc
src/client/fuse_ll.cc

index cecc40a1e63b56156c0288d32b1ff7839948f994..b51995dce6b6ee85bd9d5ad4debf7908ac010ca0 100644 (file)
@@ -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<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;
index 6bfc3a737aa818f3e0ef69314ee3f28fc8664aa2..aa917b66e1fc7e157ba9104c287076a1dcab5ae9 100644 (file)
@@ -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;