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);
utime_t el = now - last_cap_renew;
if (mdsmap && el > mdsmap->get_session_timeout() / 3.0)
renew_caps();
-
}
void Client::renew_caps()
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 {
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;
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);
}
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),
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;