Don't use kernel responses in servers

This commit is contained in:
Erik van der Kouwe 2010-06-24 07:37:26 +00:00
parent 491efeead9
commit 498d7d8a4c
12 changed files with 37 additions and 34 deletions

View File

@ -114,7 +114,6 @@ extern int errno; /* place where the error numbers go */
*/ */
#define ELOCKED (_SIGN 101) /* can't send message due to deadlock */ #define ELOCKED (_SIGN 101) /* can't send message due to deadlock */
#define EBADCALL (_SIGN 102) /* illegal system call number */ #define EBADCALL (_SIGN 102) /* illegal system call number */
#define EBADSRCDST (_SIGN 103) /* bad source or destination process */
#define ECALLDENIED (_SIGN 104) /* no permission for system call */ #define ECALLDENIED (_SIGN 104) /* no permission for system call */
#define EDEADSRCDST (_SIGN 105) /* source or destination is not alive */ #define EDEADSRCDST (_SIGN 105) /* source or destination is not alive */
#define ENOTREADY (_SIGN 106) /* source or destination is not ready */ #define ENOTREADY (_SIGN 106) /* source or destination is not ready */
@ -122,4 +121,8 @@ extern int errno; /* place where the error numbers go */
#define ETRAPDENIED (_SIGN 110) /* IPC trap not allowed */ #define ETRAPDENIED (_SIGN 110) /* IPC trap not allowed */
#define EDONTREPLY (_SIGN 201) /* pseudo-code: don't send a reply */ #define EDONTREPLY (_SIGN 201) /* pseudo-code: don't send a reply */
/* The following are non-POSIX server responses */
#define EBADEPT (_SIGN 301) /* specified endpoint is bad */
#define EDEADEPT (_SIGN 302) /* specified endpoint is not alive */
#endif /* _ERRNO_H */ #endif /* _ERRNO_H */

View File

@ -184,7 +184,7 @@ PUBLIC int block_dev_io(
driver_e = driver_endpoints[(dev >> MAJOR) & BYTE].driver_e; driver_e = driver_endpoints[(dev >> MAJOR) & BYTE].driver_e;
/* See if driver is roughly valid. */ /* See if driver is roughly valid. */
if (driver_e == NONE) return(EDEADSRCDST); if (driver_e == NONE) return(EDEADEPT);
/* The io vector copying relies on this I/O being for FS itself. */ /* The io vector copying relies on this I/O being for FS itself. */
if(proc_e != SELF_E) { if(proc_e != SELF_E) {
@ -214,7 +214,7 @@ PUBLIC int block_dev_io(
/* Call the task. */ /* Call the task. */
r = sendrec(driver_e, &m); r = sendrec(driver_e, &m);
if(r == OK && m.REP_STATUS == ERESTART) r = EDEADSRCDST; if(r == OK && m.REP_STATUS == ERESTART) r = EDEADEPT;
/* As block I/O never SUSPENDs, safe cleanup must be done whether /* As block I/O never SUSPENDs, safe cleanup must be done whether
* the I/O succeeded or not. */ * the I/O succeeded or not. */
@ -226,7 +226,7 @@ PUBLIC int block_dev_io(
* - VFS sends the new driver endp for the FS proc and the request again * - VFS sends the new driver endp for the FS proc and the request again
*/ */
if (r != OK) { if (r != OK) {
if (r == EDEADSRCDST) { if (r == EDEADSRCDST || r == EDEADEPT) {
printf("ISOFS(%d) dead driver %d\n", SELF_E, driver_e); printf("ISOFS(%d) dead driver %d\n", SELF_E, driver_e);
driver_endpoints[(dev >> MAJOR) & BYTE].driver_e = NONE; driver_endpoints[(dev >> MAJOR) & BYTE].driver_e = NONE;
return(r); return(r);
@ -299,9 +299,9 @@ message *mess_ptr; /* pointer to message for task */
proc_e = mess_ptr->IO_ENDPT; proc_e = mess_ptr->IO_ENDPT;
r = sendrec(task_nr, mess_ptr); r = sendrec(task_nr, mess_ptr);
if(r == OK && mess_ptr->REP_STATUS == ERESTART) r = EDEADSRCDST; if(r == OK && mess_ptr->REP_STATUS == ERESTART) r = EDEADEPT;
if (r != OK) { if (r != OK) {
if (r == EDEADSRCDST) { if (r == EDEADSRCDST || r == EDEADEPT) {
printf("fs: dead driver %d\n", task_nr); printf("fs: dead driver %d\n", task_nr);
panic("should handle crashed drivers"); panic("should handle crashed drivers");
/* dmap_unmap_by_endpt(task_nr); */ /* dmap_unmap_by_endpt(task_nr); */

View File

@ -175,7 +175,7 @@ PUBLIC int block_dev_io(
/* See if driver is roughly valid. */ /* See if driver is roughly valid. */
if (driver_e == NONE) { if (driver_e == NONE) {
printf("MFS(%d) block_dev_io: no driver for dev %x\n", SELF_E, dev); printf("MFS(%d) block_dev_io: no driver for dev %x\n", SELF_E, dev);
return(EDEADSRCDST); return(EDEADEPT);
} }
/* The io vector copying relies on this I/O being for FS itself. */ /* The io vector copying relies on this I/O being for FS itself. */
@ -205,7 +205,7 @@ PUBLIC int block_dev_io(
/* Call the task. */ /* Call the task. */
r = sendrec(driver_e, &m); r = sendrec(driver_e, &m);
if(r == OK && m.REP_STATUS == ERESTART) r = EDEADSRCDST; if(r == OK && m.REP_STATUS == ERESTART) r = EDEADEPT;
/* As block I/O never SUSPENDs, safe cleanup must be done whether /* As block I/O never SUSPENDs, safe cleanup must be done whether
* the I/O succeeded or not. */ * the I/O succeeded or not. */
@ -217,7 +217,7 @@ PUBLIC int block_dev_io(
* - VFS sends the new driver endp for the FS proc and the request again * - VFS sends the new driver endp for the FS proc and the request again
*/ */
if (r != OK) { if (r != OK) {
if (r == EDEADSRCDST) { if (r == EDEADSRCDST || r == EDEADEPT) {
printf("MFS(%d) dead driver %d\n", SELF_E, driver_e); printf("MFS(%d) dead driver %d\n", SELF_E, driver_e);
driver_endpoints[major(dev)].driver_e = NONE; driver_endpoints[major(dev)].driver_e = NONE;
return(r); return(r);
@ -331,10 +331,10 @@ PRIVATE int gen_io(
r = sendrec(task_nr, mess_ptr); r = sendrec(task_nr, mess_ptr);
if(r == OK && mess_ptr->REP_STATUS == ERESTART) if(r == OK && mess_ptr->REP_STATUS == ERESTART)
r = EDEADSRCDST; r = EDEADEPT;
if (r != OK) { if (r != OK) {
if (r == EDEADSRCDST) { if (r == EDEADSRCDST || r == EDEADEPT) {
printf("fs: dead driver %d\n", task_nr); printf("fs: dead driver %d\n", task_nr);
panic("should handle crashed drivers"); panic("should handle crashed drivers");
return(r); return(r);

View File

@ -222,14 +222,14 @@ PUBLIC int process_ksig(endpoint_t proc_nr_e, int signo)
if(pm_isokendpt(proc_nr_e, &proc_nr) != OK || proc_nr < 0) { if(pm_isokendpt(proc_nr_e, &proc_nr) != OK || proc_nr < 0) {
printf("PM: process_ksig: %d?? not ok\n", proc_nr_e); printf("PM: process_ksig: %d?? not ok\n", proc_nr_e);
return EDEADSRCDST; /* process is gone. */ return EDEADEPT; /* process is gone. */
} }
rmp = &mproc[proc_nr]; rmp = &mproc[proc_nr];
if ((rmp->mp_flags & (IN_USE | EXITING)) != IN_USE) { if ((rmp->mp_flags & (IN_USE | EXITING)) != IN_USE) {
#if 0 #if 0
printf("PM: process_ksig: %d?? exiting / not in use\n", proc_nr_e); printf("PM: process_ksig: %d?? exiting / not in use\n", proc_nr_e);
#endif #endif
return EDEADSRCDST; /* process is gone. */ return EDEADEPT; /* process is gone. */
} }
proc_id = rmp->mp_pid; proc_id = rmp->mp_pid;
mp = &mproc[0]; /* pretend signals are from PM */ mp = &mproc[0]; /* pretend signals are from PM */
@ -287,7 +287,7 @@ PUBLIC int process_ksig(endpoint_t proc_nr_e, int signo)
return OK; /* signal has been delivered */ return OK; /* signal has been delivered */
} }
else { else {
return EDEADSRCDST; /* process is gone */ return EDEADEPT; /* process is gone */
} }
} }

View File

@ -111,9 +111,9 @@ PUBLIC int pm_isokendpt(int endpoint, int *proc)
if(*proc < -NR_TASKS || *proc >= NR_PROCS) if(*proc < -NR_TASKS || *proc >= NR_PROCS)
return EINVAL; return EINVAL;
if(*proc >= 0 && endpoint != mproc[*proc].mp_endpoint) if(*proc >= 0 && endpoint != mproc[*proc].mp_endpoint)
return EDEADSRCDST; return EDEADEPT;
if(*proc >= 0 && !(mproc[*proc].mp_flags & IN_USE)) if(*proc >= 0 && !(mproc[*proc].mp_flags & IN_USE))
return EDEADSRCDST; return EDEADEPT;
return OK; return OK;
} }

View File

@ -526,7 +526,7 @@ PRIVATE int sef_cb_signal_manager(endpoint_t target, int signo)
/* Don't bother if a termination signal has already been processed. */ /* Don't bother if a termination signal has already been processed. */
if((rp->r_flags & RS_TERMINATED) && !(rp->r_flags & RS_EXITING)) { if((rp->r_flags & RS_TERMINATED) && !(rp->r_flags & RS_EXITING)) {
return EDEADSRCDST; /* process is gone */ return EDEADEPT; /* process is gone */
} }
/* Ignore external signals for inactive service instances. */ /* Ignore external signals for inactive service instances. */
@ -551,7 +551,7 @@ PRIVATE int sef_cb_signal_manager(endpoint_t target, int signo)
rp->r_flags |= RS_TERMINATED; rp->r_flags |= RS_TERMINATED;
terminate_service(rp); terminate_service(rp);
return EDEADSRCDST; /* process is now gone */ return EDEADEPT; /* process is now gone */
} }
/* Translate every non-termination signal into a message. */ /* Translate every non-termination signal into a message. */

View File

@ -857,7 +857,7 @@ PUBLIC void terminate_service(struct rproc *rp)
} }
/* See if a late reply has to be sent. */ /* See if a late reply has to be sent. */
r = (rp->r_caller_request == RS_DOWN ? OK : EDEADSRCDST); r = (rp->r_caller_request == RS_DOWN ? OK : EDEADEPT);
late_reply(rp, r); late_reply(rp, r);
/* Unpublish the service. */ /* Unpublish the service. */

View File

@ -35,7 +35,7 @@ PUBLIC int do_noquantum(message *m_ptr)
if (sched_isokendpt(m_ptr->m_source, &proc_nr_n) != OK) { if (sched_isokendpt(m_ptr->m_source, &proc_nr_n) != OK) {
printf("SCHED: WARNING: got an invalid endpoint in OOQ msg %u.\n", printf("SCHED: WARNING: got an invalid endpoint in OOQ msg %u.\n",
m_ptr->m_source); m_ptr->m_source);
return EBADSRCDST; return EBADEPT;
} }
rmp = &schedproc[proc_nr_n]; rmp = &schedproc[proc_nr_n];
@ -64,7 +64,7 @@ PUBLIC int do_stop_scheduling(message *m_ptr)
if (sched_isokendpt(m_ptr->SCHEDULING_ENDPOINT, &proc_nr_n) != OK) { if (sched_isokendpt(m_ptr->SCHEDULING_ENDPOINT, &proc_nr_n) != OK) {
printf("SCHED: WARNING: got an invalid endpoint in OOQ msg %u.\n", printf("SCHED: WARNING: got an invalid endpoint in OOQ msg %u.\n",
m_ptr->SCHEDULING_ENDPOINT); m_ptr->SCHEDULING_ENDPOINT);
return EBADSRCDST; return EBADEPT;
} }
rmp = &schedproc[proc_nr_n]; rmp = &schedproc[proc_nr_n];
@ -168,7 +168,7 @@ PUBLIC int do_nice(message *m_ptr)
if (sched_isokendpt(m_ptr->SCHEDULING_ENDPOINT, &proc_nr_n) != OK) { if (sched_isokendpt(m_ptr->SCHEDULING_ENDPOINT, &proc_nr_n) != OK) {
printf("SCHED: WARNING: got an invalid endpoint in OOQ msg %u.\n", printf("SCHED: WARNING: got an invalid endpoint in OOQ msg %u.\n",
m_ptr->SCHEDULING_ENDPOINT); m_ptr->SCHEDULING_ENDPOINT);
return EBADSRCDST; return EBADEPT;
} }
rmp = &schedproc[proc_nr_n]; rmp = &schedproc[proc_nr_n];

View File

@ -32,13 +32,13 @@ PUBLIC int sched_isokendpt(int endpoint, int *proc)
{ {
*proc = _ENDPOINT_P(endpoint); *proc = _ENDPOINT_P(endpoint);
if (*proc < 0) if (*proc < 0)
return (EBADSRCDST); /* Don't schedule tasks */ return (EBADEPT); /* Don't schedule tasks */
if(*proc >= NR_PROCS) if(*proc >= NR_PROCS)
return (EINVAL); return (EINVAL);
if(endpoint != schedproc[*proc].endpoint) if(endpoint != schedproc[*proc].endpoint)
return (EDEADSRCDST); return (EDEADEPT);
if(!(schedproc[*proc].flags & IN_USE)) if(!(schedproc[*proc].flags & IN_USE))
return (EDEADSRCDST); return (EDEADEPT);
return (OK); return (OK);
} }
@ -49,11 +49,11 @@ PUBLIC int sched_isemtyendpt(int endpoint, int *proc)
{ {
*proc = _ENDPOINT_P(endpoint); *proc = _ENDPOINT_P(endpoint);
if (*proc < 0) if (*proc < 0)
return (EBADSRCDST); /* Don't schedule tasks */ return (EBADEPT); /* Don't schedule tasks */
if(*proc >= NR_PROCS) if(*proc >= NR_PROCS)
return (EINVAL); return (EINVAL);
if(schedproc[*proc].flags & IN_USE) if(schedproc[*proc].flags & IN_USE)
return (EDEADSRCDST); return (EDEADEPT);
return (OK); return (OK);
} }

View File

@ -159,10 +159,10 @@ PUBLIC void dev_status(message *m)
int r; int r;
st.m_type = DEV_STATUS; st.m_type = DEV_STATUS;
r = sendrec(m->m_source, &st); r = sendrec(m->m_source, &st);
if(r == OK && st.REP_STATUS == ERESTART) r = EDEADSRCDST; if(r == OK && st.REP_STATUS == ERESTART) r = EDEADEPT;
if (r != OK) { if (r != OK) {
printf("DEV_STATUS failed to %d: %d\n", m->m_source, r); printf("DEV_STATUS failed to %d: %d\n", m->m_source, r);
if (r == EDEADSRCDST) return; if (r == EDEADSRCDST || r == EDEADEPT) return;
panic("couldn't sendrec for DEV_STATUS: %d", r); panic("couldn't sendrec for DEV_STATUS: %d", r);
} }
@ -625,9 +625,9 @@ message *mess_ptr; /* pointer to message for task */
proc_e = mess_ptr->IO_ENDPT; proc_e = mess_ptr->IO_ENDPT;
r = sendrec(task_nr, mess_ptr); r = sendrec(task_nr, mess_ptr);
if(r == OK && mess_ptr->REP_STATUS == ERESTART) r = EDEADSRCDST; if(r == OK && mess_ptr->REP_STATUS == ERESTART) r = EDEADEPT;
if (r != OK) { if (r != OK) {
if (r == EDEADSRCDST) { if (r == EDEADSRCDST || r == EDEADEPT) {
printf("fs: dead driver %d\n", task_nr); printf("fs: dead driver %d\n", task_nr);
dmap_unmap_by_endpt(task_nr); dmap_unmap_by_endpt(task_nr);
return(r); return(r);

View File

@ -115,7 +115,7 @@ PUBLIC int isokendpt_f(char *file, int line, endpoint_t endpoint, int *proc, int
if(failed && fatal) if(failed && fatal)
panic("isokendpt_f failed"); panic("isokendpt_f failed");
return(failed ? EDEADSRCDST : OK); return(failed ? EDEADEPT : OK);
} }

View File

@ -127,9 +127,9 @@ PUBLIC int vm_isokendpt(endpoint_t endpoint, int *proc)
if(*proc < 0 || *proc >= NR_PROCS) if(*proc < 0 || *proc >= NR_PROCS)
return EINVAL; return EINVAL;
if(*proc >= 0 && endpoint != vmproc[*proc].vm_endpoint) if(*proc >= 0 && endpoint != vmproc[*proc].vm_endpoint)
return EDEADSRCDST; return EDEADEPT;
if(*proc >= 0 && !(vmproc[*proc].vm_flags & VMF_INUSE)) if(*proc >= 0 && !(vmproc[*proc].vm_flags & VMF_INUSE))
return EDEADSRCDST; return EDEADEPT;
return OK; return OK;
} }