]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
FIXUP: xfs: allow internal RT devices for zoned mode
authorChristoph Hellwig <hch@lst.de>
Fri, 20 Dec 2024 03:49:36 +0000 (19:49 -0800)
committerChristoph Hellwig <hch@lst.de>
Tue, 8 Apr 2025 07:09:46 +0000 (09:09 +0200)
Signed-off-by: Christoph Hellwig <hch@lst.de>
include/libxfs.h
include/xfs_mount.h
libfrog/fsgeom.c
libxfs/init.c
libxfs/rdwr.c
repair/agheader.c

index 82b34b9d81c3a7a6817a10d0fedb7ad32b0e69ff..b968a2b88da372bddeab6786ab1a307ef7f2f62a 100644 (file)
@@ -293,4 +293,10 @@ static inline bool xfs_sb_version_hassparseinodes(struct xfs_sb *sbp)
                xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_SPINODES);
 }
 
+static inline bool xfs_sb_version_haszoned(struct xfs_sb *sbp)
+{
+       return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
+               xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_ZONED);
+}
+
 #endif /* __LIBXFS_H__ */
index 7856acfb9f8e8e555547bf0e254bdf353a0b9c19..bf9ebc25fc795a9775dad65ad40c3c349ee7a8ef 100644 (file)
@@ -53,6 +53,13 @@ struct xfs_groups {
         * rtgroup, so this mask must be 64-bit.
         */
        uint64_t                blkmask;
+
+       /*
+        * Start of the first group in the device.  This is used to support a
+        * RT device following the data device on the same block device for
+        * SMR hard drives.
+        */
+       xfs_fsblock_t           start_fsb;
 };
 
 /*
index b5220d2d6ffd2295ccd5909f1a26a630cd12b699..13df88ae43a75b870e759dcf9d2e6316d2586117 100644 (file)
@@ -81,7 +81,7 @@ xfs_report_geom(
                isint ? _("internal log") : logname ? logname : _("external"),
                        geo->blocksize, geo->logblocks, logversion,
                "", geo->logsectsize, geo->logsunit / geo->blocksize, lazycount,
-               !geo->rtblocks ? _("none") : rtname ? rtname : _("external"),
+               !geo->rtblocks ? _("none") : rtname ? rtname : _("internal"),
                geo->rtextsize * geo->blocksize, (unsigned long long)geo->rtblocks,
                        (unsigned long long)geo->rtextents,
                "", geo->rgcount, geo->rgextents);
index 5b45ed3472762ca20319b0f5735ecc0eb1611eae..a186369f3fd804e330b25c84163eae2ad88f3418 100644 (file)
@@ -560,7 +560,7 @@ libxfs_buftarg_init(
                                progname);
                        exit(1);
                }
-               if (xi->rt.dev &&
+               if ((xi->rt.dev || xi->rt.dev == xi->data.dev) &&
                    (mp->m_rtdev_targp->bt_bdev != xi->rt.dev ||
                     mp->m_rtdev_targp->bt_mount != mp)) {
                        fprintf(stderr,
@@ -577,7 +577,11 @@ libxfs_buftarg_init(
        else
                mp->m_logdev_targp = libxfs_buftarg_alloc(mp, xi, &xi->log,
                                lfail);
-       mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, xi, &xi->rt, rfail);
+       if (!xi->rt.dev || xi->rt.dev == xi->data.dev)
+               mp->m_rtdev_targp = mp->m_ddev_targp;
+       else
+               mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, xi, &xi->rt,
+                               rfail);
 }
 
 /* Compute maximum possible height for per-AG btree types for this fs. */
@@ -978,7 +982,7 @@ libxfs_flush_mount(
                        error = err2;
        }
 
-       if (mp->m_rtdev_targp) {
+       if (mp->m_rtdev_targp && mp->m_rtdev_targp != mp->m_ddev_targp) {
                err2 = libxfs_flush_buftarg(mp->m_rtdev_targp,
                                _("realtime device"));
                if (!error)
@@ -1031,7 +1035,8 @@ libxfs_umount(
        free(mp->m_fsname);
        mp->m_fsname = NULL;
 
-       libxfs_buftarg_free(mp->m_rtdev_targp);
+       if (mp->m_rtdev_targp != mp->m_ddev_targp)
+               libxfs_buftarg_free(mp->m_rtdev_targp);
        if (mp->m_logdev_targp != mp->m_ddev_targp)
                libxfs_buftarg_free(mp->m_logdev_targp);
        libxfs_buftarg_free(mp->m_ddev_targp);
index 35be785c435a974f036ec42615b6c09174ebe7f5..f06763b38bd88c97dd46f2b8301a970b41ff6a0a 100644 (file)
@@ -175,6 +175,8 @@ libxfs_getrtsb(
        if (!mp->m_rtdev_targp->bt_bdev)
                return NULL;
 
+       ASSERT(!mp->m_sb.sb_rtstart);
+
        error = libxfs_buf_read_uncached(mp->m_rtdev_targp, XFS_RTSB_DADDR,
                        XFS_FSB_TO_BB(mp, 1), 0, &bp, &xfs_rtsb_buf_ops);
        if (error)
index 327ba041671f9f0606c91f2afa43b98946770e7f..5bb4e47e0c5bfd63efdb83364f332e5481957584 100644 (file)
@@ -485,7 +485,9 @@ secondary_sb_whack(
         *
         * size is the size of data which is valid for this sb.
         */
-       if (xfs_sb_version_hasmetadir(sb))
+       if (xfs_sb_version_haszoned(sb))
+               size = offsetofend(struct xfs_dsb, sb_rtstart);
+       else if (xfs_sb_version_hasmetadir(sb))
                size = offsetofend(struct xfs_dsb, sb_pad);
        else if (xfs_sb_version_hasmetauuid(sb))
                size = offsetofend(struct xfs_dsb, sb_meta_uuid);