]> granicus.if.org Git - strace/commitdiff
file_ioctl.c: print first two extents for FIDEDUPERANGE in abbrev mode
authorJeff Mahoney <jeffm@suse.com>
Fri, 27 May 2016 20:07:22 +0000 (16:07 -0400)
committerDmitry V. Levin <ldv@altlinux.org>
Sat, 28 May 2016 00:37:02 +0000 (00:37 +0000)
* 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
tests/btrfs.c

index b065db917557149dd0b7cb3270f78424184aea0f..de8101937b3058745a8dcfb35d80fb9eaf06e9c2 100644 (file)
@@ -80,6 +80,15 @@ 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;
+       unsigned int *count = data;
+
+       if (count) {
+               if (*count == 0) {
+                       tprints("...");
+                       return false;
+               }
+               --*count;
+       }
 
        if (entering(tcp)) {
                tprints("{dest_fd=");
@@ -141,6 +150,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;
+               unsigned int *limit = NULL;
+               unsigned int count = 2;
+               bool rc;
 
                if (entering(tcp))
                        tprints(", ");
@@ -162,19 +175,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))
index f1dee55d1eec87b07ff133a4d34f80e857c9400b..4014c883c3015f5be881fa66cd1eb30f35240d2c 100644 (file)
@@ -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);