Update of /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/vproc
In directory
sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16979/openssi/kernel/cluster/ssi/vproc
Modified Files:
Tag: OPENSSI-RH
rproc_server.c rproc_server.h rproc_server_pproc.c
rproc_svr_vproc.c
Log Message:
M ci/kernel/cluster/arch/i386/include/arch_regs.h
M openssi/kernel/cluster/arch/i386/vproc/rproc_arch.c
M openssi/kernel/cluster/ssi/vproc/rproc_server.c
M openssi/kernel/cluster/ssi/vproc/rproc_server.h
M openssi/kernel/cluster/ssi/vproc/rproc_server_pproc.c
M openssi/kernel/cluster/ssi/vproc/rproc_svr_vproc.c
Fixed race in rexec where arguments would be freed before
they were used. In order to work properly with ptrace, the
way the exec is done for rexec was totally reworked.
Index: rproc_server_pproc.c
===================================================================
RCS file:
/cvsroot/ssic-linux/openssi/kernel/cluster/ssi/vproc/Attic/rproc_server_pproc.c,v
retrieving revision 1.2.2.1
retrieving revision 1.2.2.2
diff -u -d -r1.2.2.1 -r1.2.2.2
--- rproc_server_pproc.c 25 Feb 2004 02:27:07 -0000 1.2.2.1
+++ rproc_server_pproc.c 30 Mar 2004 02:28:56 -0000 1.2.2.2
@@ -41,15 +41,14 @@
int
rproc_create_proc(
void (*svrfunc)(rvp_remote_args_t *),
- rvp_remote_args_t *svrargs,
- int flags)
+ rvp_remote_args_t *svrargs)
{
int error;
INIT_EVENT(&svrargs->childdone);
error = kernel_thread_with_pid((void *)svrfunc, svrargs,
- flags, svrargs->childpid);
+ 0, svrargs->childpid);
if (error < 0)
DEINIT_EVENT(&svrargs->childdone);
else if (error == svrargs->childpid) {
@@ -113,14 +112,14 @@
rexecve_server_setup(
rvp_remote_args_t *re_args)
{
- int error;
+ struct pt_regs regs;
re_args->retval = rexecve_server(re_args->rexecve_args.vprocp,
current,
re_args->rexecve_args.fname,
re_args->rexecve_args.argv,
re_args->rexecve_args.envp,
- re_args->remotedata);
+ re_args->remotedata, ®s);
if (re_args->retval) {
struct vproc *ve;
@@ -154,29 +153,8 @@
*/
SIGNAL_EVENT(&re_args->childdone);
- /* since execve will go back to syscall, if its being
- * ptrace it will go into syscall_trace and hang the rexec,
- * because its vforked, need to clear the vfork to finish
- */
- if (current->ptrace) {
- struct completion *vfork_done = current->vfork_done;
- current->vfork_done = NULL;
- complete(vfork_done);
- }
-
- current->execnode = this_node;
-
- error = execve(re_args->rexecve_args.fname,
- re_args->rexecve_args.argv,
- re_args->rexecve_args.envp);
-
- if (error != 0) {
- printk("rexecve failed in execve with %d\n", error);
- /* Need to send error back to client node, but
- * by this time our client rexec is gone
- */
- }
- do_exit(CLD_EXITED);
+ ret_from_rexec(®s);
+ /*UNREACHABLE*/
}
}
Index: rproc_server.h
===================================================================
RCS file:
/cvsroot/ssic-linux/openssi/kernel/cluster/ssi/vproc/Attic/rproc_server.h,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -d -r1.2 -r1.2.2.1
--- rproc_server.h 3 Oct 2003 23:25:49 -0000 1.2
+++ rproc_server.h 30 Mar 2004 02:28:56 -0000 1.2.2.1
@@ -59,7 +59,7 @@
extern int rproc_create_proc(void (*)(rvp_remote_args_t *),
- rvp_remote_args_t *, int);
+ rvp_remote_args_t *);
extern void migrate_server_setup(rvp_remote_args_t *);
extern int migrate_server(struct vproc *, struct task_struct *,
struct rvp_remote_data *, struct arch_regs_stack *);
@@ -69,7 +69,7 @@
extern void rexecve_server_setup(rvp_remote_args_t *);
extern int rexecve_server(struct vproc *, struct task_struct *,
char *, char **, char **,
- struct rvp_remote_data *);
+ struct rvp_remote_data *, struct pt_regs *);
extern int svr_rfork(struct rvp_remote_data *, pid_t *, int);
extern int svr_rexecve(char *, char **, char **, struct rvp_remote_data *);
extern int svr_migrate(struct rvp_remote_data *, int);
Index: rproc_server.c
===================================================================
RCS file:
/cvsroot/ssic-linux/openssi/kernel/cluster/ssi/vproc/Attic/rproc_server.c,v
retrieving revision 1.3
retrieving revision 1.3.2.1
diff -u -d -r1.3 -r1.3.2.1
--- rproc_server.c 3 Oct 2003 23:25:49 -0000 1.3
+++ rproc_server.c 30 Mar 2004 02:28:56 -0000 1.3.2.1
@@ -56,7 +56,7 @@
args->rfork_args.parentpid = rf_data->rd_vproc_data->rpvp_ppid;
args->rfork_args.flags = flags;
- error = rproc_create_proc(rfork_server_setup, args, 0);
+ error = rproc_create_proc(rfork_server_setup, args);
kfree((caddr_t)args);
return error;
@@ -117,7 +117,7 @@
args->rexecve_args.argv = argv;
args->rexecve_args.envp = envp;
- error = rproc_create_proc(rexecve_server_setup, args, CLONE_VFORK);
+ error = rproc_create_proc(rexecve_server_setup, args);
kfree((caddr_t)args);
@@ -181,7 +181,7 @@
args->migrate_args.vprocp = vm;
args->migrate_args.is_sigmigrate = is_sigmigrate;
- error = rproc_create_proc(migrate_server_setup, args, 0);
+ error = rproc_create_proc(migrate_server_setup, args);
kfree((caddr_t)args);
Index: rproc_svr_vproc.c
===================================================================
RCS file:
/cvsroot/ssic-linux/openssi/kernel/cluster/ssi/vproc/Attic/rproc_svr_vproc.c,v
retrieving revision 1.5.2.3
retrieving revision 1.5.2.4
diff -u -d -r1.5.2.3 -r1.5.2.4
--- rproc_svr_vproc.c 11 Mar 2004 02:33:44 -0000 1.5.2.3
+++ rproc_svr_vproc.c 30 Mar 2004 02:28:56 -0000 1.5.2.4
@@ -224,7 +224,8 @@
char *fname,
char **argv,
char **envp,
- struct rvp_remote_data *re_datap)
+ struct rvp_remote_data *re_datap,
+ struct pt_regs *regs)
{
rvp_vproc_data *vp_datap = re_datap->rd_vproc_data;
int child_pid_cnt = vp_datap->rpvp_child_pidp.pidlist_len;
@@ -242,7 +243,6 @@
struct vproc *g;
struct pvproc *pve = PVP(ve);
int i, error;
- struct file *file;
clusternode_t clinode = 0;
int ll_select = 0;
@@ -268,19 +268,13 @@
if (error)
return error;
- /*
- * Now that the cwd, root have been established, check the
- * filename exists before setting up the vproc
- */
- file = open_exec(fname);
- if (!IS_ERR(file))
- fput(file);
+ error = ssi_do_execve(fname, argv, envp, regs, 0);
+ /* Successful? */
+ if (error == 0)
+ current->ptrace &= ~PT_DTRACE;
else
- error = PTR_ERR(file);
- if (error)
return error;
-
/*
* setup relationships before exec'ing process.
*/
-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
|