mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Currently each metabtree inode has it's own space reservation to ensure it can be expanded to the maximum size, mirroring what is done for the AG-based btrees. But unlike the AG-based btrees the metabtree inodes aren't restricted to allocate from a single AG but can use free space form the entire file system. And unlike AG-based btrees where the required reservation shrinks with the available free space due to this, the metabtree reservations for the rtrmap and rtfreflink trees are not bound in any way by the data device free space as they track RT extent allocations. This is not very efficient as it requires a large number of blocks to be set aside that can't be used at all by other btrees. Switch to a model that uses a global pool instead in preparation for reducing the amount of reserved space, which now also removes the overloading of the i_nblocks field for metabtree inodes, which would create problems if metabtree inodes ever had a big enough xattr fork to require xattr blocks outside the inode. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
80 lines
2.1 KiB
C
80 lines
2.1 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
|
|
* All Rights Reserved.
|
|
*/
|
|
#ifndef __XFS_RTALLOC_H__
|
|
#define __XFS_RTALLOC_H__
|
|
|
|
/* kernel only definitions and functions */
|
|
|
|
struct xfs_mount;
|
|
struct xfs_trans;
|
|
|
|
#ifdef CONFIG_XFS_RT
|
|
/* rtgroup superblock initialization */
|
|
int xfs_rtmount_readsb(struct xfs_mount *mp);
|
|
void xfs_rtmount_freesb(struct xfs_mount *mp);
|
|
|
|
/*
|
|
* Initialize realtime fields in the mount structure.
|
|
*/
|
|
int /* error */
|
|
xfs_rtmount_init(
|
|
struct xfs_mount *mp); /* file system mount structure */
|
|
void
|
|
xfs_rtunmount_inodes(
|
|
struct xfs_mount *mp);
|
|
|
|
/*
|
|
* Get the bitmap and summary inodes into the mount structure
|
|
* at mount time.
|
|
*/
|
|
int /* error */
|
|
xfs_rtmount_inodes(
|
|
struct xfs_mount *mp); /* file system mount structure */
|
|
|
|
/*
|
|
* Grow the realtime area of the filesystem.
|
|
*/
|
|
int
|
|
xfs_growfs_rt(
|
|
struct xfs_mount *mp, /* file system mount structure */
|
|
xfs_growfs_rt_t *in); /* user supplied growfs struct */
|
|
|
|
int xfs_rtalloc_reinit_frextents(struct xfs_mount *mp);
|
|
int xfs_growfs_check_rtgeom(const struct xfs_mount *mp, xfs_rfsblock_t dblocks,
|
|
xfs_rfsblock_t rblocks, xfs_agblock_t rextsize);
|
|
#else
|
|
# define xfs_growfs_rt(mp,in) (-ENOSYS)
|
|
# define xfs_rtalloc_reinit_frextents(m) (0)
|
|
# define xfs_rtmount_readsb(mp) (0)
|
|
# define xfs_rtmount_freesb(mp) ((void)0)
|
|
static inline int /* error */
|
|
xfs_rtmount_init(
|
|
xfs_mount_t *mp) /* file system mount structure */
|
|
{
|
|
if (mp->m_sb.sb_rblocks == 0)
|
|
return 0;
|
|
|
|
xfs_warn(mp, "Not built with CONFIG_XFS_RT");
|
|
return -ENOSYS;
|
|
}
|
|
# define xfs_rtmount_inodes(m) (((mp)->m_sb.sb_rblocks == 0)? 0 : (-ENOSYS))
|
|
# define xfs_rtunmount_inodes(m)
|
|
|
|
static inline int
|
|
xfs_growfs_check_rtgeom(const struct xfs_mount *mp,
|
|
xfs_rfsblock_t dblocks, xfs_rfsblock_t rblocks,
|
|
xfs_extlen_t rextsize)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif /* CONFIG_XFS_RT */
|
|
|
|
int xfs_rtallocate_rtgs(struct xfs_trans *tp, xfs_fsblock_t bno_hint,
|
|
xfs_rtxlen_t minlen, xfs_rtxlen_t maxlen, xfs_rtxlen_t prod,
|
|
bool wasdel, bool initial_user_data, xfs_rtblock_t *bno,
|
|
xfs_extlen_t *blen);
|
|
|
|
#endif /* __XFS_RTALLOC_H__ */
|