]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
MDS: Encode a full ancestor trace on inodes, not just the immediate parent.
authorGreg Farnum <gregf@hq.newdream.net>
Mon, 6 Dec 2010 20:49:40 +0000 (12:49 -0800)
committerGreg Farnum <gregf@hq.newdream.net>
Mon, 6 Dec 2010 20:49:40 +0000 (12:49 -0800)
src/mds/CInode.cc

index 401530d8da1a39682344fabd1d232f7580d4ee79..2ec8310b4317aded9640a06a8aee08e1d49e78ed 100644 (file)
@@ -1001,12 +1001,17 @@ void CInode::encode_parent_mutation(ObjectOperation& m)
   CDentry *pdn = get_parent_dn();
   if (pdn) {
     bufferlist parent(32 + pdn->name.length());
-    uint64_t ino = pdn->get_dir()->get_inode()->ino();
-    __u8 v = 1;
+    __u8 v = 2;
     ::encode(v, parent);
-    ::encode(inode.version, parent);
-    ::encode(ino, parent);
-    ::encode(pdn->name, parent);
+    while (pdn) {
+      uint64_t ino = pdn->get_dir()->get_inode()->ino();
+      ::encode(inode.version, parent);
+      ::encode(ino, parent);
+      ::encode(pdn->name, parent);
+      pdn = (pdn->get_linkage() && pdn->get_linkage()->get_inode())?
+                pdn->get_linkage()->get_inode()->get_parent_dn()
+                : NULL;
+    }
     m.setxattr("parent", parent);
   }
 }