file_ioctl.c: use print_array

* file_ioctl.c (file_ioctl): Rewrite printers of
struct file_dedupe_range_info and struct fiemap_extent arrays
using print_array.
This commit is contained in:
2016-05-24 00:20:07 +00:00
parent 0b13d9c294
commit d2bd683202

View File

@ -75,6 +75,44 @@ struct file_dedupe_range {
};
#endif
static bool
print_file_dedupe_range_info(struct tcb *tcp, void *elem_buf,
size_t elem_size, void *data)
{
const struct file_dedupe_range_info *info = elem_buf;
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);
}
return true;
}
#ifdef HAVE_LINUX_FIEMAP_H
static bool
print_fiemap_extent(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
{
const struct fiemap_extent *fe = elem_buf;
tprintf("{fe_logical=%" PRI__u64
", fe_physical=%" PRI__u64
", fe_length=%" PRI__u64 ", ",
fe->fe_logical, fe->fe_physical, fe->fe_length);
printflags64(fiemap_extent_flags, fe->fe_flags,
"FIEMAP_EXTENT_???");
tprints("}");
return true;
}
#endif /* HAVE_LINUX_FIEMAP_H */
int
file_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
{
@ -103,8 +141,6 @@ file_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
case FIDEDUPERANGE: { /* RW */
struct file_dedupe_range args;
uint64_t info_addr;
uint16_t i;
if (entering(tcp))
tprints(", ");
@ -116,56 +152,40 @@ file_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
if (umove_or_printaddr(tcp, arg, &args))
break;
tprints("{");
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("]}");
tprintf("src_offset=%" PRIu64
", src_length=%" PRIu64
", dest_count=%hu, ",
(uint64_t) args.src_offset,
(uint64_t) args.src_length,
(uint16_t) args.dest_count);
}
if (entering(tcp))
return 0;
break;
bool rc = false;
tprints("info=");
if (abbrev(tcp)) {
tprints("...");
} else {
struct file_dedupe_range_info info;
rc = print_array(tcp,
arg + offsetof(typeof(args), info),
args.dest_count,
&info, sizeof(info),
umoven_or_printaddr,
print_file_dedupe_range_info, 0);
}
tprints("}");
if (!rc || exiting(tcp))
break;
return 0;
}
#ifdef HAVE_LINUX_FIEMAP_H
case FS_IOC_FIEMAP: {
struct fiemap args;
struct fiemap_extent fe;
unsigned int i;
if (entering(tcp))
tprints(", ");
@ -195,33 +215,17 @@ file_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
args.fm_mapped_extents);
tprints(", fm_extents=");
if (abbrev(tcp)) {
tprints("...}");
break;
tprints("...");
} else {
struct fiemap_extent fe;
print_array(tcp,
arg + offsetof(typeof(args), fm_extents),
args.fm_mapped_extents, &fe, sizeof(fe),
umoven_or_printaddr,
print_fiemap_extent, 0);
}
tprints("}");
tprints("[");
for (i = 0; i < args.fm_mapped_extents; i++) {
unsigned long offset;
offset = offsetof(typeof(args), fm_extents[i]);
if (i)
tprints(", ");
if (i > max_strlen ||
umoven(tcp, arg + offset, sizeof(fe), &fe)) {
tprints("...");
break;
}
tprintf("{fe_logical=%" PRI__u64
", fe_physical=%" PRI__u64
", fe_length=%" PRI__u64 ", ",
fe.fe_logical, fe.fe_physical, fe.fe_length);
printflags64(fiemap_extent_flags, fe.fe_flags,
"FIEMAP_EXTENT_???");
tprints("}");
}
tprints("]}");
break;
}
#endif /* HAVE_LINUX_FIEMAP_H */