]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blobdiff - libxfs/xfs_fs.h
xfsprogs: remove stray libxfs whitespace
[thirdparty/xfsprogs-dev.git] / libxfs / xfs_fs.h
index 89689c6a43e2cf6a0f042f2abaa9dcd0da5a0873..6ca43c73a5c18d8320096bf803e14f07513b86cd 100644 (file)
@@ -1,19 +1,7 @@
+// SPDX-License-Identifier: LGPL-2.1
 /*
  * Copyright (c) 1995-2005 Silicon Graphics, Inc.
  * All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 #ifndef __XFS_FS_H__
 #define __XFS_FS_H__
@@ -36,38 +24,25 @@ struct dioattr {
 #endif
 
 /*
- * Structure for XFS_IOC_FSGETXATTR[A] and XFS_IOC_FSSETXATTR.
- */
-#ifndef HAVE_FSXATTR
-struct fsxattr {
-       __u32           fsx_xflags;     /* xflags field value (get/set) */
-       __u32           fsx_extsize;    /* extsize field value (get/set)*/
-       __u32           fsx_nextents;   /* nextents field value (get)   */
-       __u32           fsx_projid;     /* project identifier (get/set) */
-       unsigned char   fsx_pad[12];
-};
-#endif
-
-/*
- * Flags for the bs_xflags/fsx_xflags field
- * There should be a one-to-one correspondence between these flags and the
- * XFS_DIFLAG_s.
+ * Flags for the bs_xflags/fsx_xflags field in XFS_IOC_FS[GS]ETXATTR[A]
+ * These are for backwards compatibility only. New code should
+ * use the kernel [4.5 onwards] defined FS_XFLAG_* definitions directly.
  */
-#define XFS_XFLAG_REALTIME     0x00000001      /* data in realtime volume */
-#define XFS_XFLAG_PREALLOC     0x00000002      /* preallocated file extents */
-#define XFS_XFLAG_IMMUTABLE    0x00000008      /* file cannot be modified */
-#define XFS_XFLAG_APPEND       0x00000010      /* all writes append */
-#define XFS_XFLAG_SYNC         0x00000020      /* all writes synchronous */
-#define XFS_XFLAG_NOATIME      0x00000040      /* do not update access time */
-#define XFS_XFLAG_NODUMP       0x00000080      /* do not include in backups */
-#define XFS_XFLAG_RTINHERIT    0x00000100      /* create with rt bit set */
-#define XFS_XFLAG_PROJINHERIT  0x00000200      /* create with parents projid */
-#define XFS_XFLAG_NOSYMLINKS   0x00000400      /* disallow symlink creation */
-#define XFS_XFLAG_EXTSIZE      0x00000800      /* extent size allocator hint */
-#define XFS_XFLAG_EXTSZINHERIT 0x00001000      /* inherit inode extent size */
-#define XFS_XFLAG_NODEFRAG     0x00002000      /* do not defragment */
-#define XFS_XFLAG_FILESTREAM   0x00004000      /* use filestream allocator */
-#define XFS_XFLAG_HASATTR      0x80000000      /* no DIFLAG for this   */
+#define        XFS_XFLAG_REALTIME      FS_XFLAG_REALTIME
+#define        XFS_XFLAG_PREALLOC      FS_XFLAG_PREALLOC
+#define        XFS_XFLAG_IMMUTABLE     FS_XFLAG_IMMUTABLE
+#define        XFS_XFLAG_APPEND        FS_XFLAG_APPEND
+#define        XFS_XFLAG_SYNC          FS_XFLAG_SYNC
+#define        XFS_XFLAG_NOATIME       FS_XFLAG_NOATIME
+#define        XFS_XFLAG_NODUMP        FS_XFLAG_NODUMP
+#define        XFS_XFLAG_RTINHERIT     FS_XFLAG_RTINHERIT
+#define        XFS_XFLAG_PROJINHERIT   FS_XFLAG_PROJINHERIT
+#define        XFS_XFLAG_NOSYMLINKS    FS_XFLAG_NOSYMLINKS
+#define        XFS_XFLAG_EXTSIZE       FS_XFLAG_EXTSIZE
+#define        XFS_XFLAG_EXTSZINHERIT  FS_XFLAG_EXTSZINHERIT
+#define        XFS_XFLAG_NODEFRAG      FS_XFLAG_NODEFRAG
+#define        XFS_XFLAG_FILESTREAM    FS_XFLAG_FILESTREAM
+#define        XFS_XFLAG_HASATTR       FS_XFLAG_HASATTR
 
 /*
  * Structure for XFS_IOC_GETBMAP.
@@ -115,21 +90,35 @@ struct getbmapx {
 #define BMV_IF_PREALLOC                0x4     /* rtn status BMV_OF_PREALLOC if req */
 #define BMV_IF_DELALLOC                0x8     /* rtn status BMV_OF_DELALLOC if req */
 #define BMV_IF_NO_HOLES                0x10    /* Do not return holes */
+#define BMV_IF_COWFORK         0x20    /* return CoW fork rather than data */
 #define BMV_IF_VALID   \
        (BMV_IF_ATTRFORK|BMV_IF_NO_DMAPI_READ|BMV_IF_PREALLOC|  \
-        BMV_IF_DELALLOC|BMV_IF_NO_HOLES)
+        BMV_IF_DELALLOC|BMV_IF_NO_HOLES|BMV_IF_COWFORK)
 
 /*     bmv_oflags values - returned for each non-header segment */
 #define BMV_OF_PREALLOC                0x1     /* segment = unwritten pre-allocation */
 #define BMV_OF_DELALLOC                0x2     /* segment = delayed allocation */
 #define BMV_OF_LAST            0x4     /* segment is the last in the file */
+#define BMV_OF_SHARED          0x8     /* segment shared with another file */
+
+/*     fmr_owner special values for FS_IOC_GETFSMAP */
+#define XFS_FMR_OWN_FREE       FMR_OWN_FREE      /* free space */
+#define XFS_FMR_OWN_UNKNOWN    FMR_OWN_UNKNOWN   /* unknown owner */
+#define XFS_FMR_OWN_FS         FMR_OWNER('X', 1) /* static fs metadata */
+#define XFS_FMR_OWN_LOG                FMR_OWNER('X', 2) /* journalling log */
+#define XFS_FMR_OWN_AG         FMR_OWNER('X', 3) /* per-AG metadata */
+#define XFS_FMR_OWN_INOBT      FMR_OWNER('X', 4) /* inode btree blocks */
+#define XFS_FMR_OWN_INODES     FMR_OWNER('X', 5) /* inodes */
+#define XFS_FMR_OWN_REFC       FMR_OWNER('X', 6) /* refcount tree */
+#define XFS_FMR_OWN_COW                FMR_OWNER('X', 7) /* cow staging */
+#define XFS_FMR_OWN_DEFECTIVE  FMR_OWNER('X', 8) /* bad blocks */
 
 /*
  * Structure for XFS_IOC_FSSETDM.
  * For use by backup and restore programs to set the XFS on-disk inode
  * fields di_dmevmask and di_dmstate.  These must be set to exactly and
  * only values previously obtained via xfs_bulkstat!  (Specifically the
- * xfs_bstat_t fields bs_dmevmask and bs_dmstate.)
+ * struct xfs_bstat fields bs_dmevmask and bs_dmstate.)
  */
 #ifndef HAVE_FSDMIDATA
 struct fsdmidata {
@@ -156,7 +145,7 @@ typedef struct xfs_flock64 {
 /*
  * Output for XFS_IOC_FSGEOMETRY_V1
  */
-typedef struct xfs_fsop_geom_v1 {
+struct xfs_fsop_geom_v1 {
        __u32           blocksize;      /* filesystem (data) block size */
        __u32           rtextsize;      /* realtime extent size         */
        __u32           agblocks;       /* fsblocks in an AG            */
@@ -177,12 +166,39 @@ typedef struct xfs_fsop_geom_v1 {
        __u32           logsectsize;    /* log sector size, bytes       */
        __u32           rtsectsize;     /* realtime sector size, bytes  */
        __u32           dirblocksize;   /* directory block size, bytes  */
-} xfs_fsop_geom_v1_t;
+};
+
+/*
+ * Output for XFS_IOC_FSGEOMETRY_V4
+ */
+struct xfs_fsop_geom_v4 {
+       __u32           blocksize;      /* filesystem (data) block size */
+       __u32           rtextsize;      /* realtime extent size         */
+       __u32           agblocks;       /* fsblocks in an AG            */
+       __u32           agcount;        /* number of allocation groups  */
+       __u32           logblocks;      /* fsblocks in the log          */
+       __u32           sectsize;       /* (data) sector size, bytes    */
+       __u32           inodesize;      /* inode size in bytes          */
+       __u32           imaxpct;        /* max allowed inode space(%)   */
+       __u64           datablocks;     /* fsblocks in data subvolume   */
+       __u64           rtblocks;       /* fsblocks in realtime subvol  */
+       __u64           rtextents;      /* rt extents in realtime subvol*/
+       __u64           logstart;       /* starting fsblock of the log  */
+       unsigned char   uuid[16];       /* unique id of the filesystem  */
+       __u32           sunit;          /* stripe unit, fsblocks        */
+       __u32           swidth;         /* stripe width, fsblocks       */
+       __s32           version;        /* structure version            */
+       __u32           flags;          /* superblock version flags     */
+       __u32           logsectsize;    /* log sector size, bytes       */
+       __u32           rtsectsize;     /* realtime sector size, bytes  */
+       __u32           dirblocksize;   /* directory block size, bytes  */
+       __u32           logsunit;       /* log stripe unit, bytes       */
+};
 
 /*
  * Output for XFS_IOC_FSGEOMETRY
  */
-typedef struct xfs_fsop_geom {
+struct xfs_fsop_geom {
        __u32           blocksize;      /* filesystem (data) block size */
        __u32           rtextsize;      /* realtime extent size         */
        __u32           agblocks;       /* fsblocks in an AG            */
@@ -203,8 +219,18 @@ typedef struct xfs_fsop_geom {
        __u32           logsectsize;    /* log sector size, bytes       */
        __u32           rtsectsize;     /* realtime sector size, bytes  */
        __u32           dirblocksize;   /* directory block size, bytes  */
-       __u32           logsunit;       /* log stripe unit, bytes */
-} xfs_fsop_geom_t;
+       __u32           logsunit;       /* log stripe unit, bytes       */
+       uint32_t        sick;           /* o: unhealthy fs & rt metadata */
+       uint32_t        checked;        /* o: checked fs & rt metadata  */
+       __u64           reserved[17];   /* reserved space               */
+};
+
+#define XFS_FSOP_GEOM_SICK_COUNTERS    (1 << 0)  /* summary counters */
+#define XFS_FSOP_GEOM_SICK_UQUOTA      (1 << 1)  /* user quota */
+#define XFS_FSOP_GEOM_SICK_GQUOTA      (1 << 2)  /* group quota */
+#define XFS_FSOP_GEOM_SICK_PQUOTA      (1 << 3)  /* project quota */
+#define XFS_FSOP_GEOM_SICK_RT_BITMAP   (1 << 4)  /* realtime bitmap */
+#define XFS_FSOP_GEOM_SICK_RT_SUMMARY  (1 << 5)  /* realtime summary */
 
 /* Output for XFS_FS_COUNTS */
 typedef struct xfs_fsop_counts {
@@ -220,26 +246,30 @@ typedef struct xfs_fsop_resblks {
        __u64  resblks_avail;
 } xfs_fsop_resblks_t;
 
-#define XFS_FSOP_GEOM_VERSION  0
-
-#define XFS_FSOP_GEOM_FLAGS_ATTR       0x0001  /* attributes in use    */
-#define XFS_FSOP_GEOM_FLAGS_NLINK      0x0002  /* 32-bit nlink values  */
-#define XFS_FSOP_GEOM_FLAGS_QUOTA      0x0004  /* quotas enabled       */
-#define XFS_FSOP_GEOM_FLAGS_IALIGN     0x0008  /* inode alignment      */
-#define XFS_FSOP_GEOM_FLAGS_DALIGN     0x0010  /* large data alignment */
-#define XFS_FSOP_GEOM_FLAGS_SHARED     0x0020  /* read-only shared     */
-#define XFS_FSOP_GEOM_FLAGS_EXTFLG     0x0040  /* special extent flag  */
-#define XFS_FSOP_GEOM_FLAGS_DIRV2      0x0080  /* directory version 2  */
-#define XFS_FSOP_GEOM_FLAGS_LOGV2      0x0100  /* log format version 2 */
-#define XFS_FSOP_GEOM_FLAGS_SECTOR     0x0200  /* sector sizes >1BB    */
-#define XFS_FSOP_GEOM_FLAGS_ATTR2      0x0400  /* inline attributes rework */
-#define XFS_FSOP_GEOM_FLAGS_PROJID32   0x0800  /* 32-bit project IDs   */
-#define XFS_FSOP_GEOM_FLAGS_DIRV2CI    0x1000  /* ASCII only CI names  */
-#define XFS_FSOP_GEOM_FLAGS_LAZYSB     0x4000  /* lazy superblock counters */
-#define XFS_FSOP_GEOM_FLAGS_V5SB       0x8000  /* version 5 superblock */
-#define XFS_FSOP_GEOM_FLAGS_FTYPE      0x10000 /* inode directory types */
-#define XFS_FSOP_GEOM_FLAGS_FINOBT     0x20000 /* free inode btree */
-#define XFS_FSOP_GEOM_FLAGS_SPINODES   0x40000 /* sparse inode chunks  */
+#define XFS_FSOP_GEOM_VERSION          0
+#define XFS_FSOP_GEOM_VERSION_V5       5
+
+#define XFS_FSOP_GEOM_FLAGS_ATTR       (1 << 0)  /* attributes in use     */
+#define XFS_FSOP_GEOM_FLAGS_NLINK      (1 << 1)  /* 32-bit nlink values   */
+#define XFS_FSOP_GEOM_FLAGS_QUOTA      (1 << 2)  /* quotas enabled        */
+#define XFS_FSOP_GEOM_FLAGS_IALIGN     (1 << 3)  /* inode alignment       */
+#define XFS_FSOP_GEOM_FLAGS_DALIGN     (1 << 4)  /* large data alignment  */
+#define XFS_FSOP_GEOM_FLAGS_SHARED     (1 << 5)  /* read-only shared      */
+#define XFS_FSOP_GEOM_FLAGS_EXTFLG     (1 << 6)  /* special extent flag   */
+#define XFS_FSOP_GEOM_FLAGS_DIRV2      (1 << 7)  /* directory version 2   */
+#define XFS_FSOP_GEOM_FLAGS_LOGV2      (1 << 8)  /* log format version 2  */
+#define XFS_FSOP_GEOM_FLAGS_SECTOR     (1 << 9)  /* sector sizes >1BB     */
+#define XFS_FSOP_GEOM_FLAGS_ATTR2      (1 << 10) /* inline attributes rework */
+#define XFS_FSOP_GEOM_FLAGS_PROJID32   (1 << 11) /* 32-bit project IDs    */
+#define XFS_FSOP_GEOM_FLAGS_DIRV2CI    (1 << 12) /* ASCII only CI names   */
+       /*  -- Do not use --            (1 << 13)    SGI parent pointers   */
+#define XFS_FSOP_GEOM_FLAGS_LAZYSB     (1 << 14) /* lazy superblock counters */
+#define XFS_FSOP_GEOM_FLAGS_V5SB       (1 << 15) /* version 5 superblock  */
+#define XFS_FSOP_GEOM_FLAGS_FTYPE      (1 << 16) /* inode directory types */
+#define XFS_FSOP_GEOM_FLAGS_FINOBT     (1 << 17) /* free inode btree      */
+#define XFS_FSOP_GEOM_FLAGS_SPINODES   (1 << 18) /* sparse inode chunks   */
+#define XFS_FSOP_GEOM_FLAGS_RMAPBT     (1 << 19) /* reverse mapping btree */
+#define XFS_FSOP_GEOM_FLAGS_REFLINK    (1 << 20) /* files can share blocks */
 
 /*
  * Minimum and maximum sizes need for growth checks.
@@ -251,6 +281,13 @@ typedef struct xfs_fsop_resblks {
 #define XFS_MAX_LOG_BLOCKS     (1024 * 1024ULL)
 #define XFS_MIN_LOG_BYTES      (10 * 1024 * 1024ULL)
 
+/*
+ * Limits on sb_agblocks/sb_agblklog -- mkfs won't format AGs smaller than
+ * 16MB or larger than 1TB.
+ */
+#define XFS_MIN_AG_BYTES       (1ULL << 24)    /* 16 MB */
+#define XFS_MAX_AG_BYTES       (1ULL << 40)    /* 1 TB */
+
 /* keep the maximum size under 2^31 by a small amount */
 #define XFS_MAX_LOG_BYTES \
        ((2 * 1024 * 1024 * 1024ULL) - XFS_MIN_LOG_BYTES)
@@ -260,6 +297,31 @@ typedef struct xfs_fsop_resblks {
 #define XFS_MIN_DBLOCKS(s) ((xfs_rfsblock_t)((s)->sb_agcount - 1) *    \
                         (s)->sb_agblocks + XFS_MIN_AG_BLOCKS)
 
+/*
+ * Output for XFS_IOC_AG_GEOMETRY
+ */
+struct xfs_ag_geometry {
+       uint32_t        ag_number;      /* i/o: AG number */
+       uint32_t        ag_length;      /* o: length in blocks */
+       uint32_t        ag_freeblks;    /* o: free space */
+       uint32_t        ag_icount;      /* o: inodes allocated */
+       uint32_t        ag_ifree;       /* o: inodes free */
+       uint32_t        ag_sick;        /* o: sick things in ag */
+       uint32_t        ag_checked;     /* o: checked metadata in ag */
+       uint32_t        ag_flags;       /* i/o: flags for this ag */
+       uint64_t        ag_reserved[12];/* o: zero */
+};
+#define XFS_AG_GEOM_SICK_SB    (1 << 0)  /* superblock */
+#define XFS_AG_GEOM_SICK_AGF   (1 << 1)  /* AGF header */
+#define XFS_AG_GEOM_SICK_AGFL  (1 << 2)  /* AGFL header */
+#define XFS_AG_GEOM_SICK_AGI   (1 << 3)  /* AGI header */
+#define XFS_AG_GEOM_SICK_BNOBT (1 << 4)  /* free space by block */
+#define XFS_AG_GEOM_SICK_CNTBT (1 << 5)  /* free space by length */
+#define XFS_AG_GEOM_SICK_INOBT (1 << 6)  /* inode index */
+#define XFS_AG_GEOM_SICK_FINOBT        (1 << 7)  /* free inode index */
+#define XFS_AG_GEOM_SICK_RMAPBT        (1 << 8)  /* reverse mappings */
+#define XFS_AG_GEOM_SICK_REFCNTBT (1 << 9)  /* reference counts */
+
 /*
  * Structures for XFS_IOC_FSGROWFSDATA, XFS_IOC_FSGROWFSLOG & XFS_IOC_FSGROWFSRT
  */
@@ -287,7 +349,7 @@ typedef struct xfs_bstime {
        __s32           tv_nsec;        /* and nanoseconds      */
 } xfs_bstime_t;
 
-typedef struct xfs_bstat {
+struct xfs_bstat {
        __u64           bs_ino;         /* inode number                 */
        __u16           bs_mode;        /* type and mode                */
        __u16           bs_nlink;       /* number of links              */
@@ -308,43 +370,158 @@ typedef struct xfs_bstat {
 #define        bs_projid       bs_projid_lo    /* (previously just bs_projid)  */
        __u16           bs_forkoff;     /* inode fork offset in bytes   */
        __u16           bs_projid_hi;   /* higher part of project id    */
-       unsigned char   bs_pad[10];     /* pad space, unused            */
+       uint16_t        bs_sick;        /* sick inode metadata          */
+       uint16_t        bs_checked;     /* checked inode metadata       */
+       unsigned char   bs_pad[2];      /* pad space, unused            */
+       __u32           bs_cowextsize;  /* cow extent size              */
        __u32           bs_dmevmask;    /* DMIG event mask              */
        __u16           bs_dmstate;     /* DMIG state info              */
        __u16           bs_aextents;    /* attribute number of extents  */
-} xfs_bstat_t;
+};
+
+/* New bulkstat structure that reports v5 features and fixes padding issues */
+struct xfs_bulkstat {
+       uint64_t        bs_ino;         /* inode number                 */
+       uint64_t        bs_size;        /* file size                    */
+
+       uint64_t        bs_blocks;      /* number of blocks             */
+       uint64_t        bs_xflags;      /* extended flags               */
+
+       int64_t         bs_atime;       /* access time, seconds         */
+       int64_t         bs_mtime;       /* modify time, seconds         */
+
+       int64_t         bs_ctime;       /* inode change time, seconds   */
+       int64_t         bs_btime;       /* creation time, seconds       */
+
+       uint32_t        bs_gen;         /* generation count             */
+       uint32_t        bs_uid;         /* user id                      */
+       uint32_t        bs_gid;         /* group id                     */
+       uint32_t        bs_projectid;   /* project id                   */
+
+       uint32_t        bs_atime_nsec;  /* access time, nanoseconds     */
+       uint32_t        bs_mtime_nsec;  /* modify time, nanoseconds     */
+       uint32_t        bs_ctime_nsec;  /* inode change time, nanoseconds */
+       uint32_t        bs_btime_nsec;  /* creation time, nanoseconds   */
+
+       uint32_t        bs_blksize;     /* block size                   */
+       uint32_t        bs_rdev;        /* device value                 */
+       uint32_t        bs_cowextsize_blks; /* cow extent size hint, blocks */
+       uint32_t        bs_extsize_blks; /* extent size hint, blocks    */
+
+       uint32_t        bs_nlink;       /* number of links              */
+       uint32_t        bs_extents;     /* number of extents            */
+       uint32_t        bs_aextents;    /* attribute number of extents  */
+       uint16_t        bs_version;     /* structure version            */
+       uint16_t        bs_forkoff;     /* inode fork offset in bytes   */
+
+       uint16_t        bs_sick;        /* sick inode metadata          */
+       uint16_t        bs_checked;     /* checked inode metadata       */
+       uint16_t        bs_mode;        /* type and mode                */
+       uint16_t        bs_pad2;        /* zeroed                       */
+
+       uint64_t        bs_pad[7];      /* zeroed                       */
+};
+
+#define XFS_BULKSTAT_VERSION_V1        (1)
+#define XFS_BULKSTAT_VERSION_V5        (5)
+
+/* bs_sick flags */
+#define XFS_BS_SICK_INODE      (1 << 0)  /* inode core */
+#define XFS_BS_SICK_BMBTD      (1 << 1)  /* data fork */
+#define XFS_BS_SICK_BMBTA      (1 << 2)  /* attr fork */
+#define XFS_BS_SICK_BMBTC      (1 << 3)  /* cow fork */
+#define XFS_BS_SICK_DIR                (1 << 4)  /* directory */
+#define XFS_BS_SICK_XATTR      (1 << 5)  /* extended attributes */
+#define XFS_BS_SICK_SYMLINK    (1 << 6)  /* symbolic link remote target */
+#define XFS_BS_SICK_PARENT     (1 << 7)  /* parent pointers */
 
 /*
  * Project quota id helpers (previously projid was 16bit only
  * and using two 16bit values to hold new 32bit projid was choosen
  * to retain compatibility with "old" filesystems).
  */
-static inline __uint32_t
-bstat_get_projid(struct xfs_bstat *bs)
+static inline uint32_t
+bstat_get_projid(const struct xfs_bstat *bs)
 {
-       return (__uint32_t)bs->bs_projid_hi << 16 | bs->bs_projid_lo;
+       return (uint32_t)bs->bs_projid_hi << 16 | bs->bs_projid_lo;
 }
 
 /*
  * The user-level BulkStat Request interface structure.
  */
-typedef struct xfs_fsop_bulkreq {
+struct xfs_fsop_bulkreq {
        __u64           __user *lastip; /* last inode # pointer         */
        __s32           icount;         /* count of entries in buffer   */
        void            __user *ubuffer;/* user buffer for inode desc.  */
        __s32           __user *ocount; /* output count pointer         */
-} xfs_fsop_bulkreq_t;
-
+};
 
 /*
  * Structures returned from xfs_inumbers routine (XFS_IOC_FSINUMBERS).
  */
-typedef struct xfs_inogrp {
+struct xfs_inogrp {
        __u64           xi_startino;    /* starting inode number        */
        __s32           xi_alloccount;  /* # bits set in allocmask      */
        __u64           xi_allocmask;   /* mask of allocated inodes     */
-} xfs_inogrp_t;
+};
+
+/* New inumbers structure that reports v5 features and fixes padding issues */
+struct xfs_inumbers {
+       uint64_t        xi_startino;    /* starting inode number        */
+       uint64_t        xi_allocmask;   /* mask of allocated inodes     */
+       uint8_t         xi_alloccount;  /* # bits set in allocmask      */
+       uint8_t         xi_version;     /* version                      */
+       uint8_t         xi_padding[6];  /* zero                         */
+};
+
+#define XFS_INUMBERS_VERSION_V1        (1)
+#define XFS_INUMBERS_VERSION_V5        (5)
+
+/* Header for bulk inode requests. */
+struct xfs_bulk_ireq {
+       uint64_t        ino;            /* I/O: start with this inode   */
+       uint32_t        flags;          /* I/O: operation flags         */
+       uint32_t        icount;         /* I: count of entries in buffer */
+       uint32_t        ocount;         /* O: count of entries filled out */
+       uint32_t        agno;           /* I: see comment for IREQ_AGNO */
+       uint64_t        reserved[5];    /* must be zero                 */
+};
+
+/*
+ * Only return results from the specified @agno.  If @ino is zero, start
+ * with the first inode of @agno.
+ */
+#define XFS_BULK_IREQ_AGNO     (1 << 0)
 
+/*
+ * Return bulkstat information for a single inode, where @ino value is a
+ * special value, not a literal inode number.  See the XFS_BULK_IREQ_SPECIAL_*
+ * values below.  Not compatible with XFS_BULK_IREQ_AGNO.
+ */
+#define XFS_BULK_IREQ_SPECIAL  (1 << 1)
+
+#define XFS_BULK_IREQ_FLAGS_ALL        (XFS_BULK_IREQ_AGNO | \
+                                XFS_BULK_IREQ_SPECIAL)
+
+/* Operate on the root directory inode. */
+#define XFS_BULK_IREQ_SPECIAL_ROOT     (1)
+
+/*
+ * ioctl structures for v5 bulkstat and inumbers requests
+ */
+struct xfs_bulkstat_req {
+       struct xfs_bulk_ireq    hdr;
+       struct xfs_bulkstat     bulkstat[];
+};
+#define XFS_BULKSTAT_REQ_SIZE(nr)      (sizeof(struct xfs_bulkstat_req) + \
+                                        (nr) * sizeof(struct xfs_bulkstat))
+
+struct xfs_inumbers_req {
+       struct xfs_bulk_ireq    hdr;
+       struct xfs_inumbers     inumbers[];
+};
+#define XFS_INUMBERS_REQ_SIZE(nr)      (sizeof(struct xfs_inumbers_req) + \
+                                        (nr) * sizeof(struct xfs_inumbers))
 
 /*
  * Error injection.
@@ -463,23 +640,19 @@ typedef struct xfs_handle {
 } xfs_handle_t;
 #define ha_fsid ha_u._ha_fsid
 
-#define XFS_HSIZE(handle)      (((char *) &(handle).ha_fid.fid_pad      \
-                                - (char *) &(handle))                    \
-                                + (handle).ha_fid.fid_len)
-
 /*
  * Structure passed to XFS_IOC_SWAPEXT
  */
 typedef struct xfs_swapext
 {
-       __int64_t       sx_version;     /* version */
+       int64_t         sx_version;     /* version */
 #define XFS_SX_VERSION         0
-       __int64_t       sx_fdtarget;    /* fd of target file */
-       __int64_t       sx_fdtmp;       /* fd of tmp file */
+       int64_t         sx_fdtarget;    /* fd of target file */
+       int64_t         sx_fdtmp;       /* fd of tmp file */
        xfs_off_t       sx_offset;      /* offset into file */
        xfs_off_t       sx_length;      /* leng from offset */
        char            sx_pad[16];     /* pad space, unused */
-       xfs_bstat_t     sx_stat;        /* stat of target b4 copy */
+       struct xfs_bstat sx_stat;       /* stat of target b4 copy */
 } xfs_swapext_t;
 
 /*
@@ -489,6 +662,100 @@ typedef struct xfs_swapext
 #define XFS_FSOP_GOING_FLAGS_LOGFLUSH          0x1     /* flush log but not data */
 #define XFS_FSOP_GOING_FLAGS_NOLOGFLUSH                0x2     /* don't flush log nor data */
 
+/* metadata scrubbing */
+struct xfs_scrub_metadata {
+       __u32 sm_type;          /* What to check? */
+       __u32 sm_flags;         /* flags; see below. */
+       __u64 sm_ino;           /* inode number. */
+       __u32 sm_gen;           /* inode generation. */
+       __u32 sm_agno;          /* ag number. */
+       __u64 sm_reserved[5];   /* pad to 64 bytes */
+};
+
+/*
+ * Metadata types and flags for scrub operation.
+ */
+
+/* Scrub subcommands. */
+#define XFS_SCRUB_TYPE_PROBE   0       /* presence test ioctl */
+#define XFS_SCRUB_TYPE_SB      1       /* superblock */
+#define XFS_SCRUB_TYPE_AGF     2       /* AG free header */
+#define XFS_SCRUB_TYPE_AGFL    3       /* AG free list */
+#define XFS_SCRUB_TYPE_AGI     4       /* AG inode header */
+#define XFS_SCRUB_TYPE_BNOBT   5       /* freesp by block btree */
+#define XFS_SCRUB_TYPE_CNTBT   6       /* freesp by length btree */
+#define XFS_SCRUB_TYPE_INOBT   7       /* inode btree */
+#define XFS_SCRUB_TYPE_FINOBT  8       /* free inode btree */
+#define XFS_SCRUB_TYPE_RMAPBT  9       /* reverse mapping btree */
+#define XFS_SCRUB_TYPE_REFCNTBT        10      /* reference count btree */
+#define XFS_SCRUB_TYPE_INODE   11      /* inode record */
+#define XFS_SCRUB_TYPE_BMBTD   12      /* data fork block mapping */
+#define XFS_SCRUB_TYPE_BMBTA   13      /* attr fork block mapping */
+#define XFS_SCRUB_TYPE_BMBTC   14      /* CoW fork block mapping */
+#define XFS_SCRUB_TYPE_DIR     15      /* directory */
+#define XFS_SCRUB_TYPE_XATTR   16      /* extended attribute */
+#define XFS_SCRUB_TYPE_SYMLINK 17      /* symbolic link */
+#define XFS_SCRUB_TYPE_PARENT  18      /* parent pointers */
+#define XFS_SCRUB_TYPE_RTBITMAP        19      /* realtime bitmap */
+#define XFS_SCRUB_TYPE_RTSUM   20      /* realtime summary */
+#define XFS_SCRUB_TYPE_UQUOTA  21      /* user quotas */
+#define XFS_SCRUB_TYPE_GQUOTA  22      /* group quotas */
+#define XFS_SCRUB_TYPE_PQUOTA  23      /* project quotas */
+#define XFS_SCRUB_TYPE_FSCOUNTERS 24   /* fs summary counters */
+
+/* Number of scrub subcommands. */
+#define XFS_SCRUB_TYPE_NR      25
+
+/* i: Repair this metadata. */
+#define XFS_SCRUB_IFLAG_REPAIR         (1 << 0)
+
+/* o: Metadata object needs repair. */
+#define XFS_SCRUB_OFLAG_CORRUPT                (1 << 1)
+
+/*
+ * o: Metadata object could be optimized.  It's not corrupt, but
+ *    we could improve on it somehow.
+ */
+#define XFS_SCRUB_OFLAG_PREEN          (1 << 2)
+
+/* o: Cross-referencing failed. */
+#define XFS_SCRUB_OFLAG_XFAIL          (1 << 3)
+
+/* o: Metadata object disagrees with cross-referenced metadata. */
+#define XFS_SCRUB_OFLAG_XCORRUPT       (1 << 4)
+
+/* o: Scan was not complete. */
+#define XFS_SCRUB_OFLAG_INCOMPLETE     (1 << 5)
+
+/* o: Metadata object looked funny but isn't corrupt. */
+#define XFS_SCRUB_OFLAG_WARNING                (1 << 6)
+
+/*
+ * o: IFLAG_REPAIR was set but metadata object did not need fixing or
+ *    optimization and has therefore not been altered.
+ */
+#define XFS_SCRUB_OFLAG_NO_REPAIR_NEEDED (1 << 7)
+
+#define XFS_SCRUB_FLAGS_IN     (XFS_SCRUB_IFLAG_REPAIR)
+#define XFS_SCRUB_FLAGS_OUT    (XFS_SCRUB_OFLAG_CORRUPT | \
+                                XFS_SCRUB_OFLAG_PREEN | \
+                                XFS_SCRUB_OFLAG_XFAIL | \
+                                XFS_SCRUB_OFLAG_XCORRUPT | \
+                                XFS_SCRUB_OFLAG_INCOMPLETE | \
+                                XFS_SCRUB_OFLAG_WARNING | \
+                                XFS_SCRUB_OFLAG_NO_REPAIR_NEEDED)
+#define XFS_SCRUB_FLAGS_ALL    (XFS_SCRUB_FLAGS_IN | XFS_SCRUB_FLAGS_OUT)
+
+/*
+ * ioctl limits
+ */
+#ifdef XATTR_LIST_MAX
+#  define XFS_XATTR_LIST_MAX XATTR_LIST_MAX
+#else
+#  define XFS_XATTR_LIST_MAX 65536
+#endif
+
+
 /*
  * ioctl commands that are used by Linux filesystems
  */
@@ -504,8 +771,8 @@ typedef struct xfs_swapext
 #define XFS_IOC_ALLOCSP                _IOW ('X', 10, struct xfs_flock64)
 #define XFS_IOC_FREESP         _IOW ('X', 11, struct xfs_flock64)
 #define XFS_IOC_DIOINFO                _IOR ('X', 30, struct dioattr)
-#define XFS_IOC_FSGETXATTR     _IOR ('X', 31, struct fsxattr)
-#define XFS_IOC_FSSETXATTR     _IOW ('X', 32, struct fsxattr)
+#define XFS_IOC_FSGETXATTR     FS_IOC_FSGETXATTR
+#define XFS_IOC_FSSETXATTR     FS_IOC_FSSETXATTR
 #define XFS_IOC_ALLOCSP64      _IOW ('X', 36, struct xfs_flock64)
 #define XFS_IOC_FREESP64       _IOW ('X', 37, struct xfs_flock64)
 #define XFS_IOC_GETBMAP                _IOWR('X', 38, struct getbmap)
@@ -521,6 +788,9 @@ typedef struct xfs_swapext
 #define XFS_IOC_GETBMAPX       _IOWR('X', 56, struct getbmap)
 #define XFS_IOC_ZERO_RANGE     _IOW ('X', 57, struct xfs_flock64)
 #define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_fs_eofblocks)
+/*     XFS_IOC_GETFSMAP ------ hoisted 59         */
+#define XFS_IOC_SCRUB_METADATA _IOWR('X', 60, struct xfs_scrub_metadata)
+#define XFS_IOC_AG_GEOMETRY    _IOWR('X', 61, struct xfs_ag_geometry)
 
 /*
  * ioctl commands that replace IRIX syssgi()'s
@@ -545,20 +815,60 @@ typedef struct xfs_swapext
 #define XFS_IOC_ERROR_CLEARALL      _IOW ('X', 117, struct xfs_error_injection)
 /*     XFS_IOC_ATTRCTL_BY_HANDLE -- deprecated 118      */
 
-/*     XFS_IOC_FREEZE            -- FIFREEZE   119      */
-/*     XFS_IOC_THAW              -- FITHAW     120      */
-#ifndef FIFREEZE
-#define XFS_IOC_FREEZE              _IOWR('X', 119, int)
-#define XFS_IOC_THAW                _IOWR('X', 120, int)
-#endif
+#define XFS_IOC_FREEZE              _IOWR('X', 119, int)       /* aka FIFREEZE */
+#define XFS_IOC_THAW                _IOWR('X', 120, int)       /* aka FITHAW */
 
 #define XFS_IOC_FSSETDM_BY_HANDLE    _IOW ('X', 121, struct xfs_fsop_setdm_handlereq)
 #define XFS_IOC_ATTRLIST_BY_HANDLE   _IOW ('X', 122, struct xfs_fsop_attrlist_handlereq)
 #define XFS_IOC_ATTRMULTI_BY_HANDLE  _IOW ('X', 123, struct xfs_fsop_attrmulti_handlereq)
-#define XFS_IOC_FSGEOMETRY          _IOR ('X', 124, struct xfs_fsop_geom)
-#define XFS_IOC_GOINGDOWN           _IOR ('X', 125, __uint32_t)
+#define XFS_IOC_FSGEOMETRY_V4       _IOR ('X', 124, struct xfs_fsop_geom_v4)
+#define XFS_IOC_GOINGDOWN           _IOR ('X', 125, uint32_t)
+#define XFS_IOC_FSGEOMETRY          _IOR ('X', 126, struct xfs_fsop_geom)
+#define XFS_IOC_BULKSTAT            _IOR ('X', 127, struct xfs_bulkstat_req)
+#define XFS_IOC_INUMBERS            _IOR ('X', 128, struct xfs_inumbers_req)
 /*     XFS_IOC_GETFSUUID ---------- deprecated 140      */
 
+/* reflink ioctls; these MUST match the btrfs ioctl definitions */
+/* from struct btrfs_ioctl_clone_range_args */
+struct xfs_clone_args {
+       __s64 src_fd;
+       __u64 src_offset;
+       __u64 src_length;
+       __u64 dest_offset;
+};
+
+/* extent-same (dedupe) ioctls; these MUST match the btrfs ioctl definitions */
+#define XFS_EXTENT_DATA_SAME   0
+#define XFS_EXTENT_DATA_DIFFERS        1
+
+/* from struct btrfs_ioctl_file_extent_same_info */
+struct xfs_extent_data_info {
+       __s64 fd;               /* in - destination file */
+       __u64 logical_offset;   /* in - start of extent in destination */
+       __u64 bytes_deduped;    /* out - total # of bytes we were able
+                                * to dedupe from this file */
+       /* status of this dedupe operation:
+        * < 0 for error
+        * == XFS_EXTENT_DATA_SAME if dedupe succeeds
+        * == XFS_EXTENT_DATA_DIFFERS if data differs
+        */
+       __s32 status;           /* out - see above description */
+       __u32 reserved;
+};
+
+/* from struct btrfs_ioctl_file_extent_same_args */
+struct xfs_extent_data {
+       __u64 logical_offset;   /* in - start of extent in source */
+       __u64 length;           /* in - length of extent */
+       __u16 dest_count;       /* in - total elements in info array */
+       __u16 reserved1;
+       __u32 reserved2;
+       struct xfs_extent_data_info info[0];
+};
+
+#define XFS_IOC_CLONE           _IOW (0x94, 9, int)
+#define XFS_IOC_CLONE_RANGE     _IOW (0x94, 13, struct xfs_clone_args)
+#define XFS_IOC_FILE_EXTENT_SAME _IOWR(0x94, 54, struct xfs_extent_data)
 
 #ifndef HAVE_BBMACROS
 /*