diff options
| author | David S. Miller <davem@davemloft.net> | 2009-05-18 21:08:20 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-05-18 21:08:20 -0700 | 
| commit | bb803cfbecb03a0cf8dc7e1864f18dda6631af00 (patch) | |
| tree | 6c0989693bea6f50cfa5c6bb14f52ec19668def3 /include/linux/fs.h | |
| parent | 3878fb6fdbceecca20b15748f807340854220f06 (diff) | |
| parent | 511e11e396dc596825ce04d53d7f6d579404bc01 (diff) | |
| download | olio-linux-3.10-bb803cfbecb03a0cf8dc7e1864f18dda6631af00.tar.xz olio-linux-3.10-bb803cfbecb03a0cf8dc7e1864f18dda6631af00.zip  | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
	drivers/scsi/fcoe/fcoe.c
Diffstat (limited to 'include/linux/fs.h')
| -rw-r--r-- | include/linux/fs.h | 73 | 
1 files changed, 64 insertions, 9 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index 562d2855cf3..3b534e527e0 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -87,6 +87,60 @@ struct inodes_stat_t {   */  #define FMODE_NOCMTIME		((__force fmode_t)2048) +/* + * The below are the various read and write types that we support. Some of + * them include behavioral modifiers that send information down to the + * block layer and IO scheduler. Terminology: + * + *	The block layer uses device plugging to defer IO a little bit, in + *	the hope that we will see more IO very shortly. This increases + *	coalescing of adjacent IO and thus reduces the number of IOs we + *	have to send to the device. It also allows for better queuing, + *	if the IO isn't mergeable. If the caller is going to be waiting + *	for the IO, then he must ensure that the device is unplugged so + *	that the IO is dispatched to the driver. + * + *	All IO is handled async in Linux. This is fine for background + *	writes, but for reads or writes that someone waits for completion + *	on, we want to notify the block layer and IO scheduler so that they + *	know about it. That allows them to make better scheduling + *	decisions. So when the below references 'sync' and 'async', it + *	is referencing this priority hint. + * + * With that in mind, the available types are: + * + * READ			A normal read operation. Device will be plugged. + * READ_SYNC		A synchronous read. Device is not plugged, caller can + *			immediately wait on this read without caring about + *			unplugging. + * READA		Used for read-ahead operations. Lower priority, and the + *			 block layer could (in theory) choose to ignore this + *			request if it runs into resource problems. + * WRITE		A normal async write. Device will be plugged. + * SWRITE		Like WRITE, but a special case for ll_rw_block() that + *			tells it to lock the buffer first. Normally a buffer + *			must be locked before doing IO. + * WRITE_SYNC_PLUG	Synchronous write. Identical to WRITE, but passes down + *			the hint that someone will be waiting on this IO + *			shortly. The device must still be unplugged explicitly, + *			WRITE_SYNC_PLUG does not do this as we could be + *			submitting more writes before we actually wait on any + *			of them. + * WRITE_SYNC		Like WRITE_SYNC_PLUG, but also unplugs the device + *			immediately after submission. The write equivalent + *			of READ_SYNC. + * WRITE_ODIRECT	Special case write for O_DIRECT only. + * SWRITE_SYNC + * SWRITE_SYNC_PLUG	Like WRITE_SYNC/WRITE_SYNC_PLUG, but locks the buffer. + *			See SWRITE. + * WRITE_BARRIER	Like WRITE, but tells the block layer that all + *			previously submitted writes must be safely on storage + *			before this one is started. Also guarantees that when + *			this write is complete, it itself is also safely on + *			storage. Prevents reordering of writes on both sides + *			of this IO. + * + */  #define RW_MASK		1  #define RWA_MASK	2  #define READ 0 @@ -102,6 +156,11 @@ struct inodes_stat_t {  			(SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE))  #define SWRITE_SYNC	(SWRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG))  #define WRITE_BARRIER	(WRITE | (1 << BIO_RW_BARRIER)) + +/* + * These aren't really reads or writes, they pass down information about + * parts of device that are now unused by the file system. + */  #define DISCARD_NOBARRIER (1 << BIO_RW_DISCARD)  #define DISCARD_BARRIER ((1 << BIO_RW_DISCARD) | (1 << BIO_RW_BARRIER)) @@ -738,9 +797,6 @@ enum inode_i_mutex_lock_class  	I_MUTEX_QUOTA  }; -extern void inode_double_lock(struct inode *inode1, struct inode *inode2); -extern void inode_double_unlock(struct inode *inode1, struct inode *inode2); -  /*   * NOTE: in a 32bit arch with a preemptable kernel and   * an UP compile the i_size_read/write must be atomic @@ -1719,6 +1775,7 @@ void kill_block_super(struct super_block *sb);  void kill_anon_super(struct super_block *sb);  void kill_litter_super(struct super_block *sb);  void deactivate_super(struct super_block *sb); +void deactivate_locked_super(struct super_block *sb);  int set_anon_super(struct super_block *s, void *data);  struct super_block *sget(struct file_system_type *type,  			int (*test)(struct super_block *,void *), @@ -2061,7 +2118,7 @@ extern struct file *create_write_pipe(int flags);  extern void free_write_pipe(struct file *);  extern struct file *do_filp_open(int dfd, const char *pathname, -		int open_flag, int mode); +		int open_flag, int mode, int acc_mode);  extern int may_open(struct path *, int, int);  extern int kernel_read(struct file *, unsigned long, char *, unsigned long); @@ -2150,8 +2207,6 @@ extern ssize_t generic_file_splice_read(struct file *, loff_t *,  		struct pipe_inode_info *, size_t, unsigned int);  extern ssize_t generic_file_splice_write(struct pipe_inode_info *,  		struct file *, loff_t *, size_t, unsigned int); -extern ssize_t generic_file_splice_write_nolock(struct pipe_inode_info *, -		struct file *, loff_t *, size_t, unsigned int);  extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe,  		struct file *out, loff_t *, size_t len, unsigned int flags);  extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, @@ -2245,9 +2300,8 @@ extern int vfs_readdir(struct file *, filldir_t, void *);  extern int vfs_stat(char __user *, struct kstat *);  extern int vfs_lstat(char __user *, struct kstat *); -extern int vfs_stat_fd(int dfd, char __user *, struct kstat *); -extern int vfs_lstat_fd(int dfd, char __user *, struct kstat *);  extern int vfs_fstat(unsigned int, struct kstat *); +extern int vfs_fstatat(int , char __user *, struct kstat *, int);  extern int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,  		    unsigned long arg); @@ -2314,6 +2368,7 @@ extern void file_update_time(struct file *file);  extern int generic_show_options(struct seq_file *m, struct vfsmount *mnt);  extern void save_mount_options(struct super_block *sb, char *options); +extern void replace_mount_options(struct super_block *sb, char *options);  static inline ino_t parent_ino(struct dentry *dentry)  { @@ -2395,7 +2450,7 @@ struct ctl_table;  int proc_nr_files(struct ctl_table *table, int write, struct file *filp,  		  void __user *buffer, size_t *lenp, loff_t *ppos); -int get_filesystem_list(char * buf); +int __init get_filesystem_list(char *buf);  #endif /* __KERNEL__ */  #endif /* _LINUX_FS_H */  |