From 0fcadab77a92a8e9d9fdd48f5bf0fbd9b1fc2b46 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 14 Jul 2008 10:00:00 -0700 Subject: [PATCH] client: track snapdir ref to parent explicitly --- src/client/Client.cc | 4 ++-- src/client/Client.h | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 3740f20fa55eb..dd6371c77ea9a 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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 { diff --git a/src/client/Client.h b/src/client/Client.h index 75ef31f85f041..7d8cb9f8e2f9c 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -189,6 +189,7 @@ class Inode { SnapRealm *snaprealm; xlist::item snaprealm_item; + Inode *snapdir_parent; // only if we are a snapdir inode //int open_by_mode[CEPH_FILE_MODE_NUM]; map 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; -- 2.39.5