summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@strace.io>2021-01-04 08:00:00 +0000
committerDmitry V. Levin <ldv@strace.io>2021-01-04 08:00:00 +0000
commit15af9719511da8485d3f93c3290e64d66586b4b3 (patch)
treecbb9ce8fb6996d01288f583e093470b339b88107
parented41699c5a79417a3d9d4704757eb2c95fc706d7 (diff)
downloadstrace-15af9719511da8485d3f93c3290e64d66586b4b3.tar.gz
file_ioctl: compile unconditionally
* configure.ac (AC_CHECK_HEADERS): Remove linux/fiemap.h. * types/fiemap.h: New file. * xlat/fs_f_ioctl_cmds.in: Likewise. * file_ioctl.c: Include "types/fiemap.h" instead of <linux/fiemap.h>. Include "xlat/fs_f_ioctl_cmds.h" in XLAT_MACROS_ONLY mode. (print_fiemap_extentm, file_ioctl): Use struct_fiemap instead of struct fiemap, compile unconditionally.
-rw-r--r--configure.ac1
-rw-r--r--file_ioctl.c21
-rw-r--r--types/fiemap.h35
-rw-r--r--xlat/fs_f_ioctl_cmds.in1
4 files changed, 45 insertions, 13 deletions
diff --git a/configure.ac b/configure.ac
index 502c305d3..a736e70bd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -415,7 +415,6 @@ AC_CHECK_HEADERS(m4_normalize([
linux/dqblk_xfs.h
linux/falloc.h
linux/fib_rules.h
- linux/fiemap.h
linux/hiddev.h
linux/ip_vs.h
linux/ipc.h
diff --git a/file_ioctl.c b/file_ioctl.c
index 7baa4d2b1..1dada177d 100644
--- a/file_ioctl.c
+++ b/file_ioctl.c
@@ -9,17 +9,17 @@
#include "defs.h"
#include "print_fields.h"
#include <linux/fs.h>
-
-#ifdef HAVE_LINUX_FIEMAP_H
-# include <linux/types.h>
-# include <linux/fiemap.h>
-# include "xlat/fiemap_flags.h"
-# include "xlat/fiemap_extent_flags.h"
+#include "types/fiemap.h"
+#include "xlat/fiemap_flags.h"
+#include "xlat/fiemap_extent_flags.h"
+#define XLAT_MACROS_ONLY
+# include "xlat/fs_f_ioctl_cmds.h"
+#undef XLAT_MACROS_ONLY
static bool
print_fiemap_extent(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
{
- const struct fiemap_extent *fe = elem_buf;
+ const struct_fiemap_extent *fe = elem_buf;
PRINT_FIELD_U("{", *fe, fe_logical);
PRINT_FIELD_U(", ", *fe, fe_physical);
@@ -30,16 +30,14 @@ print_fiemap_extent(struct tcb *tcp, void *elem_buf, size_t elem_size, void *dat
return true;
}
-#endif /* HAVE_LINUX_FIEMAP_H */
int
file_ioctl(struct tcb *const tcp, const unsigned int code,
const kernel_ulong_t arg)
{
switch (code) {
-#ifdef HAVE_LINUX_FIEMAP_H
case FS_IOC_FIEMAP: {
- struct fiemap args;
+ struct_fiemap args;
if (entering(tcp))
tprints(", ");
@@ -67,7 +65,7 @@ file_ioctl(struct tcb *const tcp, const unsigned int code,
if (abbrev(tcp)) {
tprints(", ...");
} else {
- struct fiemap_extent fe;
+ struct_fiemap_extent fe;
tprints(", fm_extents=");
print_array(tcp,
arg + offsetof(typeof(args), fm_extents),
@@ -79,7 +77,6 @@ file_ioctl(struct tcb *const tcp, const unsigned int code,
break;
}
-#endif /* HAVE_LINUX_FIEMAP_H */
default:
return RVAL_DECODED;
diff --git a/types/fiemap.h b/types/fiemap.h
new file mode 100644
index 000000000..10f32e27b
--- /dev/null
+++ b/types/fiemap.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2021 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#ifndef STRACE_TYPES_FIEMAP_H
+# define STRACE_TYPES_FIEMAP_H
+
+# ifdef HAVE_LINUX_FIEMAP_H
+# include <linux/types.h>
+# include <linux/fiemap.h>
+# endif
+
+typedef struct {
+ uint64_t fe_logical;
+ uint64_t fe_physical;
+ uint64_t fe_length;
+ uint64_t fe_reserved64[2];
+ uint32_t fe_flags;
+ uint32_t fe_reserved[3];
+} struct_fiemap_extent;
+
+typedef struct {
+ uint64_t fm_start;
+ uint64_t fm_length;
+ uint32_t fm_flags;
+ uint32_t fm_mapped_extents;
+ uint32_t fm_extent_count;
+ uint32_t fm_reserved;
+ struct fiemap_extent fm_extents[0];
+} struct_fiemap;
+
+#endif /* STRACE_TYPES_FIEMAP_H */
diff --git a/xlat/fs_f_ioctl_cmds.in b/xlat/fs_f_ioctl_cmds.in
new file mode 100644
index 000000000..d1710b760
--- /dev/null
+++ b/xlat/fs_f_ioctl_cmds.in
@@ -0,0 +1 @@
+FS_IOC_FIEMAP _IOWR('f', 11, struct_fiemap)