cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xfs_inode.h (16175B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
      4 * All Rights Reserved.
      5 */
      6#ifndef	__XFS_INODE_H__
      7#define	__XFS_INODE_H__
      8
      9#include "xfs_inode_buf.h"
     10#include "xfs_inode_fork.h"
     11
     12/*
     13 * Kernel only inode definitions
     14 */
     15struct xfs_dinode;
     16struct xfs_inode;
     17struct xfs_buf;
     18struct xfs_bmbt_irec;
     19struct xfs_inode_log_item;
     20struct xfs_mount;
     21struct xfs_trans;
     22struct xfs_dquot;
     23
     24typedef struct xfs_inode {
     25	/* Inode linking and identification information. */
     26	struct xfs_mount	*i_mount;	/* fs mount struct ptr */
     27	struct xfs_dquot	*i_udquot;	/* user dquot */
     28	struct xfs_dquot	*i_gdquot;	/* group dquot */
     29	struct xfs_dquot	*i_pdquot;	/* project dquot */
     30
     31	/* Inode location stuff */
     32	xfs_ino_t		i_ino;		/* inode number (agno/agino)*/
     33	struct xfs_imap		i_imap;		/* location for xfs_imap() */
     34
     35	/* Extent information. */
     36	struct xfs_ifork	*i_afp;		/* attribute fork pointer */
     37	struct xfs_ifork	*i_cowfp;	/* copy on write extents */
     38	struct xfs_ifork	i_df;		/* data fork */
     39
     40	/* Transaction and locking information. */
     41	struct xfs_inode_log_item *i_itemp;	/* logging information */
     42	mrlock_t		i_lock;		/* inode lock */
     43	atomic_t		i_pincount;	/* inode pin count */
     44	struct llist_node	i_gclist;	/* deferred inactivation list */
     45
     46	/*
     47	 * Bitsets of inode metadata that have been checked and/or are sick.
     48	 * Callers must hold i_flags_lock before accessing this field.
     49	 */
     50	uint16_t		i_checked;
     51	uint16_t		i_sick;
     52
     53	spinlock_t		i_flags_lock;	/* inode i_flags lock */
     54	/* Miscellaneous state. */
     55	unsigned long		i_flags;	/* see defined flags below */
     56	uint64_t		i_delayed_blks;	/* count of delay alloc blks */
     57	xfs_fsize_t		i_disk_size;	/* number of bytes in file */
     58	xfs_rfsblock_t		i_nblocks;	/* # of direct & btree blocks */
     59	prid_t			i_projid;	/* owner's project id */
     60	xfs_extlen_t		i_extsize;	/* basic/minimum extent size */
     61	/* cowextsize is only used for v3 inodes, flushiter for v1/2 */
     62	union {
     63		xfs_extlen_t	i_cowextsize;	/* basic cow extent size */
     64		uint16_t	i_flushiter;	/* incremented on flush */
     65	};
     66	uint8_t			i_forkoff;	/* attr fork offset >> 3 */
     67	uint16_t		i_diflags;	/* XFS_DIFLAG_... */
     68	uint64_t		i_diflags2;	/* XFS_DIFLAG2_... */
     69	struct timespec64	i_crtime;	/* time created */
     70
     71	/* VFS inode */
     72	struct inode		i_vnode;	/* embedded VFS inode */
     73
     74	/* pending io completions */
     75	spinlock_t		i_ioend_lock;
     76	struct work_struct	i_ioend_work;
     77	struct list_head	i_ioend_list;
     78} xfs_inode_t;
     79
     80/* Convert from vfs inode to xfs inode */
     81static inline struct xfs_inode *XFS_I(struct inode *inode)
     82{
     83	return container_of(inode, struct xfs_inode, i_vnode);
     84}
     85
     86/* convert from xfs inode to vfs inode */
     87static inline struct inode *VFS_I(struct xfs_inode *ip)
     88{
     89	return &ip->i_vnode;
     90}
     91
     92/*
     93 * For regular files we only update the on-disk filesize when actually
     94 * writing data back to disk.  Until then only the copy in the VFS inode
     95 * is uptodate.
     96 */
     97static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip)
     98{
     99	if (S_ISREG(VFS_I(ip)->i_mode))
    100		return i_size_read(VFS_I(ip));
    101	return ip->i_disk_size;
    102}
    103
    104/*
    105 * If this I/O goes past the on-disk inode size update it unless it would
    106 * be past the current in-core inode size.
    107 */
    108static inline xfs_fsize_t
    109xfs_new_eof(struct xfs_inode *ip, xfs_fsize_t new_size)
    110{
    111	xfs_fsize_t i_size = i_size_read(VFS_I(ip));
    112
    113	if (new_size > i_size || new_size < 0)
    114		new_size = i_size;
    115	return new_size > ip->i_disk_size ? new_size : 0;
    116}
    117
    118/*
    119 * i_flags helper functions
    120 */
    121static inline void
    122__xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
    123{
    124	ip->i_flags |= flags;
    125}
    126
    127static inline void
    128xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
    129{
    130	spin_lock(&ip->i_flags_lock);
    131	__xfs_iflags_set(ip, flags);
    132	spin_unlock(&ip->i_flags_lock);
    133}
    134
    135static inline void
    136xfs_iflags_clear(xfs_inode_t *ip, unsigned short flags)
    137{
    138	spin_lock(&ip->i_flags_lock);
    139	ip->i_flags &= ~flags;
    140	spin_unlock(&ip->i_flags_lock);
    141}
    142
    143static inline int
    144__xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
    145{
    146	return (ip->i_flags & flags);
    147}
    148
    149static inline int
    150xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
    151{
    152	int ret;
    153	spin_lock(&ip->i_flags_lock);
    154	ret = __xfs_iflags_test(ip, flags);
    155	spin_unlock(&ip->i_flags_lock);
    156	return ret;
    157}
    158
    159static inline int
    160xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags)
    161{
    162	int ret;
    163
    164	spin_lock(&ip->i_flags_lock);
    165	ret = ip->i_flags & flags;
    166	if (ret)
    167		ip->i_flags &= ~flags;
    168	spin_unlock(&ip->i_flags_lock);
    169	return ret;
    170}
    171
    172static inline int
    173xfs_iflags_test_and_set(xfs_inode_t *ip, unsigned short flags)
    174{
    175	int ret;
    176
    177	spin_lock(&ip->i_flags_lock);
    178	ret = ip->i_flags & flags;
    179	if (!ret)
    180		ip->i_flags |= flags;
    181	spin_unlock(&ip->i_flags_lock);
    182	return ret;
    183}
    184
    185static inline prid_t
    186xfs_get_initial_prid(struct xfs_inode *dp)
    187{
    188	if (dp->i_diflags & XFS_DIFLAG_PROJINHERIT)
    189		return dp->i_projid;
    190
    191	return XFS_PROJID_DEFAULT;
    192}
    193
    194static inline bool xfs_is_reflink_inode(struct xfs_inode *ip)
    195{
    196	return ip->i_diflags2 & XFS_DIFLAG2_REFLINK;
    197}
    198
    199static inline bool xfs_is_metadata_inode(struct xfs_inode *ip)
    200{
    201	struct xfs_mount	*mp = ip->i_mount;
    202
    203	return ip == mp->m_rbmip || ip == mp->m_rsumip ||
    204		xfs_is_quota_inode(&mp->m_sb, ip->i_ino);
    205}
    206
    207/*
    208 * Check if an inode has any data in the COW fork.  This might be often false
    209 * even for inodes with the reflink flag when there is no pending COW operation.
    210 */
    211static inline bool xfs_inode_has_cow_data(struct xfs_inode *ip)
    212{
    213	return ip->i_cowfp && ip->i_cowfp->if_bytes;
    214}
    215
    216static inline bool xfs_inode_has_bigtime(struct xfs_inode *ip)
    217{
    218	return ip->i_diflags2 & XFS_DIFLAG2_BIGTIME;
    219}
    220
    221static inline bool xfs_inode_has_large_extent_counts(struct xfs_inode *ip)
    222{
    223	return ip->i_diflags2 & XFS_DIFLAG2_NREXT64;
    224}
    225
    226/*
    227 * Return the buftarg used for data allocations on a given inode.
    228 */
    229#define xfs_inode_buftarg(ip) \
    230	(XFS_IS_REALTIME_INODE(ip) ? \
    231		(ip)->i_mount->m_rtdev_targp : (ip)->i_mount->m_ddev_targp)
    232
    233/*
    234 * In-core inode flags.
    235 */
    236#define XFS_IRECLAIM		(1 << 0) /* started reclaiming this inode */
    237#define XFS_ISTALE		(1 << 1) /* inode has been staled */
    238#define XFS_IRECLAIMABLE	(1 << 2) /* inode can be reclaimed */
    239#define XFS_INEW		(1 << 3) /* inode has just been allocated */
    240#define XFS_IPRESERVE_DM_FIELDS	(1 << 4) /* has legacy DMAPI fields set */
    241#define XFS_ITRUNCATED		(1 << 5) /* truncated down so flush-on-close */
    242#define XFS_IDIRTY_RELEASE	(1 << 6) /* dirty release already seen */
    243#define XFS_IFLUSHING		(1 << 7) /* inode is being flushed */
    244#define __XFS_IPINNED_BIT	8	 /* wakeup key for zero pin count */
    245#define XFS_IPINNED		(1 << __XFS_IPINNED_BIT)
    246#define XFS_IEOFBLOCKS		(1 << 9) /* has the preallocblocks tag set */
    247#define XFS_NEED_INACTIVE	(1 << 10) /* see XFS_INACTIVATING below */
    248/*
    249 * If this unlinked inode is in the middle of recovery, don't let drop_inode
    250 * truncate and free the inode.  This can happen if we iget the inode during
    251 * log recovery to replay a bmap operation on the inode.
    252 */
    253#define XFS_IRECOVERY		(1 << 11)
    254#define XFS_ICOWBLOCKS		(1 << 12)/* has the cowblocks tag set */
    255
    256/*
    257 * If we need to update on-disk metadata before this IRECLAIMABLE inode can be
    258 * freed, then NEED_INACTIVE will be set.  Once we start the updates, the
    259 * INACTIVATING bit will be set to keep iget away from this inode.  After the
    260 * inactivation completes, both flags will be cleared and the inode is a
    261 * plain old IRECLAIMABLE inode.
    262 */
    263#define XFS_INACTIVATING	(1 << 13)
    264
    265/* All inode state flags related to inode reclaim. */
    266#define XFS_ALL_IRECLAIM_FLAGS	(XFS_IRECLAIMABLE | \
    267				 XFS_IRECLAIM | \
    268				 XFS_NEED_INACTIVE | \
    269				 XFS_INACTIVATING)
    270
    271/*
    272 * Per-lifetime flags need to be reset when re-using a reclaimable inode during
    273 * inode lookup. This prevents unintended behaviour on the new inode from
    274 * ocurring.
    275 */
    276#define XFS_IRECLAIM_RESET_FLAGS	\
    277	(XFS_IRECLAIMABLE | XFS_IRECLAIM | \
    278	 XFS_IDIRTY_RELEASE | XFS_ITRUNCATED | XFS_NEED_INACTIVE | \
    279	 XFS_INACTIVATING)
    280
    281/*
    282 * Flags for inode locking.
    283 * Bit ranges:	1<<1  - 1<<16-1 -- iolock/ilock modes (bitfield)
    284 *		1<<16 - 1<<32-1 -- lockdep annotation (integers)
    285 */
    286#define	XFS_IOLOCK_EXCL		(1u << 0)
    287#define	XFS_IOLOCK_SHARED	(1u << 1)
    288#define	XFS_ILOCK_EXCL		(1u << 2)
    289#define	XFS_ILOCK_SHARED	(1u << 3)
    290#define	XFS_MMAPLOCK_EXCL	(1u << 4)
    291#define	XFS_MMAPLOCK_SHARED	(1u << 5)
    292
    293#define XFS_LOCK_MASK		(XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \
    294				| XFS_ILOCK_EXCL | XFS_ILOCK_SHARED \
    295				| XFS_MMAPLOCK_EXCL | XFS_MMAPLOCK_SHARED)
    296
    297#define XFS_LOCK_FLAGS \
    298	{ XFS_IOLOCK_EXCL,	"IOLOCK_EXCL" }, \
    299	{ XFS_IOLOCK_SHARED,	"IOLOCK_SHARED" }, \
    300	{ XFS_ILOCK_EXCL,	"ILOCK_EXCL" }, \
    301	{ XFS_ILOCK_SHARED,	"ILOCK_SHARED" }, \
    302	{ XFS_MMAPLOCK_EXCL,	"MMAPLOCK_EXCL" }, \
    303	{ XFS_MMAPLOCK_SHARED,	"MMAPLOCK_SHARED" }
    304
    305
    306/*
    307 * Flags for lockdep annotations.
    308 *
    309 * XFS_LOCK_PARENT - for directory operations that require locking a
    310 * parent directory inode and a child entry inode. IOLOCK requires nesting,
    311 * MMAPLOCK does not support this class, ILOCK requires a single subclass
    312 * to differentiate parent from child.
    313 *
    314 * XFS_LOCK_RTBITMAP/XFS_LOCK_RTSUM - the realtime device bitmap and summary
    315 * inodes do not participate in the normal lock order, and thus have their
    316 * own subclasses.
    317 *
    318 * XFS_LOCK_INUMORDER - for locking several inodes at the some time
    319 * with xfs_lock_inodes().  This flag is used as the starting subclass
    320 * and each subsequent lock acquired will increment the subclass by one.
    321 * However, MAX_LOCKDEP_SUBCLASSES == 8, which means we are greatly
    322 * limited to the subclasses we can represent via nesting. We need at least
    323 * 5 inodes nest depth for the ILOCK through rename, and we also have to support
    324 * XFS_ILOCK_PARENT, which gives 6 subclasses. Then we have XFS_ILOCK_RTBITMAP
    325 * and XFS_ILOCK_RTSUM, which are another 2 unique subclasses, so that's all
    326 * 8 subclasses supported by lockdep.
    327 *
    328 * This also means we have to number the sub-classes in the lowest bits of
    329 * the mask we keep, and we have to ensure we never exceed 3 bits of lockdep
    330 * mask and we can't use bit-masking to build the subclasses. What a mess.
    331 *
    332 * Bit layout:
    333 *
    334 * Bit		Lock Region
    335 * 16-19	XFS_IOLOCK_SHIFT dependencies
    336 * 20-23	XFS_MMAPLOCK_SHIFT dependencies
    337 * 24-31	XFS_ILOCK_SHIFT dependencies
    338 *
    339 * IOLOCK values
    340 *
    341 * 0-3		subclass value
    342 * 4-7		unused
    343 *
    344 * MMAPLOCK values
    345 *
    346 * 0-3		subclass value
    347 * 4-7		unused
    348 *
    349 * ILOCK values
    350 * 0-4		subclass values
    351 * 5		PARENT subclass (not nestable)
    352 * 6		RTBITMAP subclass (not nestable)
    353 * 7		RTSUM subclass (not nestable)
    354 * 
    355 */
    356#define XFS_IOLOCK_SHIFT		16
    357#define XFS_IOLOCK_MAX_SUBCLASS		3
    358#define XFS_IOLOCK_DEP_MASK		0x000f0000u
    359
    360#define XFS_MMAPLOCK_SHIFT		20
    361#define XFS_MMAPLOCK_NUMORDER		0
    362#define XFS_MMAPLOCK_MAX_SUBCLASS	3
    363#define XFS_MMAPLOCK_DEP_MASK		0x00f00000u
    364
    365#define XFS_ILOCK_SHIFT			24
    366#define XFS_ILOCK_PARENT_VAL		5u
    367#define XFS_ILOCK_MAX_SUBCLASS		(XFS_ILOCK_PARENT_VAL - 1)
    368#define XFS_ILOCK_RTBITMAP_VAL		6u
    369#define XFS_ILOCK_RTSUM_VAL		7u
    370#define XFS_ILOCK_DEP_MASK		0xff000000u
    371#define	XFS_ILOCK_PARENT		(XFS_ILOCK_PARENT_VAL << XFS_ILOCK_SHIFT)
    372#define	XFS_ILOCK_RTBITMAP		(XFS_ILOCK_RTBITMAP_VAL << XFS_ILOCK_SHIFT)
    373#define	XFS_ILOCK_RTSUM			(XFS_ILOCK_RTSUM_VAL << XFS_ILOCK_SHIFT)
    374
    375#define XFS_LOCK_SUBCLASS_MASK	(XFS_IOLOCK_DEP_MASK | \
    376				 XFS_MMAPLOCK_DEP_MASK | \
    377				 XFS_ILOCK_DEP_MASK)
    378
    379#define XFS_IOLOCK_DEP(flags)	(((flags) & XFS_IOLOCK_DEP_MASK) \
    380					>> XFS_IOLOCK_SHIFT)
    381#define XFS_MMAPLOCK_DEP(flags)	(((flags) & XFS_MMAPLOCK_DEP_MASK) \
    382					>> XFS_MMAPLOCK_SHIFT)
    383#define XFS_ILOCK_DEP(flags)	(((flags) & XFS_ILOCK_DEP_MASK) \
    384					>> XFS_ILOCK_SHIFT)
    385
    386/*
    387 * Layouts are broken in the BREAK_WRITE case to ensure that
    388 * layout-holders do not collide with local writes. Additionally,
    389 * layouts are broken in the BREAK_UNMAP case to make sure the
    390 * layout-holder has a consistent view of the file's extent map. While
    391 * BREAK_WRITE breaks can be satisfied by recalling FL_LAYOUT leases,
    392 * BREAK_UNMAP breaks additionally require waiting for busy dax-pages to
    393 * go idle.
    394 */
    395enum layout_break_reason {
    396        BREAK_WRITE,
    397        BREAK_UNMAP,
    398};
    399
    400/*
    401 * For multiple groups support: if S_ISGID bit is set in the parent
    402 * directory, group of new file is set to that of the parent, and
    403 * new subdirectory gets S_ISGID bit from parent.
    404 */
    405#define XFS_INHERIT_GID(pip)	\
    406	(xfs_has_grpid((pip)->i_mount) || (VFS_I(pip)->i_mode & S_ISGID))
    407
    408int		xfs_release(struct xfs_inode *ip);
    409void		xfs_inactive(struct xfs_inode *ip);
    410int		xfs_lookup(struct xfs_inode *dp, const struct xfs_name *name,
    411			   struct xfs_inode **ipp, struct xfs_name *ci_name);
    412int		xfs_create(struct user_namespace *mnt_userns,
    413			   struct xfs_inode *dp, struct xfs_name *name,
    414			   umode_t mode, dev_t rdev, bool need_xattr,
    415			   struct xfs_inode **ipp);
    416int		xfs_create_tmpfile(struct user_namespace *mnt_userns,
    417			   struct xfs_inode *dp, umode_t mode,
    418			   struct xfs_inode **ipp);
    419int		xfs_remove(struct xfs_inode *dp, struct xfs_name *name,
    420			   struct xfs_inode *ip);
    421int		xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip,
    422			 struct xfs_name *target_name);
    423int		xfs_rename(struct user_namespace *mnt_userns,
    424			   struct xfs_inode *src_dp, struct xfs_name *src_name,
    425			   struct xfs_inode *src_ip, struct xfs_inode *target_dp,
    426			   struct xfs_name *target_name,
    427			   struct xfs_inode *target_ip, unsigned int flags);
    428
    429void		xfs_ilock(xfs_inode_t *, uint);
    430int		xfs_ilock_nowait(xfs_inode_t *, uint);
    431void		xfs_iunlock(xfs_inode_t *, uint);
    432void		xfs_ilock_demote(xfs_inode_t *, uint);
    433bool		xfs_isilocked(struct xfs_inode *, uint);
    434uint		xfs_ilock_data_map_shared(struct xfs_inode *);
    435uint		xfs_ilock_attr_map_shared(struct xfs_inode *);
    436
    437uint		xfs_ip2xflags(struct xfs_inode *);
    438int		xfs_ifree(struct xfs_trans *, struct xfs_inode *);
    439int		xfs_itruncate_extents_flags(struct xfs_trans **,
    440				struct xfs_inode *, int, xfs_fsize_t, int);
    441void		xfs_iext_realloc(xfs_inode_t *, int, int);
    442
    443int		xfs_log_force_inode(struct xfs_inode *ip);
    444void		xfs_iunpin_wait(xfs_inode_t *);
    445#define xfs_ipincount(ip)	((unsigned int) atomic_read(&ip->i_pincount))
    446
    447int		xfs_iflush_cluster(struct xfs_buf *);
    448void		xfs_lock_two_inodes(struct xfs_inode *ip0, uint ip0_mode,
    449				struct xfs_inode *ip1, uint ip1_mode);
    450
    451xfs_extlen_t	xfs_get_extsz_hint(struct xfs_inode *ip);
    452xfs_extlen_t	xfs_get_cowextsz_hint(struct xfs_inode *ip);
    453
    454int xfs_init_new_inode(struct user_namespace *mnt_userns, struct xfs_trans *tp,
    455		struct xfs_inode *pip, xfs_ino_t ino, umode_t mode,
    456		xfs_nlink_t nlink, dev_t rdev, prid_t prid, bool init_xattrs,
    457		struct xfs_inode **ipp);
    458
    459static inline int
    460xfs_itruncate_extents(
    461	struct xfs_trans	**tpp,
    462	struct xfs_inode	*ip,
    463	int			whichfork,
    464	xfs_fsize_t		new_size)
    465{
    466	return xfs_itruncate_extents_flags(tpp, ip, whichfork, new_size, 0);
    467}
    468
    469/* from xfs_file.c */
    470int	xfs_break_layouts(struct inode *inode, uint *iolock,
    471		enum layout_break_reason reason);
    472
    473/* from xfs_iops.c */
    474extern void xfs_setup_inode(struct xfs_inode *ip);
    475extern void xfs_setup_iops(struct xfs_inode *ip);
    476extern void xfs_diflags_to_iflags(struct xfs_inode *ip, bool init);
    477
    478/*
    479 * When setting up a newly allocated inode, we need to call
    480 * xfs_finish_inode_setup() once the inode is fully instantiated at
    481 * the VFS level to prevent the rest of the world seeing the inode
    482 * before we've completed instantiation. Otherwise we can do it
    483 * the moment the inode lookup is complete.
    484 */
    485static inline void xfs_finish_inode_setup(struct xfs_inode *ip)
    486{
    487	xfs_iflags_clear(ip, XFS_INEW);
    488	barrier();
    489	unlock_new_inode(VFS_I(ip));
    490}
    491
    492static inline void xfs_setup_existing_inode(struct xfs_inode *ip)
    493{
    494	xfs_setup_inode(ip);
    495	xfs_setup_iops(ip);
    496	xfs_finish_inode_setup(ip);
    497}
    498
    499void xfs_irele(struct xfs_inode *ip);
    500
    501extern struct kmem_cache	*xfs_inode_cache;
    502
    503/* The default CoW extent size hint. */
    504#define XFS_DEFAULT_COWEXTSZ_HINT 32
    505
    506bool xfs_inode_needs_inactive(struct xfs_inode *ip);
    507
    508int xfs_iunlink_init(struct xfs_perag *pag);
    509void xfs_iunlink_destroy(struct xfs_perag *pag);
    510
    511void xfs_end_io(struct work_struct *work);
    512
    513int xfs_ilock2_io_mmap(struct xfs_inode *ip1, struct xfs_inode *ip2);
    514void xfs_iunlock2_io_mmap(struct xfs_inode *ip1, struct xfs_inode *ip2);
    515
    516#endif	/* __XFS_INODE_H__ */