]> granicus.if.org Git - strace/blobdiff - btrfs.c
travis: add build environment information to the travis log
[strace] / btrfs.c
diff --git a/btrfs.c b/btrfs.c
index c1c9592801165ee1c95629980b50ff32f07a1d69..8bffba8b6604072dcb4b79a0a9e3249607d5465d 100644 (file)
--- a/btrfs.c
+++ b/btrfs.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2016 Jeff Mahoney <jeffm@suse.com>
+ * Copyright (c) 2016-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -32,6 +33,7 @@
 #include DEF_MPERS_TYPE(struct_btrfs_ioctl_dev_replace_args)
 #include DEF_MPERS_TYPE(struct_btrfs_ioctl_send_args)
 #include DEF_MPERS_TYPE(struct_btrfs_ioctl_received_subvol_args)
+#include DEF_MPERS_TYPE(struct_btrfs_ioctl_vol_args_v2)
 
 # include <linux/btrfs.h>
 
@@ -41,6 +43,8 @@ typedef struct btrfs_ioctl_send_args
        struct_btrfs_ioctl_send_args;
 typedef struct btrfs_ioctl_received_subvol_args
        struct_btrfs_ioctl_received_subvol_args;
+typedef struct btrfs_ioctl_vol_args_v2
+       struct_btrfs_ioctl_vol_args_v2;
 
 #endif /* HAVE_LINUX_BTRFS_H */
 
@@ -48,6 +52,7 @@ typedef struct btrfs_ioctl_received_subvol_args
 
 #ifdef HAVE_LINUX_BTRFS_H
 
+#include "print_fields.h"
 #include <linux/fs.h>
 
 /*
@@ -83,6 +88,20 @@ struct btrfs_ioctl_defrag_range_args {
 # define BTRFS_FIRST_FREE_OBJECTID 256ULL
 #endif
 
+#ifndef BTRFS_IOC_QUOTA_RESCAN
+struct btrfs_ioctl_quota_rescan_args {
+       uint64_t flags, progress, reserved[6];
+};
+# define BTRFS_IOC_QUOTA_RESCAN _IOW(BTRFS_IOCTL_MAGIC, 44, \
+                                       struct btrfs_ioctl_quota_rescan_args)
+# define BTRFS_IOC_QUOTA_RESCAN_STATUS _IOR(BTRFS_IOCTL_MAGIC, 45, \
+                                       struct btrfs_ioctl_quota_rescan_args)
+#endif
+
+#ifndef BTRFS_IOC_QUOTA_RESCAN_WAIT
+# define BTRFS_IOC_QUOTA_RESCAN_WAIT _IO(BTRFS_IOCTL_MAGIC, 46)
+#endif
+
 #ifndef BTRFS_IOC_GET_FEATURES
 # define BTRFS_IOC_GET_FEATURES _IOR(BTRFS_IOCTL_MAGIC, 57, \
                                        struct btrfs_ioctl_feature_flags)
@@ -163,7 +182,7 @@ print_u64(const char *name, uint64_t value)
 {
        tprintf(", %s=%" PRIu64, name, value);
        if (value == UINT64_MAX)
-               tprints(" /* UINT64_MAX */");
+               tprints_comment("UINT64_MAX");
 }
 
 #define print_member_u64(obj, name) print_u64(#name, obj->name)
@@ -187,7 +206,7 @@ btrfs_print_balance_args(const char *name, const struct btrfs_balance_args *bba)
 }
 
 static void
-btrfs_print_balance(struct tcb *tcp, const long arg, bool out)
+btrfs_print_balance(struct tcb *const tcp, const kernel_ulong_t arg, bool out)
 {
        struct btrfs_ioctl_balance_args balance_args;
 
@@ -244,19 +263,15 @@ btrfs_print_qgroup_limit(const struct btrfs_qgroup_limit *lim)
 static void
 btrfs_print_key_type(uint32_t type)
 {
-       const char *str = xlookup(btrfs_key_types, type);
        tprintf("%u", type);
-       if (str)
-               tprintf(" /* %s */", str);
+       tprints_comment(xlookup(btrfs_key_types, type));
 }
 
 static void
 btrfs_print_objectid(uint64_t objectid)
 {
-       const char *str = xlookup(btrfs_tree_objectids, objectid);
        tprintf("%" PRIu64, objectid);
-       if (str)
-               tprintf(" /* %s */", str);
+       tprints_comment(xlookup(btrfs_tree_objectids, objectid));
 }
 
 static void
@@ -303,7 +318,7 @@ btrfs_print_logical_ino_container(struct tcb *tcp,
                const uint64_t val_addr =
                        inodes_addr + offsetof(typeof(container), val);
                uint64_t record[3];
-               print_array(tcp, val_addr, container.elem_cnt,
+               print_array(tcp, val_addr, container.elem_cnt / 3,
                            record, sizeof(record),
                            umoven_or_printaddr,
                            print_btrfs_data_container_logical_ino, 0);
@@ -353,20 +368,20 @@ btrfs_print_ino_path_container(struct tcb *tcp,
 static bool
 print_uint64(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
 {
-       tprintf("%" PRIu64, * (uint64_t *) elem_buf);
+       tprintf("%" PRIu64, *(uint64_t *) elem_buf);
 
        return true;
 }
 
 static void
-btrfs_print_qgroup_inherit(struct tcb *tcp, const uint64_t qgi_addr)
+btrfs_print_qgroup_inherit(struct tcb *const tcp, const kernel_ulong_t qgi_addr)
 {
        struct btrfs_qgroup_inherit inherit;
 
        if (umove_or_printaddr(tcp, qgi_addr, &inherit))
                return;
 
-       tprintf("{flags=");
+       tprints("{flags=");
        printflags64(btrfs_qgroup_inherit_flags, inherit.flags,
                     "BTRFS_QGROUP_INHERIT_???");
        tprintf(", num_qgroups=%" PRI__u64 ", num_ref_copies=%" PRI__u64
@@ -395,33 +410,18 @@ print_key_value_internal(struct tcb *tcp, const char *name, uint64_t value)
        if (value) {
                tprintf(", %s=%" PRIu64, name, value);
                if (value == UINT64_MAX)
-                       tprints(" /* UINT64_MAX */");
+                       tprints_comment("UINT64_MAX");
        }
 }
 #define print_key_value(tcp, key, name)                                        \
        print_key_value_internal((tcp), #name, (key)->name)
 
-static bool
-print_btrfs_ioctl_search_header(struct tcb *tcp, void *elem_buf,
-                               size_t elem_size, void *data)
-{
-       const struct btrfs_ioctl_search_header *sh = elem_buf;
-
-       tprintf("{transid=%" PRI__u64 ", objectid=", sh->transid);
-       btrfs_print_objectid(sh->objectid);
-       tprintf(", offset=%" PRI__u64 ", type=", sh->offset);
-       btrfs_print_key_type(sh->type);
-       tprintf(", len=%u}", sh->len);
-
-       return true;
-}
-
 static void
 btrfs_print_tree_search(struct tcb *tcp, struct btrfs_ioctl_search_key *key,
                        uint64_t buf_addr, uint64_t buf_size, bool print_size)
 {
        if (entering(tcp)) {
-               tprintf("{key={tree_id=");
+               tprints("{key={tree_id=");
                btrfs_print_objectid(key->tree_id);
 
                if (key->min_objectid != BTRFS_FIRST_FREE_OBJECTID ||
@@ -457,12 +457,29 @@ btrfs_print_tree_search(struct tcb *tcp, struct btrfs_ioctl_search_key *key,
                if (abbrev(tcp))
                        tprints("...");
                else {
-                       struct btrfs_ioctl_search_header sh;
+                       uint64_t i;
+                       uint64_t off = 0;
+                       tprints("[");
+                       for (i = 0; i < key->nr_items; i++) {
+                               struct btrfs_ioctl_search_header sh;
+                               uint64_t addr = buf_addr + off;
+                               if (i)
+                                       tprints(", ");
+                               if (i > max_strlen ||
+                                   umove(tcp, addr, &sh)) {
+                                       tprints("...");
+                                       break;
+                               }
+                               tprintf("{transid=%" PRI__u64 ", objectid=",
+                                       sh.transid);
+                               btrfs_print_objectid(sh.objectid);
+                               tprintf(", offset=%" PRI__u64 ", type=", sh.offset);
+                               btrfs_print_key_type(sh.type);
+                               tprintf(", len=%u}", sh.len);
+                               off += sizeof(sh) + sh.len;
 
-                       print_array(tcp, buf_addr, key->nr_items,
-                                   &sh, sizeof(sh),
-                                   umoven_or_printaddr,
-                                   print_btrfs_ioctl_search_header, 0);
+                       }
+                       tprints("]");
                }
                tprints("}");
        }
@@ -472,7 +489,7 @@ static bool
 print_objectid_callback(struct tcb *tcp, void *elem_buf,
                        size_t elem_size, void *data)
 {
-       btrfs_print_objectid(* (uint64_t *) elem_buf);
+       btrfs_print_objectid(*(uint64_t *) elem_buf);
 
        return true;
 }
@@ -493,7 +510,8 @@ print_btrfs_ioctl_space_info(struct tcb *tcp, void *elem_buf,
 }
 
 MPERS_PRINTER_DECL(int, btrfs_ioctl,
-                  struct tcb *tcp, const unsigned int code, const long arg)
+                  struct tcb *const tcp, const unsigned int code,
+                  const kernel_ulong_t arg)
 {
        switch (code) {
        /* Take no arguments; command only. */
@@ -588,9 +606,9 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
 
                tprintf("{start=%" PRIu64 ", len=", (uint64_t)args.start);
 
-               tprintf("%" PRIu64, args.len);
+               tprintf("%" PRIu64, (uint64_t) args.len);
                if (args.len == UINT64_MAX)
-                       tprints(" /* UINT64_MAX */");
+                       tprints_comment("UINT64_MAX");
 
                tprints(", flags=");
                printflags64(btrfs_defrag_flags, args.flags,
@@ -629,10 +647,9 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                if (valid)
                        tprintf("uuid=%s, ", uuid);
                tprintf("bytes_used=%" PRI__u64
-                       ", total_bytes=%" PRI__u64 ", path=",
+                       ", total_bytes=%" PRI__u64,
                        args.bytes_used, args.total_bytes);
-               print_quoted_string((const char *)args.path, sizeof(args.path),
-                                   QUOTE_0_TERMINATED);
+               PRINT_FIELD_CSTRING(", ", args, path);
                tprints("}");
                break;
        }
@@ -662,12 +679,12 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                                   (uint64_t) args.start.srcdevid,
                                   (uint64_t) args.start.cont_reading_from_srcdev_mode);
 
-                               str = (const char*) args.start.srcdev_name;
+                               str = (const char *) args.start.srcdev_name;
                                print_quoted_string(str,
                                                sizeof(args.start.srcdev_name),
                                                QUOTE_0_TERMINATED);
                                tprints(", tgtdev_name=");
-                               str = (const char*) args.start.tgtdev_name;
+                               str = (const char *) args.start.tgtdev_name;
                                print_quoted_string(str,
                                                sizeof(args.start.tgtdev_name),
                                                QUOTE_0_TERMINATED);
@@ -682,35 +699,27 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                printxval64(btrfs_dev_replace_results, args.result,
                            "BTRFS_IOCTL_DEV_REPLACE_RESULT_???");
                if (args.cmd == BTRFS_IOCTL_DEV_REPLACE_CMD_STATUS) {
-                       char buf[sizeof("HH:MM:SS") + 1];
-                       time_t time;
                        tprints(", ");
                        printxval64(btrfs_dev_replace_state,
                                   args.status.replace_state,
                                   "BTRFS_IOCTL_DEV_REPLACE_STATE_???");
-                       tprintf(", progress_1000=%" PRIu64 " /* ",
+                       tprintf(", progress_1000=%" PRIu64,
                                (uint64_t) args.status.progress_1000);
+
                        if (args.status.progress_1000 <= 1000)
-                               tprintf("%" PRIu64 ".%.2" PRIu64 "%%",
-                                       (uint64_t) args.status.progress_1000 / 10,
-                                       (uint64_t) args.status.progress_1000 % 10);
-                       else
-                               tprints("???");
-                       tprints(" */ ,");
-
-                       time = args.status.time_started;
-                       strftime(buf, sizeof(buf), "%T",
-                                localtime(&time));
-                       tprintf("time_started=%" PRIu64" /* %s */, ",
-                               (uint64_t) args.status.time_started, buf);
-
-                       time = args.status.time_stopped;
-                       strftime(buf, sizeof(buf), "%T",
-                                localtime(&time));
-                       tprintf("time_stopped=%" PRIu64" /* %s */, ",
-                               (uint64_t) args.status.time_stopped, buf);
-
-                       tprintf("num_write_errors=%" PRIu64
+                               tprintf_comment("%u.%u%%",
+                                       (unsigned) args.status.progress_1000 / 10,
+                                       (unsigned) args.status.progress_1000 % 10);
+
+                       tprintf(", time_started=%" PRIu64,
+                               (uint64_t) args.status.time_started);
+                       tprints_comment(sprinttime(args.status.time_started));
+
+                       tprintf(", time_stopped=%" PRIu64,
+                               (uint64_t) args.status.time_stopped);
+                       tprints_comment(sprinttime(args.status.time_stopped));
+
+                       tprintf(", num_write_errors=%" PRIu64
                                ", num_uncorrectable_read_errors=%" PRIu64,
                                (uint64_t) args.status.num_write_errors,
                                (uint64_t) args.status.num_uncorrectable_read_errors);
@@ -759,14 +768,17 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                if (umove_or_printaddr(tcp, arg, &flarg))
                        break;
 
-               tprints("[ /* supported */ ");
+               tprints("[");
                btrfs_print_features(&flarg[0]);
+               tprints_comment("supported");
 
-               tprints(", /* safe to set */ ");
+               tprints(", ");
                btrfs_print_features(&flarg[1]);
+               tprints_comment("safe to set");
 
-               tprints(", /* safe to clear */ ");
+               tprints(", ");
                btrfs_print_features(&flarg[2]);
+               tprints_comment("safe to clear");
                tprints("]");
 
                break;
@@ -792,7 +804,7 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                sectorsize = args.sectorsize,
                clone_alignment = args.clone_alignment;
 #else
-               reserved32 = (__u32 *)args.reserved;
+               reserved32 = (__u32 *) (void *) args.reserved;
                nodesize = reserved32[0];
                sectorsize = reserved32[1];
                clone_alignment = reserved32[2];
@@ -849,10 +861,8 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                                tprints("...");
                                break;
                        }
-                       const char *name = xlookup(btrfs_dev_stats_values, i);
-                       if (name)
-                               tprintf("/* %s */ ", name);
                        tprintf("%" PRI__u64, args.values[i]);
+                       tprints_comment(xlookup(btrfs_dev_stats_values, i));
                }
                tprints("]}");
                break;
@@ -874,10 +884,7 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                if (entering(tcp)) {
                        /* Use subvolume id of the containing root */
                        if (args.treeid == 0)
-                               /* abuse of auxstr to retain state */
-                               tcp->auxstr = (void *)1;
-                       else
-                               tcp->auxstr = NULL;
+                               set_tcb_priv_ulong(tcp, 1);
 
                        tprints("{treeid=");
                        btrfs_print_objectid(args.treeid);
@@ -888,16 +895,13 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                }
 
                tprints("{");
-               if (tcp->auxstr) {
-                       tcp->auxstr = NULL;
+               if (get_tcb_priv_ulong(tcp)) {
                        tprints("treeid=");
                        btrfs_print_objectid(args.treeid);
                        tprints(", ");
                }
 
-               tprints("name=");
-               print_quoted_string(args.name, sizeof(args.name),
-                                   QUOTE_0_TERMINATED);
+               PRINT_FIELD_CSTRING("", args, name);
                tprints("}");
                break;
        }
@@ -1022,7 +1026,7 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                if (umove_or_printaddr(tcp, arg, &args))
                        break;
 
-               tprintf("{flags=%" PRI__u64 "}", args.flags);
+               tprintf("{flags=%" PRIu64 "}", (uint64_t) args.flags);
                break;
        }
 
@@ -1036,7 +1040,7 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                if (umove_or_printaddr(tcp, arg, &args))
                        break;
 
-               tprintf("{flags=%" PRI__u64 ", progress=", args.flags);
+               tprintf("{flags=%" PRIu64 ", progress=", (uint64_t) args.flags);
                btrfs_print_objectid(args.progress);
                tprints("}");
                break;
@@ -1092,7 +1096,7 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                                        args.start);
                                tprintf("%" PRI__u64, args.end);
                                if (args.end == UINT64_MAX)
-                                       tprints(" /* UINT64_MAX */");
+                                       tprints_comment("UINT64_MAX");
                                tprints(", flags=");
                                printflags64(btrfs_scrub_flags, args.flags,
                                             "BTRFS_SCRUB_???");
@@ -1201,7 +1205,7 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                        tprints("...");
                else {
                        uint64_t record;
-                       print_array(tcp, (unsigned long) args.clone_sources,
+                       print_array(tcp, ptr_to_kulong(args.clone_sources),
                                    args.clone_sources_count,
                                    &record, sizeof(record),
                                    umoven_or_printaddr,
@@ -1273,16 +1277,14 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
 
                tprints("{fd=");
                printfd(tcp, args.fd);
-               tprints(", name=");
-               print_quoted_string(args.name, sizeof(args.name),
-                                   QUOTE_0_TERMINATED);
+               PRINT_FIELD_CSTRING(", ", args, name);
                tprints("}");
                break;
        }
 
        case BTRFS_IOC_SNAP_CREATE_V2:
        case BTRFS_IOC_SUBVOL_CREATE_V2: { /* code is W, but is actually RW */
-               struct btrfs_ioctl_vol_args_v2 args;
+               struct_btrfs_ioctl_vol_args_v2 args;
 
                if (entering(tcp))
                        tprints(", ");
@@ -1301,19 +1303,17 @@ MPERS_PRINTER_DECL(int, btrfs_ioctl,
                        printflags64(btrfs_snap_flags_v2, args.flags,
                                     "BTRFS_SUBVOL_???");
                        if (args.flags & BTRFS_SUBVOL_QGROUP_INHERIT) {
-                               tprintf(", size=%" PRI__u64 ", qgroup_inherit=",
-                                       args.size);
+                               tprintf(", size=%" PRIu64 ", qgroup_inherit=",
+                                       (uint64_t) args.size);
 
                                btrfs_print_qgroup_inherit(tcp,
-                                       (unsigned long)args.qgroup_inherit);
+                                       ptr_to_kulong(args.qgroup_inherit));
                        }
-                       tprintf(", name=");
-                       print_quoted_string(args.name, sizeof(args.name),
-                                           QUOTE_0_TERMINATED);
+                       PRINT_FIELD_CSTRING(", ", args, name);
                        tprints("}");
                        return 0;
                }
-               tprintf("{transid=%" PRI__u64 "}", args.transid);
+               tprintf("{transid=%" PRIu64 "}", (uint64_t) args.transid);
                break;
        }