<< dendl;
if (dn) {
- if (dn->inode->vino() == in->vino()) {
- touch_dn(dn);
- dout(12) << " had dentry " << dname
- << " with correct vino " << dn->inode->vino()
- << dendl;
+ if (dn->inode) {
+ if (dn->inode->vino() == in->vino()) {
+ touch_dn(dn);
+ dout(12) << " had dentry " << dname
+ << " with correct vino " << dn->inode->vino()
+ << dendl;
+ } else {
+ dout(12) << " had dentry " << dname
+ << " with WRONG vino " << dn->inode->vino()
+ << dendl;
+ unlink(dn, true);
+ dn = NULL;
+ }
} else {
- dout(12) << " had dentry " << dname
- << " with WRONG vino " << dn->inode->vino()
- << dendl;
- unlink(dn, true);
- dn = NULL;
+ link(dir, dname, in, dn);
}
}
*/
void Client::encode_cap_releases(MetaRequest *req, int mds) {
dout(20) << "encode_cap_releases enter (req: "
- << req << ", mds: " << mds << dendl;
+ << req << ", mds: " << mds << ")" << dendl;
if (req->inode_drop)
encode_inode_release(req->inode, req->request,
mds, req->inode_drop,
/**
* Don't call this with in==NULL, use get_or_create for that
+ * leave dn set to default NULL unless you're trying to add
+ * a new inode to a pre-created Dentry
*/
- Dentry* link(Dir *dir, const string& name, Inode *in) {
- Dentry *dn = new Dentry;
- dn->name = name;
-
- // link to dir
- dn->dir = dir;
- //cout << "link dir " << dir->parent_inode->ino << " '" << name << "' -> inode " << in->ino << endl;
- dir->dentries[dn->name] = dn;
+ Dentry* link(Dir *dir, const string& name, Inode *in, Dentry *dn=NULL) {
+ if (!dn) { //create a new Dentry
+ dn = new Dentry;
+ dn->name = name;
+
+ // link to dir
+ dn->dir = dir;
+ //cout << "link dir " << dir->parent_inode->ino << " '" << name << "' -> inode " << in->ino << endl;
+ dir->dentries[dn->name] = dn;
+ lru.lru_insert_mid(dn); // mid or top?
+ }
if (in) { // link to inode
dn->inode = in;
if (in->dir) dn->get(); // dir -> dn pin
}
- lru.lru_insert_mid(dn); // mid or top?
return dn;
}