]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: track snapdir ref to parent explicitly
authorSage Weil <sage@newdream.net>
Mon, 14 Jul 2008 17:00:00 +0000 (10:00 -0700)
committerSage Weil <sage@newdream.net>
Mon, 14 Jul 2008 17:00:00 +0000 (10:00 -0700)
src/client/Client.cc
src/client/Client.h

index 3740f20fa55ebe709f9ae995cc7379ef5875b7d3..dd6371c77ea9a48eb99808e5280e79365182e3c9 100644 (file)
@@ -2106,7 +2106,7 @@ public:
 
 void Client::tick()
 {
-  dout(10) << "tick" << dendl;
+  dout(21) << "tick" << dendl;
   tick_event = new C_C_Tick(this);
   timer.add_event_after(g_conf.client_tick_interval, tick_event);
   
@@ -2114,7 +2114,6 @@ void Client::tick()
   utime_t el = now - last_cap_renew;
   if (mdsmap && el > mdsmap->get_session_timeout() / 3.0)
     renew_caps();
-  
 }
 
 void Client::renew_caps()
@@ -3841,6 +3840,7 @@ int Client::ll_lookup(vinodeno_t parent, const char *name, struct stat *attr, in
       in->inode.mode = S_IFDIR | 0600;
       in->dirfragtree.clear();
       inode_map[vino] = in;
+      in->snapdir_parent = diri;
       diri->get();
       dout(10) << " created snapshot inode " << *in << dendl;
     } else {
index 75ef31f85f041137161bfb00ab53dafc39893d18..7d8cb9f8e2f9cb0e03abba12e6296d7404c077f8 100644 (file)
@@ -189,6 +189,7 @@ class Inode {
 
   SnapRealm *snaprealm;
   xlist<Inode*>::item snaprealm_item;
+  Inode *snapdir_parent;  // only if we are a snapdir inode
 
   //int open_by_mode[CEPH_FILE_MODE_NUM];
   map<int,int> open_by_mode;
@@ -217,6 +218,10 @@ class Inode {
       assert(dn->dir && dn->dir->parent_inode);
       dn->dir->parent_inode->make_path(p);
       p.push_dentry(dn->name);
+    } else if (snapdir_parent) {
+      snapdir_parent->make_path(p);
+      string empty;
+      p.push_dentry(empty);
     } else
       p = filepath(inode.ino);
   }
@@ -244,7 +249,7 @@ class Inode {
     lease_mask(0), lease_mds(-1),
     dir_auth(-1), dir_hashed(false), dir_replicated(false), 
     exporting_issued(0), exporting_mds(-1), exporting_mseq(0),
-    snaprealm(0), snaprealm_item(this),
+    snaprealm(0), snaprealm_item(this), snapdir_parent(0),
     reported_size(0), wanted_max_size(0), requested_max_size(0),
     ref(0), ll_ref(0), 
     dir(0), dn(0), symlink(0),
@@ -664,10 +669,8 @@ protected:
     in->put(n);
     if (in->ref == 0) {
       //cout << "put_inode deleting " << in << " " << in->inode.ino << std::endl;
-      if (in->snapid == SNAPDIR) {
-       vinodeno_t live(in->inode.ino, CEPH_NOSNAP);
-       put_inode(inode_map[live]);
-      }
+      if (in->snapdir_parent)
+       put_inode(in->snapdir_parent);
       inode_map.erase(in->vino());
       if (in == root) root = 0;
       delete in;