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.tomohiro@xxxxxxxxxxxxxx>
>> ---
>> 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html