diff options
Diffstat (limited to 'include/linux/fs.h')
| -rw-r--r-- | include/linux/fs.h | 59 | 
1 files changed, 41 insertions, 18 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index 760d8da1b6c7..d78d146a98da 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -36,6 +36,7 @@  #include <linux/delayed_call.h>  #include <linux/uuid.h>  #include <linux/errseq.h> +#include <linux/ioprio.h>  #include <asm/byteorder.h>  #include <uapi/linux/fs.h> @@ -94,7 +95,7 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset,  /*   * flags in file.f_mode.  Note that FMODE_READ and FMODE_WRITE must correspond - * to O_WRONLY and O_RDWR via the strange trick in __dentry_open() + * to O_WRONLY and O_RDWR via the strange trick in do_dentry_open()   */  /* file is open for reading */ @@ -206,9 +207,9 @@ struct iattr {  	kuid_t		ia_uid;  	kgid_t		ia_gid;  	loff_t		ia_size; -	struct timespec	ia_atime; -	struct timespec	ia_mtime; -	struct timespec	ia_ctime; +	struct timespec64 ia_atime; +	struct timespec64 ia_mtime; +	struct timespec64 ia_ctime;  	/*  	 * Not an attribute, but an auxiliary info for filesystems wanting to @@ -299,7 +300,8 @@ struct kiocb {  	void (*ki_complete)(struct kiocb *iocb, long ret, long ret2);  	void			*private;  	int			ki_flags; -	enum rw_hint		ki_hint; +	u16			ki_hint; +	u16			ki_ioprio; /* See linux/ioprio.h */  } __randomize_layout;  static inline bool is_sync_kiocb(struct kiocb *kiocb) @@ -602,9 +604,9 @@ struct inode {  	};  	dev_t			i_rdev;  	loff_t			i_size; -	struct timespec		i_atime; -	struct timespec		i_mtime; -	struct timespec		i_ctime; +	struct timespec64	i_atime; +	struct timespec64	i_mtime; +	struct timespec64	i_ctime;  	spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */  	unsigned short          i_bytes;  	unsigned int		i_blkbits; @@ -1091,7 +1093,7 @@ extern int vfs_lock_file(struct file *, unsigned int, struct file_lock *, struct  extern int vfs_cancel_lock(struct file *filp, struct file_lock *fl);  extern int locks_lock_inode_wait(struct inode *inode, struct file_lock *fl);  extern int __break_lease(struct inode *inode, unsigned int flags, unsigned int type); -extern void lease_get_mtime(struct inode *, struct timespec *time); +extern void lease_get_mtime(struct inode *, struct timespec64 *time);  extern int generic_setlease(struct file *, long, struct file_lock **, void **priv);  extern int vfs_setlease(struct file *, long, struct file_lock **, void **);  extern int lease_modify(struct file_lock *, int, struct list_head *); @@ -1206,7 +1208,8 @@ static inline int __break_lease(struct inode *inode, unsigned int mode, unsigned  	return 0;  } -static inline void lease_get_mtime(struct inode *inode, struct timespec *time) +static inline void lease_get_mtime(struct inode *inode, +				   struct timespec64 *time)  {  	return;  } @@ -1250,7 +1253,7 @@ static inline int locks_lock_file_wait(struct file *filp, struct file_lock *fl)  }  struct fasync_struct { -	spinlock_t		fa_lock; +	rwlock_t		fa_lock;  	int			magic;  	int			fa_fd;  	struct fasync_struct	*fa_next; /* singly linked list */ @@ -1364,9 +1367,9 @@ struct super_block {  	void                    *s_security;  #endif  	const struct xattr_handler **s_xattr; - +#if IS_ENABLED(CONFIG_FS_ENCRYPTION)  	const struct fscrypt_operations	*s_cop; - +#endif  	struct hlist_bl_head	s_roots;	/* alternate root dentries for NFS */  	struct list_head	s_mounts;	/* list of mounts; _not_ for fs use */  	struct block_device	*s_bdev; @@ -1476,7 +1479,8 @@ static inline void i_gid_write(struct inode *inode, gid_t gid)  	inode->i_gid = make_kgid(inode->i_sb->s_user_ns, gid);  } -extern struct timespec current_time(struct inode *inode); +extern struct timespec64 timespec64_trunc(struct timespec64 t, unsigned gran); +extern struct timespec64 current_time(struct inode *inode);  /*   * Snapshotting support. @@ -1597,6 +1601,11 @@ static inline void sb_start_intwrite(struct super_block *sb)  	__sb_start_write(sb, SB_FREEZE_FS, true);  } +static inline int sb_start_intwrite_trylock(struct super_block *sb) +{ +	return __sb_start_write(sb, SB_FREEZE_FS, false); +} +  extern bool inode_owner_or_capable(const struct inode *inode); @@ -1764,7 +1773,7 @@ struct inode_operations {  	ssize_t (*listxattr) (struct dentry *, char *, size_t);  	int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,  		      u64 len); -	int (*update_time)(struct inode *, struct timespec *, int); +	int (*update_time)(struct inode *, struct timespec64 *, int);  	int (*atomic_open)(struct inode *, struct dentry *,  			   struct file *, unsigned open_flag,  			   umode_t create_mode, int *opened); @@ -1927,12 +1936,22 @@ static inline enum rw_hint file_write_hint(struct file *file)  static inline int iocb_flags(struct file *file); +static inline u16 ki_hint_validate(enum rw_hint hint) +{ +	typeof(((struct kiocb *)0)->ki_hint) max_hint = -1; + +	if (hint <= max_hint) +		return hint; +	return 0; +} +  static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp)  {  	*kiocb = (struct kiocb) {  		.ki_filp = filp,  		.ki_flags = iocb_flags(filp), -		.ki_hint = file_write_hint(filp), +		.ki_hint = ki_hint_validate(file_write_hint(filp)), +		.ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0),  	};  } @@ -2198,7 +2217,7 @@ extern int current_umask(void);  extern void ihold(struct inode * inode);  extern void iput(struct inode *); -extern int generic_update_time(struct inode *, struct timespec *, int); +extern int generic_update_time(struct inode *, struct timespec64 *, int);  /* /sys/fs */  extern struct kobject *fs_kobj; @@ -2570,7 +2589,7 @@ extern bool is_bad_inode(struct inode *);  #ifdef CONFIG_BLOCK  extern void check_disk_size_change(struct gendisk *disk, -				   struct block_device *bdev); +		struct block_device *bdev, bool verbose);  extern int revalidate_disk(struct gendisk *);  extern int check_disk_change(struct block_device *);  extern int __invalidate_device(struct block_device *, bool); @@ -2879,6 +2898,10 @@ extern struct inode *ilookup5(struct super_block *sb, unsigned long hashval,  		int (*test)(struct inode *, void *), void *data);  extern struct inode *ilookup(struct super_block *sb, unsigned long ino); +extern struct inode *inode_insert5(struct inode *inode, unsigned long hashval, +		int (*test)(struct inode *, void *), +		int (*set)(struct inode *, void *), +		void *data);  extern struct inode * iget5_locked(struct super_block *, unsigned long, int (*test)(struct inode *, void *), int (*set)(struct inode *, void *), void *);  extern struct inode * iget_locked(struct super_block *, unsigned long);  extern struct inode *find_inode_nowait(struct super_block *,  |