* file_ioctl.c (file_ioctl, print_file_dedupe_range_info): print first
  two elements of info array in abbrev mode
* tests/btrfs.c (btrfs_test_extent_same_ioctl): handle newly
  printed elements
---
 file_ioctl.c  | 31 +++++++++++++++----------
 tests/btrfs.c | 74 ++++++++++++++++++++++++++++++++++++++---------------------
 2 files changed, 67 insertions(+), 38 deletions(-)

diff --git a/file_ioctl.c b/file_ioctl.c
index b065db9..95e526d 100644
--- a/file_ioctl.c
+++ b/file_ioctl.c
@@ -80,6 +80,7 @@ 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;
+       int *count = data;
 
        if (entering(tcp)) {
                tprints("{dest_fd=");
@@ -91,6 +92,11 @@ print_file_dedupe_range_info(struct tcb *tcp, void *elem_buf,
                        (uint64_t) info->bytes_deduped, info->status);
        }
 
+       if (count && --*count == 0) {
+               tprints(", ...");
+               return false;
+       }
+
        return true;
 }
 
@@ -141,6 +147,10 @@ file_ioctl(struct tcb *tcp, const unsigned int code, const 
long arg)
 
        case FIDEDUPERANGE: { /* RW */
                struct file_dedupe_range args;
+               struct file_dedupe_range_info info;
+               int *limit = NULL;
+               int count = 2;
+               bool rc;
 
                if (entering(tcp))
                        tprints(", ");
@@ -162,19 +172,16 @@ file_ioctl(struct tcb *tcp, const unsigned int code, 
const long arg)
                                (uint16_t) args.dest_count);
                }
 
-               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);
-               }
+
+               /* Limit how many elements we print in abbrev mode */
+               if (abbrev(tcp) && args.dest_count > count)
+                       limit = &count;
+
+               rc = print_array(tcp, arg + offsetof(typeof(args), info),
+                                args.dest_count, &info, sizeof(info),
+                                umoven_or_printaddr,
+                                print_file_dedupe_range_info, limit);
 
                tprints("}");
                if (!rc || exiting(tcp))
diff --git a/tests/btrfs.c b/tests/btrfs.c
index f1dee55..4014c88 100644
--- a/tests/btrfs.c
+++ b/tests/btrfs.c
@@ -1597,27 +1597,25 @@ btrfs_test_extent_same_ioctl(void)
        printf("ioctl(-1, BTRFS_IOC_FILE_EXTENT_SAME or FIDEDUPERANGE, "
               "{src_offset=%" PRIu64
               ", src_length=%" PRIu64
-              ", dest_count=%hu, info=",
+              ", dest_count=%hu, info=[]",
                (uint64_t)args.src_offset,
                (uint64_t)args.src_length, args.dest_count);
-       if (verbose)
-               printf("[]");
-       else
-               printf("...");
        ioctl(-1, BTRFS_IOC_FILE_EXTENT_SAME, &args);
        printf("}) = -1 EBADF (%m)\n");
 
-       argsp = malloc(sizeof(*argsp) + sizeof(argsp->info[0]) * 2);
+       argsp = malloc(sizeof(*argsp) + sizeof(argsp->info[0]) * 3);
        if (!argsp)
                perror_msg_and_fail("malloc failed");
-       memset(argsp, 0, sizeof(*argsp) + sizeof(argsp->info[0]) * 2);
+       memset(argsp, 0, sizeof(*argsp) + sizeof(argsp->info[0]) * 3);
 
        *argsp = args;
-       argsp->dest_count = 2;
+       argsp->dest_count = 3;
        argsp->info[0].dest_fd = 2;
        argsp->info[0].dest_offset = 0;
        argsp->info[1].dest_fd = 2;
        argsp->info[1].dest_offset = 10240;
+       argsp->info[2].dest_fd = 2;
+       argsp->info[2].dest_offset = 20480;
 
        printf("ioctl(-1, BTRFS_IOC_FILE_EXTENT_SAME or FIDEDUPERANGE, "
               "{src_offset=%" PRIu64
@@ -1625,23 +1623,25 @@ btrfs_test_extent_same_ioctl(void)
               ", dest_count=%hu, info=",
                (int64_t)argsp->src_offset,
                (uint64_t)argsp->src_length, argsp->dest_count);
-       if (verbose)
                printf("[{dest_fd=%" PRId64 ", dest_offset=%" PRIu64
-                      "}, {dest_fd=%" PRId64 ", dest_offset=%"PRIu64
-                      "}]",
+                      "}, {dest_fd=%" PRId64 ", dest_offset=%"PRIu64 "}",
                       (int64_t)argsp->info[0].dest_fd,
                       (uint64_t)argsp->info[0].dest_offset,
                       (int64_t)argsp->info[1].dest_fd,
                       (uint64_t)argsp->info[1].dest_offset);
+       if (verbose)
+               printf(", {dest_fd=%" PRId64 ", dest_offset=%" PRIu64 "}",
+                      (int64_t)argsp->info[2].dest_fd,
+                      (uint64_t)argsp->info[2].dest_offset);
        else
-               printf("...");
+               printf(", ...");
+       printf("]");
        ioctl(-1, BTRFS_IOC_FILE_EXTENT_SAME, argsp);
        printf("}) = -1 EBADF (%m)\n");
 
        if (write_ok) {
                int fd1, fd2;
                char buf[16384];
-               int size = sizeof(*argsp) + sizeof(argsp->info[0]);
 
                memset(buf, 0, sizeof(buf));
 
@@ -1655,6 +1655,10 @@ btrfs_test_extent_same_ioctl(void)
 
                if (write(fd1, buf, sizeof(buf)) < 0)
                        perror_msg_and_fail("write: fd1");
+               if (write(fd1, buf, sizeof(buf)) < 0)
+                       perror_msg_and_fail("write: fd1");
+               if (write(fd2, buf, sizeof(buf)) < 0)
+                       perror_msg_and_fail("write: fd2");
                if (write(fd2, buf, sizeof(buf)) < 0)
                        perror_msg_and_fail("write: fd2");
 
@@ -1663,34 +1667,52 @@ btrfs_test_extent_same_ioctl(void)
                if (fd2 < 0)
                        perror_msg_and_fail("open file2 failed");
 
-               argsp = realloc(argsp, size);
-               if (!argsp)
-                       perror_msg_and_fail("realloc failed");
-               memset(argsp, 0, size);
+               memset(argsp, 0, sizeof(*argsp) + sizeof(argsp->info[0]) * 3);
 
                argsp->src_offset = 0;
-               argsp->src_length = sizeof(buf);
-               argsp->dest_count = 1;
+               argsp->src_length = 4096;
+               argsp->dest_count = 3;
                argsp->info[0].dest_fd = fd2;
                argsp->info[0].dest_offset = 0;
+               argsp->info[1].dest_fd = fd2;
+               argsp->info[1].dest_offset = 10240;
+               argsp->info[2].dest_fd = fd2;
+               argsp->info[2].dest_offset = 20480;
 
                printf("ioctl(%d, BTRFS_IOC_FILE_EXTENT_SAME or FIDEDUPERANGE, "
                       "{src_offset=%" PRIu64 ", src_length=%" PRIu64
                       ", dest_count=%hu, info=", fd1,
                       (uint64_t)argsp->src_offset,
                       (uint64_t)argsp->src_length, argsp->dest_count);
+               printf("[{dest_fd=%" PRId64 ", dest_offset=%" PRIu64
+                      "}, {dest_fd=%" PRId64 ", dest_offset=%"PRIu64 "}",
+                      (int64_t)argsp->info[0].dest_fd,
+                      (uint64_t)argsp->info[0].dest_offset,
+                      (int64_t)argsp->info[1].dest_fd,
+                      (uint64_t)argsp->info[1].dest_offset);
                if (verbose)
-                       printf("[{dest_fd=%d, dest_offset=0}]", fd2);
+                       printf(", {dest_fd=%" PRId64
+                              ", dest_offset=%" PRIu64 "}",
+                              (int64_t)argsp->info[2].dest_fd,
+                              (uint64_t)argsp->info[2].dest_offset);
                else
-                       printf("...");
+                       printf(", ...");
+
                ioctl(fd1, BTRFS_IOC_FILE_EXTENT_SAME, argsp);
-               printf("} => {info=");
+               printf("]} => {info=");
+               printf("[{bytes_deduped=%" PRIu64 ", status=%d}, "
+                       "{bytes_deduped=%" PRIu64 ", status=%d}",
+                      (uint64_t)argsp->info[0].bytes_deduped,
+                      argsp->info[0].status,
+                      (uint64_t)argsp->info[1].bytes_deduped,
+                      argsp->info[1].status);
                if (verbose)
-                       printf("[{bytes_deduped=%u, status=0}]",
-                               (unsigned) sizeof(buf));
+                       printf(", {bytes_deduped=%" PRIu64 ", status=%d}",
+                              (uint64_t)argsp->info[2].bytes_deduped,
+                              argsp->info[2].status);
                else
-                       printf("...");
-               printf("}) = 0\n");
+                       printf(", ...");
+               printf("]}) = 0\n");
                close(fd1);
                close(fd2);
                unlinkat(btrfs_test_dir_fd, "file1", 0);
-- 
2.7.1


-- 
Jeff Mahoney
SUSE Labs

------------------------------------------------------------------------------
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