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_alloc.h (9673B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
      4 * All Rights Reserved.
      5 */
      6#ifndef __XFS_ALLOC_H__
      7#define	__XFS_ALLOC_H__
      8
      9struct xfs_buf;
     10struct xfs_btree_cur;
     11struct xfs_mount;
     12struct xfs_perag;
     13struct xfs_trans;
     14
     15extern struct workqueue_struct *xfs_alloc_wq;
     16
     17unsigned int xfs_agfl_size(struct xfs_mount *mp);
     18
     19/*
     20 * Freespace allocation types.  Argument to xfs_alloc_[v]extent.
     21 */
     22#define XFS_ALLOCTYPE_FIRST_AG	0x02	/* ... start at ag 0 */
     23#define XFS_ALLOCTYPE_THIS_AG	0x08	/* anywhere in this a.g. */
     24#define XFS_ALLOCTYPE_START_BNO	0x10	/* near this block else anywhere */
     25#define XFS_ALLOCTYPE_NEAR_BNO	0x20	/* in this a.g. and near this block */
     26#define XFS_ALLOCTYPE_THIS_BNO	0x40	/* at exactly this block */
     27
     28/* this should become an enum again when the tracing code is fixed */
     29typedef unsigned int xfs_alloctype_t;
     30
     31#define XFS_ALLOC_TYPES \
     32	{ XFS_ALLOCTYPE_FIRST_AG,	"FIRST_AG" }, \
     33	{ XFS_ALLOCTYPE_THIS_AG,	"THIS_AG" }, \
     34	{ XFS_ALLOCTYPE_START_BNO,	"START_BNO" }, \
     35	{ XFS_ALLOCTYPE_NEAR_BNO,	"NEAR_BNO" }, \
     36	{ XFS_ALLOCTYPE_THIS_BNO,	"THIS_BNO" }
     37
     38/*
     39 * Flags for xfs_alloc_fix_freelist.
     40 */
     41#define	XFS_ALLOC_FLAG_TRYLOCK	0x00000001  /* use trylock for buffer locking */
     42#define	XFS_ALLOC_FLAG_FREEING	0x00000002  /* indicate caller is freeing extents*/
     43#define	XFS_ALLOC_FLAG_NORMAP	0x00000004  /* don't modify the rmapbt */
     44#define	XFS_ALLOC_FLAG_NOSHRINK	0x00000008  /* don't shrink the freelist */
     45#define	XFS_ALLOC_FLAG_CHECK	0x00000010  /* test only, don't modify args */
     46
     47/*
     48 * Argument structure for xfs_alloc routines.
     49 * This is turned into a structure to avoid having 20 arguments passed
     50 * down several levels of the stack.
     51 */
     52typedef struct xfs_alloc_arg {
     53	struct xfs_trans *tp;		/* transaction pointer */
     54	struct xfs_mount *mp;		/* file system mount point */
     55	struct xfs_buf	*agbp;		/* buffer for a.g. freelist header */
     56	struct xfs_perag *pag;		/* per-ag struct for this agno */
     57	xfs_fsblock_t	fsbno;		/* file system block number */
     58	xfs_agnumber_t	agno;		/* allocation group number */
     59	xfs_agblock_t	agbno;		/* allocation group-relative block # */
     60	xfs_extlen_t	minlen;		/* minimum size of extent */
     61	xfs_extlen_t	maxlen;		/* maximum size of extent */
     62	xfs_extlen_t	mod;		/* mod value for extent size */
     63	xfs_extlen_t	prod;		/* prod value for extent size */
     64	xfs_extlen_t	minleft;	/* min blocks must be left after us */
     65	xfs_extlen_t	total;		/* total blocks needed in xaction */
     66	xfs_extlen_t	alignment;	/* align answer to multiple of this */
     67	xfs_extlen_t	minalignslop;	/* slop for minlen+alignment calcs */
     68	xfs_agblock_t	min_agbno;	/* set an agbno range for NEAR allocs */
     69	xfs_agblock_t	max_agbno;	/* ... */
     70	xfs_extlen_t	len;		/* output: actual size of extent */
     71	xfs_alloctype_t	type;		/* allocation type XFS_ALLOCTYPE_... */
     72	xfs_alloctype_t	otype;		/* original allocation type */
     73	int		datatype;	/* mask defining data type treatment */
     74	char		wasdel;		/* set if allocation was prev delayed */
     75	char		wasfromfl;	/* set if allocation is from freelist */
     76	struct xfs_owner_info	oinfo;	/* owner of blocks being allocated */
     77	enum xfs_ag_resv_type	resv;	/* block reservation to use */
     78#ifdef DEBUG
     79	bool		alloc_minlen_only; /* allocate exact minlen extent */
     80#endif
     81} xfs_alloc_arg_t;
     82
     83/*
     84 * Defines for datatype
     85 */
     86#define XFS_ALLOC_USERDATA		(1 << 0)/* allocation is for user data*/
     87#define XFS_ALLOC_INITIAL_USER_DATA	(1 << 1)/* special case start of file */
     88#define XFS_ALLOC_NOBUSY		(1 << 2)/* Busy extents not allowed */
     89
     90/* freespace limit calculations */
     91unsigned int xfs_alloc_set_aside(struct xfs_mount *mp);
     92unsigned int xfs_alloc_ag_max_usable(struct xfs_mount *mp);
     93
     94xfs_extlen_t xfs_alloc_longest_free_extent(struct xfs_perag *pag,
     95		xfs_extlen_t need, xfs_extlen_t reserved);
     96unsigned int xfs_alloc_min_freelist(struct xfs_mount *mp,
     97		struct xfs_perag *pag);
     98
     99/*
    100 * Compute and fill in value of m_alloc_maxlevels.
    101 */
    102void
    103xfs_alloc_compute_maxlevels(
    104	struct xfs_mount	*mp);	/* file system mount structure */
    105
    106/*
    107 * Get a block from the freelist.
    108 * Returns with the buffer for the block gotten.
    109 */
    110int				/* error */
    111xfs_alloc_get_freelist(
    112	struct xfs_trans *tp,	/* transaction pointer */
    113	struct xfs_buf	*agbp,	/* buffer containing the agf structure */
    114	xfs_agblock_t	*bnop,	/* block address retrieved from freelist */
    115	int		btreeblk); /* destination is a AGF btree */
    116
    117/*
    118 * Log the given fields from the agf structure.
    119 */
    120void
    121xfs_alloc_log_agf(
    122	struct xfs_trans *tp,	/* transaction pointer */
    123	struct xfs_buf	*bp,	/* buffer for a.g. freelist header */
    124	uint32_t	fields);/* mask of fields to be logged (XFS_AGF_...) */
    125
    126/*
    127 * Interface for inode allocation to force the pag data to be initialized.
    128 */
    129int				/* error */
    130xfs_alloc_pagf_init(
    131	struct xfs_mount *mp,	/* file system mount structure */
    132	struct xfs_trans *tp,	/* transaction pointer */
    133	xfs_agnumber_t	agno,	/* allocation group number */
    134	int		flags);	/* XFS_ALLOC_FLAGS_... */
    135
    136/*
    137 * Put the block on the freelist for the allocation group.
    138 */
    139int				/* error */
    140xfs_alloc_put_freelist(
    141	struct xfs_trans *tp,	/* transaction pointer */
    142	struct xfs_buf	*agbp,	/* buffer for a.g. freelist header */
    143	struct xfs_buf	*agflbp,/* buffer for a.g. free block array */
    144	xfs_agblock_t	bno,	/* block being freed */
    145	int		btreeblk); /* owner was a AGF btree */
    146
    147/*
    148 * Read in the allocation group header (free/alloc section).
    149 */
    150int					/* error  */
    151xfs_alloc_read_agf(
    152	struct xfs_mount *mp,		/* mount point structure */
    153	struct xfs_trans *tp,		/* transaction pointer */
    154	xfs_agnumber_t	agno,		/* allocation group number */
    155	int		flags,		/* XFS_ALLOC_FLAG_... */
    156	struct xfs_buf	**bpp);		/* buffer for the ag freelist header */
    157
    158/*
    159 * Allocate an extent (variable-size).
    160 */
    161int				/* error */
    162xfs_alloc_vextent(
    163	xfs_alloc_arg_t	*args);	/* allocation argument structure */
    164
    165/*
    166 * Free an extent.
    167 */
    168int				/* error */
    169__xfs_free_extent(
    170	struct xfs_trans	*tp,	/* transaction pointer */
    171	xfs_fsblock_t		bno,	/* starting block number of extent */
    172	xfs_extlen_t		len,	/* length of extent */
    173	const struct xfs_owner_info	*oinfo,	/* extent owner */
    174	enum xfs_ag_resv_type	type,	/* block reservation type */
    175	bool			skip_discard);
    176
    177static inline int
    178xfs_free_extent(
    179	struct xfs_trans	*tp,
    180	xfs_fsblock_t		bno,
    181	xfs_extlen_t		len,
    182	const struct xfs_owner_info	*oinfo,
    183	enum xfs_ag_resv_type	type)
    184{
    185	return __xfs_free_extent(tp, bno, len, oinfo, type, false);
    186}
    187
    188int				/* error */
    189xfs_alloc_lookup_le(
    190	struct xfs_btree_cur	*cur,	/* btree cursor */
    191	xfs_agblock_t		bno,	/* starting block of extent */
    192	xfs_extlen_t		len,	/* length of extent */
    193	int			*stat);	/* success/failure */
    194
    195int				/* error */
    196xfs_alloc_lookup_ge(
    197	struct xfs_btree_cur	*cur,	/* btree cursor */
    198	xfs_agblock_t		bno,	/* starting block of extent */
    199	xfs_extlen_t		len,	/* length of extent */
    200	int			*stat);	/* success/failure */
    201
    202int					/* error */
    203xfs_alloc_get_rec(
    204	struct xfs_btree_cur	*cur,	/* btree cursor */
    205	xfs_agblock_t		*bno,	/* output: starting block of extent */
    206	xfs_extlen_t		*len,	/* output: length of extent */
    207	int			*stat);	/* output: success/failure */
    208
    209int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp,
    210			xfs_agnumber_t agno, int flags, struct xfs_buf **bpp);
    211int xfs_alloc_read_agfl(struct xfs_mount *mp, struct xfs_trans *tp,
    212			xfs_agnumber_t agno, struct xfs_buf **bpp);
    213int xfs_free_agfl_block(struct xfs_trans *, xfs_agnumber_t, xfs_agblock_t,
    214			struct xfs_buf *, struct xfs_owner_info *);
    215int xfs_alloc_fix_freelist(struct xfs_alloc_arg *args, int flags);
    216int xfs_free_extent_fix_freelist(struct xfs_trans *tp, struct xfs_perag *pag,
    217		struct xfs_buf **agbp);
    218
    219xfs_extlen_t xfs_prealloc_blocks(struct xfs_mount *mp);
    220
    221typedef int (*xfs_alloc_query_range_fn)(
    222	struct xfs_btree_cur			*cur,
    223	const struct xfs_alloc_rec_incore	*rec,
    224	void					*priv);
    225
    226int xfs_alloc_query_range(struct xfs_btree_cur *cur,
    227		const struct xfs_alloc_rec_incore *low_rec,
    228		const struct xfs_alloc_rec_incore *high_rec,
    229		xfs_alloc_query_range_fn fn, void *priv);
    230int xfs_alloc_query_all(struct xfs_btree_cur *cur, xfs_alloc_query_range_fn fn,
    231		void *priv);
    232
    233int xfs_alloc_has_record(struct xfs_btree_cur *cur, xfs_agblock_t bno,
    234		xfs_extlen_t len, bool *exist);
    235
    236typedef int (*xfs_agfl_walk_fn)(struct xfs_mount *mp, xfs_agblock_t bno,
    237		void *priv);
    238int xfs_agfl_walk(struct xfs_mount *mp, struct xfs_agf *agf,
    239		struct xfs_buf *agflbp, xfs_agfl_walk_fn walk_fn, void *priv);
    240
    241static inline __be32 *
    242xfs_buf_to_agfl_bno(
    243	struct xfs_buf		*bp)
    244{
    245	if (xfs_has_crc(bp->b_mount))
    246		return bp->b_addr + sizeof(struct xfs_agfl);
    247	return bp->b_addr;
    248}
    249
    250void __xfs_free_extent_later(struct xfs_trans *tp, xfs_fsblock_t bno,
    251		xfs_filblks_t len, const struct xfs_owner_info *oinfo,
    252		bool skip_discard);
    253
    254/*
    255 * List of extents to be free "later".
    256 * The list is kept sorted on xbf_startblock.
    257 */
    258struct xfs_extent_free_item {
    259	struct list_head	xefi_list;
    260	uint64_t		xefi_owner;
    261	xfs_fsblock_t		xefi_startblock;/* starting fs block number */
    262	xfs_extlen_t		xefi_blockcount;/* number of blocks in extent */
    263	unsigned int		xefi_flags;
    264};
    265
    266#define XFS_EFI_SKIP_DISCARD	(1U << 0) /* don't issue discard */
    267#define XFS_EFI_ATTR_FORK	(1U << 1) /* freeing attr fork block */
    268#define XFS_EFI_BMBT_BLOCK	(1U << 2) /* freeing bmap btree block */
    269
    270static inline void
    271xfs_free_extent_later(
    272	struct xfs_trans		*tp,
    273	xfs_fsblock_t			bno,
    274	xfs_filblks_t			len,
    275	const struct xfs_owner_info	*oinfo)
    276{
    277	__xfs_free_extent_later(tp, bno, len, oinfo, false);
    278}
    279
    280
    281extern struct kmem_cache	*xfs_extfree_item_cache;
    282
    283int __init xfs_extfree_intent_init_cache(void);
    284void xfs_extfree_intent_destroy_cache(void);
    285
    286#endif	/* __XFS_ALLOC_H__ */