]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
uclient: changed link and insert_dentry_inode to behave with pre-built dentrys
authorGreg Farnum <gregf@hq.newdream.net>
Mon, 21 Sep 2009 18:13:55 +0000 (11:13 -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 3d9ad338eee3f680343fbc1273ca582e733270e6..d632acafb99724a0870cccb86a98406528ed75da 100644 (file)
@@ -487,17 +487,21 @@ void Client::insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dleas
            << dendl;
   
   if (dn) {
-    if (dn->inode->vino() == in->vino()) {
-      touch_dn(dn);
-      dout(12) << " had dentry " << dname
-               << " with correct vino " << dn->inode->vino()
-               << dendl;
+    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;
+      }
     } else {
-      dout(12) << " had dentry " << dname
-               << " with WRONG vino " << dn->inode->vino()
-               << dendl;
-      unlink(dn, true);
-      dn = NULL;
+      link(dir, dname, in, dn);
     }
   }
   
@@ -969,7 +973,7 @@ void Client::encode_dentry_release(Dentry *dn, MClientRequest *req,
  */
 void Client::encode_cap_releases(MetaRequest *req, int mds) {
   dout(20) << "encode_cap_releases enter (req: "
-          << req << ", mds: " << mds << dendl;
+          << req << ", mds: " << mds << ")" << dendl;
   if (req->inode_drop)
     encode_inode_release(req->inode, req->request,
                         mds, req->inode_drop,
index f0786c92d1d1c6ad41495a1b6187123802329d00..2c8c3e7d27e3e520f270f3ae38bfedfb7efa5507 100644 (file)
@@ -948,15 +948,20 @@ protected:
 
   /**
    * Don't call this with in==NULL, use get_or_create for that
+   * leave dn set to default NULL unless you're trying to add
+   * a new inode to a pre-created Dentry
    */
-  Dentry* link(Dir *dir, const string& name, Inode *in) {
-    Dentry *dn = new Dentry;
-    dn->name = name;
-    
-    // link to dir
-    dn->dir = dir;
-    //cout << "link dir " << dir->parent_inode->ino << " '" << name << "' -> inode " << in->ino << endl;
-    dir->dentries[dn->name] = dn;
+  Dentry* link(Dir *dir, const string& name, Inode *in, Dentry *dn=NULL) {
+    if (!dn) { //create a new Dentry
+      dn = new Dentry;
+      dn->name = name;
+      
+      // link to dir
+      dn->dir = dir;
+      //cout << "link dir " << dir->parent_inode->ino << " '" << name << "' -> inode " << in->ino << endl;
+      dir->dentries[dn->name] = dn;
+      lru.lru_insert_mid(dn);    // mid or top?
+    }
 
     if (in) {    // link to inode
       dn->inode = in;
@@ -967,7 +972,6 @@ protected:
       if (in->dir) dn->get();  // dir -> dn pin
     }
 
-    lru.lru_insert_mid(dn);    // mid or top?
     return dn;
   }