]>
git.proxmox.com Git - ceph.git/blob - ceph/src/client/Dentry.h
483a31eccb324b56dd704f1931dbe1a68cea26e6
1 #ifndef CEPH_CLIENT_DENTRY_H
2 #define CEPH_CLIENT_DENTRY_H
4 #include "include/lru.h"
5 #include "include/xlist.h"
7 #include "mds/mdstypes.h"
12 class Dentry
: public LRUObject
{
14 explicit Dentry(Dir
*_dir
, const std::string
&_name
) :
15 dir(_dir
), name(_name
), inode_xlist_link(this)
17 auto r
= dir
->dentries
.insert(make_pair(name
, this));
18 ceph_assert(r
.second
);
19 dir
->num_null_dentries
++;
22 ceph_assert(ref
== 0);
23 ceph_assert(dir
== nullptr);
27 * ref==1 -> cached, unused
28 * ref >1 -> pinned in lru
34 //cout << "dentry.get on " << this << " " << name << " now " << ref << std::endl;
40 //cout << "dentry.put on " << this << " " << name << " now " << ref << std::endl;
44 void link(InodeRef in
) {
46 inode
->dentries
.push_back(&inode_xlist_link
);
47 if (inode
->is_dir()) {
49 get(); // dir -> dn pin
51 get(); // ll_ref -> dn pin
53 dir
->num_null_dentries
--;
56 if (inode
->is_dir()) {
58 put(); // dir -> dn pin
60 put(); // ll_ref -> dn pin
62 ceph_assert(inode_xlist_link
.get_list() == &inode
->dentries
);
63 inode_xlist_link
.remove_myself();
65 dir
->num_null_dentries
++;
68 if (inode
&& inode
->dentries
.front() != this)
69 inode
->dentries
.push_front(&inode_xlist_link
);
73 auto p
= dir
->dentries
.find(name
);
74 ceph_assert(p
!= dir
->dentries
.end());
75 dir
->dentries
.erase(p
);
76 dir
->num_null_dentries
--;
80 void dump(Formatter
*f
) const;
81 friend std::ostream
&operator<<(std::ostream
&oss
, const Dentry
&Dentry
);
86 int ref
= 1; // 1 if there's a dir beneath me.
88 mds_rank_t lease_mds
= -1;
90 uint64_t lease_gen
= 0;
91 ceph_seq_t lease_seq
= 0;
92 int cap_shared_gen
= 0;
93 std::string alternate_name
;
96 xlist
<Dentry
*>::item inode_xlist_link
;