lrv == inode->inode.last_renamed_version) {
inode->item_renamed_file.remove_myself();
inode->state_clear(CInode::STATE_DIRTYPARENT);
+ inode->put(CInode::PIN_DIRTYPARENT);
dout(10) << "_committed stored parent pointer, removed from renamed_files list " << *inode << dendl;
}
void CInode::_stored_parent(version_t v, Context *fin)
{
- if (v == inode.last_renamed_version) {
- dout(10) << "stored_parent committed v" << v << ", removing from list" << dendl;
- item_renamed_file.remove_myself();
- state_clear(STATE_DIRTYPARENT);
+ if (state_test(STATE_DIRTYPARENT)) {
+ if (v == inode.last_renamed_version) {
+ dout(10) << "stored_parent committed v" << v << ", removing from list" << dendl;
+ item_renamed_file.remove_myself();
+ state_clear(STATE_DIRTYPARENT);
+ put(PIN_DIRTYPARENT);
+ } else {
+ dout(10) << "stored_parent committed v" << v << " < " << inode.last_renamed_version
+ << ", renamed again, not removing from list" << dendl;
+ }
} else {
- dout(10) << "stored_parent committed v" << v << " < " << inode.last_renamed_version
- << ", renamed again, not removing from list" << dendl;
+ dout(10) << "stored_parent committed v" << v << ", tho i wasn't on the renamed_files list" << dendl;
}
if (fin) {
fin->finish(0);
static const int PIN_NEEDSNAPFLUSH = 20;
static const int PIN_DIRTYRSTAT = 21;
static const int PIN_EXPORTINGCAPS = 22;
+ static const int PIN_DIRTYPARENT = 23;
const char *pin_name(int p) {
switch (p) {
case PIN_STRAY: return "stray";
case PIN_NEEDSNAPFLUSH: return "needsnapflush";
case PIN_DIRTYRSTAT: return "dirtyrstat";
+ case PIN_DIRTYPARENT: return "dirtyparent";
default: return generic_pin_name(p);
}
}
if (desti->is_dir()) {
mdr->ls->renamed_files.push_back(&desti->item_renamed_file);
- desti->state_set(CInode::STATE_DIRTYPARENT);
- dout(10) << "added dir to logsegment renamed_files list " << *desti << dendl;
+ if (!desti->state_test(CInode::STATE_DIRTYPARENT)) {
+ desti->state_set(CInode::STATE_DIRTYPARENT);
+ desti->get(CInode::PIN_DIRTYPARENT);
+ dout(10) << "added dir to logsegment renamed_files list " << *desti << dendl;
+ } else {
+ dout(10) << "re-added dir to logsegment renamed_files list " << *desti << dendl;
+ }
}
} else {
// FIXME: fix up snaprealm!