]> git-server-git.apps.pok.os.sepia.ceph.com Git - xfsprogs-dev.git/commitdiff
libfrog: move the GETFSMAP definitions into libfrog
authorDarrick J. Wong <djwong@kernel.org>
Thu, 6 Jan 2022 22:13:17 +0000 (14:13 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 20 Jan 2022 00:02:51 +0000 (16:02 -0800)
Move our private copy of the GETFSMAP definition into a libfrog header
file that (preferentially) uses the system header files.  We have no
business shipping kernel headers in the xfslibs package, but this shim
is still needed to build fully functional xfsprogs on old userspace.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
include/linux.h
io/fsmap.c
io/io.h
libfrog/Makefile
libfrog/fsmap.h [new file with mode: 0644]
scrub/phase6.c
scrub/phase7.c
scrub/spacemap.c
spaceman/freesp.c
spaceman/space.h

index de8a71221146c9dda5cb9bbfe9b2dd6dcdf6bd2c..3d9f4e3dca8020380df17ec1e41c5631a53fb096 100644 (file)
@@ -251,111 +251,6 @@ struct fsxattr {
 #define FS_XFLAG_COWEXTSIZE    0x00010000      /* CoW extent size allocator hint */
 #endif
 
-#ifdef HAVE_GETFSMAP
-# include <linux/fsmap.h>
-#else
-/*
- *     Structure for FS_IOC_GETFSMAP.
- *
- *     The memory layout for this call are the scalar values defined in
- *     struct fsmap_head, followed by two struct fsmap that describe
- *     the lower and upper bound of mappings to return, followed by an
- *     array of struct fsmap mappings.
- *
- *     fmh_iflags control the output of the call, whereas fmh_oflags report
- *     on the overall record output.  fmh_count should be set to the
- *     length of the fmh_recs array, and fmh_entries will be set to the
- *     number of entries filled out during each call.  If fmh_count is
- *     zero, the number of reverse mappings will be returned in
- *     fmh_entries, though no mappings will be returned.  fmh_reserved
- *     must be set to zero.
- *
- *     The two elements in the fmh_keys array are used to constrain the
- *     output.  The first element in the array should represent the
- *     lowest disk mapping ("low key") that the user wants to learn
- *     about.  If this value is all zeroes, the filesystem will return
- *     the first entry it knows about.  For a subsequent call, the
- *     contents of fsmap_head.fmh_recs[fsmap_head.fmh_count - 1] should be
- *     copied into fmh_keys[0] to have the kernel start where it left off.
- *
- *     The second element in the fmh_keys array should represent the
- *     highest disk mapping ("high key") that the user wants to learn
- *     about.  If this value is all ones, the filesystem will not stop
- *     until it runs out of mapping to return or runs out of space in
- *     fmh_recs.
- *
- *     fmr_device can be either a 32-bit cookie representing a device, or
- *     a 32-bit dev_t if the FMH_OF_DEV_T flag is set.  fmr_physical,
- *     fmr_offset, and fmr_length are expressed in units of bytes.
- *     fmr_owner is either an inode number, or a special value if
- *     FMR_OF_SPECIAL_OWNER is set in fmr_flags.
- */
-struct fsmap {
-       __u32           fmr_device;     /* device id */
-       __u32           fmr_flags;      /* mapping flags */
-       __u64           fmr_physical;   /* device offset of segment */
-       __u64           fmr_owner;      /* owner id */
-       __u64           fmr_offset;     /* file offset of segment */
-       __u64           fmr_length;     /* length of segment */
-       __u64           fmr_reserved[3];        /* must be zero */
-};
-
-struct fsmap_head {
-       __u32           fmh_iflags;     /* control flags */
-       __u32           fmh_oflags;     /* output flags */
-       __u32           fmh_count;      /* # of entries in array incl. input */
-       __u32           fmh_entries;    /* # of entries filled in (output). */
-       __u64           fmh_reserved[6];        /* must be zero */
-
-       struct fsmap    fmh_keys[2];    /* low and high keys for the mapping search */
-       struct fsmap    fmh_recs[];     /* returned records */
-};
-
-/* Size of an fsmap_head with room for nr records. */
-static inline size_t
-fsmap_sizeof(
-       unsigned int    nr)
-{
-       return sizeof(struct fsmap_head) + nr * sizeof(struct fsmap);
-}
-
-/* Start the next fsmap query at the end of the current query results. */
-static inline void
-fsmap_advance(
-       struct fsmap_head       *head)
-{
-       head->fmh_keys[0] = head->fmh_recs[head->fmh_entries - 1];
-}
-
-/*     fmh_iflags values - set by XFS_IOC_GETFSMAP caller in the header. */
-/* no flags defined yet */
-#define FMH_IF_VALID           0
-
-/*     fmh_oflags values - returned in the header segment only. */
-#define FMH_OF_DEV_T           0x1     /* fmr_device values will be dev_t */
-
-/*     fmr_flags values - returned for each non-header segment */
-#define FMR_OF_PREALLOC                0x1     /* segment = unwritten pre-allocation */
-#define FMR_OF_ATTR_FORK       0x2     /* segment = attribute fork */
-#define FMR_OF_EXTENT_MAP      0x4     /* segment = extent map */
-#define FMR_OF_SHARED          0x8     /* segment = shared with another file */
-#define FMR_OF_SPECIAL_OWNER   0x10    /* owner is a special value */
-#define FMR_OF_LAST            0x20    /* segment is the last in the FS */
-
-/* Each FS gets to define its own special owner codes. */
-#define FMR_OWNER(type, code)  (((__u64)type << 32) | \
-                                ((__u64)code & 0xFFFFFFFFULL))
-#define FMR_OWNER_TYPE(owner)  ((__u32)((__u64)owner >> 32))
-#define FMR_OWNER_CODE(owner)  ((__u32)(((__u64)owner & 0xFFFFFFFFULL)))
-#define FMR_OWN_FREE           FMR_OWNER(0, 1) /* free space */
-#define FMR_OWN_UNKNOWN                FMR_OWNER(0, 2) /* unknown owner */
-#define FMR_OWN_METADATA       FMR_OWNER(0, 3) /* metadata */
-
-#define FS_IOC_GETFSMAP                _IOWR('X', 59, struct fsmap_head)
-
-#define HAVE_GETFSMAP
-#endif /* HAVE_GETFSMAP */
-
 #ifndef HAVE_MAP_SYNC
 #define MAP_SYNC 0
 #define MAP_SHARED_VALIDATE 0
index f540a7c04409c0ba3a91f7631d88df1aee5842d7..9ff36bf4a6cfc1bb367cb5cea158c26a73cfee9e 100644 (file)
@@ -10,6 +10,7 @@
 #include "io.h"
 #include "input.h"
 #include "libfrog/fsgeom.h"
+#include "libfrog/fsmap.h"
 
 static cmdinfo_t       fsmap_cmd;
 static dev_t           xfs_data_dev;
diff --git a/io/io.h b/io/io.h
index 49db902fc44fea6c22dc60c05d33e9bf62b03890..39fb5878857a07afc7eed0cf5693e996109cbd6b 100644 (file)
--- a/io/io.h
+++ b/io/io.h
@@ -167,12 +167,7 @@ extern void                readdir_init(void);
 extern void            reflink_init(void);
 
 extern void            cowextsize_init(void);
-
-#ifdef HAVE_GETFSMAP
 extern void            fsmap_init(void);
-#else
-# define fsmap_init()  do { } while (0)
-#endif
 
 #ifdef HAVE_DEVMAPPER
 extern void            log_writes_init(void);
index 0110708239a8c2818872d5f8c12b2965ac77da0c..d60444554d84de05f01eb7efea20754953f6ac76 100644 (file)
@@ -40,6 +40,7 @@ crc32cselftest.h \
 crc32defs.h \
 crc32table.h \
 fsgeom.h \
+fsmap.h \
 logging.h \
 paths.h \
 projects.h \
diff --git a/libfrog/fsmap.h b/libfrog/fsmap.h
new file mode 100644 (file)
index 0000000..dc29096
--- /dev/null
@@ -0,0 +1,117 @@
+#ifdef HAVE_GETFSMAP
+# include <linux/fsmap.h>
+#endif
+
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+ * FS_IOC_GETFSMAP ioctl infrastructure.
+ *
+ * Copyright (C) 2017 Oracle.  All Rights Reserved.
+ *
+ * Author: Darrick J. Wong <djwong@kernel.org>
+ */
+#ifndef _LINUX_FSMAP_H
+#define _LINUX_FSMAP_H
+
+#include <linux/types.h>
+
+/*
+ *     Structure for FS_IOC_GETFSMAP.
+ *
+ *     The memory layout for this call are the scalar values defined in
+ *     struct fsmap_head, followed by two struct fsmap that describe
+ *     the lower and upper bound of mappings to return, followed by an
+ *     array of struct fsmap mappings.
+ *
+ *     fmh_iflags control the output of the call, whereas fmh_oflags report
+ *     on the overall record output.  fmh_count should be set to the
+ *     length of the fmh_recs array, and fmh_entries will be set to the
+ *     number of entries filled out during each call.  If fmh_count is
+ *     zero, the number of reverse mappings will be returned in
+ *     fmh_entries, though no mappings will be returned.  fmh_reserved
+ *     must be set to zero.
+ *
+ *     The two elements in the fmh_keys array are used to constrain the
+ *     output.  The first element in the array should represent the
+ *     lowest disk mapping ("low key") that the user wants to learn
+ *     about.  If this value is all zeroes, the filesystem will return
+ *     the first entry it knows about.  For a subsequent call, the
+ *     contents of fsmap_head.fmh_recs[fsmap_head.fmh_count - 1] should be
+ *     copied into fmh_keys[0] to have the kernel start where it left off.
+ *
+ *     The second element in the fmh_keys array should represent the
+ *     highest disk mapping ("high key") that the user wants to learn
+ *     about.  If this value is all ones, the filesystem will not stop
+ *     until it runs out of mapping to return or runs out of space in
+ *     fmh_recs.
+ *
+ *     fmr_device can be either a 32-bit cookie representing a device, or
+ *     a 32-bit dev_t if the FMH_OF_DEV_T flag is set.  fmr_physical,
+ *     fmr_offset, and fmr_length are expressed in units of bytes.
+ *     fmr_owner is either an inode number, or a special value if
+ *     FMR_OF_SPECIAL_OWNER is set in fmr_flags.
+ */
+struct fsmap {
+       __u32           fmr_device;     /* device id */
+       __u32           fmr_flags;      /* mapping flags */
+       __u64           fmr_physical;   /* device offset of segment */
+       __u64           fmr_owner;      /* owner id */
+       __u64           fmr_offset;     /* file offset of segment */
+       __u64           fmr_length;     /* length of segment */
+       __u64           fmr_reserved[3];        /* must be zero */
+};
+
+struct fsmap_head {
+       __u32           fmh_iflags;     /* control flags */
+       __u32           fmh_oflags;     /* output flags */
+       __u32           fmh_count;      /* # of entries in array incl. input */
+       __u32           fmh_entries;    /* # of entries filled in (output). */
+       __u64           fmh_reserved[6];        /* must be zero */
+
+       struct fsmap    fmh_keys[2];    /* low and high keys for the mapping search */
+       struct fsmap    fmh_recs[];     /* returned records */
+};
+
+/* Size of an fsmap_head with room for nr records. */
+static __inline__ size_t
+fsmap_sizeof(
+       unsigned int    nr)
+{
+       return sizeof(struct fsmap_head) + nr * sizeof(struct fsmap);
+}
+
+/* Start the next fsmap query at the end of the current query results. */
+static __inline__ void
+fsmap_advance(
+       struct fsmap_head       *head)
+{
+       head->fmh_keys[0] = head->fmh_recs[head->fmh_entries - 1];
+}
+
+/*     fmh_iflags values - set by FS_IOC_GETFSMAP caller in the header. */
+/* no flags defined yet */
+#define FMH_IF_VALID           0
+
+/*     fmh_oflags values - returned in the header segment only. */
+#define FMH_OF_DEV_T           0x1     /* fmr_device values will be dev_t */
+
+/*     fmr_flags values - returned for each non-header segment */
+#define FMR_OF_PREALLOC                0x1     /* segment = unwritten pre-allocation */
+#define FMR_OF_ATTR_FORK       0x2     /* segment = attribute fork */
+#define FMR_OF_EXTENT_MAP      0x4     /* segment = extent map */
+#define FMR_OF_SHARED          0x8     /* segment = shared with another file */
+#define FMR_OF_SPECIAL_OWNER   0x10    /* owner is a special value */
+#define FMR_OF_LAST            0x20    /* segment is the last in the dataset */
+
+/* Each FS gets to define its own special owner codes. */
+#define FMR_OWNER(type, code)  (((__u64)type << 32) | \
+                                ((__u64)code & 0xFFFFFFFFULL))
+#define FMR_OWNER_TYPE(owner)  ((__u32)((__u64)owner >> 32))
+#define FMR_OWNER_CODE(owner)  ((__u32)(((__u64)owner & 0xFFFFFFFFULL)))
+#define FMR_OWN_FREE           FMR_OWNER(0, 1) /* free space */
+#define FMR_OWN_UNKNOWN                FMR_OWNER(0, 2) /* unknown owner */
+#define FMR_OWN_METADATA       FMR_OWNER(0, 3) /* metadata */
+
+#define FS_IOC_GETFSMAP                _IOWR('X', 59, struct fsmap_head)
+
+#endif /* _LINUX_FSMAP_H */
index 87828b60fbed90a1dfd9d681512672a774f83f6a..dd42b66c90d3664d08d54e8c3d491aaa9610bfbd 100644 (file)
@@ -10,6 +10,7 @@
 #include "handle.h"
 #include "libfrog/paths.h"
 #include "libfrog/workqueue.h"
+#include "libfrog/fsmap.h"
 #include "xfs_scrub.h"
 #include "common.h"
 #include "libfrog/bitmap.h"
index bc652ab6f44aeb790602b4dcc8a3775b9f20ea49..e24906d1448b404023f9e24fec6cbc349633223c 100644 (file)
@@ -9,6 +9,7 @@
 #include <sys/statvfs.h>
 #include "libfrog/paths.h"
 #include "libfrog/ptvar.h"
+#include "libfrog/fsmap.h"
 #include "list.h"
 #include "xfs_scrub.h"
 #include "common.h"
index a5508d568a4386d2be40ec7e9c57d47f64d65cbd..b7f17e57e8045252039c7798ab7fb279e119511b 100644 (file)
@@ -10,6 +10,7 @@
 #include <sys/statvfs.h>
 #include "libfrog/workqueue.h"
 #include "libfrog/paths.h"
+#include "libfrog/fsmap.h"
 #include "xfs_scrub.h"
 #include "common.h"
 #include "spacemap.h"
index de301c195fb3b476073e65663e3d574f464e9a33..4e46ab267c509e89e42ad6cc87c5a24307c60e3b 100644 (file)
@@ -9,6 +9,7 @@
 #include "libxfs.h"
 #include <linux/fiemap.h>
 #include "libfrog/fsgeom.h"
+#include "libfrog/fsmap.h"
 #include "command.h"
 #include "init.h"
 #include "libfrog/paths.h"
index 723209edd9984b8ee558d69f08f8bd5bfe087e07..a8055535190997f507271c1a937802dc4de00470 100644 (file)
@@ -26,11 +26,7 @@ extern void  help_init(void);
 extern void    prealloc_init(void);
 extern void    quit_init(void);
 extern void    trim_init(void);
-#ifdef HAVE_GETFSMAP
 extern void    freesp_init(void);
-#else
-# define freesp_init() do { } while (0)
-#endif
 extern void    info_init(void);
 extern void    health_init(void);