From: Jeff Mahoney <je...@suse.com>

* btrfs.c (btrfs_print_tree_search): don't use print_array.  The buffer
  represents a series of variable sized records, not an array.
---
 btrfs.c | 42 ++++++++++++++++++++++--------------------
 1 file changed, 22 insertions(+), 20 deletions(-)

diff --git a/btrfs.c b/btrfs.c
index af0645c..04c71fc 100644
--- a/btrfs.c
+++ b/btrfs.c
@@ -401,21 +401,6 @@ print_key_value_internal(struct tcb *tcp, const char 
*name, uint64_t value)
 #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)
@@ -457,12 +442,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("}");
        }
-- 
2.7.1


------------------------------------------------------------------------------
What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic
patterns at an interface-level. Reveals which users, apps, and protocols are 
consuming the most bandwidth. Provides multi-vendor support for NetFlow, 
J-Flow, sFlow and other flows. Make informed decisions using capacity 
planning reports. https://ad.doubleclick.net/ddm/clk/305295220;132659582;e
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to