assert(is_base());
pv = get_projected_version() + 1;
}
+ // force update backtrace for old format inode (see inode_t::decode)
+ if (inode.backtrace_version == 0 && !projected_nodes.empty()) {
+ inode_t *pi = projected_nodes.back()->inode;
+ if (pi->backtrace_version == 0)
+ pi->update_backtrace(pv);
+ }
return pv;
}
wrlock_force(&in->xattrlock, mut);
}
-
- // update backtrace for old format inode. (see inode_t::decode)
- if (pi->backtrace_version == 0)
- pi->update_backtrace();
mut->auth_pin(in);
mdcache->predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, 0, follows);
// log + wait
le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid());
-
- // update backtrace for old format inode. (see inode_t::decode)
- if (pi->backtrace_version == 0)
- pi->update_backtrace();
-
mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
mdcache->journal_dirty_inode(mdr, &le->metablob, cur);
//cout << "journaling " << in->inode.ino << " at " << my_offset << std::endl;
inode_t *pi = in->get_projected_inode();
+ if ((state & fullbit::STATE_DIRTY) && pi->is_backtrace_updated())
+ state |= fullbit::STATE_DIRTYPARENT;
+
bufferlist snapbl;
sr_t *sr = in->get_projected_srnode();
if (sr)
*/
void inode_t::encode(bufferlist &bl) const
{
- ENCODE_START(9, 6, bl);
+ ENCODE_START(10, 6, bl);
::encode(ino, bl);
::encode(rdev, bl);
void inode_t::decode(bufferlist::iterator &p)
{
- DECODE_START_LEGACY_COMPAT_LEN(9, 6, 6, p);
+ DECODE_START_LEGACY_COMPAT_LEN(10, 6, 6, p);
::decode(ino, p);
::decode(rdev, p);
::decode(backtrace_version, p);
if (struct_v >= 7)
::decode(old_pools, p);
- else
- backtrace_version = 0; // note inode which has no backtrace
if (struct_v >= 8)
::decode(max_size_ever, p);
if (struct_v >= 9) {
} else {
inline_version = CEPH_INLINE_NONE;
}
+ if (struct_v < 10)
+ backtrace_version = 0; // force update backtrace
DECODE_FINISH(p);
}
bool is_backtrace_updated() {
return backtrace_version == version;
}
- void update_backtrace() {
- backtrace_version = version;
+ void update_backtrace(version_t pv=0) {
+ backtrace_version = pv ? pv : version;
}
void add_old_pool(int64_t l) {