On Thu, Jul 19, 2018 at 01:51:59PM +0800, Qu Wenruo wrote:
>
>
>On 2018年07月19日 13:15, Misono Tomohiro wrote:
>> Add -i (ignore offset) option to logical-resolve command
>> to show how BTRFS_IOC_LOGICAL_INO_V2 ioctl works
>> (returns every ref to the extent of given logical address).
>> 
>> [Example]
>> $ mkfs.btrfs -f $DEV
>> $ mount $DEV /mnt
>> 
>> $ dd if=/dev/urandom of=/mnt/file bs=4k count=100
>> # split above extent
>> $ dd if=/dev/urandom of=/mnt/file bs=4k seek=10 count=1 conv=notrunc
>> $ btrfs filesystem sync
>> 
>> # v1
>> $ btrfs inspect-internal logical-resolve -P 13631488 /mnt
>> inode 257 offset 0 root 5
>> 
>> # v2
>> $ btrfs inspect-internal logical-resolve -iP 13631488 /mnt
>> inode 257 offset 0 root 5
>> inode 257 offset 45056 root 5
>> 
>> Signed-off-by: Misono Tomohiro <misono.tomoh...@jp.fujitsu.com>
>> ---
>>  Documentation/btrfs-inspect-internal.asciidoc |  4 ++++
>>  cmds-inspect.c                                | 17 +++++++++++++++--
>>  ioctl.h                                       | 10 +++++++++-
>>  libbtrfsutil/btrfs.h                          | 10 +++++++++-
>
>Not related to this patch itself, but I'm wondering could we just use
>/usr/include/linux/btrfs.h?
>
>So we could save 2 same copies of headers here.

If we want to compile the newest btrfs-progs, but the older
/usr/include/linux/btrfs.h maybe doesn't have already defined the ioctl,
this will cause the compile error. I am curious about why the
libbtrfsutil need to copy the part of ioctl.h instead of including the
ioctl.h directly?

-- 
Thanks,
Lu

>
>Thanks,
>Qu
>
>>  4 files changed, 37 insertions(+), 4 deletions(-)
>> 
>> diff --git a/Documentation/btrfs-inspect-internal.asciidoc 
>> b/Documentation/btrfs-inspect-internal.asciidoc
>> index e2db6466..a55c9add 100644
>> --- a/Documentation/btrfs-inspect-internal.asciidoc
>> +++ b/Documentation/btrfs-inspect-internal.asciidoc
>> @@ -125,6 +125,10 @@ skip the path resolving and print the inodes instead
>>  verbose mode, print count of returned paths and all ioctl() return values
>>  -s <bufsize>::::
>>  set internal buffer for storing the file names to 'bufsize', default is 
>> 4096, maximum 64k
>> +-i::::
>> +ignore offset and return all the ref information
>> +which points to the extent containing given logical address.
>> +This requires version 2 ioctl support (BTRFS_IOC_LOGICAL_INO_V2, since 
>> 4.15).
>>  
>>  *min-dev-size* [options] <path>::
>>  (needs root privileges)
>> diff --git a/cmds-inspect.c b/cmds-inspect.c
>> index 2fc50c1a..d47eeacb 100644
>> --- a/cmds-inspect.c
>> +++ b/cmds-inspect.c
>> @@ -131,6 +131,9 @@ static const char * const 
>> cmd_inspect_logical_resolve_usage[] = {
>>      "-s bufsize  set inode container's size. This is used to increase 
>> inode",
>>      "            container's size in case it is not enough to read all the 
>> ",
>>      "            resolved results. The max value one can set is 64k",
>> +    "-i          ignore offset and return all the ref information",
>> +    "            which points to the extent containing given logical 
>> address",
>> +    "            (requires version 2 ioctl support)",
>>      NULL
>>  };
>>  
>> @@ -142,7 +145,9 @@ static int cmd_inspect_logical_resolve(int argc, char 
>> **argv)
>>      int verbose = 0;
>>      int getpath = 1;
>>      int bytes_left;
>> +    int ignore_offset = 0;
>>      struct btrfs_ioctl_logical_ino_args loi;
>> +    unsigned long ioctl_num = BTRFS_IOC_LOGICAL_INO;
>>      struct btrfs_data_container *inodes;
>>      u64 size = 4096;
>>      char full_path[PATH_MAX];
>> @@ -151,7 +156,7 @@ static int cmd_inspect_logical_resolve(int argc, char 
>> **argv)
>>  
>>      optind = 0;
>>      while (1) {
>> -            int c = getopt(argc, argv, "Pvs:");
>> +            int c = getopt(argc, argv, "Pvs:i");
>>              if (c < 0)
>>                      break;
>>  
>> @@ -165,6 +170,9 @@ static int cmd_inspect_logical_resolve(int argc, char 
>> **argv)
>>              case 's':
>>                      size = arg_strtou64(optarg);
>>                      break;
>> +            case 'i':
>> +                    ignore_offset = 1;
>> +                    break;
>>              default:
>>                      usage(cmd_inspect_logical_resolve_usage);
>>              }
>> @@ -183,13 +191,18 @@ static int cmd_inspect_logical_resolve(int argc, char 
>> **argv)
>>      loi.size = size;
>>      loi.inodes = ptr_to_u64(inodes);
>>  
>> +    if (ignore_offset) {
>> +            loi.flags = BTRFS_LOGICAL_INO_ARGS_IGNORE_OFFSET;
>> +            ioctl_num = BTRFS_IOC_LOGICAL_INO_V2;
>> +    }
>> +
>>      fd = btrfs_open_dir(argv[optind + 1], &dirstream, 1);
>>      if (fd < 0) {
>>              ret = 12;
>>              goto out;
>>      }
>>  
>> -    ret = ioctl(fd, BTRFS_IOC_LOGICAL_INO, &loi);
>> +    ret = ioctl(fd, ioctl_num, &loi);
>>      if (ret < 0) {
>>              error("logical ino ioctl: %m");
>>              goto out;
>> diff --git a/ioctl.h b/ioctl.h
>> index 709e996f..74f30c20 100644
>> --- a/ioctl.h
>> +++ b/ioctl.h
>> @@ -491,10 +491,16 @@ BUILD_ASSERT(sizeof(struct btrfs_ioctl_ino_path_args) 
>> == 56);
>>  struct btrfs_ioctl_logical_ino_args {
>>      __u64                           logical;        /* in */
>>      __u64                           size;           /* in */
>> -    __u64                           reserved[4];
>> +    __u64                           reserved[3];    /* must be 0 for now */
>> +    __u64                           flags;          /* in, v2 only */
>>      /* struct btrfs_data_container  *inodes;        out   */
>>      __u64                           inodes;
>>  };
>> +/*
>> + * Return every ref to the extent, not just those containing logical block.
>> + * Requires logical == extent bytenr.
>> + */
>> +#define BTRFS_LOGICAL_INO_ARGS_IGNORE_OFFSET        (1ULL << 0)
>>  
>>  enum btrfs_dev_stat_values {
>>      /* disk I/O failure stats */
>> @@ -828,6 +834,8 @@ static inline char *btrfs_err_str(enum btrfs_err_code 
>> err_code)
>>                                    struct btrfs_ioctl_feature_flags[3])
>>  #define BTRFS_IOC_RM_DEV_V2 _IOW(BTRFS_IOCTL_MAGIC, 58, \
>>                                 struct btrfs_ioctl_vol_args_v2)
>> +#define BTRFS_IOC_LOGICAL_INO_V2 _IOWR(BTRFS_IOCTL_MAGIC, 59, \
>> +                                    struct btrfs_ioctl_logical_ino_args)
>>  #ifdef __cplusplus
>>  }
>>  #endif
>> diff --git a/libbtrfsutil/btrfs.h b/libbtrfsutil/btrfs.h
>> index c293f6bf..b4debba7 100644
>> --- a/libbtrfsutil/btrfs.h
>> +++ b/libbtrfsutil/btrfs.h
>> @@ -609,10 +609,16 @@ struct btrfs_ioctl_ino_path_args {
>>  struct btrfs_ioctl_logical_ino_args {
>>      __u64                           logical;        /* in */
>>      __u64                           size;           /* in */
>> -    __u64                           reserved[4];
>> +    __u64                           reserved[3];    /* must be 0 for now */
>> +    __u64                           flags;          /* in, v2 only */
>>      /* struct btrfs_data_container  *inodes;        out   */
>>      __u64                           inodes;
>>  };
>> +/*
>> + * Return every ref to the extent, not just those containing logical block.
>> + * Requires logical == extent bytenr.
>> + */
>> +#define BTRFS_LOGICAL_INO_ARGS_IGNORE_OFFSET        (1ULL << 0)
>>  
>>  enum btrfs_dev_stat_values {
>>      /* disk I/O failure stats */
>> @@ -836,5 +842,7 @@ enum btrfs_err_code {
>>                                 struct btrfs_ioctl_feature_flags[3])
>>  #define BTRFS_IOC_RM_DEV_V2 _IOW(BTRFS_IOCTL_MAGIC, 58, \
>>                                 struct btrfs_ioctl_vol_args_v2)
>> +#define BTRFS_IOC_LOGICAL_INO_V2 _IOWR(BTRFS_IOCTL_MAGIC, 59, \
>> +                                    struct btrfs_ioctl_logical_ino_args)
>>  
>>  #endif /* _LINUX_BTRFS_H */
>> 
>


--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to