diff options
author | Sage Weil <sage@inktank.com> | 2013-05-17 19:06:32 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-06-24 21:21:47 -0700 |
commit | 3cea945f540bce66906ef79c909c809b56858b03 (patch) | |
tree | 2fcd976f44d9b06e798ebe4b96a7c5543d8aaacf | |
parent | dff24952cfb983ae6f5e13484fb240eeed67f469 (diff) | |
download | ceph-3cea945f540bce66906ef79c909c809b56858b03.tar.gz |
client: audit unlink() callers
Basically, always keep the dentry and dir, unless we are pruning.
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | src/client/Client.cc | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc index 205511b7043..58d332765de 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -468,7 +468,7 @@ void Client::trim_dentry(Dentry *dn) dn->dir->parent_inode->flags &= ~I_COMPLETE; dn->dir->release_count++; } - unlink(dn, false, false); + unlink(dn, false, false); // drop dir, drop dentry } @@ -664,7 +664,7 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from, MetaSession *sessi for (map<string, Dentry*>::iterator p = in->dir->dentry_map.begin(); p != in->dir->dentry_map.end(); ++p) { - unlink(in->dir->dentry_map.begin()->second, true, true); + unlink(p->second, true, true); // keep dir, keep dentry } if (in->dir->dentry_map.empty()) close_dir(in->dir); @@ -700,7 +700,7 @@ Dentry *Client::insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dl ldout(cct, 12) << " had dentry " << dname << " with WRONG vino " << dn->inode->vino() << dendl; - unlink(dn, true, false); + unlink(dn, true, false); // keep dir, keep dentry dn = NULL; } } @@ -708,7 +708,7 @@ Dentry *Client::insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dl if (!dn || dn->inode == 0) { in->get(); if (old_dentry) - unlink(old_dentry, dir == old_dentry->dir, false); // keep dir open if its the same dir + unlink(old_dentry, dir == old_dentry->dir, false); // drop dentry, keep dir open if its the same dir dn = link(dir, dname, in, dn); in->put(); if (set_offset) { @@ -834,7 +834,7 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session, ldout(cct, 15) << "insert_trace unlink '" << pd->first << "'" << dendl; Dentry *dn = pd->second; ++pd; - unlink(dn, true, false); + unlink(dn, true, true); // keep dir, dentry } else { ++pd; } @@ -853,8 +853,9 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session, if (pd->second->inode != in) { // replace incorrect dentry ++pd; // we are about to unlink this guy, move past it. - unlink(olddn, true, false); + unlink(olddn, true, true); // keep dir, dentry dn = link(dir, dname, in, NULL); + assert(dn == olddn); } else { // keep existing dn dn = olddn; @@ -884,7 +885,7 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session, ldout(cct, 15) << "insert_trace unlink '" << pd->first << "'" << dendl; Dentry *dn = pd->second; ++pd; - unlink(dn, true, false); + unlink(dn, true, true); // keep dir, dentry } else ++pd; } @@ -933,12 +934,12 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session) Dentry *od = request->old_dentry(); ldout(cct, 10) << " unlinking rename src dn " << od << " for traceless reply" << dendl; assert(od); - unlink(od, false, false); + unlink(od, true, true); // keep dir, dentry } else if (request->head.op == CEPH_MDS_OP_RMDIR || request->head.op == CEPH_MDS_OP_UNLINK) { // unlink, rmdir ldout(cct, 10) << " unlinking unlink/rmdir dn " << d << " for traceless reply" << dendl; - unlink(d, true, true); + unlink(d, true, true); // keep dir, dentry } } return NULL; @@ -990,7 +991,7 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session) if (diri->dir && diri->dir->dentries.count(dname)) { Dentry *dn = diri->dir->dentries[dname]; if (dn->inode) - unlink(dn, true, true); + unlink(dn, true, true); // keep dir, dentry } } } else if (reply->head.op == CEPH_MDS_OP_LOOKUPSNAP || @@ -1014,7 +1015,7 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session) if (diri->dir && diri->dir->dentries.count(dname)) { Dentry *dn = diri->dir->dentries[dname]; if (dn->inode) - unlink(dn, true, true); + unlink(dn, true, true); // keep dir, dentry } } } @@ -2157,7 +2158,7 @@ Dentry* Client::link(Dir *dir, const string& name, Inode *in, Dentry *dn) if (in->is_dir() && !in->dn_set.empty()) { Dentry *olddn = in->get_first_parent(); assert(olddn->dir != dir || olddn->name != name); - unlink(olddn, false, false); + unlink(olddn, true, true); // keep dir, dentry } in->dn_set.insert(dn); |