diff options
Diffstat (limited to 'include/linux/fs.h')
| -rw-r--r-- | include/linux/fs.h | 140 | 
1 files changed, 88 insertions, 52 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index b1bcb275b59..3428393942a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -60,24 +60,24 @@ struct inodes_stat_t {   */  /* file is open for reading */ -#define FMODE_READ		((__force fmode_t)1) +#define FMODE_READ		((__force fmode_t)0x1)  /* file is open for writing */ -#define FMODE_WRITE		((__force fmode_t)2) +#define FMODE_WRITE		((__force fmode_t)0x2)  /* file is seekable */ -#define FMODE_LSEEK		((__force fmode_t)4) +#define FMODE_LSEEK		((__force fmode_t)0x4)  /* file can be accessed using pread */ -#define FMODE_PREAD		((__force fmode_t)8) +#define FMODE_PREAD		((__force fmode_t)0x8)  /* file can be accessed using pwrite */ -#define FMODE_PWRITE		((__force fmode_t)16) +#define FMODE_PWRITE		((__force fmode_t)0x10)  /* File is opened for execution with sys_execve / sys_uselib */ -#define FMODE_EXEC		((__force fmode_t)32) +#define FMODE_EXEC		((__force fmode_t)0x20)  /* File is opened with O_NDELAY (only set for block devices) */ -#define FMODE_NDELAY		((__force fmode_t)64) +#define FMODE_NDELAY		((__force fmode_t)0x40)  /* File is opened with O_EXCL (only set for block devices) */ -#define FMODE_EXCL		((__force fmode_t)128) +#define FMODE_EXCL		((__force fmode_t)0x80)  /* File is opened using open(.., 3, ..) and is writeable only for ioctls     (specialy hack for floppy.c) */ -#define FMODE_WRITE_IOCTL	((__force fmode_t)256) +#define FMODE_WRITE_IOCTL	((__force fmode_t)0x100)  /*   * Don't update ctime and mtime. @@ -85,7 +85,10 @@ struct inodes_stat_t {   * Currently a special hack for the XFS open_by_handle ioctl, but we'll   * hopefully graduate it to a proper O_CMTIME flag supported by open(2) soon.   */ -#define FMODE_NOCMTIME		((__force fmode_t)2048) +#define FMODE_NOCMTIME		((__force fmode_t)0x800) + +/* Expect random access pattern */ +#define FMODE_RANDOM		((__force fmode_t)0x1000)  /*   * The below are the various read and write types that we support. Some of @@ -648,6 +651,7 @@ struct block_device {  	int			bd_openers;  	struct mutex		bd_mutex;	/* open/close mutex */  	struct list_head	bd_inodes; +	void *			bd_claiming;  	void *			bd_holder;  	int			bd_holders;  #ifdef CONFIG_SYSFS @@ -729,6 +733,7 @@ struct inode {  	uid_t			i_uid;  	gid_t			i_gid;  	dev_t			i_rdev; +	unsigned int		i_blkbits;  	u64			i_version;  	loff_t			i_size;  #ifdef __NEED_I_SIZE_ORDERED @@ -738,7 +743,6 @@ struct inode {  	struct timespec		i_mtime;  	struct timespec		i_ctime;  	blkcnt_t		i_blocks; -	unsigned int		i_blkbits;  	unsigned short          i_bytes;  	umode_t			i_mode;  	spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */ @@ -950,6 +954,7 @@ extern spinlock_t files_lock;  #define file_list_unlock() spin_unlock(&files_lock);  #define get_file(x)	atomic_long_inc(&(x)->f_count) +#define fput_atomic(x)	atomic_long_add_unless(&(x)->f_count, -1, 1)  #define file_count(x)	atomic_long_read(&(x)->f_count)  #ifdef CONFIG_DEBUG_WRITECOUNT @@ -1277,10 +1282,12 @@ static inline int lock_may_write(struct inode *inode, loff_t start,  struct fasync_struct { -	int	magic; -	int	fa_fd; -	struct	fasync_struct	*fa_next; /* singly linked list */ -	struct	file 		*fa_file; +	spinlock_t		fa_lock; +	int			magic; +	int			fa_fd; +	struct fasync_struct	*fa_next; /* singly linked list */ +	struct file		*fa_file; +	struct rcu_head		fa_rcu;  };  #define FASYNC_MAGIC 0x4601 @@ -1289,8 +1296,6 @@ struct fasync_struct {  extern int fasync_helper(int, struct file *, int, struct fasync_struct **);  /* can be called from interrupts */  extern void kill_fasync(struct fasync_struct **, int, int); -/* only for net: no internal synchronization */ -extern void __kill_fasync(struct fasync_struct *, int, int);  extern int __f_setown(struct file *filp, struct pid *, enum pid_type, int force);  extern int f_setown(struct file *filp, unsigned long arg, int force); @@ -1305,18 +1310,18 @@ extern int send_sigurg(struct fown_struct *fown);  #define MNT_FORCE	0x00000001	/* Attempt to forcibily umount */  #define MNT_DETACH	0x00000002	/* Just detach from the tree */  #define MNT_EXPIRE	0x00000004	/* Mark for expiry */ +#define UMOUNT_NOFOLLOW	0x00000008	/* Don't follow symlink on umount */ +#define UMOUNT_UNUSED	0x80000000	/* Flag guaranteed to be unused */  extern struct list_head super_blocks;  extern spinlock_t sb_lock; -#define sb_entry(list)  list_entry((list), struct super_block, s_list) -#define S_BIAS (1<<30)  struct super_block {  	struct list_head	s_list;		/* Keep this first */  	dev_t			s_dev;		/* search index; _not_ kdev_t */ -	unsigned long		s_blocksize; -	unsigned char		s_blocksize_bits;  	unsigned char		s_dirt; +	unsigned char		s_blocksize_bits; +	unsigned long		s_blocksize;  	loff_t			s_maxbytes;	/* Max file size */  	struct file_system_type	*s_type;  	const struct super_operations	*s_op; @@ -1329,12 +1334,11 @@ struct super_block {  	struct rw_semaphore	s_umount;  	struct mutex		s_lock;  	int			s_count; -	int			s_need_sync;  	atomic_t		s_active;  #ifdef CONFIG_SECURITY  	void                    *s_security;  #endif -	struct xattr_handler	**s_xattr; +	const struct xattr_handler **s_xattr;  	struct list_head	s_inodes;	/* all inodes */  	struct hlist_head	s_anon;		/* anonymous dentries for (nfs) exporting */ @@ -1357,16 +1361,16 @@ struct super_block {  	void 			*s_fs_info;	/* Filesystem private info */  	fmode_t			s_mode; +	/* Granularity of c/m/atime in ns. +	   Cannot be worse than a second */ +	u32		   s_time_gran; +  	/*  	 * The next field is for VFS *only*. No filesystems have any business  	 * even looking at it. You had been warned.  	 */  	struct mutex s_vfs_rename_mutex;	/* Kludge */ -	/* Granularity of c/m/atime in ns. -	   Cannot be worse than a second */ -	u32		   s_time_gran; -  	/*  	 * Filesystem subtype.  If non-empty the filesystem type field  	 * in /proc/mounts will be "type.subtype" @@ -1426,7 +1430,8 @@ extern void dentry_unhash(struct dentry *dentry);   * VFS file helper functions.   */  extern int file_permission(struct file *, int); - +extern void inode_init_owner(struct inode *inode, const struct inode *dir, +			mode_t mode);  /*   * VFS FS_IOC_FIEMAP helper definitions.   */ @@ -1493,7 +1498,7 @@ struct file_operations {  	int (*open) (struct inode *, struct file *);  	int (*flush) (struct file *, fl_owner_t id);  	int (*release) (struct inode *, struct file *); -	int (*fsync) (struct file *, struct dentry *, int datasync); +	int (*fsync) (struct file *, int datasync);  	int (*aio_fsync) (struct kiocb *, int datasync);  	int (*fasync) (int, struct file *, int);  	int (*lock) (struct file *, int, struct file_lock *); @@ -1555,7 +1560,7 @@ struct super_operations {  	void (*destroy_inode)(struct inode *);     	void (*dirty_inode) (struct inode *); -	int (*write_inode) (struct inode *, int); +	int (*write_inode) (struct inode *, struct writeback_control *wbc);  	void (*drop_inode) (struct inode *);  	void (*delete_inode) (struct inode *);  	void (*put_super) (struct super_block *); @@ -1739,6 +1744,7 @@ struct file_system_type {  	struct lock_class_key s_lock_key;  	struct lock_class_key s_umount_key; +	struct lock_class_key s_vfs_rename_key;  	struct lock_class_key i_lock_key;  	struct lock_class_key i_mutex_key; @@ -1776,8 +1782,6 @@ extern int get_sb_pseudo(struct file_system_type *, char *,  	const struct super_operations *ops, unsigned long,  	struct vfsmount *mnt);  extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb); -int __put_super_and_need_restart(struct super_block *sb); -void put_super(struct super_block *sb);  /* Alas, no aliases. Too much hassle with bringing module.h everywhere */  #define fops_get(fops) \ @@ -1794,8 +1798,11 @@ extern int may_umount(struct vfsmount *);  extern long do_mount(char *, char *, char *, unsigned long, void *);  extern struct vfsmount *collect_mounts(struct path *);  extern void drop_collected_mounts(struct vfsmount *); - +extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *, +			  struct vfsmount *);  extern int vfs_statfs(struct dentry *, struct kstatfs *); +extern int freeze_super(struct super_block *super); +extern int thaw_super(struct super_block *super);  extern int current_umask(void); @@ -2058,12 +2065,6 @@ extern int invalidate_inodes(struct super_block *);  unsigned long invalidate_mapping_pages(struct address_space *mapping,  					pgoff_t start, pgoff_t end); -static inline unsigned long __deprecated -invalidate_inode_pages(struct address_space *mapping) -{ -	return invalidate_mapping_pages(mapping, 0, ~0UL); -} -  static inline void invalidate_remote_inode(struct inode *inode)  {  	if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || @@ -2087,9 +2088,9 @@ extern int __filemap_fdatawrite_range(struct address_space *mapping,  extern int filemap_fdatawrite_range(struct address_space *mapping,  				loff_t start, loff_t end); -extern int vfs_fsync_range(struct file *file, struct dentry *dentry, -			   loff_t start, loff_t end, int datasync); -extern int vfs_fsync(struct file *file, struct dentry *dentry, int datasync); +extern int vfs_fsync_range(struct file *file, loff_t start, loff_t end, +			   int datasync); +extern int vfs_fsync(struct file *file, int datasync);  extern int generic_write_sync(struct file *file, loff_t pos, loff_t count);  extern void sync_supers(void);  extern void emergency_sync(void); @@ -2132,6 +2133,7 @@ extern struct file * open_exec(const char *);  /* fs/dcache.c -- generic fs support functions */  extern int is_subdir(struct dentry *, struct dentry *); +extern int path_is_under(struct path *, struct path *);  extern ino_t find_inode_number(struct dentry *, struct qstr *);  #include <linux/err.h> @@ -2211,6 +2213,7 @@ extern int generic_segment_checks(const struct iovec *iov,  /* fs/block_dev.c */  extern ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov,  				unsigned long nr_segs, loff_t pos); +extern int blkdev_fsync(struct file *filp, int datasync);  /* fs/splice.c */  extern ssize_t generic_file_splice_read(struct file *, loff_t *, @@ -2226,6 +2229,7 @@ extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,  extern void  file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping); +extern loff_t noop_llseek(struct file *file, loff_t offset, int origin);  extern loff_t no_llseek(struct file *file, loff_t offset, int origin);  extern loff_t generic_file_llseek(struct file *file, loff_t offset, int origin);  extern loff_t generic_file_llseek_unlocked(struct file *file, loff_t offset, @@ -2248,10 +2252,19 @@ static inline int xip_truncate_page(struct address_space *mapping, loff_t from)  #endif  #ifdef CONFIG_BLOCK +struct bio; +typedef void (dio_submit_t)(int rw, struct bio *bio, struct inode *inode, +			    loff_t file_offset); +void dio_end_io(struct bio *bio, int error); + +ssize_t __blockdev_direct_IO_newtrunc(int rw, struct kiocb *iocb, struct inode *inode, +	struct block_device *bdev, const struct iovec *iov, loff_t offset, +	unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, +	dio_submit_t submit_io, int lock_type);  ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,  	struct block_device *bdev, const struct iovec *iov, loff_t offset,  	unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, -	int lock_type); +	dio_submit_t submit_io,	int lock_type);  enum {  	/* need locking between buffered and direct access */ @@ -2261,13 +2274,31 @@ enum {  	DIO_SKIP_HOLES	= 0x02,  }; +static inline ssize_t blockdev_direct_IO_newtrunc(int rw, struct kiocb *iocb, +	struct inode *inode, struct block_device *bdev, const struct iovec *iov, +	loff_t offset, unsigned long nr_segs, get_block_t get_block, +	dio_iodone_t end_io) +{ +	return __blockdev_direct_IO_newtrunc(rw, iocb, inode, bdev, iov, offset, +				    nr_segs, get_block, end_io, NULL, +				    DIO_LOCKING | DIO_SKIP_HOLES); +} + +static inline ssize_t blockdev_direct_IO_no_locking_newtrunc(int rw, struct kiocb *iocb, +	struct inode *inode, struct block_device *bdev, const struct iovec *iov, +	loff_t offset, unsigned long nr_segs, get_block_t get_block, +	dio_iodone_t end_io) +{ +	return __blockdev_direct_IO_newtrunc(rw, iocb, inode, bdev, iov, offset, +				nr_segs, get_block, end_io, NULL, 0); +}  static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb,  	struct inode *inode, struct block_device *bdev, const struct iovec *iov,  	loff_t offset, unsigned long nr_segs, get_block_t get_block,  	dio_iodone_t end_io)  {  	return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, -				    nr_segs, get_block, end_io, +				    nr_segs, get_block, end_io, NULL,  				    DIO_LOCKING | DIO_SKIP_HOLES);  } @@ -2277,7 +2308,7 @@ static inline ssize_t blockdev_direct_IO_no_locking(int rw, struct kiocb *iocb,  	dio_iodone_t end_io)  {  	return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, -				nr_segs, get_block, end_io, 0); +				    nr_segs, get_block, end_io, NULL, 0);  }  #endif @@ -2313,8 +2344,9 @@ 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);  extern int __generic_block_fiemap(struct inode *inode, -				  struct fiemap_extent_info *fieinfo, u64 start, -				  u64 len, get_block_t *get_block); +				  struct fiemap_extent_info *fieinfo, +				  loff_t start, loff_t len, +				  get_block_t *get_block);  extern int generic_block_fiemap(struct inode *inode,  				struct fiemap_extent_info *fieinfo, u64 start,  				u64 len, get_block_t *get_block); @@ -2326,22 +2358,23 @@ extern struct super_block *get_super(struct block_device *);  extern struct super_block *get_active_super(struct block_device *bdev);  extern struct super_block *user_get_super(dev_t);  extern void drop_super(struct super_block *sb); +extern void iterate_supers(void (*)(struct super_block *, void *), void *);  extern int dcache_dir_open(struct inode *, struct file *);  extern int dcache_dir_close(struct inode *, struct file *);  extern loff_t dcache_dir_lseek(struct file *, loff_t, int);  extern int dcache_readdir(struct file *, void *, filldir_t); +extern int simple_setattr(struct dentry *, struct iattr *);  extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *);  extern int simple_statfs(struct dentry *, struct kstatfs *);  extern int simple_link(struct dentry *, struct inode *, struct dentry *);  extern int simple_unlink(struct inode *, struct dentry *);  extern int simple_rmdir(struct inode *, struct dentry *);  extern int simple_rename(struct inode *, struct dentry *, struct inode *, struct dentry *); -extern int simple_sync_file(struct file *, struct dentry *, int); +extern int simple_setsize(struct inode *, loff_t); +extern int noop_fsync(struct file *, int);  extern int simple_empty(struct dentry *);  extern int simple_readpage(struct file *file, struct page *page); -extern int simple_prepare_write(struct file *file, struct page *page, -			unsigned offset, unsigned to);  extern int simple_write_begin(struct file *file, struct address_space *mapping,  			loff_t pos, unsigned len, unsigned flags,  			struct page **pagep, void **fsdata); @@ -2361,8 +2394,10 @@ extern void simple_release_fs(struct vfsmount **mount, int *count);  extern ssize_t simple_read_from_buffer(void __user *to, size_t count,  			loff_t *ppos, const void *from, size_t available); +extern ssize_t simple_write_to_buffer(void *to, size_t available, loff_t *ppos, +		const void __user *from, size_t count); -extern int simple_fsync(struct file *, struct dentry *, int); +extern int generic_file_fsync(struct file *, int);  #ifdef CONFIG_MIGRATION  extern int buffer_migrate_page(struct address_space *, @@ -2373,7 +2408,8 @@ extern int buffer_migrate_page(struct address_space *,  extern int inode_change_ok(const struct inode *, struct iattr *);  extern int inode_newsize_ok(const struct inode *, loff_t offset); -extern int __must_check inode_setattr(struct inode *, struct iattr *); +extern int __must_check inode_setattr(struct inode *, const struct iattr *); +extern void generic_setattr(struct inode *inode, const struct iattr *attr);  extern void file_update_time(struct file *file);  |