f->close_section();
}
if (it->second->inode)
- dump_inode(f, it->second->inode, did, false);
+ dump_inode(f, it->second->inode.get(), did, false);
}
}
}
}
}
- if (!dn || dn->inode == 0) {
+ if (!dn || !dn->inode) {
in->get();
if (old_dentry) {
if (old_dentry->dir != dir) {
}
} 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;
if (in) { // link to inode
dn->inode = in;
- in->get();
if (in->is_dir()) {
if (in->dir)
dn->get(); // dir -> dn pin
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
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) {
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 {
#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;
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:
// Release Inode references
ceph_ll_forget(client, ino, 1);
for (std::vector<Dentry*>::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();