From 07f580977319110cbdd60c78fff892c85711ef3e Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 24 Jun 2015 11:21:23 +0800 Subject: [PATCH] client: convert Dentry::inode to smart pointer Signed-off-by: Yan, Zheng --- src/client/Client.cc | 15 +++++++-------- src/client/Dentry.h | 11 ++++++----- src/tools/ceph-client-debug.cc | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 168eb37d52f61..c477748236d1d 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -324,7 +324,7 @@ void Client::dump_inode(Formatter *f, Inode *in, set& did, bool disconne f->close_section(); } if (it->second->inode) - dump_inode(f, it->second->inode, did, false); + dump_inode(f, it->second->inode.get(), did, false); } } } @@ -894,7 +894,7 @@ Dentry *Client::insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dl } } - if (!dn || dn->inode == 0) { + if (!dn || !dn->inode) { in->get(); if (old_dentry) { if (old_dentry->dir != dir) { @@ -1253,7 +1253,7 @@ mds_rank_t Client::choose_target_mds(MetaRequest *req) } } else if (de) { if (de->inode) { - in = de->inode; + in = de->inode.get(); ldout(cct, 20) << "choose_target_mds starting with req->dentry inode " << *in << dendl; } else { in = de->dir->parent_inode; @@ -2647,7 +2647,6 @@ Dentry* Client::link(Dir *dir, const string& name, Inode *in, Dentry *dn) if (in) { // link to inode dn->inode = in; - in->get(); if (in->is_dir()) { if (in->dir) dn->get(); // dir -> dn pin @@ -2674,13 +2673,14 @@ Dentry* Client::link(Dir *dir, const string& name, Inode *in, Dentry *dn) void Client::unlink(Dentry *dn, bool keepdir, bool keepdentry) { - Inode *in = dn->inode; + InodeRef in; + in.swap(dn->inode); ldout(cct, 15) << "unlink dir " << dn->dir->parent_inode << " '" << dn->name << "' dn " << dn << " inode " << dn->inode << dendl; // unlink from inode if (in) { - invalidate_quota_tree(in); + invalidate_quota_tree(in.get()); if (in->is_dir()) { if (in->dir) dn->put(); // dir -> dn pin @@ -2691,7 +2691,6 @@ void Client::unlink(Dentry *dn, bool keepdir, bool keepdentry) assert(in->dn_set.count(dn)); in->dn_set.erase(dn); ldout(cct, 20) << "unlink inode " << in << " parents now " << in->dn_set << dendl; - put_inode(in); } if (keepdentry) { @@ -6344,7 +6343,7 @@ int Client::readdir_r_cb(dir_result_t *d, add_dirent_cb_t cb, void *p) if (dirp->offset == 1) { ldout(cct, 15) << " including .." << dendl; if (!diri->dn_set.empty()) { - Inode* in = diri->get_first_parent()->inode; + InodeRef& in = diri->get_first_parent()->inode; fill_dirent(&de, "..", S_IFDIR, in->ino, 2); fill_stat(in, &st); } else { diff --git a/src/client/Dentry.h b/src/client/Dentry.h index aad6343f8179f..198b375ce0988 100644 --- a/src/client/Dentry.h +++ b/src/client/Dentry.h @@ -5,17 +5,18 @@ #include "include/xlist.h" #include "mds/mdstypes.h" +#include "InodeRef.h" class Dir; struct Inode; class Dentry : public LRUObject { public: - string name; // sort of lame + string name; // sort of lame //const char *name; - Dir *dir; - Inode *inode; - int ref; // 1 if there's a dir beneath me. + Dir *dir; + InodeRef inode; + int ref; // 1 if there's a dir beneath me. uint64_t offset; mds_rank_t lease_mds; utime_t lease_ttl; @@ -47,7 +48,7 @@ class Dentry : public LRUObject { void dump(Formatter *f) const; Dentry() : - dir(0), inode(0), ref(1), offset(0), + dir(0), ref(1), offset(0), lease_mds(-1), lease_gen(0), lease_seq(0), cap_shared_gen(0), item_dentry_list(this) { } private: diff --git a/src/tools/ceph-client-debug.cc b/src/tools/ceph-client-debug.cc index 2ed93326b4433..a84cadcf69db7 100644 --- a/src/tools/ceph-client-debug.cc +++ b/src/tools/ceph-client-debug.cc @@ -163,7 +163,7 @@ int main(int argc, const char **argv) // Release Inode references ceph_ll_forget(client, ino, 1); for (std::vector::reverse_iterator p = path.rbegin(); p != path.rend(); ++p) { - ceph_ll_forget(client, (*p)->inode, 1); + ceph_ll_forget(client, (*p)->inode.get(), 1); } ino = NULL; path.clear(); -- 2.39.5