void CDir::unlink_inode(CDentry *dn)
{
- if (dn->get_linkage()->is_remote()) {
- dout(12) << "unlink_inode " << *dn << dendl;
- } else {
+ if (dn->get_linkage()->is_primary()) {
dout(12) << "unlink_inode " << *dn << " " << *dn->get_linkage()->get_inode() << dendl;
+ } else {
+ dout(12) << "unlink_inode " << *dn << dendl;
}
unlink_inode_work(dn);
dn->unlink_remote(dn->get_linkage());
dn->get_linkage()->set_remote(0, 0);
- } else {
+ } else if (dn->get_linkage()->is_primary()) {
// primary
- assert(dn->get_linkage()->is_primary());
-
// unpin dentry?
if (in->get_num_ref())
dn->put(CDentry::PIN_INODEPIN);
// detach inode
in->remove_primary_parent(dn);
dn->get_linkage()->inode = 0;
+ } else {
+ assert(!dn->get_linkage()->is_null());
}
}
bl.append('L'); // remote link
::encode(ino, bl);
::encode(d_type, bl);
- } else {
+ } else if (dn->linkage.is_primary()) {
// primary link
CInode *in = dn->linkage.get_inode();
assert(in);
bufferlist snap_blob;
in->encode_snap_blob(snap_blob);
in->encode_bare(bl, cache->mds->mdsmap->get_up_features(), &snap_blob);
+ } else {
+ assert(!dn->linkage.is_null());
}
}