brintos

brintos / linux-shallow public Read only

0
0
Text · 9.6 KiB · 140513d Raw
362 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.4 * All Rights Reserved.5 */6#ifndef __XFS_RTBITMAP_H__7#define	__XFS_RTBITMAP_H__8 9struct xfs_rtalloc_args {10	struct xfs_mount	*mp;11	struct xfs_trans	*tp;12 13	struct xfs_buf		*rbmbp;	/* bitmap block buffer */14	struct xfs_buf		*sumbp;	/* summary block buffer */15 16	xfs_fileoff_t		rbmoff;	/* bitmap block number */17	xfs_fileoff_t		sumoff;	/* summary block number */18};19 20static inline xfs_rtblock_t21xfs_rtx_to_rtb(22	struct xfs_mount	*mp,23	xfs_rtxnum_t		rtx)24{25	if (mp->m_rtxblklog >= 0)26		return rtx << mp->m_rtxblklog;27 28	return rtx * mp->m_sb.sb_rextsize;29}30 31static inline xfs_extlen_t32xfs_rtxlen_to_extlen(33	struct xfs_mount	*mp,34	xfs_rtxlen_t		rtxlen)35{36	if (mp->m_rtxblklog >= 0)37		return rtxlen << mp->m_rtxblklog;38 39	return rtxlen * mp->m_sb.sb_rextsize;40}41 42/* Compute the misalignment between an extent length and a realtime extent .*/43static inline unsigned int44xfs_extlen_to_rtxmod(45	struct xfs_mount	*mp,46	xfs_extlen_t		len)47{48	if (mp->m_rtxblklog >= 0)49		return len & mp->m_rtxblkmask;50 51	return len % mp->m_sb.sb_rextsize;52}53 54static inline xfs_rtxlen_t55xfs_extlen_to_rtxlen(56	struct xfs_mount	*mp,57	xfs_extlen_t		len)58{59	if (mp->m_rtxblklog >= 0)60		return len >> mp->m_rtxblklog;61 62	return len / mp->m_sb.sb_rextsize;63}64 65/* Convert an rt block number into an rt extent number. */66static inline xfs_rtxnum_t67xfs_rtb_to_rtx(68	struct xfs_mount	*mp,69	xfs_rtblock_t		rtbno)70{71	if (likely(mp->m_rtxblklog >= 0))72		return rtbno >> mp->m_rtxblklog;73 74	return div_u64(rtbno, mp->m_sb.sb_rextsize);75}76 77/* Return the offset of an rt block number within an rt extent. */78static inline xfs_extlen_t79xfs_rtb_to_rtxoff(80	struct xfs_mount	*mp,81	xfs_rtblock_t		rtbno)82{83	if (likely(mp->m_rtxblklog >= 0))84		return rtbno & mp->m_rtxblkmask;85 86	return do_div(rtbno, mp->m_sb.sb_rextsize);87}88 89/*90 * Convert an rt block number into an rt extent number, rounding up to the next91 * rt extent if the rt block is not aligned to an rt extent boundary.92 */93static inline xfs_rtxnum_t94xfs_rtb_to_rtxup(95	struct xfs_mount	*mp,96	xfs_rtblock_t		rtbno)97{98	if (likely(mp->m_rtxblklog >= 0)) {99		if (rtbno & mp->m_rtxblkmask)100			return (rtbno >> mp->m_rtxblklog) + 1;101		return rtbno >> mp->m_rtxblklog;102	}103 104	if (do_div(rtbno, mp->m_sb.sb_rextsize))105		rtbno++;106	return rtbno;107}108 109/* Round this rtblock up to the nearest rt extent size. */110static inline xfs_rtblock_t111xfs_rtb_roundup_rtx(112	struct xfs_mount	*mp,113	xfs_rtblock_t		rtbno)114{115	return roundup_64(rtbno, mp->m_sb.sb_rextsize);116}117 118/* Round this rtblock down to the nearest rt extent size. */119static inline xfs_rtblock_t120xfs_rtb_rounddown_rtx(121	struct xfs_mount	*mp,122	xfs_rtblock_t		rtbno)123{124	return rounddown_64(rtbno, mp->m_sb.sb_rextsize);125}126 127/* Convert an rt extent number to a file block offset in the rt bitmap file. */128static inline xfs_fileoff_t129xfs_rtx_to_rbmblock(130	struct xfs_mount	*mp,131	xfs_rtxnum_t		rtx)132{133	return rtx >> mp->m_blkbit_log;134}135 136/* Convert an rt extent number to a word offset within an rt bitmap block. */137static inline unsigned int138xfs_rtx_to_rbmword(139	struct xfs_mount	*mp,140	xfs_rtxnum_t		rtx)141{142	return (rtx >> XFS_NBWORDLOG) & (mp->m_blockwsize - 1);143}144 145/* Convert a file block offset in the rt bitmap file to an rt extent number. */146static inline xfs_rtxnum_t147xfs_rbmblock_to_rtx(148	struct xfs_mount	*mp,149	xfs_fileoff_t		rbmoff)150{151	return rbmoff << mp->m_blkbit_log;152}153 154/* Return a pointer to a bitmap word within a rt bitmap block. */155static inline union xfs_rtword_raw *156xfs_rbmblock_wordptr(157	struct xfs_rtalloc_args	*args,158	unsigned int		index)159{160	union xfs_rtword_raw	*words = args->rbmbp->b_addr;161 162	return words + index;163}164 165/* Convert an ondisk bitmap word to its incore representation. */166static inline xfs_rtword_t167xfs_rtbitmap_getword(168	struct xfs_rtalloc_args	*args,169	unsigned int		index)170{171	union xfs_rtword_raw	*word = xfs_rbmblock_wordptr(args, index);172 173	return word->old;174}175 176/* Set an ondisk bitmap word from an incore representation. */177static inline void178xfs_rtbitmap_setword(179	struct xfs_rtalloc_args	*args,180	unsigned int		index,181	xfs_rtword_t		value)182{183	union xfs_rtword_raw	*word = xfs_rbmblock_wordptr(args, index);184 185	word->old = value;186}187 188/*189 * Convert a rt extent length and rt bitmap block number to a xfs_suminfo_t190 * offset within the rt summary file.191 */192static inline xfs_rtsumoff_t193xfs_rtsumoffs(194	struct xfs_mount	*mp,195	int			log2_len,196	xfs_fileoff_t		rbmoff)197{198	return log2_len * mp->m_sb.sb_rbmblocks + rbmoff;199}200 201/*202 * Convert an xfs_suminfo_t offset to a file block offset within the rt summary203 * file.204 */205static inline xfs_fileoff_t206xfs_rtsumoffs_to_block(207	struct xfs_mount	*mp,208	xfs_rtsumoff_t		rsumoff)209{210	return XFS_B_TO_FSBT(mp, rsumoff * sizeof(xfs_suminfo_t));211}212 213/*214 * Convert an xfs_suminfo_t offset to an info word offset within an rt summary215 * block.216 */217static inline unsigned int218xfs_rtsumoffs_to_infoword(219	struct xfs_mount	*mp,220	xfs_rtsumoff_t		rsumoff)221{222	unsigned int		mask = mp->m_blockmask >> XFS_SUMINFOLOG;223 224	return rsumoff & mask;225}226 227/* Return a pointer to a summary info word within a rt summary block. */228static inline union xfs_suminfo_raw *229xfs_rsumblock_infoptr(230	struct xfs_rtalloc_args	*args,231	unsigned int		index)232{233	union xfs_suminfo_raw	*info = args->sumbp->b_addr;234 235	return info + index;236}237 238/* Get the current value of a summary counter. */239static inline xfs_suminfo_t240xfs_suminfo_get(241	struct xfs_rtalloc_args	*args,242	unsigned int		index)243{244	union xfs_suminfo_raw	*info = xfs_rsumblock_infoptr(args, index);245 246	return info->old;247}248 249/* Add to the current value of a summary counter and return the new value. */250static inline xfs_suminfo_t251xfs_suminfo_add(252	struct xfs_rtalloc_args	*args,253	unsigned int		index,254	int			delta)255{256	union xfs_suminfo_raw	*info = xfs_rsumblock_infoptr(args, index);257 258	info->old += delta;259	return info->old;260}261 262/*263 * Functions for walking free space rtextents in the realtime bitmap.264 */265struct xfs_rtalloc_rec {266	xfs_rtxnum_t		ar_startext;267	xfs_rtbxlen_t		ar_extcount;268};269 270typedef int (*xfs_rtalloc_query_range_fn)(271	struct xfs_mount		*mp,272	struct xfs_trans		*tp,273	const struct xfs_rtalloc_rec	*rec,274	void				*priv);275 276#ifdef CONFIG_XFS_RT277void xfs_rtbuf_cache_relse(struct xfs_rtalloc_args *args);278int xfs_rtbitmap_read_buf(struct xfs_rtalloc_args *args, xfs_fileoff_t block);279int xfs_rtsummary_read_buf(struct xfs_rtalloc_args *args, xfs_fileoff_t block);280int xfs_rtcheck_range(struct xfs_rtalloc_args *args, xfs_rtxnum_t start,281		xfs_rtxlen_t len, int val, xfs_rtxnum_t *new, int *stat);282int xfs_rtfind_back(struct xfs_rtalloc_args *args, xfs_rtxnum_t start,283		xfs_rtxnum_t *rtblock);284int xfs_rtfind_forw(struct xfs_rtalloc_args *args, xfs_rtxnum_t start,285		xfs_rtxnum_t limit, xfs_rtxnum_t *rtblock);286int xfs_rtmodify_range(struct xfs_rtalloc_args *args, xfs_rtxnum_t start,287		xfs_rtxlen_t len, int val);288int xfs_rtget_summary(struct xfs_rtalloc_args *args, int log,289		xfs_fileoff_t bbno, xfs_suminfo_t *sum);290int xfs_rtmodify_summary(struct xfs_rtalloc_args *args, int log,291		xfs_fileoff_t bbno, int delta);292int xfs_rtfree_range(struct xfs_rtalloc_args *args, xfs_rtxnum_t start,293		xfs_rtxlen_t len);294int xfs_rtalloc_query_range(struct xfs_mount *mp, struct xfs_trans *tp,295		xfs_rtxnum_t start, xfs_rtxnum_t end,296		xfs_rtalloc_query_range_fn fn, void *priv);297int xfs_rtalloc_query_all(struct xfs_mount *mp, struct xfs_trans *tp,298			  xfs_rtalloc_query_range_fn fn,299			  void *priv);300int xfs_rtalloc_extent_is_free(struct xfs_mount *mp, struct xfs_trans *tp,301			       xfs_rtxnum_t start, xfs_rtxlen_t len,302			       bool *is_free);303/*304 * Free an extent in the realtime subvolume.  Length is expressed in305 * realtime extents, as is the block number.306 */307int					/* error */308xfs_rtfree_extent(309	struct xfs_trans	*tp,	/* transaction pointer */310	xfs_rtxnum_t		start,	/* starting rtext number to free */311	xfs_rtxlen_t		len);	/* length of extent freed */312 313/* Same as above, but in units of rt blocks. */314int xfs_rtfree_blocks(struct xfs_trans *tp, xfs_fsblock_t rtbno,315		xfs_filblks_t rtlen);316 317xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t318		rtextents);319xfs_filblks_t xfs_rtsummary_blockcount(struct xfs_mount *mp,320		unsigned int rsumlevels, xfs_extlen_t rbmblocks);321 322int xfs_rtfile_initialize_blocks(struct xfs_inode *ip,323		xfs_fileoff_t offset_fsb, xfs_fileoff_t end_fsb, void *data);324 325void xfs_rtbitmap_lock(struct xfs_mount *mp);326void xfs_rtbitmap_unlock(struct xfs_mount *mp);327void xfs_rtbitmap_trans_join(struct xfs_trans *tp);328 329/* Lock the rt bitmap inode in shared mode */330#define XFS_RBMLOCK_BITMAP	(1U << 0)331/* Lock the rt summary inode in shared mode */332#define XFS_RBMLOCK_SUMMARY	(1U << 1)333 334void xfs_rtbitmap_lock_shared(struct xfs_mount *mp,335		unsigned int rbmlock_flags);336void xfs_rtbitmap_unlock_shared(struct xfs_mount *mp,337		unsigned int rbmlock_flags);338#else /* CONFIG_XFS_RT */339# define xfs_rtfree_extent(t,b,l)			(-ENOSYS)340# define xfs_rtfree_blocks(t,rb,rl)			(-ENOSYS)341# define xfs_rtalloc_query_range(m,t,l,h,f,p)		(-ENOSYS)342# define xfs_rtalloc_query_all(m,t,f,p)			(-ENOSYS)343# define xfs_rtbitmap_read_buf(a,b)			(-ENOSYS)344# define xfs_rtsummary_read_buf(a,b)			(-ENOSYS)345# define xfs_rtbuf_cache_relse(a)			(0)346# define xfs_rtalloc_extent_is_free(m,t,s,l,i)		(-ENOSYS)347static inline xfs_filblks_t348xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents)349{350	/* shut up gcc */351	return 0;352}353# define xfs_rtsummary_blockcount(mp, l, b)		(0)354# define xfs_rtbitmap_lock(mp)			do { } while (0)355# define xfs_rtbitmap_trans_join(tp)		do { } while (0)356# define xfs_rtbitmap_unlock(mp)		do { } while (0)357# define xfs_rtbitmap_lock_shared(mp, lf)	do { } while (0)358# define xfs_rtbitmap_unlock_shared(mp, lf)	do { } while (0)359#endif /* CONFIG_XFS_RT */360 361#endif /* __XFS_RTBITMAP_H__ */362