Messages in this thread | | | Date | Wed, 10 Sep 2008 14:36:16 -0400 | From | Oren Laadan <> | Subject | Re: [RFC v4][PATCH 2/9] General infrastructure for checkpoint restart |
| |
MinChan Kim wrote: > On Tue, Sep 9, 2008 at 4:42 PM, Oren Laadan <orenl@cs.columbia.edu> wrote:
[...]
>> +struct cr_ctx *cr_ctx_alloc(pid_t pid, int fd, unsigned long flags) >> +{ >> + struct cr_ctx *ctx; >> + >> + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); >> + if (!ctx) >> + return ERR_PTR(-ENOMEM); >> + >> + ctx->file = fget(fd); >> + if (!ctx->file) { >> + cr_ctx_free(ctx); >> + return ERR_PTR(-EBADF); >> + } >> + get_file(ctx->file); > > Why do you need get_file? > You already called fget. > Am I missing something ?
This was meant for when we will restart multiple processes, each would have access to the checkpoint-context, such that the checkpoint-context may outlives the task that created it and initiated the restart. Thus the file-pointer will need to stay around longer than that task.
Of course, restart of multiple processes _can_ be coded such that this first task will always terminate last - either after restart completes successfully, or after all the other tasks aborted and won't use the checkpoint-context anymore.
Because that code is not part of the this patch-set, I considered it safer to grab a reference of the file pointer, making it less likely that we forget about it later.
> >> + ctx->hbuf = (void *) __get_free_pages(GFP_KERNEL, CR_HBUF_ORDER); >> + if (!ctx->hbuf) { >> + cr_ctx_free(ctx); >> + return ERR_PTR(-ENOMEM); >> + } >> + >> + ctx->pid = pid; >> + ctx->flags = flags; >> + >> + ctx->crid = atomic_inc_return(&cr_ctx_count); >> + >> + return ctx; >> +}
Oren.
| |