237 lines
8.9 KiB
Diff
237 lines
8.9 KiB
Diff
|
From 79116330e3eea392dec9a1f38fddf3449ad0195a Mon Sep 17 00:00:00 2001
|
||
|
From: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||
|
Date: Thu, 3 Sep 2020 01:26:58 +0200
|
||
|
Subject: [PATCH 6/9] linux-user: Add support for a group of btrfs inode ioctls
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
This patch implements functionality of following ioctls:
|
||
|
|
||
|
BTRFS_IOC_INO_LOOKUP - Reading tree root id and path
|
||
|
|
||
|
Read tree root id and path for a given file or directory.
|
||
|
The name and tree root id are returned in an ioctl's third
|
||
|
argument that represents a pointer to a following type:
|
||
|
|
||
|
struct btrfs_ioctl_ino_lookup_args {
|
||
|
__u64 treeid;
|
||
|
__u64 objectid;
|
||
|
char name[BTRFS_INO_LOOKUP_PATH_MAX];
|
||
|
};
|
||
|
|
||
|
Before calling this ioctl, field 'objectid' should be filled
|
||
|
with the object id value for which the tree id and path are
|
||
|
to be read. Value 'BTRFS_FIRST_FREE_OBJECTID' represents the
|
||
|
object id for the first available btrfs object (directory or
|
||
|
file).
|
||
|
|
||
|
BTRFS_IOC_INO_PATHS - Reading paths to all files
|
||
|
|
||
|
Read path to all files with a certain inode number. The paths
|
||
|
are returned in the ioctl's third argument which represents
|
||
|
a pointer to a following type:
|
||
|
|
||
|
struct btrfs_ioctl_ino_path_args {
|
||
|
__u64 inum; /* in */
|
||
|
__u64 size; /* in */
|
||
|
__u64 reserved[4];
|
||
|
/* struct btrfs_data_container *fspath; out */
|
||
|
__u64 fspath; /* out */
|
||
|
};
|
||
|
|
||
|
Before calling this ioctl, the 'inum' and 'size' field should
|
||
|
be filled with the aproppriate inode number and size of the
|
||
|
directory where file paths should be looked for. For now, the
|
||
|
paths are returned in an '__u64' (unsigned long long) value
|
||
|
'fspath'.
|
||
|
|
||
|
BTRFS_IOC_LOGICAL_INO - Reading inode numbers
|
||
|
|
||
|
Read inode numbers for files on a certain logical adress. The
|
||
|
inode numbers are returned in the ioctl's third argument which
|
||
|
represents a pointer to a following type:
|
||
|
|
||
|
struct btrfs_ioctl_logical_ino_args {
|
||
|
__u64 logical; /* in */
|
||
|
__u64 size; /* in */
|
||
|
__u64 reserved[3]; /* must be 0 for now */
|
||
|
__u64 flags; /* in, v2 only */
|
||
|
/* struct btrfs_data_container *inodes; out */
|
||
|
__u64 inodes;
|
||
|
};
|
||
|
|
||
|
Before calling this ioctl, the 'logical' and 'size' field should
|
||
|
be filled with the aproppriate logical adress and size of where
|
||
|
the inode numbers of files should be looked for. For now, the
|
||
|
inode numbers are returned in an '__u64' (unsigned long long)
|
||
|
value 'inodes'.
|
||
|
|
||
|
BTRFS_IOC_LOGICAL_INO_V2 - Reading inode numbers
|
||
|
|
||
|
Same as the above mentioned ioctl except that it allows passing
|
||
|
a flags 'BTRFS_LOGICAL_INO_ARGS_IGNORE_OFFSET'.
|
||
|
|
||
|
BTRFS_IOC_INO_LOOKUP_USER - Reading subvolume name and path
|
||
|
|
||
|
Read name and path of a subvolume. The tree root id and
|
||
|
path are read in an ioctl's third argument which represents a
|
||
|
pointer to a following type:
|
||
|
|
||
|
struct btrfs_ioctl_ino_lookup_user_args {
|
||
|
/* in, inode number containing the subvolume of 'subvolid' */
|
||
|
__u64 dirid;
|
||
|
/* in */
|
||
|
__u64 treeid;
|
||
|
/* out, name of the subvolume of 'treeid' */
|
||
|
char name[BTRFS_VOL_NAME_MAX + 1];
|
||
|
/*
|
||
|
* out, constructed path from the directory with which the ioctl is
|
||
|
* called to dirid
|
||
|
*/
|
||
|
char path[BTRFS_INO_LOOKUP_USER_PATH_MAX];
|
||
|
};
|
||
|
|
||
|
Before calling this ioctl, the 'dirid' and 'treeid' field should
|
||
|
be filled with aproppriate values which represent the inode number
|
||
|
of the directory that contains the subvolume and treeid of the
|
||
|
subvolume.
|
||
|
|
||
|
Implementation notes:
|
||
|
|
||
|
All of the ioctls in this patch use structure types as third arguments.
|
||
|
That is the reason why aproppriate thunk definitions were added in file
|
||
|
'syscall_types.h'.
|
||
|
|
||
|
Signed-off-by: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||
|
Tested-by: Daniel P. Berrangé <berrange@redhat.com>
|
||
|
Message-Id: <20200823195014.116226-6-Filip.Bozuta@syrmia.com>
|
||
|
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||
|
---
|
||
|
linux-user/ioctls.h | 20 ++++++++++++++++++++
|
||
|
linux-user/syscall_defs.h | 5 +++++
|
||
|
linux-user/syscall_types.h | 32 ++++++++++++++++++++++++++++++++
|
||
|
3 files changed, 57 insertions(+)
|
||
|
|
||
|
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
|
||
|
index 50fae1e33b..169f98f7a3 100644
|
||
|
--- a/linux-user/ioctls.h
|
||
|
+++ b/linux-user/ioctls.h
|
||
|
@@ -202,6 +202,10 @@
|
||
|
IOCTL(BTRFS_IOC_SNAP_DESTROY, IOC_W,
|
||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_vol_args)))
|
||
|
#endif
|
||
|
+#ifdef BTRFS_IOC_INO_LOOKUP
|
||
|
+ IOCTL(BTRFS_IOC_INO_LOOKUP, IOC_RW,
|
||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_ino_lookup_args)))
|
||
|
+#endif
|
||
|
#ifdef BTRFS_IOC_SUBVOL_GETFLAGS
|
||
|
IOCTL(BTRFS_IOC_SUBVOL_GETFLAGS, IOC_R, MK_PTR(TYPE_ULONGLONG))
|
||
|
#endif
|
||
|
@@ -212,6 +216,14 @@
|
||
|
IOCTL(BTRFS_IOC_DEV_INFO, IOC_RW,
|
||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_dev_info_args)))
|
||
|
#endif
|
||
|
+#ifdef BTRFS_IOC_INO_PATHS
|
||
|
+ IOCTL(BTRFS_IOC_INO_PATHS, IOC_RW,
|
||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_ino_path_args)))
|
||
|
+#endif
|
||
|
+#ifdef BTRFS_IOC_LOGICAL_INO
|
||
|
+ IOCTL(BTRFS_IOC_LOGICAL_INO, IOC_RW,
|
||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_logical_ino_args)))
|
||
|
+#endif
|
||
|
#ifdef BTRFS_IOC_GET_DEV_STATS
|
||
|
IOCTL(BTRFS_IOC_GET_DEV_STATS, IOC_RW,
|
||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_get_dev_stats)))
|
||
|
@@ -228,10 +240,18 @@
|
||
|
IOCTL(BTRFS_IOC_GET_SUPPORTED_FEATURES, IOC_R,
|
||
|
MK_PTR(MK_ARRAY(MK_STRUCT(STRUCT_btrfs_ioctl_feature_flags), 3)))
|
||
|
#endif
|
||
|
+#ifdef BTRFS_IOC_LOGICAL_INO_V2
|
||
|
+ IOCTL(BTRFS_IOC_LOGICAL_INO_V2, IOC_RW,
|
||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_logical_ino_args)))
|
||
|
+#endif
|
||
|
#ifdef BTRFS_IOC_GET_SUBVOL_INFO
|
||
|
IOCTL(BTRFS_IOC_GET_SUBVOL_INFO, IOC_R,
|
||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_get_subvol_info_args)))
|
||
|
#endif
|
||
|
+#ifdef BTRFS_IOC_INO_LOOKUP_USER
|
||
|
+ IOCTL(BTRFS_IOC_INO_LOOKUP_USER, IOC_RW,
|
||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_ino_lookup_user_args)))
|
||
|
+#endif
|
||
|
|
||
|
#ifdef CONFIG_USBFS
|
||
|
/* USB ioctls */
|
||
|
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
|
||
|
index 44811fdcbb..a6a9454b85 100644
|
||
|
--- a/linux-user/syscall_defs.h
|
||
|
+++ b/linux-user/syscall_defs.h
|
||
|
@@ -975,16 +975,21 @@ struct target_rtc_pll_info {
|
||
|
#define TARGET_BTRFS_IOC_RM_DEV TARGET_IOWU(BTRFS_IOCTL_MAGIC, 11)
|
||
|
#define TARGET_BTRFS_IOC_SUBVOL_CREATE TARGET_IOWU(BTRFS_IOCTL_MAGIC, 14)
|
||
|
#define TARGET_BTRFS_IOC_SNAP_DESTROY TARGET_IOWU(BTRFS_IOCTL_MAGIC, 15)
|
||
|
+#define TARGET_BTRFS_IOC_INO_LOOKUP TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 18)
|
||
|
#define TARGET_BTRFS_IOC_SUBVOL_GETFLAGS TARGET_IOR(BTRFS_IOCTL_MAGIC, 25,\
|
||
|
abi_ullong)
|
||
|
#define TARGET_BTRFS_IOC_SUBVOL_SETFLAGS TARGET_IOW(BTRFS_IOCTL_MAGIC, 26,\
|
||
|
abi_ullong)
|
||
|
#define TARGET_BTRFS_IOC_DEV_INFO TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 30)
|
||
|
+#define TARGET_BTRFS_IOC_INO_PATHS TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 35)
|
||
|
+#define TARGET_BTRFS_IOC_LOGICAL_INO TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 36)
|
||
|
#define TARGET_BTRFS_IOC_GET_DEV_STATS TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 52)
|
||
|
#define TARGET_BTRFS_IOC_GET_FEATURES TARGET_IORU(BTRFS_IOCTL_MAGIC, 57)
|
||
|
#define TARGET_BTRFS_IOC_SET_FEATURES TARGET_IOWU(BTRFS_IOCTL_MAGIC, 57)
|
||
|
#define TARGET_BTRFS_IOC_GET_SUPPORTED_FEATURES TARGET_IORU(BTRFS_IOCTL_MAGIC, 57)
|
||
|
+#define TARGET_BTRFS_IOC_LOGICAL_INO_V2 TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 59)
|
||
|
#define TARGET_BTRFS_IOC_GET_SUBVOL_INFO TARGET_IORU(BTRFS_IOCTL_MAGIC, 60)
|
||
|
+#define TARGET_BTRFS_IOC_INO_LOOKUP_USER TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 62)
|
||
|
|
||
|
/* usb ioctls */
|
||
|
#define TARGET_USBDEVFS_CONTROL TARGET_IOWRU('U', 0)
|
||
|
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
|
||
|
index 925054cfd4..b84e14235f 100644
|
||
|
--- a/linux-user/syscall_types.h
|
||
|
+++ b/linux-user/syscall_types.h
|
||
|
@@ -389,6 +389,38 @@ STRUCT(btrfs_ioctl_get_subvol_info_args,
|
||
|
MK_ARRAY(TYPE_ULONGLONG, 8)) /* reserved */
|
||
|
#endif
|
||
|
|
||
|
+#ifdef BTRFS_IOC_INO_LOOKUP
|
||
|
+STRUCT(btrfs_ioctl_ino_lookup_args,
|
||
|
+ TYPE_ULONGLONG, /* treeid */
|
||
|
+ TYPE_ULONGLONG, /* objectid */
|
||
|
+ MK_ARRAY(TYPE_CHAR, BTRFS_INO_LOOKUP_PATH_MAX)) /* name */
|
||
|
+#endif
|
||
|
+
|
||
|
+#ifdef BTRFS_IOC_INO_PATHS
|
||
|
+STRUCT(btrfs_ioctl_ino_path_args,
|
||
|
+ TYPE_ULONGLONG, /* inum */
|
||
|
+ TYPE_ULONGLONG, /* size */
|
||
|
+ MK_ARRAY(TYPE_ULONGLONG, 4), /* reserved */
|
||
|
+ TYPE_ULONGLONG) /* fspath */
|
||
|
+#endif
|
||
|
+
|
||
|
+#if defined(BTRFS_IOC_LOGICAL_INO) || defined(BTRFS_IOC_LOGICAL_INO_V2)
|
||
|
+STRUCT(btrfs_ioctl_logical_ino_args,
|
||
|
+ TYPE_ULONGLONG, /* logical */
|
||
|
+ TYPE_ULONGLONG, /* size */
|
||
|
+ MK_ARRAY(TYPE_ULONGLONG, 3), /* reserved */
|
||
|
+ TYPE_ULONGLONG, /* flags */
|
||
|
+ TYPE_ULONGLONG) /* inodes */
|
||
|
+#endif
|
||
|
+
|
||
|
+#ifdef BTRFS_IOC_INO_LOOKUP_USER
|
||
|
+STRUCT(btrfs_ioctl_ino_lookup_user_args,
|
||
|
+ TYPE_ULONGLONG, /* dirid */
|
||
|
+ TYPE_ULONGLONG, /* treeid */
|
||
|
+ MK_ARRAY(TYPE_CHAR, BTRFS_VOL_NAME_MAX + 1), /* name */
|
||
|
+ MK_ARRAY(TYPE_CHAR, BTRFS_INO_LOOKUP_USER_PATH_MAX)) /* path */
|
||
|
+#endif
|
||
|
+
|
||
|
#ifdef BTRFS_IOC_DEV_INFO
|
||
|
STRUCT(btrfs_ioctl_dev_info_args,
|
||
|
TYPE_ULONGLONG, /* devid */
|
||
|
--
|
||
|
2.26.2
|
||
|
|