int64_t old_pool = inode.layout.pool_id;
mark_dirty(front.inode.version, ls);
+ bool new_export_pin = inode.export_pin != front.inode.export_pin;
inode = front.inode;
+ if (new_export_pin)
+ maybe_export_pin(true);
if (inode.is_backtrace_updated())
mark_dirty_parent(ls, old_pool != inode.layout.pool_id);
assert(is_dir());
assert(is_projected());
get_projected_inode()->export_pin = rank;
- maybe_export_pin(true);
}
mds_rank_t CInode::get_export_pin(bool inherit) const
while (true) {
if (in->is_system())
break;
- const CDentry *pdn = in->get_projected_parent_dn();
+ const CDentry *pdn = in->get_parent_dn();
if (!pdn)
break;
- const mempool_inode *pi = in->get_projected_inode();
// ignore export pin for unlinked directory
- if (pi->nlink == 0)
+ if (in->get_inode().nlink == 0)
break;
- if (pi->export_pin >= 0)
- return pi->export_pin;
+ if (in->get_inode().export_pin >= 0)
+ return in->get_inode().export_pin;
if (!inherit)
break;
int d_type() const { return IFTODT(inode.mode); }
mempool_inode& get_inode() { return inode; }
+ const mempool_inode& get_inode() const { return inode; }
CDentry* get_parent_dn() { return parent; }
const CDentry* get_parent_dn() const { return parent; }
const CDentry* get_projected_parent_dn() const { return !projected_parent.empty() ? projected_parent.back() : parent; }
if (in->is_dir()) {
assert(straydn);
mdcache->project_subtree_rename(in, dn->get_dir(), straydn->get_dir());
-
- in->maybe_export_pin(true);
}
journal_and_reply(mdr, 0, dn, le, new C_MDS_unlink_local_finish(this, mdr, dn, straydn));