File 0001-btrfs-progs-inspect-add-support-for-LOGICAL_INO_V2-i.patch of Package btrfsprogs.17950
From ff3843b87d09a0d8c1ca88a190752ddb70063185 Mon Sep 17 00:00:00 2001
From: Zygo Blaxell <ce3g8jdj@umail.furryterror.org>
Date: Tue, 26 Nov 2019 22:55:07 -0500
Subject: [PATCH] btrfs-progs: inspect: add support for LOGICAL_INO_V2 ioctl
Increase the maximum buffer size to SZ_16M.
Add an option (-o) to set the ..._IGNORE_OFFSET flag.
If the buffer size is greater than 64K or the IGNORE_OFFSET option
is used, call ioctl V2; otherwise, use ioctl V1 to be compatible with
older kernels.
Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Zygo Blaxell <ce3g8jdj@umail.furryterror.org>
Signed-off-by: David Sterba <dsterba@suse.com>
---
cmds-inspect.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
--- a/cmds-inspect.c
+++ b/cmds-inspect.c
@@ -124,13 +124,16 @@ static int cmd_inspect_inode_resolve(int
}
static const char * const cmd_inspect_logical_resolve_usage[] = {
- "btrfs inspect-internal logical-resolve [-Pv] [-s bufsize] <logical> <path>",
+ "btrfs inspect-internal logical-resolve [-Pvo] [-s bufsize] <logical> <path>",
"Get file system paths for the given logical address",
"-P skip the path resolving and print the inodes instead",
"-v verbose mode",
+ "-o ignore offsets when matching references (requires v2 ioctl",
+ " support in the kernel 4.15+)",
"-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",
+ " resolved results. The max value one can set is 64k with the",
+ " v1 ioctl. Sizes over 64k will use the v2 ioctl (kernel 4.15+)",
NULL
};
@@ -148,10 +151,12 @@ static int cmd_inspect_logical_resolve(i
char full_path[PATH_MAX];
char *path_ptr;
DIR *dirstream = NULL;
+ u64 flags = 0;
+ unsigned long request = BTRFS_IOC_LOGICAL_INO;
optind = 0;
while (1) {
- int c = getopt(argc, argv, "Pvs:");
+ int c = getopt(argc, argv, "Pvos:");
if (c < 0)
break;
@@ -162,6 +167,9 @@ static int cmd_inspect_logical_resolve(i
case 'v':
verbose = 1;
break;
+ case 'o':
+ flags |= BTRFS_LOGICAL_INO_ARGS_IGNORE_OFFSET;
+ break;
case 's':
size = arg_strtou64(optarg);
break;
@@ -173,14 +181,18 @@ static int cmd_inspect_logical_resolve(i
if (check_argc_exact(argc - optind, 2))
usage(cmd_inspect_logical_resolve_usage);
- size = min(size, (u64)SZ_64K);
+ size = min(size, (u64)SZ_16M);
inodes = malloc(size);
if (!inodes)
return 1;
+ if (size > SZ_64K || flags != 0)
+ request = BTRFS_IOC_LOGICAL_INO_V2;
+
memset(inodes, 0, sizeof(*inodes));
loi.logical = arg_strtou64(argv[optind]);
loi.size = size;
+ loi.flags = flags;
loi.inodes = ptr_to_u64(inodes);
fd = btrfs_open_dir(argv[optind + 1], &dirstream, 1);
@@ -189,7 +201,7 @@ static int cmd_inspect_logical_resolve(i
goto out;
}
- ret = ioctl(fd, BTRFS_IOC_LOGICAL_INO, &loi);
+ ret = ioctl(fd, request, &loi);
if (ret < 0) {
error("logical ino ioctl: %m");
goto out;