From ed7ebf35b124a236b88a478c33db82f015a8d4a4 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 30 Aug 2011 13:10:42 -0700 Subject: [PATCH] client: drop mostly-useless relink() Just use unlink() and then link(). Carry an inode ref to avoid badness. The relink() is left over from a simpler time when we didn't do proper refcounting. Signed-off-by: Sage Weil --- src/client/Client.cc | 68 ++++---------------------------------------- src/client/Client.h | 5 ---- 2 files changed, 5 insertions(+), 68 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 8e86e8354c676..aa07561ef8eeb 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -597,16 +597,11 @@ Dentry *Client::insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dl } if (!dn || dn->inode == 0) { - // have inode linked elsewhere? -> unlink and relink! - if (!in->dn_set.empty() && old_dentry) { - ldout(cct, 12) << " had vino " << in->vino() - << " linked at the wrong position, relinking" - << dendl; - dn = relink(dir, dname, in, old_dentry, dn); - } else { - // link - dn = link(dir, dname, in, dn); - } + in->get(); + if (old_dentry) + unlink(old_dentry, true); + dn = link(dir, dname, in, dn); + in->put(); if (set_offset) { ldout(cct, 15) << " setting dn offset to " << dir->max_offset << dendl; dn->offset = dir->max_offset++; @@ -1866,59 +1861,6 @@ void Client::unlink(Dentry *dn, bool keepdir) dn->put(); } -/* If an inode's been moved from one dentry to another - * (via rename, for instance), call this function to move it */ -Dentry *Client::relink(Dir *dir, const string& name, Inode *in, - Dentry *olddn, Dentry *newdn) -{ - Dir *olddir = olddn->dir; // note: might == dir! - bool made_new = false; - - // newdn, attach to inode. don't touch inode ref. - if (!newdn) { - made_new = true; - newdn = new Dentry; - newdn->dir = dir; - newdn->name = name; - } else { - assert(newdn->inode == NULL); - } - - ldout(cct, 15) << "relink dir " << dir->parent_inode << " '" << name << "' olddn " << olddn - << " newdn " << newdn << " inode " << in << dendl; - - newdn->inode = in; - in->dn_set.erase(olddn); - in->dn_set.insert(newdn); - - if (in->dir) { // dir -> dn pin - newdn->get(); - olddn->put(); - } - - // unlink old dn from dir - olddir->dentries.erase(olddn->name); - olddir->dentry_map.erase(olddn->name); - olddn->inode = 0; - olddn->dir = 0; - lru.lru_remove(olddn); - olddn->put(); - - // link new dn to dir - dir->dentries[name] = newdn; - dir->dentry_map[name] = newdn; - if (made_new) - lru.lru_insert_mid(newdn); - else - lru.lru_midtouch(newdn); - - // olddir now empty? (remember, olddir might == dir) - if (olddir->is_empty()) - close_dir(olddir); - - return newdn; -} - /**** * caps diff --git a/src/client/Client.h b/src/client/Client.h index 1dd4848c0203b..c094082c92ff6 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -325,11 +325,6 @@ protected: Dentry* link(Dir *dir, const string& name, Inode *in, Dentry *dn); void unlink(Dentry *dn, bool keepdir); - /* If an inode's been moved from one dentry to another - * (via rename, for instance), call this function to move it */ - Dentry *relink(Dir *dir, const string& name, Inode *in, Dentry *olddn, - Dentry *newdn); - // path traversal for high-level interface Inode *cwd; int path_walk(const filepath& fp, Inode **end, bool followsym=true); -- 2.39.5