const auto& pf = targeti->get_parent_dn()->get_dir()->get_projected_fnode();
rollback.old_dir_mtime = pf->fragstat.mtime;
rollback.old_dir_rctime = pf->rstat.rctime;
+ rollback.referent_ino = referent_ino;
rollback.was_inc = inc;
if (realm_projected) {
if (targeti->snaprealm) {
// inode
pi.inode->ctime = rollback.old_ctime;
- if (rollback.was_inc)
+ if (rollback.was_inc) {
pi.inode->nlink--;
- else
+ if (rollback.referent_ino > 0) {
+ pi.inode->remove_referent_ino(rollback.referent_ino);
+ dout(10) << __func__ << " referent_inodes " << std::hex << pi.inode->get_referent_inodes()
+ << " referent ino removed " << rollback.referent_ino << dendl;
+ }
+ } else {
pi.inode->nlink++;
+ }
map<client_t,ref_t<MClientSnap>> splits;
if (rollback.snapbl.length() && in->snaprealm) {
void link_rollback::encode(bufferlist &bl) const
{
- ENCODE_START(3, 2, bl);
+ ENCODE_START(4, 2, bl);
encode(reqid, bl);
encode(ino, bl);
encode(was_inc, bl);
encode(old_dir_mtime, bl);
encode(old_dir_rctime, bl);
encode(snapbl, bl);
+ encode(referent_ino, bl);
ENCODE_FINISH(bl);
}
void link_rollback::decode(bufferlist::const_iterator &bl)
{
- DECODE_START_LEGACY_COMPAT_LEN(3, 2, 2, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(4, 2, 2, bl);
decode(reqid, bl);
decode(ino, bl);
decode(was_inc, bl);
decode(old_dir_rctime, bl);
if (struct_v >= 3)
decode(snapbl, bl);
+ if (struct_v >= 4)
+ decode(referent_ino, bl);
DECODE_FINISH(bl);
}
f->dump_stream("old_ctime") << old_ctime;
f->dump_stream("old_dir_mtime") << old_dir_mtime;
f->dump_stream("old_dir_rctime") << old_dir_rctime;
+ f->dump_stream("referent_ino") << referent_ino;
}
void link_rollback::generate_test_instances(std::list<link_rollback*>& ls)