 aba392e630
			
		
	
	
		aba392e630
		
	
	
	
	
		
			
			- Remove redundant code. - Always wait for the initial reply from an asynchronous select request, even if the select has been satisfied on another file descriptor or was canceled due to a serious error. - Restart asynchronous selects if upon reply from the driver turns out that there are deferred operations (and do not forget we're still interested in the results of the deferred operations). - Do not hang a non-blocking select when another blocking select on the same filp is still blocking. - Split blocking operations in read, write, and exceptions (i.e., blocking on read does not imply the write will block as well). - Some loops would iterate over OPEN_MAX file descriptors instead of the "highest" file descriptor. - Use proper internal error return values. - A secondary reply from a synchronous driver is essentially the same as from an asynchronous driver (the only difference being how the answer is received). Merge. - Return proper error code after a driver failure. - Auto-detect whether a driver is synchronous or asynchronous. - Remove some code duplication. - Clean up code (coding style, add missing comments, put all select related code together).
		
			
				
	
	
		
			46 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.6 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_state;		/* state for crash recovery */
 | |
|   int filp_count;		/* how many file descriptors share this slot?*/
 | |
|   struct vnode *filp_vno;	/* vnode belonging to this file */
 | |
|   u64_t filp_pos;		/* file position */
 | |
| 
 | |
|   /* 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).
 | |
|    */
 | |
|   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 */
 | |
| 
 | |
| #define FS_NORMAL	0	/* file descriptor can be used normally */
 | |
| #define FS_NEEDS_REOPEN	1	/* file descriptor needs to be re-opened */
 | |
| 
 | |
| #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
 | |
| 
 |