return 0;
}
-static inline xfs_rtblock_t
-xfs_daddr_to_rtb(
- struct xfs_mount *mp,
- xfs_daddr_t daddr)
-{
- return daddr >> mp->m_blkbb_log;
-}
-
static inline uint64_t
rt_daddr_to_rsumblock(
struct xfs_mount *mp,
free((void *)ptr);
}
+static inline void kfree_rcu_mightsleep(const void *ptr)
+{
+ kfree(ptr);
+}
+
__attribute__((format(printf,2,3)))
char *kasprintf(gfp_t gfp, const char *fmt, ...);
struct xfs_ino_geometry m_ino_geo; /* inode geometry */
uint m_rsumlevels; /* rt summary levels */
xfs_filblks_t m_rsumblocks; /* size of rt summary, FSBs */
+ uint32_t m_rgblocks; /* size of rtgroup in rtblocks */
/*
* Optional cache of rt summary level per bitmap block with the
* invariant that m_rsum_cache[bbno] <= the minimum i for which
uint8_t m_sectbb_log; /* sectorlog - BBSHIFT */
uint8_t m_agno_log; /* log #ag's */
int8_t m_rtxblklog; /* log2 of rextsize, if possible */
+ int8_t m_rgblklog; /* log2 of rt group sz if possible */
uint m_blockmask; /* sb_blocksize-1 */
uint m_blockwsize; /* sb_blocksize in words */
uint m_blockwmask; /* blockwsize-1 */
uint m_alloc_set_aside; /* space we can't use */
uint m_ag_max_usable; /* max space per AG */
struct radix_tree_root m_perag_tree;
+ struct radix_tree_root m_rtgroup_tree;
uint64_t m_features; /* active filesystem features */
uint64_t m_low_space[XFS_LOWSP_MAX];
uint64_t m_rtxblkmask; /* rt extent block mask */
+ uint64_t m_rgblkmask; /* rt group block mask */
unsigned long m_opstate; /* dynamic state flags */
bool m_finobt_nores; /* no per-AG finobt resv. */
uint m_qflags; /* quota status flags */
*/
atomic64_t m_allocbt_blks;
spinlock_t m_perag_lock; /* lock for m_perag_tree */
+ spinlock_t m_rtgroup_lock; /* lock for m_rtgroup_tree */
} xfs_mount_t;
#define XFS_FEAT_NREXT64 (1ULL << 26) /* large extent counters */
#define XFS_FEAT_EXCHANGE_RANGE (1ULL << 27) /* exchange range */
#define XFS_FEAT_METADIR (1ULL << 28) /* metadata directory tree */
+#define XFS_FEAT_RTGROUPS (1ULL << 29) /* realtime groups */
+#define XFS_FEAT_RTSB (1ULL << 30) /* realtime superblock */
#define __XFS_HAS_FEAT(name, NAME) \
static inline bool xfs_has_ ## name (struct xfs_mount *mp) \
__XFS_HAS_FEAT(large_extent_counts, NREXT64)
__XFS_HAS_FEAT(exchange_range, EXCHANGE_RANGE)
__XFS_HAS_FEAT(metadir, METADIR)
+__XFS_HAS_FEAT(rtgroups, RTGROUPS)
+__XFS_HAS_FEAT(rtsb, RTSB)
/* Kernel mount features that we don't support */
#define __XFS_UNSUPP_FEAT(name) \
#define XFS_OPSTATE_DEBUGGER 1 /* is this the debugger? */
#define XFS_OPSTATE_REPORT_CORRUPTION 2 /* report buffer corruption? */
#define XFS_OPSTATE_PERAG_DATA_LOADED 3 /* per-AG data initialized? */
+#define XFS_OPSTATE_RTGROUP_DATA_LOADED 4 /* rtgroup data initialized? */
#define __XFS_IS_OPSTATE(name, NAME) \
static inline bool xfs_is_ ## name (struct xfs_mount *mp) \
__XFS_IS_OPSTATE(debugger, DEBUGGER)
__XFS_IS_OPSTATE(reporting_corruption, REPORT_CORRUPTION)
__XFS_IS_OPSTATE(perag_data_loaded, PERAG_DATA_LOADED)
+__XFS_IS_OPSTATE(rtgroup_data_loaded, RTGROUP_DATA_LOADED)
#define __XFS_UNSUPP_OPSTATE(name) \
static inline bool xfs_is_ ## name (struct xfs_mount *mp) \
#define trace_xfs_exchmaps_overhead(...) ((void) 0)
#define trace_xfs_exchmaps_update_inode_size(...) ((void) 0)
+/* set c = c to avoid unused var warnings */
+#define trace_xfs_rtgroup_get(a,b) ((a) = (a))
+#define trace_xfs_rtgroup_hold(a,b) ((a) = (a))
+#define trace_xfs_rtgroup_put(a,b) ((a) = (a))
+#define trace_xfs_rtgroup_grab(a,b) ((a) = (a))
+#define trace_xfs_rtgroup_rele(a,b) ((a) = (a))
+
#define trace_xfs_fs_mark_healthy(a,b) ((void) 0)
#define trace_xlog_intent_recovery_failed(...) ((void) 0)
xfs_rmap.h \
xfs_rmap_btree.h \
xfs_rtbitmap.h \
+ xfs_rtgroup.h \
xfs_sb.h \
xfs_shared.h \
xfs_trans_resv.h \
xfs_rmap.c \
xfs_rmap_btree.c \
xfs_rtbitmap.c \
+ xfs_rtgroup.c \
xfs_sb.c \
xfs_symlink_remote.c \
xfs_trans_inode.c \
#include "xfs_ondisk.h"
#include "libxfs.h" /* for now */
+#include "xfs_rtgroup.h"
#ifndef HAVE_LIBURCU_ATOMIC64
pthread_mutex_t atomic64_lock = PTHREAD_MUTEX_INITIALIZER;
{
struct xfs_buf *bp;
struct xfs_sb *sbp;
+ struct xfs_rtgroup *rtg;
xfs_daddr_t d;
+ xfs_rgnumber_t rgno;
int error;
mp->m_features = xfs_sb_version_to_features(sb);
xfs_set_inode32(mp);
mp->m_sb = *sb;
INIT_RADIX_TREE(&mp->m_perag_tree, GFP_KERNEL);
+ INIT_RADIX_TREE(&mp->m_rtgroup_tree, GFP_KERNEL);
sbp = &mp->m_sb;
spin_lock_init(&mp->m_sb_lock);
spin_lock_init(&mp->m_agirotor_lock);
+ spin_lock_init(&mp->m_rtgroup_lock);
xfs_sb_mount_common(mp, sb);
if (xfs_has_metadir(mp))
libxfs_mount_setup_metadir(mp);
+ for (rgno = 0; rgno < sbp->sb_rgcount; rgno++) {
+ error = libxfs_rtgroup_alloc(mp, rgno);
+ if (error) {
+ fprintf(stderr, _("%s: rtgroup init failed\n"),
+ progname);
+ xfs_warn(mp, "Failed rtgroup init: %d", error);
+ exit(1);
+ }
+ }
+
+ for_each_rtgroup(mp, rgno, rtg)
+ rtg->rtg_extents = xfs_rtgroup_extents(mp, rtg->rtg_rgno);
+
+ xfs_set_rtgroup_data_loaded(mp);
+
return mp;
out_da:
xfs_da_unmount(mp);
* Only try to free the per-AG structures if we set them up in the
* first place.
*/
+ if (xfs_is_rtgroup_data_loaded(mp))
+ libxfs_free_rtgroups(mp, mp->m_sb.sb_rgcount);
if (xfs_is_perag_data_loaded(mp))
libxfs_free_perag(mp);
#define xfs_free_extent libxfs_free_extent
#define xfs_free_extent_later libxfs_free_extent_later
#define xfs_free_perag libxfs_free_perag
+#define xfs_free_rtgroups libxfs_free_rtgroups
#define xfs_fs_geometry libxfs_fs_geometry
#define xfs_get_projid libxfs_get_projid
#define xfs_get_initial_prid libxfs_get_initial_prid
#define xfs_rtbitmap_setword libxfs_rtbitmap_setword
#define xfs_rtbitmap_wordcount libxfs_rtbitmap_wordcount
+#define xfs_rtgroup_alloc libxfs_rtgroup_alloc
+
#define xfs_suminfo_add libxfs_suminfo_add
#define xfs_suminfo_get libxfs_suminfo_get
#define xfs_rtsummary_wordcount libxfs_rtsummary_wordcount
* Copyright (c) 2022-2024 Oracle. All Rights Reserved.
* Author: Darrick J. Wong <djwong@kernel.org>
*/
-#include "xfs.h"
+#include "libxfs_priv.h"
#include "xfs_fs.h"
#include "xfs_shared.h"
#include "xfs_format.h"
#include "xfs_ag.h"
#include "xfs_ag_resv.h"
#include "xfs_health.h"
-#include "xfs_error.h"
#include "xfs_bmap.h"
#include "xfs_defer.h"
#include "xfs_log_format.h"
#include "xfs_trans.h"
#include "xfs_trace.h"
#include "xfs_inode.h"
-#include "xfs_icache.h"
#include "xfs_rtgroup.h"
#include "xfs_rtbitmap.h"
*/
sbp->sb_bad_features2 = sbp->sb_features2;
+ /* This will be overriden later for real rtgroup file systems: */
+ sbp->sb_rgcount = 1;
+ sbp->sb_rgextents = UINT_MAX;
+
if (!fp->crcs_enabled)
return;