]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: export zoned geometry via XFS_FSOP_GEOM
authorChristoph Hellwig <hch@lst.de>
Thu, 24 Oct 2024 08:57:41 +0000 (10:57 +0200)
committerChristoph Hellwig <hch@lst.de>
Mon, 3 Mar 2025 15:16:45 +0000 (08:16 -0700)
Export the zoned geometry information so that userspace can query it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
fs/xfs/libxfs/xfs_fs.h
fs/xfs/libxfs/xfs_sb.c

index 2c3171262b445b4b50c08efe5bd647fd183ca2b1..5e66fb2b2cc7b75e9cb312a4485a6ed11f4a5287 100644 (file)
@@ -189,7 +189,9 @@ struct xfs_fsop_geom {
        uint32_t        checked;        /* o: checked fs & rt metadata  */
        __u32           rgextents;      /* rt extents in a realtime group */
        __u32           rgcount;        /* number of realtime groups    */
-       __u64           reserved[16];   /* reserved space               */
+       __u64           rtstart;        /* start of internal rt section */
+       __u64           rtreserved;     /* RT (zoned) reserved blocks   */
+       __u64           reserved[14];   /* reserved space               */
 };
 
 #define XFS_FSOP_GEOM_SICK_COUNTERS    (1 << 0)  /* summary counters */
@@ -247,6 +249,7 @@ typedef struct xfs_fsop_resblks {
 #define XFS_FSOP_GEOM_FLAGS_EXCHANGE_RANGE (1 << 24) /* exchange range */
 #define XFS_FSOP_GEOM_FLAGS_PARENT     (1 << 25) /* linux parent pointers */
 #define XFS_FSOP_GEOM_FLAGS_METADIR    (1 << 26) /* metadata directories */
+#define XFS_FSOP_GEOM_FLAGS_ZONED      (1 << 27) /* zoned rt device */
 
 /*
  * Minimum and maximum sizes need for growth checks.
index 52a04aae44e87cec3bd4b85c5868c89dbaa0cf49..3b886886ea693ef826233974eac9d767f4157b8a 100644 (file)
@@ -1569,6 +1569,8 @@ xfs_fs_geometry(
                geo->flags |= XFS_FSOP_GEOM_FLAGS_EXCHANGE_RANGE;
        if (xfs_has_metadir(mp))
                geo->flags |= XFS_FSOP_GEOM_FLAGS_METADIR;
+       if (xfs_has_zoned(mp))
+               geo->flags |= XFS_FSOP_GEOM_FLAGS_ZONED;
        geo->rtsectsize = sbp->sb_blocksize;
        geo->dirblocksize = xfs_dir2_dirblock_bytes(sbp);
 
@@ -1589,6 +1591,10 @@ xfs_fs_geometry(
                geo->rgcount = sbp->sb_rgcount;
                geo->rgextents = sbp->sb_rgextents;
        }
+       if (xfs_has_zoned(mp)) {
+               geo->rtstart = sbp->sb_rtstart;
+               geo->rtreserved = sbp->sb_rtreserved;
+       }
 }
 
 /* Read a secondary superblock. */