]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: implement the GETFSMAP ioctl
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 11 May 2017 19:01:07 +0000 (14:01 -0500)
committerEric Sandeen <sandeen@redhat.com>
Thu, 11 May 2017 19:01:07 +0000 (14:01 -0500)
Source kernel commit: e89c041338ed6ef2694e6465ca1ba033e0a2978c

Introduce a new ioctl that uses the reverse mapping btree to return
information about the physical layout of the filesystem.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_fs.h
libxfs/xfs_rmap.c
libxfs/xfs_rmap.h

index 11fe42a828f76ff1beb4c771289035905ac18fec..1831cff4af723db97954042bea36e3fb81564df5 100644 (file)
@@ -113,6 +113,18 @@ struct getbmapx {
 #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
@@ -522,6 +534,7 @@ 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         */
 
 /*
  * ioctl commands that replace IRIX syssgi()'s
index 7738f50a0f707829dc67af975b03f33ddb450dac..f78771d19b9341574e10d731640e1c262c9de19d 100644 (file)
@@ -2303,3 +2303,31 @@ xfs_rmap_free_extent(
        return __xfs_rmap_add(mp, dfops, XFS_RMAP_FREE, owner,
                        XFS_DATA_FORK, &bmap);
 }
+
+/* Compare rmap records.  Returns -1 if a < b, 1 if a > b, and 0 if equal. */
+int
+xfs_rmap_compare(
+       const struct xfs_rmap_irec      *a,
+       const struct xfs_rmap_irec      *b)
+{
+       __u64                           oa;
+       __u64                           ob;
+
+       oa = xfs_rmap_irec_offset_pack(a);
+       ob = xfs_rmap_irec_offset_pack(b);
+
+       if (a->rm_startblock < b->rm_startblock)
+               return -1;
+       else if (a->rm_startblock > b->rm_startblock)
+               return 1;
+       else if (a->rm_owner < b->rm_owner)
+               return -1;
+       else if (a->rm_owner > b->rm_owner)
+               return 1;
+       else if (oa < ob)
+               return -1;
+       else if (oa > ob)
+               return 1;
+       else
+               return 0;
+}
index faf2c1a2e63be348f7b7ae468b85141acabd1b1d..98f908fea103508a55955c97fc42f9052cf3316b 100644 (file)
@@ -214,5 +214,7 @@ int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_agblock_t bno,
 int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno,
                uint64_t owner, uint64_t offset, unsigned int flags,
                struct xfs_rmap_irec *irec, int *stat);
+int xfs_rmap_compare(const struct xfs_rmap_irec *a,
+               const struct xfs_rmap_irec *b);
 
 #endif /* __XFS_RMAP_H__ */