diff options
Diffstat (limited to 'fs/xfs/xfs_inode.h')
| -rw-r--r-- | fs/xfs/xfs_inode.h | 64 | 
1 files changed, 44 insertions, 20 deletions
| diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 03944b6c5fba..b0de3d924d4c 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -65,6 +65,7 @@ typedef struct xfs_inode {  		uint16_t	i_flushiter;	/* incremented on flush */  	};  	uint8_t			i_forkoff;	/* attr fork offset >> 3 */ +	enum xfs_metafile_type	i_metatype;	/* XFS_METAFILE_* */  	uint16_t		i_diflags;	/* XFS_DIFLAG_... */  	uint64_t		i_diflags2;	/* XFS_DIFLAG2_... */  	struct timespec64	i_crtime;	/* time created */ @@ -100,7 +101,7 @@ static inline bool xfs_inode_on_unlinked_list(const struct xfs_inode *ip)  	return ip->i_prev_unlinked != 0;  } -static inline bool xfs_inode_has_attr_fork(struct xfs_inode *ip) +static inline bool xfs_inode_has_attr_fork(const struct xfs_inode *ip)  {  	return ip->i_forkoff > 0;  } @@ -271,23 +272,36 @@ xfs_iflags_test_and_set(xfs_inode_t *ip, unsigned long flags)  	return ret;  } -static inline bool xfs_is_reflink_inode(struct xfs_inode *ip) +static inline bool xfs_is_reflink_inode(const struct xfs_inode *ip)  {  	return ip->i_diflags2 & XFS_DIFLAG2_REFLINK;  } -static inline bool xfs_is_metadata_inode(const struct xfs_inode *ip) +static inline bool xfs_is_metadir_inode(const struct xfs_inode *ip) +{ +	return ip->i_diflags2 & XFS_DIFLAG2_METADATA; +} + +static inline bool xfs_is_internal_inode(const struct xfs_inode *ip)  {  	struct xfs_mount	*mp = ip->i_mount; +	/* Any file in the metadata directory tree is a metadata inode. */ +	if (xfs_has_metadir(mp)) +		return xfs_is_metadir_inode(ip); + +	/* +	 * Before metadata directories, the only metadata inodes were the +	 * three quota files, the realtime bitmap, and the realtime summary. +	 */  	return ip->i_ino == mp->m_sb.sb_rbmino ||  	       ip->i_ino == mp->m_sb.sb_rsumino ||  	       xfs_is_quota_inode(&mp->m_sb, ip->i_ino);  } -bool xfs_is_always_cow_inode(struct xfs_inode *ip); +bool xfs_is_always_cow_inode(const struct xfs_inode *ip); -static inline bool xfs_is_cow_inode(struct xfs_inode *ip) +static inline bool xfs_is_cow_inode(const struct xfs_inode *ip)  {  	return xfs_is_reflink_inode(ip) || xfs_is_always_cow_inode(ip);  } @@ -301,17 +315,17 @@ static inline bool xfs_inode_has_filedata(const struct xfs_inode *ip)   * Check if an inode has any data in the COW fork.  This might be often false   * even for inodes with the reflink flag when there is no pending COW operation.   */ -static inline bool xfs_inode_has_cow_data(struct xfs_inode *ip) +static inline bool xfs_inode_has_cow_data(const struct xfs_inode *ip)  {  	return ip->i_cowfp && ip->i_cowfp->if_bytes;  } -static inline bool xfs_inode_has_bigtime(struct xfs_inode *ip) +static inline bool xfs_inode_has_bigtime(const struct xfs_inode *ip)  {  	return ip->i_diflags2 & XFS_DIFLAG2_BIGTIME;  } -static inline bool xfs_inode_has_large_extent_counts(struct xfs_inode *ip) +static inline bool xfs_inode_has_large_extent_counts(const struct xfs_inode *ip)  {  	return ip->i_diflags2 & XFS_DIFLAG2_NREXT64;  } @@ -320,7 +334,7 @@ static inline bool xfs_inode_has_large_extent_counts(struct xfs_inode *ip)   * Decide if this file is a realtime file whose data allocation unit is larger   * than a single filesystem block.   */ -static inline bool xfs_inode_has_bigrtalloc(struct xfs_inode *ip) +static inline bool xfs_inode_has_bigrtalloc(const struct xfs_inode *ip)  {  	return XFS_IS_REALTIME_INODE(ip) && ip->i_mount->m_sb.sb_rextsize > 1;  } @@ -332,6 +346,21 @@ static inline bool xfs_inode_has_bigrtalloc(struct xfs_inode *ip)  	(XFS_IS_REALTIME_INODE(ip) ? \  		(ip)->i_mount->m_rtdev_targp : (ip)->i_mount->m_ddev_targp) +static inline bool +xfs_inode_can_atomicwrite( +	struct xfs_inode	*ip) +{ +	struct xfs_mount	*mp = ip->i_mount; +	struct xfs_buftarg	*target = xfs_inode_buftarg(ip); + +	if (mp->m_sb.sb_blocksize < target->bt_bdev_awu_min) +		return false; +	if (mp->m_sb.sb_blocksize > target->bt_bdev_awu_max) +		return false; + +	return true; +} +  /*   * In-core inode flags.   */ @@ -434,9 +463,8 @@ static inline bool xfs_inode_has_bigrtalloc(struct xfs_inode *ip)   * However, MAX_LOCKDEP_SUBCLASSES == 8, which means we are greatly   * limited to the subclasses we can represent via nesting. We need at least   * 5 inodes nest depth for the ILOCK through rename, and we also have to support - * XFS_ILOCK_PARENT, which gives 6 subclasses. Then we have XFS_ILOCK_RTBITMAP - * and XFS_ILOCK_RTSUM, which are another 2 unique subclasses, so that's all - * 8 subclasses supported by lockdep. + * XFS_ILOCK_PARENT, which gives 6 subclasses.  That's 6 of the 8 subclasses + * supported by lockdep.   *   * This also means we have to number the sub-classes in the lowest bits of   * the mask we keep, and we have to ensure we never exceed 3 bits of lockdep @@ -462,8 +490,8 @@ static inline bool xfs_inode_has_bigrtalloc(struct xfs_inode *ip)   * ILOCK values   * 0-4		subclass values   * 5		PARENT subclass (not nestable) - * 6		RTBITMAP subclass (not nestable) - * 7		RTSUM subclass (not nestable) + * 6		unused + * 7		unused   *    */  #define XFS_IOLOCK_SHIFT		16 @@ -478,12 +506,8 @@ static inline bool xfs_inode_has_bigrtalloc(struct xfs_inode *ip)  #define XFS_ILOCK_SHIFT			24  #define XFS_ILOCK_PARENT_VAL		5u  #define XFS_ILOCK_MAX_SUBCLASS		(XFS_ILOCK_PARENT_VAL - 1) -#define XFS_ILOCK_RTBITMAP_VAL		6u -#define XFS_ILOCK_RTSUM_VAL		7u  #define XFS_ILOCK_DEP_MASK		0xff000000u  #define	XFS_ILOCK_PARENT		(XFS_ILOCK_PARENT_VAL << XFS_ILOCK_SHIFT) -#define	XFS_ILOCK_RTBITMAP		(XFS_ILOCK_RTBITMAP_VAL << XFS_ILOCK_SHIFT) -#define	XFS_ILOCK_RTSUM			(XFS_ILOCK_RTSUM_VAL << XFS_ILOCK_SHIFT)  #define XFS_LOCK_SUBCLASS_MASK	(XFS_IOLOCK_DEP_MASK | \  				 XFS_MMAPLOCK_DEP_MASK | \ @@ -625,9 +649,9 @@ void xfs_sort_inodes(struct xfs_inode **i_tab, unsigned int num_inodes);  static inline bool  xfs_inode_unlinked_incomplete( -	struct xfs_inode	*ip) +	const struct xfs_inode	*ip)  { -	return VFS_I(ip)->i_nlink == 0 && !xfs_inode_on_unlinked_list(ip); +	return VFS_IC(ip)->i_nlink == 0 && !xfs_inode_on_unlinked_list(ip);  }  int xfs_inode_reload_unlinked_bucket(struct xfs_trans *tp, struct xfs_inode *ip);  int xfs_inode_reload_unlinked(struct xfs_inode *ip); | 
