summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-05-17 19:06:32 -0700
committerSage Weil <sage@inktank.com>2013-06-24 21:21:47 -0700
commit3cea945f540bce66906ef79c909c809b56858b03 (patch)
tree2fcd976f44d9b06e798ebe4b96a7c5543d8aaacf
parentdff24952cfb983ae6f5e13484fb240eeed67f469 (diff)
downloadceph-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.cc25
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);