fix sid swap buglet
PATCH 1/1 fix sid swap buglet
In the case of a restart of a subtree checkpoint, some sids may be recorded as 0. If so, then we substitute the coordinator's sid. The code to do that wasn't quite right, and in fact writes past the end of the pids_arr, which happens to be into the copy_arr. As a result, the kernel was getting bogus data for substituted pids. In my own case that lead to sys_restart() waiting on a bogus vpid (in particular, the pid of my bash shell).
Fix that.
--- restart.c | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-)
restart.c +12 -10
@@ -2029,17 +2029,19 @@ static int ckpt_adjust_pids(struct ckpt_ctx *ctx)if (ctx->pids_arr[m].vpgid == swap.old) ctx->copy_arr[m].vpgid = swap.new; } + } -/* -* If the task's {sid,pgid} was zeroed out (inside -* ckpt_init_tree) then substitute the coordinator's -* sid for it now. (This should leave no more 0's in -* restart of a subtree-checkpoint). -*/ -if (ctx->tasks_arr[n].flags &TASK_ZERO_SID ) - ctx->pids_arr[m].vsid = coord_sid; -if (ctx->tasks_arr[n].flags &TASK_ZERO_PGID ) - ctx->pids_arr[m].vpgid = coord_sid; +/* +* If the task's {sid,pgid} was zeroed out (inside +* ckpt_init_tree) then substitute the coordinator's +* sid for it now. (This should leave no more 0's in +* restart of a subtree-checkpoint). +*/ +for (m =0 ; m < ctx->pids_nr; m++) { +if (ctx->tasks_arr[m].flags &TASK_ZERO_SID ) + ctx->copy_arr[m].vsid = coord_sid; +if (ctx->tasks_arr[m].flags &TASK_ZERO_PGID ) + ctx->copy_arr[m].vpgid = coord_sid; }memcpy (ctx->pids_arr, ctx->copy_arr, len);
Signature · 1 line
1.6.1.1
A message that is not in the archive (sent off-list or not yet received): 20091105232436.GA301-r/[email protected]
Oops ...already patched and pushed as per our discussion on IRC. The patch is functionally identical but adds a comment.
Oren.
Quoted 49 lines · Serge E. Hallyn
In the case of a restart of a subtree checkpoint, some sids may be recorded as 0. If so, then we substitute the coordinator's sid. The code to do that wasn't quite right, and in fact writes past the end of the
pids_arr, which happens to be into thecopy_arr. As a result, the kernel was getting bogus data for substituted pids. In my own case that lead tosys_restart()waiting on a bogus vpid (in particular, the pid of my bash shell).Fix that.
Signed-off-by Serge E. Hallyn <serue-r/[email protected]>--- restart.c | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-)restart.c +12
-10@@ -2029,17 +2029,19 @@ static int ckpt_adjust_pids(struct ckpt_ctx *ctx)if (ctx->pids_arr[m].vpgid == swap.old) ctx->copy_arr[m].vpgid = swap.new; } + } -/* -* If the task's {sid,pgid} was zeroed out (inside -* ckpt_init_tree) then substitute the coordinator's -* sid for it now. (This should leave no more 0's in -* restart of a subtree-checkpoint). -*/ -if (ctx->tasks_arr[n].flags &TASK_ZERO_SID ) - ctx->pids_arr[m].vsid = coord_sid; -if (ctx->tasks_arr[n].flags &TASK_ZERO_PGID ) - ctx->pids_arr[m].vpgid = coord_sid; +/* +* If the task's {sid,pgid} was zeroed out (inside +* ckpt_init_tree) then substitute the coordinator's +* sid for it now. (This should leave no more 0's in +* restart of a subtree-checkpoint). +*/ +for (m =0 ; m < ctx->pids_nr; m++) { +if (ctx->tasks_arr[m].flags &TASK_ZERO_SID ) + ctx->copy_arr[m].vsid = coord_sid; +if (ctx->tasks_arr[m].flags &TASK_ZERO_PGID ) + ctx->copy_arr[m].vpgid = coord_sid; }memcpy (ctx->pids_arr, ctx->copy_arr, len);