Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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