Previously, VFS would reopen a character device after a driver crash if the associated file descriptor was opened with the O_REOPEN flag. This patch removes support for this feature. The code was complex, full of uncovered corner cases, and hard to test. Moreover, it did not actually hide the crash from user applications: they would get an error code to indicate that something went wrong, and have to decide based on the nature of the underlying device how to continue. - remove support for O_REOPEN, and make playwave(1) reopen its device; - remove support for the DEV_REOPEN protocol message; - remove all code in VFS related to reopening character devices; - no longer change VFS filp reference count and FD bitmap upon filp invalidation; instead, make get_filp* fail all calls on invalidated FDs except when obtained with the locktype VNODE_OPCL which is used by close_fd only; - remove the VFS fproc file descriptor bitmap entirely, returning to the situation that a FD is in use if its slot points to a filp; use FILP_CLOSED as single means of marking a filp as invalidated. Change-Id: I34f6bc69a036b3a8fc667c1f80435ff3af56558f
45 lines
1.7 KiB
C
45 lines
1.7 KiB
C
#ifndef __VFS_FILE_H__
|
|
#define __VFS_FILE_H__
|
|
|
|
/* This is the filp table. It is an intermediary between file descriptors and
|
|
* inodes. A slot is free if filp_count == 0.
|
|
*/
|
|
|
|
EXTERN struct filp {
|
|
mode_t filp_mode; /* RW bits, telling how file is opened */
|
|
int filp_flags; /* flags from open and fcntl */
|
|
int filp_count; /* how many file descriptors share this slot?*/
|
|
struct vnode *filp_vno; /* vnode belonging to this file */
|
|
off_t filp_pos; /* file position */
|
|
mutex_t filp_lock; /* lock to gain exclusive access */
|
|
struct fproc *filp_softlock; /* if not NULL; this filp didn't lock the
|
|
* vnode. Another filp already holds a lock
|
|
* for this thread */
|
|
|
|
/* the following fields are for select() and are owned by the generic
|
|
* select() code (i.e., fd-type-specific select() code can't touch these).
|
|
* These fields may be changed without holding the filp lock.
|
|
*/
|
|
int filp_selectors; /* select()ing processes blocking on this fd */
|
|
int filp_select_ops; /* interested in these SEL_* operations */
|
|
int filp_select_flags; /* Select flags for the filp */
|
|
|
|
/* following are for fd-type-specific select() */
|
|
int filp_pipe_select_ops;
|
|
} filp[NR_FILPS];
|
|
|
|
#define FILP_CLOSED 0 /* filp_mode: associated device closed/gone */
|
|
|
|
#define FSF_UPDATE 001 /* The driver should be informed about new
|
|
* state.
|
|
*/
|
|
#define FSF_BUSY 002 /* Select operation sent to driver but no
|
|
* reply yet.
|
|
*/
|
|
#define FSF_RD_BLOCK 010 /* Read request is blocking, the driver should
|
|
* keep state.
|
|
*/
|
|
#define FSF_WR_BLOCK 020 /* Write request is blocking */
|
|
#define FSF_ERR_BLOCK 040 /* Exception request is blocking */
|
|
#define FSF_BLOCKED 070
|
|
#endif
|