]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
fixups
authorChristoph Hellwig <hch@lst.de>
Mon, 5 Aug 2024 14:04:13 +0000 (16:04 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 6 Aug 2024 12:53:49 +0000 (05:53 -0700)
db/convert.c
include/kmem.h
include/xfs_mount.h
include/xfs_trace.h
libxfs/Makefile
libxfs/init.c
libxfs/libxfs_api_defs.h
libxfs/xfs_rtgroup.c
mkfs/xfs_mkfs.c

index 048c1766f8152b37a424d12a8ee5586c8610617b..7c0b1edc2358d1057dd827bcc55de2cc5bece1e8 100644 (file)
@@ -413,14 +413,6 @@ convert_f(int argc, char **argv)
        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,
index 8dfb2fb0b45020f28180f0741d4cc201d38a4e95..5647b6599dc4e9d49fb298ac6255ccd4ea8e081d 100644 (file)
@@ -65,6 +65,11 @@ static inline void kfree(const void *ptr)
        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, ...);
 
index 06e2f9bb1911b1282070fe56c5b9434be000c6f2..287abb57a464258b53e6bb78331cdcf8e84c2295 100644 (file)
@@ -51,6 +51,7 @@ typedef struct xfs_mount {
         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
@@ -73,6 +74,7 @@ typedef struct xfs_mount {
        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 */
@@ -93,9 +95,11 @@ typedef struct xfs_mount {
        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 */
@@ -132,6 +136,7 @@ typedef struct xfs_mount {
         */
        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;
 
@@ -172,6 +177,8 @@ typedef struct xfs_mount {
 #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) \
@@ -218,6 +225,8 @@ __XFS_HAS_FEAT(needsrepair, NEEDSREPAIR)
 __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) \
@@ -238,6 +247,7 @@ __XFS_UNSUPP_FEAT(grpid)
 #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) \
@@ -263,6 +273,7 @@ __XFS_IS_OPSTATE(inode32, INODE32)
 __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) \
index c589441600bc751b3e7fee66d667734e4a5a43b0..1a31a83ad30fa3dd0afeaf01a0182e8c9abe3f64 100644 (file)
 #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)
index d850e042a5da914aa9e5740c549751f65cbe7ffd..529071b6a21da412affad99978e183566df9b3dc 100644 (file)
@@ -63,6 +63,7 @@ HFILES = \
        xfs_rmap.h \
        xfs_rmap_btree.h \
        xfs_rtbitmap.h \
+       xfs_rtgroup.h \
        xfs_sb.h \
        xfs_shared.h \
        xfs_trans_resv.h \
@@ -122,6 +123,7 @@ CFILES = buf_mem.c \
        xfs_rmap.c \
        xfs_rmap_btree.c \
        xfs_rtbitmap.c \
+       xfs_rtgroup.c \
        xfs_sb.c \
        xfs_symlink_remote.c \
        xfs_trans_inode.c \
index 2d9fa0838b691f7fe2c9e489af425034f5ddc888..da3ca9abc47b1d517b824d993648a1a9f16fc35c 100644 (file)
@@ -31,6 +31,7 @@
 #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;
@@ -673,7 +674,9 @@ libxfs_mount(
 {
        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);
@@ -692,9 +695,11 @@ libxfs_mount(
        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);
 
@@ -825,6 +830,21 @@ libxfs_mount(
        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);
@@ -958,6 +978,8 @@ libxfs_umount(
         * 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);
 
index 8f74d8ce7eb510f7485fd81e43389d8de67ef58e..912db968da49902c0b37383e4ab7c6aca17474bb 100644 (file)
 #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
index 3d4645fa4547586f9359503d5140e0c766c94c3a..772afa19b22158bdcec213370437535b1c0d15c1 100644 (file)
@@ -3,7 +3,7 @@
  * 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"
 
index 08bb4e5cda820aa3dd08de5c0ff71ccdc9309620..439b198a3d8cdd5f444cbea69205c0c0863fc671 100644 (file)
@@ -3591,6 +3591,10 @@ sb_set_features(
         */
        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;