[RFC v17][PATCH 22/60] c/r: external checkpoint of a task other than ourself

Oren Laadan orenl at librato.com
Thu Jul 23 08:33:20 PDT 2009



Serge E. Hallyn wrote:
> Quoting Oren Laadan (orenl at librato.com):
>> +/* setup checkpoint-specific parts of ctx */
>> +static int init_checkpoint_ctx(struct ckpt_ctx *ctx, pid_t pid)
>> +{
>> +	struct task_struct *task;
>> +	struct nsproxy *nsproxy;
>> +	int ret;
>> +
>> +	/*
>> +	 * No need for explicit cleanup here, because if an error
>> +	 * occurs then ckpt_ctx_free() is eventually called.
>> +	 */
>> +
>> +	ctx->root_pid = pid;
>> +
>> +	/* root task */
>> +	read_lock(&tasklist_lock);
>> +	task = find_task_by_vpid(pid);
>> +	if (task)
>> +		get_task_struct(task);
>> +	read_unlock(&tasklist_lock);
>> +	if (!task)
>> +		return -ESRCH;
>> +	else
>> +		ctx->root_task = task;
>> +
>> +	/* root nsproxy */
>> +	rcu_read_lock();
>> +	nsproxy = task_nsproxy(task);
>> +	if (nsproxy)
>> +		get_nsproxy(nsproxy);
>> +	rcu_read_unlock();
>> +	if (!nsproxy)
>> +		return -ESRCH;
>> +	else
>> +		ctx->root_nsproxy = nsproxy;
>> +
>> +	/* root freezer */
>> +	ctx->root_freezer = task;
>> +	geT_task_struct(task);
>> +
>> +	ret = may_checkpoint_task(ctx, task);
>> +	if (ret) {
>> +		ckpt_write_err(ctx, NULL);
>> +		put_task_struct(task);
>> +		put_task_struct(task);
>> +		put_nsproxy(nsproxy);
> 
> I don't think this is safe - the ckpt_ctx_free() will
> free them a second time because you're not setting them
> to NULL, right?

Yes. Fortunately this hole chunk is removed by the 3rd-next patch.
I'll make sure it's correct here too.

Thanks,

Oren.



More information about the Containers mailing list