]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
uclient: Better fix for insert_dentry_inode to work with pre-built Dentrys.
authorGreg Farnum <gregf@hq.newdream.net>
Tue, 22 Sep 2009 00:27:59 +0000 (17:27 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Tue, 22 Sep 2009 20:02:50 +0000 (13:02 -0700)
src/client/Client.cc
src/client/Client.h

index 82d9e1723a482994eca1ae00adffeddb03c87252..cecc40a1e63b56156c0288d32b1ff7839948f994 100644 (file)
@@ -487,37 +487,33 @@ void Client::insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dleas
           << " in dir " << dir->parent_inode->ino
            << dendl;
   
-  if (dn) {
-    if (dn->inode) {
-      if (dn->inode->vino() == in->vino()) {
-       touch_dn(dn);
-       dout(12) << " had dentry " << dname
-                << " with correct vino " << dn->inode->vino()
-                << dendl;
-      } else {
-       dout(12) << " had dentry " << dname
-                << " with WRONG vino " << dn->inode->vino()
-                << dendl;
-       unlink(dn, true);
-       dn = NULL;
-      }
+  if (dn && dn->inode) {
+    if (dn->inode->vino() == in->vino()) {
+      touch_dn(dn);
+      dout(12) << " had dentry " << dname
+              << " with correct vino " << dn->inode->vino()
+              << dendl;
     } else {
-      link(dir, dname, in, dn);
+      dout(12) << " had dentry " << dname
+              << " with WRONG vino " << dn->inode->vino()
+              << dendl;
+      unlink(dn, true);
+      dn = NULL;
     }
   }
   
-  if (!dn) {
+  if (!dn || dn->inode == 0) {
     // have inode linked elsewhere?  -> unlink and relink!
     if (in->dn) {
       dout(12) << " had vino " << in->vino()
               << " not linked or linked at the right position, relinking"
               << dendl;
-      dn = relink_inode(dir, dname, in);
+      dn = relink_inode(dir, dname, in, dn);
     } else {
       // link
       dout(12) << " had vino " << in->vino()
               << " unlinked, linking" << dendl;
-      dn = link(dir, dname, in);
+      dn = link(dir, dname, in, dn);
     }
   }
 
index 41285db626a88fcbe6d5201c65cc58eb9ca12ad0..1a96fb13366522100fc546a42445ecdb73da2d57 100644 (file)
@@ -1019,14 +1019,20 @@ protected:
     delete dn;
   }
 
-  Dentry *relink_inode(Dir *dir, const string& name, Inode *in) {
+  Dentry *relink_inode(Dir *dir, const string& name, Inode *in, Dentry *newdn=NULL) {
     Dentry *olddn = in->dn;
     Dir *olddir = olddn->dir;  // note: might == dir!
+    bool made_new = false;
 
     // newdn, attach to inode.  don't touch inode ref.
-    Dentry *newdn = new Dentry;
-    newdn->dir = dir;
-    newdn->name = name;
+    if (!newdn) {
+      made_new = true;
+      newdn = new Dentry;
+      newdn->dir = dir;
+      newdn->name = name;
+    } else {
+      assert(newdn->inode == NULL);
+    }
     newdn->inode = in;
     in->dn = newdn;
 
@@ -1044,7 +1050,10 @@ protected:
     
     // link new dn to dir
     dir->dentries[name] = newdn;
-    lru.lru_insert_mid(newdn);
+    if (made_new)
+      lru.lru_insert_mid(newdn);
+    else
+      lru.lru_midtouch(newdn);
     
     // olddir now empty?  (remember, olddir might == dir)
     if (olddir->is_empty())