ioctl: add decoding support for btrfs ioctls

* btrfs.c: New file.
* file_ioctl.c: Likewise.
* Makefile.am (strace_SOURCES): Add them.
* configure.ac (AC_CHECK_HEADERS): Add linux/btrfs.h.
(AC_CHECK_MEMBERS): Add struct btrfs_ioctl_feature_flags.compat_flags,
struct btrfs_ioctl_fs_info_args.nodesize,
struct btrfs_ioctl_defrag_range_args.start,
and struct btrfs_ioctl_search_args_v2.buf_size.
(AC_CHECK_DECLS): Add BTRFS_COMPRESS_* enums.
* defs.h (btrfs_ioctl, file_ioctl): New prototypes.
* ioctl.c (ioctl_decode) [HAVE_LINUX_BTRFS_H]: Use btrfs_ioctl.
* xlat/btrfs_balance_args.in: New file.
* xlat/btrfs_balance_ctl_cmds.in: Likewise.
* xlat/btrfs_balance_flags.in: Likewise.
* xlat/btrfs_balance_state.in: Likewise.
* xlat/btrfs_compress_types.in: Likewise.
* xlat/btrfs_defrag_flags.in: Likewise.
* xlat/btrfs_dev_replace_cmds.in: Likewise.
* xlat/btrfs_dev_replace_results.in: Likewise.
* xlat/btrfs_dev_replace_state.in: Likewise.
* xlat/btrfs_dev_stats_flags.in: Likewise.
* xlat/btrfs_dev_stats_values.in: Likewise.
* xlat/btrfs_features_compat.in: Likewise.
* xlat/btrfs_features_compat_ro.in: Likewise.
* xlat/btrfs_features_incompat.in: Likewise.
* xlat/btrfs_key_types.in: Likewise.
* xlat/btrfs_qgroup_ctl_cmds.in: Likewise.
* xlat/btrfs_qgroup_inherit_flags.in: Likewise.
* xlat/btrfs_qgroup_limit_flags.in: Likewise.
* xlat/btrfs_qgroup_status_flags.in: Likewise.
* xlat/btrfs_scrub_flags.in: Likewise.
* xlat/btrfs_send_flags.in: Likewise.
* xlat/btrfs_snap_flags_v2.in: Likewise.
* xlat/btrfs_space_info_flags.in: Likewise.
* xlat/btrfs_tree_objectids.in: Likewise.
This commit is contained in:
Jeff Mahoney 2016-05-18 18:09:39 -04:00 committed by Dmitry V. Levin
parent c4d4d3c3a6
commit 8cc6962216
30 changed files with 1715 additions and 0 deletions

View File

@ -81,6 +81,7 @@ strace_SOURCES = \
bjm.c \
block.c \
bpf.c \
btrfs.c \
cacheflush.c \
capability.c \
caps0.h \
@ -110,6 +111,7 @@ strace_SOURCES = \
fetch_struct_statfs.c \
file.c \
file_handle.c \
file_ioctl.c \
flock.c \
flock.h \
futex.c \

1369
btrfs.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -453,6 +453,18 @@ AC_CHECK_TYPES([struct statfs64], [
],, [#include <linux/types.h>
#include <asm/statfs.h>])
AC_CHECK_HEADERS([linux/btrfs.h], [
AC_CHECK_MEMBERS(m4_normalize([
struct btrfs_ioctl_feature_flags.compat_flags,
struct btrfs_ioctl_fs_info_args.nodesize,
struct btrfs_ioctl_defrag_range_args.start
struct btrfs_ioctl_search_args_v2.buf_size
]),,, [ #include <stdio.h>
#include <linux/btrfs.h>])
AC_CHECK_DECLS(m4_normalize([BTRFS_COMPRESS_NONE, BTRFS_COMPRESS_ZLIB,
BTRFS_COMPRESS_LZO]),,,[ #include <stdio.h>
#include <linux/btrfs.h>])])
AC_CHECK_DECLS([sys_errlist])
AC_CHECK_DECLS(m4_normalize([
PTRACE_PEEKUSER,

2
defs.h
View File

@ -660,7 +660,9 @@ extern void print_struct_statfs(struct tcb *tcp, long);
extern void print_struct_statfs64(struct tcb *tcp, long, unsigned long);
extern int block_ioctl(struct tcb *, const unsigned int, long);
extern int btrfs_ioctl(struct tcb *, const unsigned int, long);
extern int evdev_ioctl(struct tcb *, const unsigned int, long);
extern int file_ioctl(struct tcb *, const unsigned int, long);
extern int loop_ioctl(struct tcb *, const unsigned int, long);
extern int mtd_ioctl(struct tcb *, const unsigned int, long);
extern int ptp_ioctl(struct tcb *, const unsigned int, long);

162
file_ioctl.c Normal file
View File

@ -0,0 +1,162 @@
/*
* Copyright (c) 2016 Jeff Mahoney <jeffm@suse.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "defs.h"
#include <sys/ioctl.h>
#include <linux/fs.h>
#ifndef FICLONE
#define FICLONE _IOW(0x94, 9, int)
#endif
#ifndef FICLONERANGE
#define FICLONERANGE _IOW(0x94, 13, struct file_clone_range)
struct file_clone_range {
int64_t src_fd;
uint64_t src_offset;
uint64_t src_length;
uint64_t dest_offset;
};
#endif
#ifndef FIDEDUPERANGE
#define FIDEDUPERANGE _IOWR(0x94, 54, struct file_dedupe_range)
struct file_dedupe_range_info {
int64_t dest_fd; /* in - destination file */
uint64_t dest_offset; /* in - start of extent in destination */
uint64_t bytes_deduped; /* out - total # of bytes we were able
* to dedupe from this file. */
/* status of this dedupe operation:
* < 0 for error
* == FILE_DEDUPE_RANGE_SAME if dedupe succeeds
* == FILE_DEDUPE_RANGE_DIFFERS if data differs
*/
int32_t status; /* out - see above description */
uint32_t reserved; /* must be zero */
};
struct file_dedupe_range {
uint64_t src_offset; /* in - start of extent in source */
uint64_t src_length; /* in - length of extent */
uint16_t dest_count; /* in - total elements in info array */
uint16_t reserved1; /* must be zero */
uint32_t reserved2; /* must be zero */
struct file_dedupe_range_info info[0];
};
#endif
int
file_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
{
switch (code) {
/* take a signed int */
case FICLONE: /* W */
tprintf(", %d", (int)arg);
break;
case FICLONERANGE: { /* W */
struct file_clone_range args;
tprints(", ");
if (umove_or_printaddr(tcp, arg, &args))
break;
tprintf("{src_fd=%" PRIi64 ", "
"src_offset=%" PRIu64 ", "
"src_length=%" PRIu64 ", "
"dest_offset=%" PRIu64 "}",
(int64_t)args.src_fd, (uint64_t)args.src_offset,
(uint64_t)args.src_length, (uint64_t)args.dest_offset);
break;
}
case FIDEDUPERANGE: { /* RW */
struct file_dedupe_range args;
uint64_t info_addr;
uint16_t i;
if (entering(tcp))
tprints(", ");
else if (syserror(tcp))
break;
else
tprints(" => ");
if (umove_or_printaddr(tcp, arg, &args))
break;
if (entering(tcp)) {
tprintf("{src_offset=%" PRIu64 ", "
"src_length=%" PRIu64 ", "
"dest_count=%hu, info=",
(uint64_t)args.src_offset,
(uint64_t)args.src_length,
(uint16_t)args.dest_count);
} else
tprints("{info=");
if (abbrev(tcp)) {
tprints("...}");
} else {
tprints("[");
info_addr = arg + offsetof(typeof(args), info);
for (i = 0; i < args.dest_count; i++) {
struct file_dedupe_range_info info;
uint64_t addr = info_addr + sizeof(info) * i;
if (i)
tprints(", ");
if (umoven(tcp, addr, sizeof(info), &info)) {
tprints("...");
break;
}
if (entering(tcp))
tprintf("{dest_fd=%" PRIi64 ", "
"dest_offset=%" PRIu64 "}",
(int64_t)info.dest_fd,
(uint64_t)info.dest_offset);
else {
tprintf("{bytes_deduped=%" PRIu64 ", "
"status=%d}",
(uint64_t)info.bytes_deduped,
info.status);
}
}
tprints("]}");
}
if (entering(tcp))
return 0;
break;
}
default:
return RVAL_DECODED;
};
return RVAL_DECODED | 1;
}

View File

@ -266,6 +266,10 @@ ioctl_decode(struct tcb *tcp)
#ifdef HAVE_LINUX_USERFAULTFD_H
case 0xaa:
return uffdio_ioctl(tcp, code, arg);
#endif
#ifdef HAVE_LINUX_BTRFS_H
case 0x94:
return btrfs_ioctl(tcp, code, arg);
#endif
default:
break;

View File

@ -0,0 +1,12 @@
#val_type uint64_t
BTRFS_BALANCE_ARGS_PROFILES (1ULL << 0)
BTRFS_BALANCE_ARGS_USAGE (1ULL << 1)
BTRFS_BALANCE_ARGS_DEVID (1ULL << 2)
BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3)
BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4)
BTRFS_BALANCE_ARGS_LIMIT (1ULL << 5)
BTRFS_BALANCE_ARGS_LIMIT_RANGE (1ULL << 6)
BTRFS_BALANCE_ARGS_STRIPES_RANGE (1ULL << 7)
BTRFS_BALANCE_ARGS_CONVERT (1ULL << 8)
BTRFS_BALANCE_ARGS_SOFT (1ULL << 9)
BTRFS_BALANCE_ARGS_USAGE_RANGE (1ULL << 10)

View File

@ -0,0 +1,2 @@
BTRFS_BALANCE_CTL_PAUSE 1
BTRFS_BALANCE_CTL_CANCEL 2

View File

@ -0,0 +1,6 @@
#val_type uint64_t
BTRFS_BALANCE_DATA (1ULL << 0)
BTRFS_BALANCE_SYSTEM (1ULL << 1)
BTRFS_BALANCE_METADATA (1ULL << 2)
BTRFS_BALANCE_FORCE (1ULL << 3)
BTRFS_BALANCE_RESUME (1ULL << 4)

View File

@ -0,0 +1,3 @@
BTRFS_BALANCE_STATE_RUNNING (1ULL << 0)
BTRFS_BALANCE_STATE_PAUSE_REQ (1ULL << 1)
BTRFS_BALANCE_STATE_CANCEL_REQ (1ULL << 2)

View File

@ -0,0 +1,3 @@
BTRFS_COMPRESS_NONE 0
BTRFS_COMPRESS_ZLIB 1
BTRFS_COMPRESS_LZO 2

View File

@ -0,0 +1,3 @@
#val_type uint64_t
BTRFS_DEFRAG_RANGE_COMPRESS
BTRFS_DEFRAG_RANGE_START_IO

View File

@ -0,0 +1,4 @@
#val_type uint64_t
BTRFS_IOCTL_DEV_REPLACE_CMD_START
BTRFS_IOCTL_DEV_REPLACE_CMD_STATUS
BTRFS_IOCTL_DEV_REPLACE_CMD_CANCEL

View File

@ -0,0 +1,5 @@
#val_type uint64_t
BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR
BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED
BTRFS_IOCTL_DEV_REPLACE_RESULT_ALREADY_STARTED
BTRFS_IOCTL_DEV_REPLACE_RESULT_SCRUB_INPROGRESS

View File

@ -0,0 +1,6 @@
#val_type uint64_t
BTRFS_IOCTL_DEV_REPLACE_STATE_NEVER_STARTED
BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED
BTRFS_IOCTL_DEV_REPLACE_STATE_FINISHED
BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED
BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED

View File

@ -0,0 +1,2 @@
#val_type uint64_t
BTRFS_DEV_STATS_RESET

View File

@ -0,0 +1,12 @@
#val_type uint64_t
#define HAVE_DECL_BTRFS_DEV_STAT_WRITE_ERRS 1
#define HAVE_DECL_BTRFS_DEV_STAT_READ_ERRS 1
#define HAVE_DECL_BTRFS_DEV_STAT_FLUSH_ERRS 1
#define HAVE_DECL_BTRFS_DEV_STAT_CORRUPTION_ERRS 1
#define HAVE_DECL_BTRFS_DEV_STAT_GENERATION_ERRS 1
BTRFS_DEV_STAT_WRITE_ERRS
BTRFS_DEV_STAT_READ_ERRS
BTRFS_DEV_STAT_FLUSH_ERRS
BTRFS_DEV_STAT_CORRUPTION_ERRS
BTRFS_DEV_STAT_GENERATION_ERRS

View File

View File

@ -0,0 +1,2 @@
#val_type uint64_t
BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE (1ULL << 0)

View File

@ -0,0 +1,11 @@
#val_type uint64_t
BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF (1ULL << 0)
BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL (1ULL << 1)
BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS (1ULL << 2)
BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO (1ULL << 3)
BTRFS_FEATURE_INCOMPAT_COMPRESS_LZOv2 (1ULL << 4)
BTRFS_FEATURE_INCOMPAT_BIG_METADATA (1ULL << 5)
BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF (1ULL << 6)
BTRFS_FEATURE_INCOMPAT_RAID56 (1ULL << 7)
BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA (1ULL << 8)
BTRFS_FEATURE_INCOMPAT_NO_HOLES (1ULL << 9)

42
xlat/btrfs_key_types.in Normal file
View File

@ -0,0 +1,42 @@
#val_type uint64_t
BTRFS_INODE_ITEM_KEY 1
BTRFS_INODE_REF_KEY 12
BTRFS_INODE_EXTREF_KEY 13
BTRFS_XATTR_ITEM_KEY 24
BTRFS_ORPHAN_ITEM_KEY 48
BTRFS_DIR_LOG_ITEM_KEY 60
BTRFS_DIR_LOG_INDEX_KEY 72
BTRFS_DIR_ITEM_KEY 84
BTRFS_DIR_INDEX_KEY 96
BTRFS_EXTENT_DATA_KEY 108
BTRFS_EXTENT_CSUM_KEY 128
BTRFS_ROOT_ITEM_KEY 132
BTRFS_ROOT_BACKREF_KEY 144
BTRFS_ROOT_REF_KEY 156
BTRFS_EXTENT_ITEM_KEY 168
BTRFS_METADATA_ITEM_KEY 169
BTRFS_TREE_BLOCK_REF_KEY 176
BTRFS_EXTENT_DATA_REF_KEY 178
BTRFS_EXTENT_REF_V0_KEY 180
BTRFS_SHARED_BLOCK_REF_KEY 182
BTRFS_SHARED_DATA_REF_KEY 184
BTRFS_BLOCK_GROUP_ITEM_KEY 192
BTRFS_FREE_SPACE_INFO_KEY 198
BTRFS_FREE_SPACE_EXTENT_KEY 199
BTRFS_FREE_SPACE_BITMAP_KEY 200
BTRFS_DEV_EXTENT_KEY 204
BTRFS_DEV_ITEM_KEY 216
BTRFS_CHUNK_ITEM_KEY 228
BTRFS_QGROUP_STATUS_KEY 240
BTRFS_QGROUP_INFO_KEY 242
BTRFS_QGROUP_LIMIT_KEY 244
BTRFS_QGROUP_RELATION_KEY 246
BTRFS_BALANCE_ITEM_KEY 248
BTRFS_TEMPORARY_ITEM_KEY 248
BTRFS_DEV_STATS_KEY 249
BTRFS_PERSISTENT_ITEM_KEY 249
BTRFS_DEV_REPLACE_KEY 250
BTRFS_UUID_KEY_SUBVOL 251
BTRFS_UUID_KEY_RECEIVED_SUBVOL 252
BTRFS_STRING_ITEM_KEY 253
UINT32_MAX -1U

View File

@ -0,0 +1,4 @@
#val_type uint64_t
BTRFS_QUOTA_CTL_ENABLE
BTRFS_QUOTA_CTL_DISABLE
BTRFS_QUOTA_CTL_RESCAN__NOTUSED

View File

@ -0,0 +1,2 @@
#val_type uint64_t
BTRFS_QGROUP_INHERIT_SET_LIMITS

View File

@ -0,0 +1,7 @@
#val_type uint64_t
BTRFS_QGROUP_LIMIT_MAX_RFER (1ULL << 0)
BTRFS_QGROUP_LIMIT_MAX_EXCL (1ULL << 1)
BTRFS_QGROUP_LIMIT_RSV_RFER (1ULL << 2)
BTRFS_QGROUP_LIMIT_RSV_EXCL (1ULL << 3)
BTRFS_QGROUP_LIMIT_RFER_CMPR (1ULL << 4)
BTRFS_QGROUP_LIMIT_EXCL_CMPR (1ULL << 5)

View File

@ -0,0 +1,3 @@
#val_type uint64_t
BTRFS_QGROUP_STATUS_FLAG_ON (1ULL << 0)
BTRFS_QGROUP_STATUS_FLAG_RESCAN (1ULL << 1)

View File

@ -0,0 +1,2 @@
#val_type uint64_t
BTRFS_SCRUB_READONLY 1

3
xlat/btrfs_send_flags.in Normal file
View File

@ -0,0 +1,3 @@
BTRFS_SEND_FLAG_NO_FILE_DATA 0x1
BTRFS_SEND_FLAG_OMIT_STREAM_HEADER 0x2
BTRFS_SEND_FLAG_OMIT_END_CMD 0x4

View File

@ -0,0 +1,4 @@
#val_type uint64_t
BTRFS_SUBVOL_CREATE_ASYNC
BTRFS_SUBVOL_RDONLY
BTRFS_SUBVOL_QGROUP_INHERIT

View File

@ -0,0 +1,12 @@
#val_type uint64_t
BTRFS_BLOCK_GROUP_DATA (1ULL << 0)
BTRFS_BLOCK_GROUP_SYSTEM (1ULL << 1)
BTRFS_BLOCK_GROUP_METADATA (1ULL << 2)
BTRFS_BLOCK_GROUP_RAID0 (1ULL << 3)
BTRFS_BLOCK_GROUP_RAID1 (1ULL << 4)
BTRFS_BLOCK_GROUP_DUP (1ULL << 5)
BTRFS_BLOCK_GROUP_RAID10 (1ULL << 6)
BTRFS_BLOCK_GROUP_RAID5 (1ULL << 7)
BTRFS_BLOCK_GROUP_RAID6 (1ULL << 8)
BTRFS_AVAIL_ALLOC_BIT_SINGLE (1ULL << 48)
BTRFS_SPACE_INFO_GLOBAL_RSV (1ULL << 49)

View File

@ -0,0 +1,14 @@
#val_type uint64_t
BTRFS_ROOT_TREE_OBJECTID 1ULL
BTRFS_EXTENT_TREE_OBJECTID 2ULL
BTRFS_CHUNK_TREE_OBJECTID 3ULL
BTRFS_DEV_TREE_OBJECTID 4ULL
BTRFS_FS_TREE_OBJECTID 5ULL
BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL
BTRFS_CSUM_TREE_OBJECTID 7ULL
BTRFS_QUOTA_TREE_OBJECTID 8ULL
BTRFS_UUID_TREE_OBJECTID 9ULL
BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL
BTRFS_FIRST_FREE_OBJECTID 256ULL
BTRFS_LAST_FREE_OBJECTID -256ULL
UINT64_MAX -1ULL