. unmap device drivers from dmap when PM signals they are dead
	. new null-io function (no_dev_io) to fill in for io functions
	  of unmapped drivers
	. driver (process number) of unmapped drivers is NONE instead of
	  0 (a valid process number)

IS:
	. print mutable flag of dmap table too

FS changes require sync() to be done 'manually' (currently by
reboot/shutdown) at shutdown time; could be caught by SIGTERM in
the future.
This commit is contained in:
Ben Gras 2005-10-05 15:38:15 +00:00
parent a369d9c828
commit 86ed54ee94
5 changed files with 69 additions and 16 deletions

View File

@ -9,6 +9,7 @@
* gen_opcl: generic call to a task to perform an open/close
* gen_io: generic call to a task to perform an I/O operation
* no_dev: open/close processing for devices that don't exist
* no_dev_io: i/o processing for devices that don't exist
* tty_opcl: perform tty-specific processing for open/close
* ctty_opcl: perform controlling-tty-specific processing for open/close
* ctty_io: perform controlling-tty-specific processing for I/O
@ -49,6 +50,8 @@ int flags; /* mode bits and flags */
dp = &dmap[major];
r = (*dp->dmap_opcl)(DEV_OPEN, dev, proc, flags);
if (r == SUSPEND) panic(__FILE__,"suspend on open from", dp->dmap_driver);
if (r == OK && dp->dmap_driver == NONE)
panic(__FILE__, "no driver for dev %d", dev);
return(r);
}
@ -120,6 +123,10 @@ int flags; /* special flags, like O_NONBLOCK */
/* Determine task dmap. */
dp = &dmap[(dev >> MAJOR) & BYTE];
/* See if driver is roughly valid. */
if (dp->dmap_driver == NONE)
panic(__FILE__, "no driver for i/o on dev %d", dev);
/* Set up the message passed to task. */
dev_mess.m_type = op;
dev_mess.DEVICE = (dev >> MINOR) & BYTE;
@ -347,7 +354,7 @@ message *mess_ptr; /* pointer to message for task */
*/
for (;;) {
if (r != OK) {
if (r == EDEADDST) return; /* give up */
if (r == EDEADSRCDST) return; /* give up */
else panic(__FILE__,"call_task: can't send/receive", r);
}
@ -404,10 +411,19 @@ int proc; /* process to open/close for */
int flags; /* mode bits and flags */
{
/* Called when opening a nonexistent device. */
return(ENODEV);
}
/*===========================================================================*
* no_dev_io *
*===========================================================================*/
PUBLIC void no_dev_io(int proc, message *m)
{
/* Called when doing i/o on a nonexistent device. */
printf("FS: I/O on unmapped device number\n");
return;
}
/*===========================================================================*
* clone_opcl *
*===========================================================================*/

View File

@ -97,19 +97,23 @@ int style; /* style of the device */
/* Get pointer to device entry in the dmap table. */
if (major < 0 || major >= NR_DEVICES) return(ENODEV);
dp = &dmap[major];
/* Check if we're supposed to unmap it. If so, do it even
* if busy or unmutable, as unmap is called when driver has
* exited.
*/
if(proc_nr == NONE) {
dp->dmap_opcl = no_dev;
dp->dmap_io = no_dev_io;
dp->dmap_driver = NONE;
dp->dmap_flags = DMAP_MUTABLE; /* When gone, not busy or reserved. */
return(OK);
}
/* See if updating the entry is allowed. */
if (! (dp->dmap_flags & DMAP_MUTABLE)) return(EPERM);
if (dp->dmap_flags & DMAP_BUSY) return(EBUSY);
/* Check if we're supposed to unmap it. */
if(proc_nr == NONE) {
dp->dmap_opcl = no_dev;
dp->dmap_io = 0;
dp->dmap_driver = 0;
return(OK);
}
/* Check process number of new driver. */
if (! isokprocnr(proc_nr)) return(EINVAL);
@ -125,6 +129,21 @@ int style; /* style of the device */
return(OK);
}
/*===========================================================================*
* dmap_unmap_by_proc *
*===========================================================================*/
PUBLIC void dmap_unmap_by_proc(int proc_nr)
{
int i, r;
for (i=0; i<NR_DEVICES; i++)
if(dmap[i].dmap_driver && dmap[i].dmap_driver == proc_nr)
if((r=map_driver(i, NONE, 0)) != OK)
printf("FS: unmap of p %d / d %d failed: %d\n", proc_nr, i, r);
return;
}
/*===========================================================================*
* build_dmap *
*===========================================================================*/
@ -152,8 +171,8 @@ PUBLIC void build_dmap()
dp->dmap_flags = init_dmap[i].dmap_flags;
} else { /* no default */
dp->dmap_opcl = no_dev;
dp->dmap_io = 0;
dp->dmap_driver = 0;
dp->dmap_io = no_dev_io;
dp->dmap_driver = NONE;
dp->dmap_flags = DMAP_MUTABLE;
}
}

View File

@ -339,6 +339,9 @@ PUBLIC int do_exit()
fp->fp_rootdir = NIL_INODE;
fp->fp_workdir = NIL_INODE;
/* If a driver exits, unmap its entries in the dmap table. */
dmap_unmap_by_proc(exitee);
/* If a session leader exits then revoke access to its controlling tty from
* all other processes using it.
*/
@ -369,6 +372,7 @@ PUBLIC int do_exit()
/* Mark slot as free. */
fp->fp_pid = PID_FREE;
return(OK);
}

View File

@ -35,6 +35,7 @@ _PROTOTYPE( int dev_io, (int op, Dev_t dev, int proc, void *buf,
_PROTOTYPE( int gen_opcl, (int op, Dev_t dev, int proc, int flags) );
_PROTOTYPE( void gen_io, (int task_nr, message *mess_ptr) );
_PROTOTYPE( int no_dev, (int op, Dev_t dev, int proc, int flags) );
_PROTOTYPE( void no_dev_io, (int, message *) );
_PROTOTYPE( int tty_opcl, (int op, Dev_t dev, int proc, int flags) );
_PROTOTYPE( int ctty_opcl, (int op, Dev_t dev, int proc, int flags) );
_PROTOTYPE( int clone_opcl, (int op, Dev_t dev, int proc, int flags) );
@ -50,6 +51,7 @@ _PROTOTYPE( int do_fkey_pressed, (void) );
_PROTOTYPE( int do_devctl, (void) );
_PROTOTYPE( void build_dmap, (void) );
_PROTOTYPE( int map_driver, (int major, int proc_nr, int dev_style) );
_PROTOTYPE( void dmap_unmap_by_proc, (int proc_nr) );
/* filedes.c */
_PROTOTYPE( struct filp *find_filp, (struct inode *rip, mode_t bits) );

View File

@ -48,6 +48,18 @@ PUBLIC void fproc_dmp()
prev_i = i;
}
/*===========================================================================*
* dmap_flags *
*===========================================================================*/
PRIVATE char * dmap_flags(int flags)
{
static char fl[10];
fl[0] = '-';
if(flags & DMAP_MUTABLE) fl[0] = 'M';
fl[1] = '\0';
return fl;
}
/*===========================================================================*
* dtab_dmp *
*===========================================================================*/
@ -58,12 +70,12 @@ PUBLIC void dtab_dmp()
getsysinfo(FS_PROC_NR, SI_DMAP_TAB, dmap);
printf("File System (FS) device <-> driver mappings\n");
printf("Major Proc\n");
printf("----- ----\n");
printf("Major Proc Flags\n");
printf("----- ---- -----\n");
for (i=0; i<NR_DEVICES; i++) {
if (dmap[i].dmap_driver == 0) continue;
printf("%5d ", i);
printf("%4d\n", dmap[i].dmap_driver);
printf("%5d %4d %s\n",
i, dmap[i].dmap_driver, dmap_flags(dmap[i].dmap_flags));
}
}