Unverified Commit cb7f2945 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!11791 nilfs2: fix missing cleanup on rollforward recovery error

parents 6be8d57e 18bf70e9
Loading
Loading
Loading
Loading
+33 −2
Original line number Diff line number Diff line
@@ -708,6 +708,33 @@ static void nilfs_finish_roll_forward(struct the_nilfs *nilfs,
	brelse(bh);
}

/**
 * nilfs_abort_roll_forward - cleaning up after a failed rollforward recovery
 * @nilfs: nilfs object
 */
static void nilfs_abort_roll_forward(struct the_nilfs *nilfs)
{
	struct nilfs_inode_info *ii, *n;
	LIST_HEAD(head);

	/* Abandon inodes that have read recovery data */
	spin_lock(&nilfs->ns_inode_lock);
	list_splice_init(&nilfs->ns_dirty_files, &head);
	spin_unlock(&nilfs->ns_inode_lock);
	if (list_empty(&head))
		return;

	set_nilfs_purging(nilfs);
	list_for_each_entry_safe(ii, n, &head, i_dirty) {
		spin_lock(&nilfs->ns_inode_lock);
		list_del_init(&ii->i_dirty);
		spin_unlock(&nilfs->ns_inode_lock);

		iput(&ii->vfs_inode);
	}
	clear_nilfs_purging(nilfs);
}

/**
 * nilfs_salvage_orphan_logs - salvage logs written after the latest checkpoint
 * @nilfs: nilfs object
@@ -766,15 +793,19 @@ int nilfs_salvage_orphan_logs(struct the_nilfs *nilfs,
		if (unlikely(err)) {
			nilfs_err(sb, "error %d writing segment for recovery",
				  err);
			goto failed;
			goto put_root;
		}

		nilfs_finish_roll_forward(nilfs, ri);
	}

 failed:
put_root:
	nilfs_put_root(root);
	return err;

failed:
	nilfs_abort_roll_forward(nilfs);
	goto put_root;
}

/**