Compare commits
8 Commits
master
...
f33-riscv6
Author | SHA1 | Date | |
---|---|---|---|
56ec336b9a | |||
|
95cc694fb2 | ||
|
598ad396bd | ||
3df5453514 | |||
60b7351118 | |||
|
0d7eae515e | ||
|
4289f9c187 | ||
|
a3604ac316 |
46
.gitignore
vendored
46
.gitignore
vendored
@ -1,4 +1,48 @@
|
|||||||
/.build*.log
|
/.build*.log
|
||||||
/x86_64/
|
/x86_64/
|
||||||
/*.src.rpm
|
/*.src.rpm
|
||||||
/qemu-*.tar.xz
|
/qemu-*.tar.bz2
|
||||||
|
/qemu-2.9.0-rc0.tar.xz
|
||||||
|
/qemu-2.9.0-rc1.tar.xz
|
||||||
|
/qemu-2.9.0-rc2.tar.xz
|
||||||
|
/qemu-2.9.0-rc3.tar.xz
|
||||||
|
/qemu-2.9.0-rc4.tar.xz
|
||||||
|
/qemu-2.9.0.tar.xz
|
||||||
|
/qemu-2.10.0-rc1.tar.xz
|
||||||
|
/qemu-2.10.0-rc3.tar.xz
|
||||||
|
/qemu-2.10.0-rc4.tar.xz
|
||||||
|
/qemu-2.10.0.tar.xz
|
||||||
|
/qemu-2.10.1.tar.xz
|
||||||
|
/qemu-2.11.0-rc1.tar.xz
|
||||||
|
/qemu-2.11.0-rc3.tar.xz
|
||||||
|
/qemu-2.11.0.tar.xz
|
||||||
|
/qemu-2.11.1.tar.xz
|
||||||
|
/qemu-2.12.0-rc0.tar.xz
|
||||||
|
/qemu-2.12.0-rc1.tar.xz
|
||||||
|
/qemu-2.12.0-rc2.tar.xz
|
||||||
|
/qemu-2.12.0-rc3.tar.xz
|
||||||
|
/qemu-2.12.0.tar.xz
|
||||||
|
/qemu-3.0.0-rc3.tar.xz
|
||||||
|
/qemu-3.0.0.tar.xz
|
||||||
|
/qemu-3.1.0-rc1.tar.xz
|
||||||
|
/qemu-3.1.0.tar.xz
|
||||||
|
/qemu-4.0.0-rc0.tar.xz
|
||||||
|
/qemu-4.0.0-rc1.tar.xz
|
||||||
|
/qemu-4.0.0-rc2.tar.xz
|
||||||
|
/qemu-4.0.0-rc3.tar.xz
|
||||||
|
/qemu-4.0.0.tar.xz
|
||||||
|
/qemu-4.1.0-rc0.tar.xz
|
||||||
|
/qemu-4.1.0-rc1.tar.xz
|
||||||
|
/qemu-4.1.0-rc2.tar.xz
|
||||||
|
/qemu-4.1.0.tar.xz
|
||||||
|
/qemu-4.2.0-rc1.tar.xz
|
||||||
|
/qemu-4.2.0-rc2.tar.xz
|
||||||
|
/qemu-4.2.0-rc5.tar.xz
|
||||||
|
/qemu-4.2.0.tar.xz
|
||||||
|
/qemu-5.0.0-rc0.tar.xz
|
||||||
|
/qemu-5.0.0-rc2.tar.xz
|
||||||
|
/qemu-5.0.0-rc3.tar.xz
|
||||||
|
/qemu-5.0.0.tar.xz
|
||||||
|
/qemu-5.1.0-rc2.tar.xz
|
||||||
|
/qemu-5.1.0-rc3.tar.xz
|
||||||
|
/qemu-5.1.0.tar.xz
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
From: Laurent Vivier <laurent@vivier.eu>
|
||||||
|
Date: Thu, 3 Sep 2020 01:26:53 +0200
|
||||||
|
Subject: [PATCH] linux-user: fix implicit conversion from enumeration type
|
||||||
|
error
|
||||||
|
|
||||||
|
MK_ARRAY(type,size) is used to fill the field_types buffer, and if the
|
||||||
|
"size" parameter is an enum type, clang [-Werror,-Wenum-conversion] reports
|
||||||
|
an error when it is assigned to field_types which is also an enum, argtypes.
|
||||||
|
|
||||||
|
To avoid that, convert "size" to "int" in MK_ARRAY(). "int" is the type
|
||||||
|
used for the size evaluation in thunk_type_size().
|
||||||
|
|
||||||
|
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||||||
|
Message-Id: <20200902125752.1033524-1-laurent@vivier.eu>
|
||||||
|
---
|
||||||
|
include/exec/user/thunk.h | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/include/exec/user/thunk.h b/include/exec/user/thunk.h
|
||||||
|
index 7992475c9f..2099482cff 100644
|
||||||
|
--- a/include/exec/user/thunk.h
|
||||||
|
+++ b/include/exec/user/thunk.h
|
||||||
|
@@ -42,7 +42,7 @@ typedef enum argtype {
|
||||||
|
} argtype;
|
||||||
|
|
||||||
|
#define MK_PTR(type) TYPE_PTR, type
|
||||||
|
-#define MK_ARRAY(type, size) TYPE_ARRAY, size, type
|
||||||
|
+#define MK_ARRAY(type, size) TYPE_ARRAY, (int)(size), type
|
||||||
|
#define MK_STRUCT(id) TYPE_STRUCT, id
|
||||||
|
|
||||||
|
#define THUNK_TARGET 0
|
260
0002-linux-user-Add-support-for-a-group-of-btrfs-ioctls-u.patch
Normal file
260
0002-linux-user-Add-support-for-a-group-of-btrfs-ioctls-u.patch
Normal file
@ -0,0 +1,260 @@
|
|||||||
|
From: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Date: Thu, 3 Sep 2020 01:26:54 +0200
|
||||||
|
Subject: [PATCH] linux-user: Add support for a group of btrfs ioctls used for
|
||||||
|
subvolumes
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This patch implements functionality of following ioctls:
|
||||||
|
|
||||||
|
BTRFS_IOC_SUBVOL_CREATE - Creating a btrfs subvolume
|
||||||
|
|
||||||
|
Create a btrfs subvolume. The subvolume is created using the ioctl's
|
||||||
|
third argument which represents a pointer to a following structure
|
||||||
|
type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_vol_args {
|
||||||
|
__s64 fd;
|
||||||
|
char name[BTRFS_PATH_NAME_MAX + 1];
|
||||||
|
};
|
||||||
|
|
||||||
|
Before calling this ioctl, the fields of this structure should be filled
|
||||||
|
with aproppriate values. The fd field represents the file descriptor
|
||||||
|
value of the subvolume and the name field represents the subvolume
|
||||||
|
path.
|
||||||
|
|
||||||
|
BTRFS_IOC_SUBVOL_GETFLAGS - Getting subvolume flags
|
||||||
|
|
||||||
|
Read the flags of the btrfs subvolume. The flags are read using
|
||||||
|
the ioctl's third argument that is a pointer of __u64 (unsigned long).
|
||||||
|
The third argument represents a bit mask that can be composed of following
|
||||||
|
values:
|
||||||
|
BTRFS_SUBVOL_RDONLY (1ULL << 1)
|
||||||
|
BTRFS_SUBVOL_QGROUP_INHERIT (1ULL << 2)
|
||||||
|
BTRFS_DEVICE_SPEC_BY_ID (1ULL << 3)
|
||||||
|
BTRFS_SUBVOL_SPEC_BY_ID (1ULL << 4)
|
||||||
|
|
||||||
|
BTRFS_IOC_SUBVOL_SETFLAGS - Setting subvolume flags
|
||||||
|
|
||||||
|
Set the flags of the btrfs subvolume. The flags are set using the
|
||||||
|
ioctl's third argument that is a pointer of __u64 (unsigned long).
|
||||||
|
The third argument represents a bit mask that can be composed of same
|
||||||
|
values as in the case of previous ioctl (BTRFS_IOC_SUBVOL_GETFLAGS).
|
||||||
|
|
||||||
|
BTRFS_IOC_SUBVOL_GETINFO - Getting subvolume information
|
||||||
|
|
||||||
|
Read information about the subvolume. The subvolume information is
|
||||||
|
returned in the ioctl's third argument which represents a pointer to
|
||||||
|
a following structure type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_get_subvol_info_args {
|
||||||
|
/* Id of this subvolume */
|
||||||
|
__u64 treeid;
|
||||||
|
|
||||||
|
/* Name of this subvolume, used to get the real name at mount point */
|
||||||
|
char name[BTRFS_VOL_NAME_MAX + 1];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Id of the subvolume which contains this subvolume.
|
||||||
|
* Zero for top-level subvolume or a deleted subvolume.
|
||||||
|
*/
|
||||||
|
__u64 parent_id;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Inode number of the directory which contains this subvolume.
|
||||||
|
* Zero for top-level subvolume or a deleted subvolume
|
||||||
|
*/
|
||||||
|
__u64 dirid;
|
||||||
|
|
||||||
|
/* Latest transaction id of this subvolume */
|
||||||
|
__u64 generation;
|
||||||
|
|
||||||
|
/* Flags of this subvolume */
|
||||||
|
__u64 flags;
|
||||||
|
|
||||||
|
/* UUID of this subvolume */
|
||||||
|
__u8 uuid[BTRFS_UUID_SIZE];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* UUID of the subvolume of which this subvolume is a snapshot.
|
||||||
|
* All zero for a non-snapshot subvolume.
|
||||||
|
*/
|
||||||
|
__u8 parent_uuid[BTRFS_UUID_SIZE];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* UUID of the subvolume from which this subvolume was received.
|
||||||
|
* All zero for non-received subvolume.
|
||||||
|
*/
|
||||||
|
__u8 received_uuid[BTRFS_UUID_SIZE];
|
||||||
|
|
||||||
|
/* Transaction id indicating when change/create/send/receive happened */
|
||||||
|
__u64 ctransid;
|
||||||
|
__u64 otransid;
|
||||||
|
__u64 stransid;
|
||||||
|
__u64 rtransid;
|
||||||
|
/* Time corresponding to c/o/s/rtransid */
|
||||||
|
struct btrfs_ioctl_timespec ctime;
|
||||||
|
struct btrfs_ioctl_timespec otime;
|
||||||
|
struct btrfs_ioctl_timespec stime;
|
||||||
|
struct btrfs_ioctl_timespec rtime;
|
||||||
|
|
||||||
|
/* Must be zero */
|
||||||
|
__u64 reserved[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
All of the fields of this structure are filled after the ioctl call.
|
||||||
|
|
||||||
|
Implementation notes:
|
||||||
|
|
||||||
|
Ioctls BTRFS_IOC_SUBVOL_CREATE and BTRFS_IOC_SUBVOL_GETINFO have structure
|
||||||
|
types as third arguments. That is the reason why a corresponding definition
|
||||||
|
are added in file 'linux-user/syscall_types.h'.
|
||||||
|
|
||||||
|
The line '#include <linux/btrfs.h>' is added in file 'linux-user/syscall.c' to
|
||||||
|
recognise preprocessor definitions for these ioctls. Since the file "linux/btrfs.h"
|
||||||
|
was added in the kernel version 3.9, it is enwrapped in an #ifdef statement
|
||||||
|
with parameter CONFIG_BTRFS which is defined in 'configure' if the
|
||||||
|
header file is present.
|
||||||
|
|
||||||
|
Signed-off-by: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Tested-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||||
|
Message-Id: <20200823195014.116226-2-Filip.Bozuta@syrmia.com>
|
||||||
|
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||||||
|
---
|
||||||
|
configure | 9 +++++++++
|
||||||
|
linux-user/ioctls.h | 15 +++++++++++++++
|
||||||
|
linux-user/syscall.c | 3 +++
|
||||||
|
linux-user/syscall_defs.h | 8 ++++++++
|
||||||
|
linux-user/syscall_types.h | 32 ++++++++++++++++++++++++++++++++
|
||||||
|
5 files changed, 67 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/configure b/configure
|
||||||
|
index 2acc4d1465..1cba4e0b80 100755
|
||||||
|
--- a/configure
|
||||||
|
+++ b/configure
|
||||||
|
@@ -5079,6 +5079,12 @@ if check_include sys/kcov.h ; then
|
||||||
|
kcov=yes
|
||||||
|
fi
|
||||||
|
|
||||||
|
+# check for btrfs filesystem support (kernel must be 3.9+)
|
||||||
|
+btrfs=no
|
||||||
|
+if check_include linux/btrfs.h ; then
|
||||||
|
+ btrfs=yes
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
# If we're making warnings fatal, apply this to Sphinx runs as well
|
||||||
|
sphinx_werror=""
|
||||||
|
if test "$werror" = "yes"; then
|
||||||
|
@@ -7330,6 +7336,9 @@ fi
|
||||||
|
if test "$kcov" = "yes" ; then
|
||||||
|
echo "CONFIG_KCOV=y" >> $config_host_mak
|
||||||
|
fi
|
||||||
|
+if test "$btrfs" = "yes" ; then
|
||||||
|
+ echo "CONFIG_BTRFS=y" >> $config_host_mak
|
||||||
|
+fi
|
||||||
|
if test "$inotify" = "yes" ; then
|
||||||
|
echo "CONFIG_INOTIFY=y" >> $config_host_mak
|
||||||
|
fi
|
||||||
|
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
|
||||||
|
index 0713ae1311..12d1444224 100644
|
||||||
|
--- a/linux-user/ioctls.h
|
||||||
|
+++ b/linux-user/ioctls.h
|
||||||
|
@@ -174,6 +174,21 @@
|
||||||
|
IOCTL(FS_IOC32_GETVERSION, IOC_R, MK_PTR(TYPE_INT))
|
||||||
|
IOCTL(FS_IOC32_SETVERSION, IOC_W, MK_PTR(TYPE_INT))
|
||||||
|
|
||||||
|
+#ifdef BTRFS_IOC_SUBVOL_CREATE
|
||||||
|
+ IOCTL(BTRFS_IOC_SUBVOL_CREATE, IOC_W,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_vol_args)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_SUBVOL_GETFLAGS
|
||||||
|
+ IOCTL(BTRFS_IOC_SUBVOL_GETFLAGS, IOC_R, MK_PTR(TYPE_ULONGLONG))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_SUBVOL_SETFLAGS
|
||||||
|
+ IOCTL(BTRFS_IOC_SUBVOL_SETFLAGS, IOC_W, MK_PTR(TYPE_ULONGLONG))
|
||||||
|
+#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 CONFIG_USBFS
|
||||||
|
/* USB ioctls */
|
||||||
|
IOCTL(USBDEVFS_CONTROL, IOC_RW,
|
||||||
|
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
|
||||||
|
index 945fc25279..36777c91b0 100644
|
||||||
|
--- a/linux-user/syscall.c
|
||||||
|
+++ b/linux-user/syscall.c
|
||||||
|
@@ -112,6 +112,9 @@
|
||||||
|
#include <linux/if_alg.h>
|
||||||
|
#include <linux/rtc.h>
|
||||||
|
#include <sound/asound.h>
|
||||||
|
+#ifdef CONFIG_BTRFS
|
||||||
|
+#include <linux/btrfs.h>
|
||||||
|
+#endif
|
||||||
|
#ifdef HAVE_DRM_H
|
||||||
|
#include <libdrm/drm.h>
|
||||||
|
#endif
|
||||||
|
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
|
||||||
|
index 3c261cff0e..2757956dfa 100644
|
||||||
|
--- a/linux-user/syscall_defs.h
|
||||||
|
+++ b/linux-user/syscall_defs.h
|
||||||
|
@@ -967,6 +967,14 @@ struct target_rtc_pll_info {
|
||||||
|
#define TARGET_FS_IOC32_GETVERSION TARGET_IOR('v', 1, int)
|
||||||
|
#define TARGET_FS_IOC32_SETVERSION TARGET_IOW('v', 2, int)
|
||||||
|
|
||||||
|
+/* btrfs ioctls */
|
||||||
|
+#define TARGET_BTRFS_IOC_SUBVOL_CREATE TARGET_IOWU(BTRFS_IOCTL_MAGIC, 14)
|
||||||
|
+#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_GET_SUBVOL_INFO TARGET_IORU(BTRFS_IOCTL_MAGIC, 60)
|
||||||
|
+
|
||||||
|
/* usb ioctls */
|
||||||
|
#define TARGET_USBDEVFS_CONTROL TARGET_IOWRU('U', 0)
|
||||||
|
#define TARGET_USBDEVFS_BULK TARGET_IOWRU('U', 2)
|
||||||
|
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
|
||||||
|
index 3f1f033464..db61dbc1b3 100644
|
||||||
|
--- a/linux-user/syscall_types.h
|
||||||
|
+++ b/linux-user/syscall_types.h
|
||||||
|
@@ -354,6 +354,38 @@ STRUCT(blkpg_partition,
|
||||||
|
MK_ARRAY(TYPE_CHAR, BLKPG_DEVNAMELTH), /* devname */
|
||||||
|
MK_ARRAY(TYPE_CHAR, BLKPG_VOLNAMELTH)) /* volname */
|
||||||
|
|
||||||
|
+#ifdef BTRFS_IOC_SUBVOL_CREATE
|
||||||
|
+STRUCT(btrfs_ioctl_vol_args,
|
||||||
|
+ TYPE_LONGLONG, /* fd */
|
||||||
|
+ MK_ARRAY(TYPE_CHAR, BTRFS_PATH_NAME_MAX + 1)) /* name */
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#ifdef BTRFS_IOC_GET_SUBVOL_INFO
|
||||||
|
+STRUCT(btrfs_ioctl_timespec,
|
||||||
|
+ TYPE_ULONGLONG, /* sec */
|
||||||
|
+ TYPE_INT) /* nsec */
|
||||||
|
+
|
||||||
|
+STRUCT(btrfs_ioctl_get_subvol_info_args,
|
||||||
|
+ TYPE_ULONGLONG, /* treeid */
|
||||||
|
+ MK_ARRAY(TYPE_CHAR, BTRFS_VOL_NAME_MAX + 1),
|
||||||
|
+ TYPE_ULONGLONG, /* parentid */
|
||||||
|
+ TYPE_ULONGLONG, /* dirid */
|
||||||
|
+ TYPE_ULONGLONG, /* generation */
|
||||||
|
+ TYPE_ULONGLONG, /* flags */
|
||||||
|
+ MK_ARRAY(TYPE_CHAR, BTRFS_UUID_SIZE), /* uuid */
|
||||||
|
+ MK_ARRAY(TYPE_CHAR, BTRFS_UUID_SIZE), /* parent_uuid */
|
||||||
|
+ MK_ARRAY(TYPE_CHAR, BTRFS_UUID_SIZE), /* received_uuid */
|
||||||
|
+ TYPE_ULONGLONG, /* ctransid */
|
||||||
|
+ TYPE_ULONGLONG, /* otransid */
|
||||||
|
+ TYPE_ULONGLONG, /* stransid */
|
||||||
|
+ TYPE_ULONGLONG, /* rtransid */
|
||||||
|
+ MK_STRUCT(STRUCT_btrfs_ioctl_timespec), /* ctime */
|
||||||
|
+ MK_STRUCT(STRUCT_btrfs_ioctl_timespec), /* otime */
|
||||||
|
+ MK_STRUCT(STRUCT_btrfs_ioctl_timespec), /* stime */
|
||||||
|
+ MK_STRUCT(STRUCT_btrfs_ioctl_timespec), /* rtime */
|
||||||
|
+ MK_ARRAY(TYPE_ULONGLONG, 8)) /* reserved */
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
STRUCT(rtc_time,
|
||||||
|
TYPE_INT, /* tm_sec */
|
||||||
|
TYPE_INT, /* tm_min */
|
@ -0,0 +1,94 @@
|
|||||||
|
From: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Date: Thu, 3 Sep 2020 01:26:55 +0200
|
||||||
|
Subject: [PATCH] linux-user: Add support for a group of btrfs ioctls used for
|
||||||
|
snapshots
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This patch implements functionality for following ioctls:
|
||||||
|
|
||||||
|
BTRFS_IOC_SNAP_CREATE - Creating a subvolume snapshot
|
||||||
|
|
||||||
|
Create a snapshot of a btrfs subvolume. The snapshot is created using the
|
||||||
|
ioctl's third argument that is a pointer to a 'struct btrfs_ioctl_vol_args'
|
||||||
|
(which was mentioned in the previous patch). Before calling this ioctl,
|
||||||
|
the fields of the structure should be filled with aproppriate values for
|
||||||
|
the file descriptor and path of the subvolume for which the snapshot is to
|
||||||
|
be created.
|
||||||
|
|
||||||
|
BTRFS_IOC_SNAP_DESTROY - Removing a subvolume snapshot
|
||||||
|
|
||||||
|
Delete a snapshot of a btrfs subvolume. The snapshot is deleted using the
|
||||||
|
ioctl's third argument that is a pointer to a 'struct btrfs_ioctl_vol_args'
|
||||||
|
(which was mentioned in the previous patch). Before calling this ioctl,
|
||||||
|
the fields of the structure should be filled with aproppriate values for
|
||||||
|
the file descriptor and path of the subvolume for which the snapshot is to
|
||||||
|
be deleted.
|
||||||
|
|
||||||
|
Implementation notes:
|
||||||
|
|
||||||
|
Since the thunk type 'struct btrfs_ioctl_vol_args' is defined in the
|
||||||
|
previous patch, the implementation for these ioctls was straightforward.
|
||||||
|
|
||||||
|
Signed-off-by: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Tested-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||||
|
Message-Id: <20200823195014.116226-3-Filip.Bozuta@syrmia.com>
|
||||||
|
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||||||
|
---
|
||||||
|
linux-user/ioctls.h | 8 ++++++++
|
||||||
|
linux-user/syscall_defs.h | 2 ++
|
||||||
|
linux-user/syscall_types.h | 3 ++-
|
||||||
|
3 files changed, 12 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
|
||||||
|
index 12d1444224..f33a99f8b6 100644
|
||||||
|
--- a/linux-user/ioctls.h
|
||||||
|
+++ b/linux-user/ioctls.h
|
||||||
|
@@ -174,10 +174,18 @@
|
||||||
|
IOCTL(FS_IOC32_GETVERSION, IOC_R, MK_PTR(TYPE_INT))
|
||||||
|
IOCTL(FS_IOC32_SETVERSION, IOC_W, MK_PTR(TYPE_INT))
|
||||||
|
|
||||||
|
+#ifdef BTRFS_IOC_SNAP_CREATE
|
||||||
|
+ IOCTL(BTRFS_IOC_SNAP_CREATE, IOC_W,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_vol_args)))
|
||||||
|
+#endif
|
||||||
|
#ifdef BTRFS_IOC_SUBVOL_CREATE
|
||||||
|
IOCTL(BTRFS_IOC_SUBVOL_CREATE, IOC_W,
|
||||||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_vol_args)))
|
||||||
|
#endif
|
||||||
|
+#ifdef BTRFS_IOC_SNAP_DESTROY
|
||||||
|
+ IOCTL(BTRFS_IOC_SNAP_DESTROY, IOC_W,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_vol_args)))
|
||||||
|
+#endif
|
||||||
|
#ifdef BTRFS_IOC_SUBVOL_GETFLAGS
|
||||||
|
IOCTL(BTRFS_IOC_SUBVOL_GETFLAGS, IOC_R, MK_PTR(TYPE_ULONGLONG))
|
||||||
|
#endif
|
||||||
|
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
|
||||||
|
index 2757956dfa..a945e12547 100644
|
||||||
|
--- a/linux-user/syscall_defs.h
|
||||||
|
+++ b/linux-user/syscall_defs.h
|
||||||
|
@@ -968,7 +968,9 @@ struct target_rtc_pll_info {
|
||||||
|
#define TARGET_FS_IOC32_SETVERSION TARGET_IOW('v', 2, int)
|
||||||
|
|
||||||
|
/* btrfs ioctls */
|
||||||
|
+#define TARGET_BTRFS_IOC_SNAP_CREATE TARGET_IOWU(BTRFS_IOCTL_MAGIC, 1)
|
||||||
|
#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_SUBVOL_GETFLAGS TARGET_IOR(BTRFS_IOCTL_MAGIC, 25,\
|
||||||
|
abi_ullong)
|
||||||
|
#define TARGET_BTRFS_IOC_SUBVOL_SETFLAGS TARGET_IOW(BTRFS_IOCTL_MAGIC, 26,\
|
||||||
|
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
|
||||||
|
index db61dbc1b3..038cd7869b 100644
|
||||||
|
--- a/linux-user/syscall_types.h
|
||||||
|
+++ b/linux-user/syscall_types.h
|
||||||
|
@@ -354,7 +354,8 @@ STRUCT(blkpg_partition,
|
||||||
|
MK_ARRAY(TYPE_CHAR, BLKPG_DEVNAMELTH), /* devname */
|
||||||
|
MK_ARRAY(TYPE_CHAR, BLKPG_VOLNAMELTH)) /* volname */
|
||||||
|
|
||||||
|
-#ifdef BTRFS_IOC_SUBVOL_CREATE
|
||||||
|
+#if defined(BTRFS_IOC_SUBVOL_CREATE) || defined(BTRFS_IOC_SNAP_CREATE) || \
|
||||||
|
+ defined(BTRFS_IOC_SNAP_DESTROY)
|
||||||
|
STRUCT(btrfs_ioctl_vol_args,
|
||||||
|
TYPE_LONGLONG, /* fd */
|
||||||
|
MK_ARRAY(TYPE_CHAR, BTRFS_PATH_NAME_MAX + 1)) /* name */
|
218
0004-linux-user-Add-support-for-btrfs-ioctls-used-to-mani.patch
Normal file
218
0004-linux-user-Add-support-for-btrfs-ioctls-used-to-mani.patch
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
From: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Date: Thu, 3 Sep 2020 01:26:56 +0200
|
||||||
|
Subject: [PATCH] linux-user: Add support for btrfs ioctls used to manipulate
|
||||||
|
with devices
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This patch implements functionality for following ioctls:
|
||||||
|
|
||||||
|
BTRFS_IOC_SCAN_DEV - Scanning device for a btrfs filesystem
|
||||||
|
|
||||||
|
Scan a device for a btrfs filesystem. The device that is to
|
||||||
|
be scanned is passed in the ioctl's third argument which
|
||||||
|
represents a pointer to a 'struct ioc_vol_args' (which was
|
||||||
|
mentioned in a previous patch). Before calling this ioctl,
|
||||||
|
the name field of this structure should be filled with the
|
||||||
|
aproppriate name value which represents a path for the device.
|
||||||
|
If the device contains a btrfs filesystem, the ioctl returns 0,
|
||||||
|
otherwise a negative value is returned.
|
||||||
|
|
||||||
|
BTRFS_IOC_ADD_DEV - Adding a device to a btrfs filesystem
|
||||||
|
|
||||||
|
Add a device to a btrfs filesystem. The device that is to be
|
||||||
|
added is passed in the ioctl's third argument which represents
|
||||||
|
a pointer to a 'struct ioc_vol_args' (which was mentioned in
|
||||||
|
a previous patch). Before calling this ioctl, the name field of
|
||||||
|
this structure should be filled with the aproppriate name value
|
||||||
|
which represents a path for the device.
|
||||||
|
|
||||||
|
BTRFS_IOC_RM_DEV - Removing a device from a btrfs filesystem
|
||||||
|
|
||||||
|
Remove a device from a btrfs filesystem. The device that is to be
|
||||||
|
removed is passed in the ioctl's third argument which represents
|
||||||
|
a pointer to a 'struct ioc_vol_args' (which was mentioned in
|
||||||
|
a previous patch). Before calling this ioctl, the name field of
|
||||||
|
this structure should be filled with the aproppriate name value
|
||||||
|
which represents a path for the device.
|
||||||
|
|
||||||
|
BTRFS_IOC_DEV_INFO - Getting information about a device
|
||||||
|
|
||||||
|
Obtain information for device in a btrfs filesystem. The information
|
||||||
|
is gathered in the ioctl's third argument which represents a pointer
|
||||||
|
to a following structure type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_dev_info_args {
|
||||||
|
__u64 devid; /* in/out */
|
||||||
|
__u8 uuid[BTRFS_UUID_SIZE]; /* in/out */
|
||||||
|
__u64 bytes_used; /* out */
|
||||||
|
__u64 total_bytes; /* out */
|
||||||
|
__u64 unused[379]; /* pad to 4k */
|
||||||
|
__u8 path[BTRFS_DEVICE_PATH_NAME_MAX]; /* out */
|
||||||
|
};
|
||||||
|
|
||||||
|
Before calling this ioctl, field "devid" should be set with the id value
|
||||||
|
for the device for which the information is to be obtained. If this field
|
||||||
|
is not aproppriately set, the errno ENODEV ("No such device") is returned.
|
||||||
|
|
||||||
|
BTRFS_IOC_GET_DEV_STATS - Getting device statistics
|
||||||
|
|
||||||
|
Obtain stats informatin for device in a btrfs filesystem. The information
|
||||||
|
is gathered in the ioctl's third argument which represents a pointer to
|
||||||
|
a following structure type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_get_dev_stats {
|
||||||
|
__u64 devid; /* in */
|
||||||
|
__u64 nr_items; /* in/out */
|
||||||
|
__u64 flags; /* in/out */
|
||||||
|
|
||||||
|
/* out values: */
|
||||||
|
__u64 values[BTRFS_DEV_STAT_VALUES_MAX];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This pads the struct to 1032 bytes. It was originally meant to pad to
|
||||||
|
* 1024 bytes, but when adding the flags field, the padding calculation
|
||||||
|
* was not adjusted.
|
||||||
|
*/
|
||||||
|
__u64 unused[128 - 2 - BTRFS_DEV_STAT_VALUES_MAX];
|
||||||
|
};
|
||||||
|
|
||||||
|
Before calling this ioctl, field "devid" should be set with the id value
|
||||||
|
for the device for which the information is to be obtained. If this field
|
||||||
|
is not aproppriately set, the errno ENODEV ("No such device") is returned.
|
||||||
|
|
||||||
|
BTRFS_IOC_FORGET_DEV - Remove unmounted devices
|
||||||
|
|
||||||
|
Search and remove all stale devices (devices which are not mounted).
|
||||||
|
The third ioctl argument is a pointer to a 'struct btrfs_ioctl_vol_args'.
|
||||||
|
The ioctl call will release all unmounted devices which match the path
|
||||||
|
which is specified in the "name" field of the structure. If an empty
|
||||||
|
path ("") is specified, all unmounted devices will be released.
|
||||||
|
|
||||||
|
Implementation notes:
|
||||||
|
|
||||||
|
Ioctls BTRFS_IOC_DEV_INFO and BTRFS_IOC_GET_DEV_STATS use types
|
||||||
|
'struct btrfs_ioctl_dev_info_args' and ' struct btrfs_ioctl_get_dev_stats'
|
||||||
|
as third argument types. That is the reason why corresponding structure
|
||||||
|
definitions were added in file 'linux-user/syscall_types.h'.
|
||||||
|
Since the thunk type for 'struct ioc_vol_args' was already added in a
|
||||||
|
previous patch, the rest of the implementation was straightforward.
|
||||||
|
|
||||||
|
Signed-off-by: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Tested-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||||
|
Message-Id: <20200823195014.116226-4-Filip.Bozuta@syrmia.com>
|
||||||
|
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||||||
|
---
|
||||||
|
linux-user/ioctls.h | 24 ++++++++++++++++++++++++
|
||||||
|
linux-user/syscall_defs.h | 6 ++++++
|
||||||
|
linux-user/syscall_types.h | 24 +++++++++++++++++++++++-
|
||||||
|
3 files changed, 53 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
|
||||||
|
index f33a99f8b6..55a6cbeca5 100644
|
||||||
|
--- a/linux-user/ioctls.h
|
||||||
|
+++ b/linux-user/ioctls.h
|
||||||
|
@@ -178,6 +178,22 @@
|
||||||
|
IOCTL(BTRFS_IOC_SNAP_CREATE, IOC_W,
|
||||||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_vol_args)))
|
||||||
|
#endif
|
||||||
|
+#ifdef BTRFS_IOC_SCAN_DEV
|
||||||
|
+ IOCTL(BTRFS_IOC_SCAN_DEV, IOC_W,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_vol_args)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_FORGET_DEV
|
||||||
|
+ IOCTL(BTRFS_IOC_FORGET_DEV, IOC_W,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_vol_args)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_ADD_DEV
|
||||||
|
+ IOCTL(BTRFS_IOC_ADD_DEV, IOC_W,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_vol_args)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_RM_DEV
|
||||||
|
+ IOCTL(BTRFS_IOC_RM_DEV, IOC_W,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_vol_args)))
|
||||||
|
+#endif
|
||||||
|
#ifdef BTRFS_IOC_SUBVOL_CREATE
|
||||||
|
IOCTL(BTRFS_IOC_SUBVOL_CREATE, IOC_W,
|
||||||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_vol_args)))
|
||||||
|
@@ -192,6 +208,14 @@
|
||||||
|
#ifdef BTRFS_IOC_SUBVOL_SETFLAGS
|
||||||
|
IOCTL(BTRFS_IOC_SUBVOL_SETFLAGS, IOC_W, MK_PTR(TYPE_ULONGLONG))
|
||||||
|
#endif
|
||||||
|
+#ifdef BTRFS_IOC_DEV_INFO
|
||||||
|
+ IOCTL(BTRFS_IOC_DEV_INFO, IOC_RW,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_dev_info_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)))
|
||||||
|
+#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)))
|
||||||
|
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
|
||||||
|
index a945e12547..4c7bfa0391 100644
|
||||||
|
--- a/linux-user/syscall_defs.h
|
||||||
|
+++ b/linux-user/syscall_defs.h
|
||||||
|
@@ -969,12 +969,18 @@ struct target_rtc_pll_info {
|
||||||
|
|
||||||
|
/* btrfs ioctls */
|
||||||
|
#define TARGET_BTRFS_IOC_SNAP_CREATE TARGET_IOWU(BTRFS_IOCTL_MAGIC, 1)
|
||||||
|
+#define TARGET_BTRFS_IOC_SCAN_DEV TARGET_IOWU(BTRFS_IOCTL_MAGIC, 4)
|
||||||
|
+#define TARGET_BTRFS_IOC_FORGET_DEV TARGET_IOWU(BTRFS_IOCTL_MAGIC, 5)
|
||||||
|
+#define TARGET_BTRFS_IOC_ADD_DEV TARGET_IOWU(BTRFS_IOCTL_MAGIC, 10)
|
||||||
|
+#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_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_GET_DEV_STATS TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 52)
|
||||||
|
#define TARGET_BTRFS_IOC_GET_SUBVOL_INFO TARGET_IORU(BTRFS_IOCTL_MAGIC, 60)
|
||||||
|
|
||||||
|
/* usb ioctls */
|
||||||
|
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
|
||||||
|
index 038cd7869b..ea6898979b 100644
|
||||||
|
--- a/linux-user/syscall_types.h
|
||||||
|
+++ b/linux-user/syscall_types.h
|
||||||
|
@@ -355,7 +355,9 @@ STRUCT(blkpg_partition,
|
||||||
|
MK_ARRAY(TYPE_CHAR, BLKPG_VOLNAMELTH)) /* volname */
|
||||||
|
|
||||||
|
#if defined(BTRFS_IOC_SUBVOL_CREATE) || defined(BTRFS_IOC_SNAP_CREATE) || \
|
||||||
|
- defined(BTRFS_IOC_SNAP_DESTROY)
|
||||||
|
+ defined(BTRFS_IOC_SNAP_DESTROY) || defined(BTRFS_IOC_SCAN_DEV) || \
|
||||||
|
+ defined(BTRFS_IOC_FORGET_DEV) || defined(BTRFS_IOC_ADD_DEV) || \
|
||||||
|
+ defined(BTRFS_IOC_RM_DEV) || defined(BTRFS_IOC_DEV_INFO)
|
||||||
|
STRUCT(btrfs_ioctl_vol_args,
|
||||||
|
TYPE_LONGLONG, /* fd */
|
||||||
|
MK_ARRAY(TYPE_CHAR, BTRFS_PATH_NAME_MAX + 1)) /* name */
|
||||||
|
@@ -387,6 +389,26 @@ STRUCT(btrfs_ioctl_get_subvol_info_args,
|
||||||
|
MK_ARRAY(TYPE_ULONGLONG, 8)) /* reserved */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef BTRFS_IOC_DEV_INFO
|
||||||
|
+STRUCT(btrfs_ioctl_dev_info_args,
|
||||||
|
+ TYPE_ULONGLONG, /* devid */
|
||||||
|
+ MK_ARRAY(TYPE_CHAR, BTRFS_UUID_SIZE), /* uuid */
|
||||||
|
+ TYPE_ULONGLONG, /* bytes_used */
|
||||||
|
+ TYPE_ULONGLONG, /* total_bytes */
|
||||||
|
+ MK_ARRAY(TYPE_ULONGLONG, 379), /* unused */
|
||||||
|
+ MK_ARRAY(TYPE_CHAR, BTRFS_DEVICE_PATH_NAME_MAX)) /* path */
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#ifdef BTRFS_IOC_GET_DEV_STATS
|
||||||
|
+STRUCT(btrfs_ioctl_get_dev_stats,
|
||||||
|
+ TYPE_ULONGLONG, /* devid */
|
||||||
|
+ TYPE_ULONGLONG, /* nr_items */
|
||||||
|
+ TYPE_ULONGLONG, /* flags */
|
||||||
|
+ MK_ARRAY(TYPE_ULONGLONG, BTRFS_DEV_STAT_VALUES_MAX), /* values */
|
||||||
|
+ MK_ARRAY(TYPE_ULONGLONG,
|
||||||
|
+ 128 - 2 - BTRFS_DEV_STAT_VALUES_MAX)) /* unused */
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
STRUCT(rtc_time,
|
||||||
|
TYPE_INT, /* tm_sec */
|
||||||
|
TYPE_INT, /* tm_min */
|
116
0005-linux-user-Add-support-for-btrfs-ioctls-used-to-get-.patch
Normal file
116
0005-linux-user-Add-support-for-btrfs-ioctls-used-to-get-.patch
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
From: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Date: Thu, 3 Sep 2020 01:26:57 +0200
|
||||||
|
Subject: [PATCH] linux-user: Add support for btrfs ioctls used to get/set
|
||||||
|
features
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This patch implements functionality for following ioctls:
|
||||||
|
|
||||||
|
BTRFS_IOC_GET_FEATURES - Getting feature flags
|
||||||
|
|
||||||
|
Read feature flags for a btrfs filesystem. The feature flags
|
||||||
|
are returned inside the ioctl's third argument which represents
|
||||||
|
a pointer to a following structure type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_feature_flags {
|
||||||
|
__u64 compat_flags;
|
||||||
|
__u64 compat_ro_flags;
|
||||||
|
__u64 incompat_flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
All of the structure field represent bit masks that can be composed
|
||||||
|
of values which can be found on:
|
||||||
|
https://elixir.bootlin.com/linux/latest/source/fs/btrfs/ctree.h#L282
|
||||||
|
|
||||||
|
BTRFS_IOC_SET_FEATURES - Setting feature flags
|
||||||
|
|
||||||
|
Set and clear feature flags for a btrfs filesystem. The feature flags
|
||||||
|
are set using the ioctl's third argument which represents a
|
||||||
|
'struct btrfs_ioctl_feature_flags[2]' array. The first element of the
|
||||||
|
array represent flags which are to be cleared and the second element of
|
||||||
|
the array represent flags which are to be set. The second element has the
|
||||||
|
priority over the first, which means that if there are matching flags
|
||||||
|
in the elements, they will be set in the filesystem. If the flag values
|
||||||
|
in the third argument aren't correctly set to be composed of the available
|
||||||
|
predefined flag values, errno ENOPERM ("Operation not permitted") is returned.
|
||||||
|
|
||||||
|
BTRFS_IOC_GET_SUPPORTED_FEATURES - Getting supported feature flags
|
||||||
|
|
||||||
|
Read supported feature flags for a btrfs filesystem. The supported
|
||||||
|
feature flags are read using the ioctl's third argument which represents
|
||||||
|
a 'struct btrfs_ioctl_feature_flags[3]' array. The first element of this
|
||||||
|
array represents all of the supported flags in the btrfs filesystem.
|
||||||
|
The second element represents flags that can be safely set and third element
|
||||||
|
represent flags that can be safely clearead.
|
||||||
|
|
||||||
|
Implementation notes:
|
||||||
|
|
||||||
|
All of the implemented ioctls use 'struct btrfs_ioctl_feature_flags' as
|
||||||
|
third argument. That is the reason why a corresponding defintion was added
|
||||||
|
in file 'linux-user/syscall_types.h'.
|
||||||
|
|
||||||
|
Signed-off-by: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Tested-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||||
|
Message-Id: <20200823195014.116226-5-Filip.Bozuta@syrmia.com>
|
||||||
|
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||||||
|
---
|
||||||
|
linux-user/ioctls.h | 12 ++++++++++++
|
||||||
|
linux-user/syscall_defs.h | 3 +++
|
||||||
|
linux-user/syscall_types.h | 5 +++++
|
||||||
|
3 files changed, 20 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
|
||||||
|
index 55a6cbeca5..50fae1e33b 100644
|
||||||
|
--- a/linux-user/ioctls.h
|
||||||
|
+++ b/linux-user/ioctls.h
|
||||||
|
@@ -216,6 +216,18 @@
|
||||||
|
IOCTL(BTRFS_IOC_GET_DEV_STATS, IOC_RW,
|
||||||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_get_dev_stats)))
|
||||||
|
#endif
|
||||||
|
+#ifdef BTRFS_IOC_GET_FEATURES
|
||||||
|
+ IOCTL(BTRFS_IOC_GET_FEATURES, IOC_R,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_feature_flags)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_SET_FEATURES
|
||||||
|
+ IOCTL(BTRFS_IOC_SET_FEATURES, IOC_W,
|
||||||
|
+ MK_PTR(MK_ARRAY(MK_STRUCT(STRUCT_btrfs_ioctl_feature_flags), 2)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_GET_SUPPORTED_FEATURES
|
||||||
|
+ IOCTL(BTRFS_IOC_GET_SUPPORTED_FEATURES, IOC_R,
|
||||||
|
+ MK_PTR(MK_ARRAY(MK_STRUCT(STRUCT_btrfs_ioctl_feature_flags), 3)))
|
||||||
|
+#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)))
|
||||||
|
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
|
||||||
|
index 4c7bfa0391..44811fdcbb 100644
|
||||||
|
--- a/linux-user/syscall_defs.h
|
||||||
|
+++ b/linux-user/syscall_defs.h
|
||||||
|
@@ -981,6 +981,9 @@ struct target_rtc_pll_info {
|
||||||
|
abi_ullong)
|
||||||
|
#define TARGET_BTRFS_IOC_DEV_INFO TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 30)
|
||||||
|
#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_GET_SUBVOL_INFO TARGET_IORU(BTRFS_IOCTL_MAGIC, 60)
|
||||||
|
|
||||||
|
/* usb ioctls */
|
||||||
|
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
|
||||||
|
index ea6898979b..925054cfd4 100644
|
||||||
|
--- a/linux-user/syscall_types.h
|
||||||
|
+++ b/linux-user/syscall_types.h
|
||||||
|
@@ -409,6 +409,11 @@ STRUCT(btrfs_ioctl_get_dev_stats,
|
||||||
|
128 - 2 - BTRFS_DEV_STAT_VALUES_MAX)) /* unused */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+STRUCT(btrfs_ioctl_feature_flags,
|
||||||
|
+ TYPE_ULONGLONG, /* compat_flags */
|
||||||
|
+ TYPE_ULONGLONG, /* compat_ro_flags */
|
||||||
|
+ TYPE_ULONGLONG) /* incompat_flags */
|
||||||
|
+
|
||||||
|
STRUCT(rtc_time,
|
||||||
|
TYPE_INT, /* tm_sec */
|
||||||
|
TYPE_INT, /* tm_min */
|
232
0006-linux-user-Add-support-for-a-group-of-btrfs-inode-io.patch
Normal file
232
0006-linux-user-Add-support-for-a-group-of-btrfs-inode-io.patch
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
From: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Date: Thu, 3 Sep 2020 01:26:58 +0200
|
||||||
|
Subject: [PATCH] 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 */
|
128
0007-linux-user-Add-support-for-two-btrfs-ioctls-used-for.patch
Normal file
128
0007-linux-user-Add-support-for-two-btrfs-ioctls-used-for.patch
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
From: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Date: Thu, 3 Sep 2020 01:26:59 +0200
|
||||||
|
Subject: [PATCH] linux-user: Add support for two btrfs ioctls used for
|
||||||
|
subvolume
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This patch implements functionality for following ioctl:
|
||||||
|
|
||||||
|
BTRFS_IOC_DEFAULT_SUBVOL - Setting a default subvolume
|
||||||
|
|
||||||
|
Set a default subvolume for a btrfs filesystem. The third
|
||||||
|
ioctl's argument is a '__u64' (unsigned long long) which
|
||||||
|
represents the id of a subvolume that is to be set as
|
||||||
|
the default.
|
||||||
|
|
||||||
|
BTRFS_IOC_GET_SUBVOL_ROOTREF - Getting tree and directory id of subvolumes
|
||||||
|
|
||||||
|
Read tree and directory id of subvolumes from a btrfs
|
||||||
|
filesystem. The tree and directory id's are returned in the
|
||||||
|
ioctl's third argument which represents a pointer to a
|
||||||
|
following type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_get_subvol_rootref_args {
|
||||||
|
/* in/out, minimum id of rootref's treeid to be searched */
|
||||||
|
__u64 min_treeid;
|
||||||
|
|
||||||
|
/* out */
|
||||||
|
struct {
|
||||||
|
__u64 treeid;
|
||||||
|
__u64 dirid;
|
||||||
|
} rootref[BTRFS_MAX_ROOTREF_BUFFER_NUM];
|
||||||
|
|
||||||
|
/* out, number of found items */
|
||||||
|
__u8 num_items;
|
||||||
|
__u8 align[7];
|
||||||
|
};
|
||||||
|
|
||||||
|
Before calling this ioctl, 'min_treeid' field should be filled
|
||||||
|
with value that represent the minimum value for the tree id.
|
||||||
|
|
||||||
|
Implementation notes:
|
||||||
|
|
||||||
|
Ioctl BTRFS_IOC_GET_SUBVOL_ROOTREF uses the above mentioned structure
|
||||||
|
type as third argument. That is the reason why a aproppriate thunk
|
||||||
|
structure definition is 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-7-Filip.Bozuta@syrmia.com>
|
||||||
|
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||||||
|
---
|
||||||
|
linux-user/ioctls.h | 7 +++++++
|
||||||
|
linux-user/syscall_defs.h | 3 +++
|
||||||
|
linux-user/syscall_types.h | 13 +++++++++++++
|
||||||
|
3 files changed, 23 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
|
||||||
|
index 169f98f7a3..728880b9f3 100644
|
||||||
|
--- a/linux-user/ioctls.h
|
||||||
|
+++ b/linux-user/ioctls.h
|
||||||
|
@@ -206,6 +206,9 @@
|
||||||
|
IOCTL(BTRFS_IOC_INO_LOOKUP, IOC_RW,
|
||||||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_ino_lookup_args)))
|
||||||
|
#endif
|
||||||
|
+#ifdef BTRFS_IOC_DEFAULT_SUBVOL
|
||||||
|
+ IOCTL(BTRFS_IOC_DEFAULT_SUBVOL, IOC_W, MK_PTR(TYPE_ULONGLONG))
|
||||||
|
+#endif
|
||||||
|
#ifdef BTRFS_IOC_SUBVOL_GETFLAGS
|
||||||
|
IOCTL(BTRFS_IOC_SUBVOL_GETFLAGS, IOC_R, MK_PTR(TYPE_ULONGLONG))
|
||||||
|
#endif
|
||||||
|
@@ -248,6 +251,10 @@
|
||||||
|
IOCTL(BTRFS_IOC_GET_SUBVOL_INFO, IOC_R,
|
||||||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_get_subvol_info_args)))
|
||||||
|
#endif
|
||||||
|
+#ifdef BTRFS_IOC_GET_SUBVOL_ROOTREF
|
||||||
|
+ IOCTL(BTRFS_IOC_GET_SUBVOL_ROOTREF, IOC_RW,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_get_subvol_rootref_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)))
|
||||||
|
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
|
||||||
|
index a6a9454b85..1d0bfb5479 100644
|
||||||
|
--- a/linux-user/syscall_defs.h
|
||||||
|
+++ b/linux-user/syscall_defs.h
|
||||||
|
@@ -976,6 +976,8 @@ struct target_rtc_pll_info {
|
||||||
|
#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_DEFAULT_SUBVOL TARGET_IOW(BTRFS_IOCTL_MAGIC, 19,\
|
||||||
|
+ abi_ullong)
|
||||||
|
#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,\
|
||||||
|
@@ -989,6 +991,7 @@ struct target_rtc_pll_info {
|
||||||
|
#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_GET_SUBVOL_ROOTREF TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 61)
|
||||||
|
#define TARGET_BTRFS_IOC_INO_LOOKUP_USER TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 62)
|
||||||
|
|
||||||
|
/* usb ioctls */
|
||||||
|
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
|
||||||
|
index b84e14235f..5566d101c2 100644
|
||||||
|
--- a/linux-user/syscall_types.h
|
||||||
|
+++ b/linux-user/syscall_types.h
|
||||||
|
@@ -431,6 +431,19 @@ STRUCT(btrfs_ioctl_dev_info_args,
|
||||||
|
MK_ARRAY(TYPE_CHAR, BTRFS_DEVICE_PATH_NAME_MAX)) /* path */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef BTRFS_IOC_GET_SUBVOL_ROOTREF
|
||||||
|
+STRUCT(rootref,
|
||||||
|
+ TYPE_ULONGLONG, /* treeid */
|
||||||
|
+ TYPE_ULONGLONG) /* dirid */
|
||||||
|
+
|
||||||
|
+STRUCT(btrfs_ioctl_get_subvol_rootref_args,
|
||||||
|
+ TYPE_ULONGLONG, /* min_treeid */
|
||||||
|
+ MK_ARRAY(MK_STRUCT(STRUCT_rootref),
|
||||||
|
+ BTRFS_MAX_ROOTREF_BUFFER_NUM), /* rootref */
|
||||||
|
+ TYPE_CHAR, /* num_items */
|
||||||
|
+ MK_ARRAY(TYPE_CHAR, 7)) /* align */
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifdef BTRFS_IOC_GET_DEV_STATS
|
||||||
|
STRUCT(btrfs_ioctl_get_dev_stats,
|
||||||
|
TYPE_ULONGLONG, /* devid */
|
230
0008-linux-user-Add-support-for-btrfs-ioctls-used-to-mana.patch
Normal file
230
0008-linux-user-Add-support-for-btrfs-ioctls-used-to-mana.patch
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
From: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Date: Thu, 3 Sep 2020 01:27:00 +0200
|
||||||
|
Subject: [PATCH] linux-user: Add support for btrfs ioctls used to manage quota
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This patch implements functionality for following ioctls:
|
||||||
|
|
||||||
|
BTRFS_IOC_QUOTA_CTL - Enabling/Disabling quota support
|
||||||
|
|
||||||
|
Enable or disable quota support for a btrfs filesystem. Quota
|
||||||
|
support is enabled or disabled using the ioctls third argument
|
||||||
|
which represents a pointer to a following type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_quota_ctl_args {
|
||||||
|
__u64 cmd;
|
||||||
|
__u64 status;
|
||||||
|
};
|
||||||
|
|
||||||
|
Before calling this ioctl, the 'cmd' field should be filled
|
||||||
|
with one of the values 'BTRFS_QUOTA_CTL_ENABLE' (enabling quota)
|
||||||
|
'BTRFS_QUOTA_CTL_DISABLE' (disabling quota).
|
||||||
|
|
||||||
|
BTRFS_IOC_QGROUP_CREATE - Creating/Removing a subvolume quota group
|
||||||
|
|
||||||
|
Create or remove a subvolume quota group. The subvolume quota
|
||||||
|
group is created or removed using the ioctl's third argument which
|
||||||
|
represents a pointer to a following type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_qgroup_create_args {
|
||||||
|
__u64 create;
|
||||||
|
__u64 qgroupid;
|
||||||
|
};
|
||||||
|
|
||||||
|
Before calling this ioctl, the 'create' field should be filled
|
||||||
|
with the aproppriate value depending on if the user wants to
|
||||||
|
create or remove a quota group (0 for removing, everything else
|
||||||
|
for creating). Also, the 'qgroupid' field should be filled with
|
||||||
|
the value for the quota group id that is to be created.
|
||||||
|
|
||||||
|
BTRFS_IOC_QGROUP_ASSIGN - Asigning or removing a quota group as child group
|
||||||
|
|
||||||
|
Asign or remove a quota group as child quota group of another
|
||||||
|
group in the btrfs filesystem. The asignment is done using the
|
||||||
|
ioctl's third argument which represents a pointert to a following type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_qgroup_assign_args {
|
||||||
|
__u64 assign;
|
||||||
|
__u64 src;
|
||||||
|
__u64 dst;
|
||||||
|
};
|
||||||
|
|
||||||
|
Before calling this ioctl, the 'assign' field should be filled with
|
||||||
|
the aproppriate value depending on if the user wants to asign or remove
|
||||||
|
a quota group as a child quota group of another group (0 for removing,
|
||||||
|
everythin else for asigning). Also, the 'src' and 'dst' fields should
|
||||||
|
be filled with the aproppriate quota group id values depending on which
|
||||||
|
quota group needs to asigned or removed as child quota group of another
|
||||||
|
group ('src' gets asigned or removed as child group of 'dst').
|
||||||
|
|
||||||
|
BTRFS_IOC_QGROUP_LIMIT - Limiting the size of a quota group
|
||||||
|
|
||||||
|
Limit the size of a quota group. The size of the quota group is limited
|
||||||
|
with the ioctls third argument which represents a pointer to a following
|
||||||
|
type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_qgroup_limit_args {
|
||||||
|
__u64 qgroupid;
|
||||||
|
struct btrfs_qgroup_limit lim;
|
||||||
|
};
|
||||||
|
|
||||||
|
Before calling this ioctl, the 'qgroup' id field should be filled with
|
||||||
|
aproppriate value of the quota group id for which the size is to be
|
||||||
|
limited. The second field is of following type:
|
||||||
|
|
||||||
|
struct btrfs_qgroup_limit {
|
||||||
|
__u64 flags;
|
||||||
|
__u64 max_rfer;
|
||||||
|
__u64 max_excl;
|
||||||
|
__u64 rsv_rfer;
|
||||||
|
__u64 rsv_excl;
|
||||||
|
};
|
||||||
|
|
||||||
|
The 'max_rfer' field should be filled with the size to which the quota
|
||||||
|
group should be limited. The 'flags' field can be used for passing
|
||||||
|
additional options and can have values which can be found on:
|
||||||
|
https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/btrfs.h#L67
|
||||||
|
|
||||||
|
BTRFS_IOC_QUOTA_RESCAN_STATUS - Checking status of running rescan operation
|
||||||
|
|
||||||
|
Check status of a running rescan operation. The status is checked using
|
||||||
|
the ioctl's third argument which represents a pointer to a following type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_quota_rescan_args {
|
||||||
|
__u64 flags;
|
||||||
|
__u64 progress;
|
||||||
|
__u64 reserved[6];
|
||||||
|
};
|
||||||
|
|
||||||
|
If there is a rescan operation running, 'flags' field is set to 1, and
|
||||||
|
'progress' field is set to aproppriate value which represents the progress
|
||||||
|
of the operation.
|
||||||
|
|
||||||
|
BTRFS_IOC_QUOTA_RESCAN - Starting a rescan operation
|
||||||
|
|
||||||
|
Start ar rescan operation to Trash all quota groups and scan the metadata
|
||||||
|
again with the current config. Before calling this ioctl,
|
||||||
|
BTRFS_IOC_QUOTA_RESCAN_STATUS sould be run to check if there is already a
|
||||||
|
rescan operation runing. After that ioctl call, the received
|
||||||
|
'struct btrfs_ioctl_quota_rescan_args' should be than passed as this ioctls
|
||||||
|
third argument.
|
||||||
|
|
||||||
|
BTRFS_IOC_QUOTA_RESCAN_WAIT - Waiting for a rescan operation to finish
|
||||||
|
|
||||||
|
Wait until a rescan operation is finished (if there is a rescan operation
|
||||||
|
running). The third ioctls argument is ignored.
|
||||||
|
|
||||||
|
Implementation notes:
|
||||||
|
|
||||||
|
Almost 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-8-Filip.Bozuta@syrmia.com>
|
||||||
|
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||||||
|
---
|
||||||
|
linux-user/ioctls.h | 27 +++++++++++++++++++++++++++
|
||||||
|
linux-user/syscall_defs.h | 7 +++++++
|
||||||
|
linux-user/syscall_types.h | 29 +++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 63 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
|
||||||
|
index 728880b9f3..882bfb3e88 100644
|
||||||
|
--- a/linux-user/ioctls.h
|
||||||
|
+++ b/linux-user/ioctls.h
|
||||||
|
@@ -227,6 +227,33 @@
|
||||||
|
IOCTL(BTRFS_IOC_LOGICAL_INO, IOC_RW,
|
||||||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_logical_ino_args)))
|
||||||
|
#endif
|
||||||
|
+#ifdef BTRFS_IOC_QUOTA_CTL
|
||||||
|
+ IOCTL(BTRFS_IOC_QUOTA_CTL, IOC_RW,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_quota_ctl_args)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_QGROUP_ASSIGN
|
||||||
|
+ IOCTL(BTRFS_IOC_QGROUP_ASSIGN, IOC_W,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_qgroup_assign_args)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_QGROUP_CREATE
|
||||||
|
+ IOCTL(BTRFS_IOC_QGROUP_CREATE, IOC_W,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_qgroup_create_args)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_QGROUP_LIMIT
|
||||||
|
+ IOCTL(BTRFS_IOC_QGROUP_LIMIT, IOC_R,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_qgroup_limit_args)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_QUOTA_RESCAN
|
||||||
|
+ IOCTL(BTRFS_IOC_QUOTA_RESCAN, IOC_W,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_quota_rescan_args)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_QUOTA_RESCAN_STATUS
|
||||||
|
+ IOCTL(BTRFS_IOC_QUOTA_RESCAN_STATUS, IOC_R,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_quota_rescan_args)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_QUOTA_RESCAN_WAIT
|
||||||
|
+ IOCTL(BTRFS_IOC_QUOTA_RESCAN_WAIT, 0, TYPE_NULL)
|
||||||
|
+#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)))
|
||||||
|
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
|
||||||
|
index 1d0bfb5479..10a7f91016 100644
|
||||||
|
--- a/linux-user/syscall_defs.h
|
||||||
|
+++ b/linux-user/syscall_defs.h
|
||||||
|
@@ -985,6 +985,13 @@ struct target_rtc_pll_info {
|
||||||
|
#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_QUOTA_CTL TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 40)
|
||||||
|
+#define TARGET_BTRFS_IOC_QGROUP_ASSIGN TARGET_IOWU(BTRFS_IOCTL_MAGIC, 41)
|
||||||
|
+#define TARGET_BTRFS_IOC_QGROUP_CREATE TARGET_IOWU(BTRFS_IOCTL_MAGIC, 42)
|
||||||
|
+#define TARGET_BTRFS_IOC_QGROUP_LIMIT TARGET_IORU(BTRFS_IOCTL_MAGIC, 43)
|
||||||
|
+#define TARGET_BTRFS_IOC_QUOTA_RESCAN TARGET_IOWU(BTRFS_IOCTL_MAGIC, 44)
|
||||||
|
+#define TARGET_BTRFS_IOC_QUOTA_RESCAN_STATUS TARGET_IORU(BTRFS_IOCTL_MAGIC, 45)
|
||||||
|
+#define TARGET_BTRFS_IOC_QUOTA_RESCAN_WAIT TARGET_IO(BTRFS_IOCTL_MAGIC, 46)
|
||||||
|
#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)
|
||||||
|
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
|
||||||
|
index 5566d101c2..d9b7106a69 100644
|
||||||
|
--- a/linux-user/syscall_types.h
|
||||||
|
+++ b/linux-user/syscall_types.h
|
||||||
|
@@ -454,6 +454,35 @@ STRUCT(btrfs_ioctl_get_dev_stats,
|
||||||
|
128 - 2 - BTRFS_DEV_STAT_VALUES_MAX)) /* unused */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+STRUCT(btrfs_ioctl_quota_ctl_args,
|
||||||
|
+ TYPE_ULONGLONG, /* cmd */
|
||||||
|
+ TYPE_ULONGLONG) /* status */
|
||||||
|
+
|
||||||
|
+STRUCT(btrfs_ioctl_quota_rescan_args,
|
||||||
|
+ TYPE_ULONGLONG, /* flags */
|
||||||
|
+ TYPE_ULONGLONG, /* progress */
|
||||||
|
+ MK_ARRAY(TYPE_ULONGLONG, 6)) /* reserved */
|
||||||
|
+
|
||||||
|
+STRUCT(btrfs_ioctl_qgroup_assign_args,
|
||||||
|
+ TYPE_ULONGLONG, /* assign */
|
||||||
|
+ TYPE_ULONGLONG, /* src */
|
||||||
|
+ TYPE_ULONGLONG) /* dst */
|
||||||
|
+
|
||||||
|
+STRUCT(btrfs_ioctl_qgroup_create_args,
|
||||||
|
+ TYPE_ULONGLONG, /* create */
|
||||||
|
+ TYPE_ULONGLONG) /* qgroupid */
|
||||||
|
+
|
||||||
|
+STRUCT(btrfs_qgroup_limit,
|
||||||
|
+ TYPE_ULONGLONG, /* flags */
|
||||||
|
+ TYPE_ULONGLONG, /* max_rfer */
|
||||||
|
+ TYPE_ULONGLONG, /* max_excl */
|
||||||
|
+ TYPE_ULONGLONG, /* rsv_rfer */
|
||||||
|
+ TYPE_ULONGLONG) /* rsv_excl */
|
||||||
|
+
|
||||||
|
+STRUCT(btrfs_ioctl_qgroup_limit_args,
|
||||||
|
+ TYPE_ULONGLONG, /* qgroupid */
|
||||||
|
+ MK_STRUCT(STRUCT_btrfs_qgroup_limit)) /* lim */
|
||||||
|
+
|
||||||
|
STRUCT(btrfs_ioctl_feature_flags,
|
||||||
|
TYPE_ULONGLONG, /* compat_flags */
|
||||||
|
TYPE_ULONGLONG, /* compat_ro_flags */
|
138
0009-linux-user-Add-support-for-btrfs-ioctls-used-to-scru.patch
Normal file
138
0009-linux-user-Add-support-for-btrfs-ioctls-used-to-scru.patch
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
From: Filip Bozuta <Filip.Bozuta@syrmia.com>
|
||||||
|
Date: Thu, 3 Sep 2020 01:27:01 +0200
|
||||||
|
Subject: [PATCH] linux-user: Add support for btrfs ioctls used to scrub a
|
||||||
|
filesystem
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This patch implements functionality for following ioctls:
|
||||||
|
|
||||||
|
BTRFS_IOC_SCRUB - Starting a btrfs filesystem scrub
|
||||||
|
|
||||||
|
Start a btrfs filesystem scrub. The third ioctls argument
|
||||||
|
is a pointer to a following type:
|
||||||
|
|
||||||
|
struct btrfs_ioctl_scrub_args {
|
||||||
|
__u64 devid; /* in */
|
||||||
|
__u64 start; /* in */
|
||||||
|
__u64 end; /* in */
|
||||||
|
__u64 flags; /* in */
|
||||||
|
struct btrfs_scrub_progress progress; /* out */
|
||||||
|
/* pad to 1k */
|
||||||
|
__u64 unused[(1024-32-sizeof(struct btrfs_scrub_progress))/8];
|
||||||
|
};
|
||||||
|
|
||||||
|
Before calling this ioctl, field 'devid' should be filled
|
||||||
|
with value that represents the device id of the btrfs filesystem
|
||||||
|
for which the scrub is to be started.
|
||||||
|
|
||||||
|
BTRFS_IOC_SCRUB_CANCEL - Canceling scrub of a btrfs filesystem
|
||||||
|
|
||||||
|
Cancel a btrfs filesystem scrub if it is running. The third
|
||||||
|
ioctls argument is ignored.
|
||||||
|
|
||||||
|
BTRFS_IOC_SCRUB_PROGRESS - Getting status of a running scrub
|
||||||
|
|
||||||
|
Read the status of a running btrfs filesystem scrub. The third
|
||||||
|
ioctls argument is a pointer to the above mentioned
|
||||||
|
'struct btrfs_ioctl_scrub_args'. Similarly as with 'BTRFS_IOC_SCRUB',
|
||||||
|
the 'devid' field should be filled with value that represents the
|
||||||
|
id of the btrfs device for which the scrub has started. The status
|
||||||
|
of a running scrub is returned in the field 'progress' which is
|
||||||
|
of type 'struct btrfs_scrub_progress' and its definition can be
|
||||||
|
found at:
|
||||||
|
https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/btrfs.h#L150
|
||||||
|
|
||||||
|
Implementation nots:
|
||||||
|
|
||||||
|
Ioctls in this patch use type 'struct btrfs_ioctl_scrub_args' as their
|
||||||
|
third argument. That is the reason why an aproppriate thunk type
|
||||||
|
definition is 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-9-Filip.Bozuta@syrmia.com>
|
||||||
|
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
|
||||||
|
---
|
||||||
|
linux-user/ioctls.h | 11 +++++++++++
|
||||||
|
linux-user/syscall_defs.h | 3 +++
|
||||||
|
linux-user/syscall_types.h | 29 +++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 43 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
|
||||||
|
index 882bfb3e88..e3bfe78774 100644
|
||||||
|
--- a/linux-user/ioctls.h
|
||||||
|
+++ b/linux-user/ioctls.h
|
||||||
|
@@ -215,6 +215,17 @@
|
||||||
|
#ifdef BTRFS_IOC_SUBVOL_SETFLAGS
|
||||||
|
IOCTL(BTRFS_IOC_SUBVOL_SETFLAGS, IOC_W, MK_PTR(TYPE_ULONGLONG))
|
||||||
|
#endif
|
||||||
|
+#ifdef BTRFS_IOC_SCRUB
|
||||||
|
+ IOCTL(BTRFS_IOC_SCRUB, IOC_RW,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_scrub_args)))
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_SCRUB_CANCEL
|
||||||
|
+ IOCTL(BTRFS_IOC_SCRUB_CANCEL, 0, TYPE_NULL)
|
||||||
|
+#endif
|
||||||
|
+#ifdef BTRFS_IOC_SCRUB_PROGRESS
|
||||||
|
+ IOCTL(BTRFS_IOC_SCRUB_PROGRESS, IOC_RW,
|
||||||
|
+ MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_scrub_args)))
|
||||||
|
+#endif
|
||||||
|
#ifdef BTRFS_IOC_DEV_INFO
|
||||||
|
IOCTL(BTRFS_IOC_DEV_INFO, IOC_RW,
|
||||||
|
MK_PTR(MK_STRUCT(STRUCT_btrfs_ioctl_dev_info_args)))
|
||||||
|
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
|
||||||
|
index 10a7f91016..969377d622 100644
|
||||||
|
--- a/linux-user/syscall_defs.h
|
||||||
|
+++ b/linux-user/syscall_defs.h
|
||||||
|
@@ -982,6 +982,9 @@ struct target_rtc_pll_info {
|
||||||
|
abi_ullong)
|
||||||
|
#define TARGET_BTRFS_IOC_SUBVOL_SETFLAGS TARGET_IOW(BTRFS_IOCTL_MAGIC, 26,\
|
||||||
|
abi_ullong)
|
||||||
|
+#define TARGET_BTRFS_IOC_SCRUB TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 27)
|
||||||
|
+#define TARGET_BTRFS_IOC_SCRUB_CANCEL TARGET_IO(BTRFS_IOCTL_MAGIC, 28)
|
||||||
|
+#define TARGET_BTRFS_IOC_SCRUB_PROGRESS TARGET_IOWRU(BTRFS_IOCTL_MAGIC, 29)
|
||||||
|
#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)
|
||||||
|
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
|
||||||
|
index d9b7106a69..789723cfb9 100644
|
||||||
|
--- a/linux-user/syscall_types.h
|
||||||
|
+++ b/linux-user/syscall_types.h
|
||||||
|
@@ -421,6 +421,35 @@ STRUCT(btrfs_ioctl_ino_lookup_user_args,
|
||||||
|
MK_ARRAY(TYPE_CHAR, BTRFS_INO_LOOKUP_USER_PATH_MAX)) /* path */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#if defined(BTRFS_IOC_SCRUB) || defined(BTRFS_IOC_SCRUB_PROGRESS)
|
||||||
|
+STRUCT(btrfs_scrub_progress,
|
||||||
|
+ TYPE_ULONGLONG, /* data_extents_scrubbed */
|
||||||
|
+ TYPE_ULONGLONG, /* tree_extents_scrubbed */
|
||||||
|
+ TYPE_ULONGLONG, /* data_bytes_scrubbed */
|
||||||
|
+ TYPE_ULONGLONG, /* tree_bytes_scrubbed */
|
||||||
|
+ TYPE_ULONGLONG, /* read_errors */
|
||||||
|
+ TYPE_ULONGLONG, /* csum_errors */
|
||||||
|
+ TYPE_ULONGLONG, /* verify_errors */
|
||||||
|
+ TYPE_ULONGLONG, /* no_csum */
|
||||||
|
+ TYPE_ULONGLONG, /* csum_discards */
|
||||||
|
+ TYPE_ULONGLONG, /* super_errors */
|
||||||
|
+ TYPE_ULONGLONG, /* malloc_errors */
|
||||||
|
+ TYPE_ULONGLONG, /* uncorrectable_errors */
|
||||||
|
+ TYPE_ULONGLONG, /* corrected_er */
|
||||||
|
+ TYPE_ULONGLONG, /* last_physical */
|
||||||
|
+ TYPE_ULONGLONG) /* unverified_errors */
|
||||||
|
+
|
||||||
|
+STRUCT(btrfs_ioctl_scrub_args,
|
||||||
|
+ TYPE_ULONGLONG, /* devid */
|
||||||
|
+ TYPE_ULONGLONG, /* start */
|
||||||
|
+ TYPE_ULONGLONG, /* end */
|
||||||
|
+ TYPE_ULONGLONG, /* flags */
|
||||||
|
+ MK_STRUCT(STRUCT_btrfs_scrub_progress), /* progress */
|
||||||
|
+ MK_ARRAY(TYPE_ULONGLONG,
|
||||||
|
+ (1024 - 32 -
|
||||||
|
+ sizeof(struct btrfs_scrub_progress)) / 8)) /* unused */
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifdef BTRFS_IOC_DEV_INFO
|
||||||
|
STRUCT(btrfs_ioctl_dev_info_args,
|
||||||
|
TYPE_ULONGLONG, /* devid */
|
35
0101-virtiofsd-drop-CAP_DAC_READ_SEARCH.patch
Normal file
35
0101-virtiofsd-drop-CAP_DAC_READ_SEARCH.patch
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
Date: Mon, 27 Jul 2020 20:02:21 +0100
|
||||||
|
Subject: [PATCH] virtiofsd: drop CAP_DAC_READ_SEARCH
|
||||||
|
|
||||||
|
virtiofsd does not need CAP_DAC_READ_SEARCH because it already has
|
||||||
|
the more powerful CAP_DAC_OVERRIDE. Drop it from the list of
|
||||||
|
capabilities.
|
||||||
|
|
||||||
|
This is important because container runtimes may not include
|
||||||
|
CAP_DAC_READ_SEARCH by default. This patch allows virtiofsd to reduce
|
||||||
|
its capabilities when running inside a Docker container.
|
||||||
|
|
||||||
|
Note that CAP_DAC_READ_SEARCH may be necessary again in the future if
|
||||||
|
virtiofsd starts using open_by_handle_at(2).
|
||||||
|
|
||||||
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||||
|
Message-Id: <20200727190223.422280-2-stefanha@redhat.com>
|
||||||
|
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||||
|
---
|
||||||
|
tools/virtiofsd/passthrough_ll.c | 1 -
|
||||||
|
1 file changed, 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/tools/virtiofsd/passthrough_ll.c b/tools/virtiofsd/passthrough_ll.c
|
||||||
|
index 94e0de2d2b..50a164a599 100644
|
||||||
|
--- a/tools/virtiofsd/passthrough_ll.c
|
||||||
|
+++ b/tools/virtiofsd/passthrough_ll.c
|
||||||
|
@@ -2596,7 +2596,6 @@ static void setup_capabilities(char *modcaps_in)
|
||||||
|
if (capng_updatev(CAPNG_ADD, CAPNG_PERMITTED | CAPNG_EFFECTIVE,
|
||||||
|
CAP_CHOWN,
|
||||||
|
CAP_DAC_OVERRIDE,
|
||||||
|
- CAP_DAC_READ_SEARCH,
|
||||||
|
CAP_FOWNER,
|
||||||
|
CAP_FSETID,
|
||||||
|
CAP_SETGID,
|
118
0102-virtiofsd-avoid-proc-self-fd-tempdir.patch
Normal file
118
0102-virtiofsd-avoid-proc-self-fd-tempdir.patch
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
Date: Tue, 6 Oct 2020 10:58:26 +0100
|
||||||
|
Subject: [PATCH] virtiofsd: avoid /proc/self/fd tempdir
|
||||||
|
|
||||||
|
In order to prevent /proc/self/fd escapes a temporary directory is
|
||||||
|
created where /proc/self/fd is bind-mounted. This doesn't work on
|
||||||
|
read-only file systems.
|
||||||
|
|
||||||
|
Avoid the temporary directory by bind-mounting /proc/self/fd over /proc.
|
||||||
|
This does not affect other processes since we remounted / with MS_REC |
|
||||||
|
MS_SLAVE. /proc must exist and virtiofsd does not use it so it's safe to
|
||||||
|
do this.
|
||||||
|
|
||||||
|
Path traversal can be tested with the following function:
|
||||||
|
|
||||||
|
static void test_proc_fd_escape(struct lo_data *lo)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
int level = 0;
|
||||||
|
ino_t last_ino = 0;
|
||||||
|
|
||||||
|
fd = lo->proc_self_fd;
|
||||||
|
for (;;) {
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (fstat(fd, &st) != 0) {
|
||||||
|
perror("fstat");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (last_ino && st.st_ino == last_ino) {
|
||||||
|
fprintf(stderr, "inode number unchanged, stopping\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
last_ino = st.st_ino;
|
||||||
|
|
||||||
|
fprintf(stderr, "Level %d dev %lu ino %lu\n", level,
|
||||||
|
(unsigned long)st.st_dev,
|
||||||
|
(unsigned long)last_ino);
|
||||||
|
fd = openat(fd, "..", O_PATH | O_DIRECTORY | O_NOFOLLOW);
|
||||||
|
level++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Before and after this patch only Level 0 is displayed. Without
|
||||||
|
/proc/self/fd bind-mount protection it is possible to traverse parent
|
||||||
|
directories.
|
||||||
|
|
||||||
|
Fixes: 397ae982f4df4 ("virtiofsd: jail lo->proc_self_fd")
|
||||||
|
Cc: Miklos Szeredi <mszeredi@redhat.com>
|
||||||
|
Cc: Jens Freimann <jfreimann@redhat.com>
|
||||||
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
|
Message-Id: <20201006095826.59813-1-stefanha@redhat.com>
|
||||||
|
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||||
|
Tested-by: Jens Freimann <jfreimann@redhat.com>
|
||||||
|
Reviewed-by: Jens Freimann <jfreimann@redhat.com>
|
||||||
|
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||||
|
---
|
||||||
|
tools/virtiofsd/passthrough_ll.c | 34 +++++++++++---------------------
|
||||||
|
1 file changed, 11 insertions(+), 23 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tools/virtiofsd/passthrough_ll.c b/tools/virtiofsd/passthrough_ll.c
|
||||||
|
index 50a164a599..b865dc564b 100644
|
||||||
|
--- a/tools/virtiofsd/passthrough_ll.c
|
||||||
|
+++ b/tools/virtiofsd/passthrough_ll.c
|
||||||
|
@@ -2386,8 +2386,6 @@ static void setup_wait_parent_capabilities(void)
|
||||||
|
static void setup_namespaces(struct lo_data *lo, struct fuse_session *se)
|
||||||
|
{
|
||||||
|
pid_t child;
|
||||||
|
- char template[] = "virtiofsd-XXXXXX";
|
||||||
|
- char *tmpdir;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a new pid namespace for *child* processes. We'll have to
|
||||||
|
@@ -2451,33 +2449,23 @@ static void setup_namespaces(struct lo_data *lo, struct fuse_session *se)
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
- tmpdir = mkdtemp(template);
|
||||||
|
- if (!tmpdir) {
|
||||||
|
- fuse_log(FUSE_LOG_ERR, "tmpdir(%s): %m\n", template);
|
||||||
|
- exit(1);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (mount("/proc/self/fd", tmpdir, NULL, MS_BIND, NULL) < 0) {
|
||||||
|
- fuse_log(FUSE_LOG_ERR, "mount(/proc/self/fd, %s, MS_BIND): %m\n",
|
||||||
|
- tmpdir);
|
||||||
|
+ /*
|
||||||
|
+ * We only need /proc/self/fd. Prevent ".." from accessing parent
|
||||||
|
+ * directories of /proc/self/fd by bind-mounting it over /proc. Since / was
|
||||||
|
+ * previously remounted with MS_REC | MS_SLAVE this mount change only
|
||||||
|
+ * affects our process.
|
||||||
|
+ */
|
||||||
|
+ if (mount("/proc/self/fd", "/proc", NULL, MS_BIND, NULL) < 0) {
|
||||||
|
+ fuse_log(FUSE_LOG_ERR, "mount(/proc/self/fd, MS_BIND): %m\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Now we can get our /proc/self/fd directory file descriptor */
|
||||||
|
- lo->proc_self_fd = open(tmpdir, O_PATH);
|
||||||
|
+ /* Get the /proc (actually /proc/self/fd, see above) file descriptor */
|
||||||
|
+ lo->proc_self_fd = open("/proc", O_PATH);
|
||||||
|
if (lo->proc_self_fd == -1) {
|
||||||
|
- fuse_log(FUSE_LOG_ERR, "open(%s, O_PATH): %m\n", tmpdir);
|
||||||
|
+ fuse_log(FUSE_LOG_ERR, "open(/proc, O_PATH): %m\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- if (umount2(tmpdir, MNT_DETACH) < 0) {
|
||||||
|
- fuse_log(FUSE_LOG_ERR, "umount2(%s, MNT_DETACH): %m\n", tmpdir);
|
||||||
|
- exit(1);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (rmdir(tmpdir) < 0) {
|
||||||
|
- fuse_log(FUSE_LOG_ERR, "rmdir(%s): %m\n", tmpdir);
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
141
0103-virtio-skip-legacy-support-check-on-machine-types-le.patch
Normal file
141
0103-virtio-skip-legacy-support-check-on-machine-types-le.patch
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
From: Stefano Garzarella <sgarzare@redhat.com>
|
||||||
|
Date: Mon, 21 Sep 2020 14:25:03 +0200
|
||||||
|
Subject: [PATCH] virtio: skip legacy support check on machine types less than
|
||||||
|
5.1
|
||||||
|
|
||||||
|
Commit 9b3a35ec82 ("virtio: verify that legacy support is not accidentally
|
||||||
|
on") added a check that returns an error if legacy support is on, but the
|
||||||
|
device does not support legacy.
|
||||||
|
|
||||||
|
Unfortunately some devices were wrongly declared legacy capable even if
|
||||||
|
they were not (e.g vhost-vsock).
|
||||||
|
|
||||||
|
To avoid migration issues, we add a virtio-device property
|
||||||
|
(x-disable-legacy-check) to skip the legacy error, printing a warning
|
||||||
|
instead, for machine types < 5.1.
|
||||||
|
|
||||||
|
Cc: qemu-stable@nongnu.org
|
||||||
|
Fixes: 9b3a35ec82 ("virtio: verify that legacy support is not accidentally on")
|
||||||
|
Suggested-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
||||||
|
Suggested-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||||
|
Message-Id: <20200921122506.82515-2-sgarzare@redhat.com>
|
||||||
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
(cherry picked from commit d55f518248f263bb8d0852f98e47102ea09d4f89)
|
||||||
|
---
|
||||||
|
hw/core/machine.c | 1 +
|
||||||
|
hw/s390x/virtio-ccw.c | 15 ++++++++++++---
|
||||||
|
hw/virtio/virtio-pci.c | 14 ++++++++++++--
|
||||||
|
hw/virtio/virtio.c | 7 +++++++
|
||||||
|
include/hw/virtio/virtio.h | 2 ++
|
||||||
|
5 files changed, 34 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||||
|
index 8d1a90c6cf..0af18af593 100644
|
||||||
|
--- a/hw/core/machine.c
|
||||||
|
+++ b/hw/core/machine.c
|
||||||
|
@@ -35,6 +35,7 @@ GlobalProperty hw_compat_5_0[] = {
|
||||||
|
{ "vmport", "x-signal-unsupported-cmd", "off" },
|
||||||
|
{ "vmport", "x-report-vmx-type", "off" },
|
||||||
|
{ "vmport", "x-cmds-v2", "off" },
|
||||||
|
+ { "virtio-device", "x-disable-legacy-check", "true" },
|
||||||
|
};
|
||||||
|
const size_t hw_compat_5_0_len = G_N_ELEMENTS(hw_compat_5_0);
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
|
||||||
|
index 0e60270297..3dfc93d4f6 100644
|
||||||
|
--- a/hw/s390x/virtio-ccw.c
|
||||||
|
+++ b/hw/s390x/virtio-ccw.c
|
||||||
|
@@ -1122,9 +1122,18 @@ static void virtio_ccw_device_plugged(DeviceState *d, Error **errp)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!virtio_ccw_rev_max(dev) && !virtio_legacy_allowed(vdev)) {
|
||||||
|
- error_setg(errp, "Invalid value of property max_rev "
|
||||||
|
- "(is %d expected >= 1)", virtio_ccw_rev_max(dev));
|
||||||
|
- return;
|
||||||
|
+ /*
|
||||||
|
+ * To avoid migration issues, we allow legacy mode when legacy
|
||||||
|
+ * check is disabled in the old machine types (< 5.1).
|
||||||
|
+ */
|
||||||
|
+ if (virtio_legacy_check_disabled(vdev)) {
|
||||||
|
+ warn_report("device requires revision >= 1, but for backward "
|
||||||
|
+ "compatibility max_revision=0 is allowed");
|
||||||
|
+ } else {
|
||||||
|
+ error_setg(errp, "Invalid value of property max_rev "
|
||||||
|
+ "(is %d expected >= 1)", virtio_ccw_rev_max(dev));
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virtio_get_num_queues(vdev) > VIRTIO_QUEUE_MAX) {
|
||||||
|
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
|
||||||
|
index ccdf54e81c..4211565f2c 100644
|
||||||
|
--- a/hw/virtio/virtio-pci.c
|
||||||
|
+++ b/hw/virtio/virtio-pci.c
|
||||||
|
@@ -1596,8 +1596,18 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
|
||||||
|
|
||||||
|
if (legacy) {
|
||||||
|
if (!virtio_legacy_allowed(vdev)) {
|
||||||
|
- error_setg(errp, "device is modern-only, use disable-legacy=on");
|
||||||
|
- return;
|
||||||
|
+ /*
|
||||||
|
+ * To avoid migration issues, we allow legacy mode when legacy
|
||||||
|
+ * check is disabled in the old machine types (< 5.1).
|
||||||
|
+ */
|
||||||
|
+ if (virtio_legacy_check_disabled(vdev)) {
|
||||||
|
+ warn_report("device is modern-only, but for backward "
|
||||||
|
+ "compatibility legacy is allowed");
|
||||||
|
+ } else {
|
||||||
|
+ error_setg(errp,
|
||||||
|
+ "device is modern-only, use disable-legacy=on");
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
if (virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM)) {
|
||||||
|
error_setg(errp, "VIRTIO_F_IOMMU_PLATFORM was supported by"
|
||||||
|
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
|
||||||
|
index e983025217..b85277da67 100644
|
||||||
|
--- a/hw/virtio/virtio.c
|
||||||
|
+++ b/hw/virtio/virtio.c
|
||||||
|
@@ -3304,6 +3304,11 @@ bool virtio_legacy_allowed(VirtIODevice *vdev)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+bool virtio_legacy_check_disabled(VirtIODevice *vdev)
|
||||||
|
+{
|
||||||
|
+ return vdev->disable_legacy_check;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
hwaddr virtio_queue_get_desc_addr(VirtIODevice *vdev, int n)
|
||||||
|
{
|
||||||
|
return vdev->vq[n].vring.desc;
|
||||||
|
@@ -3713,6 +3718,8 @@ static Property virtio_properties[] = {
|
||||||
|
DEFINE_VIRTIO_COMMON_FEATURES(VirtIODevice, host_features),
|
||||||
|
DEFINE_PROP_BOOL("use-started", VirtIODevice, use_started, true),
|
||||||
|
DEFINE_PROP_BOOL("use-disabled-flag", VirtIODevice, use_disabled_flag, true),
|
||||||
|
+ DEFINE_PROP_BOOL("x-disable-legacy-check", VirtIODevice,
|
||||||
|
+ disable_legacy_check, false),
|
||||||
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
|
||||||
|
index e424df12cf..c50f5a9dfe 100644
|
||||||
|
--- a/include/hw/virtio/virtio.h
|
||||||
|
+++ b/include/hw/virtio/virtio.h
|
||||||
|
@@ -105,6 +105,7 @@ struct VirtIODevice
|
||||||
|
bool use_started;
|
||||||
|
bool started;
|
||||||
|
bool start_on_kick; /* when virtio 1.0 feature has not been negotiated */
|
||||||
|
+ bool disable_legacy_check;
|
||||||
|
VMChangeStateEntry *vmstate;
|
||||||
|
char *bus_name;
|
||||||
|
uint8_t device_endian;
|
||||||
|
@@ -398,5 +399,6 @@ static inline bool virtio_device_disabled(VirtIODevice *vdev)
|
||||||
|
}
|
||||||
|
|
||||||
|
bool virtio_legacy_allowed(VirtIODevice *vdev);
|
||||||
|
+bool virtio_legacy_check_disabled(VirtIODevice *vdev);
|
||||||
|
|
||||||
|
#endif
|
71
0104-vhost-vsock-pci-force-virtio-version-1.patch
Normal file
71
0104-vhost-vsock-pci-force-virtio-version-1.patch
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
From: Stefano Garzarella <sgarzare@redhat.com>
|
||||||
|
Date: Mon, 21 Sep 2020 14:25:04 +0200
|
||||||
|
Subject: [PATCH] vhost-vsock-pci: force virtio version 1
|
||||||
|
|
||||||
|
Commit 9b3a35ec82 ("virtio: verify that legacy support is not
|
||||||
|
accidentally on") added a safety check that requires to set
|
||||||
|
'disable-legacy=on' on vhost-vsock-pci device:
|
||||||
|
|
||||||
|
$ ./qemu-system-x86_64 ... -device vhost-vsock-pci,guest-cid=5
|
||||||
|
qemu-system-x86_64: -device vhost-vsock-pci,guest-cid=5:
|
||||||
|
device is modern-only, use disable-legacy=on
|
||||||
|
|
||||||
|
virtio-vsock was introduced after the release of VIRTIO 1.0
|
||||||
|
specifications, so it should be 'modern-only'.
|
||||||
|
In addition Cornelia verified that forcing a legacy mode on
|
||||||
|
vhost-vsock-pci device using x86-64 host and s390x guest, so with
|
||||||
|
different endianness, produces strange behaviours.
|
||||||
|
|
||||||
|
This patch forces virtio version 1 and removes the 'transitional_name'
|
||||||
|
property removing the need to specify 'disable-legacy=on' on
|
||||||
|
vhost-vsock-pci device.
|
||||||
|
|
||||||
|
To avoid migration issues, we force virtio version 1 only when
|
||||||
|
legacy check is enabled in the new machine types (>= 5.1).
|
||||||
|
|
||||||
|
As the transitional device name is not commonly used, we do not
|
||||||
|
provide compatibility handling for it.
|
||||||
|
|
||||||
|
Cc: qemu-stable@nongnu.org
|
||||||
|
Reported-by: Qian Cai <caiqian@redhat.com>
|
||||||
|
Reported-by: Qinghua Cheng <qcheng@redhat.com>
|
||||||
|
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1868449
|
||||||
|
Suggested-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||||
|
Message-Id: <20200921122506.82515-3-sgarzare@redhat.com>
|
||||||
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
(cherry picked from commit 6209070503989cf4f28549f228989419d4f0b236)
|
||||||
|
---
|
||||||
|
hw/virtio/vhost-vsock-pci.c | 10 +++++++++-
|
||||||
|
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/hw/virtio/vhost-vsock-pci.c b/hw/virtio/vhost-vsock-pci.c
|
||||||
|
index a815278e69..f11a38292f 100644
|
||||||
|
--- a/hw/virtio/vhost-vsock-pci.c
|
||||||
|
+++ b/hw/virtio/vhost-vsock-pci.c
|
||||||
|
@@ -43,6 +43,15 @@ static void vhost_vsock_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
|
||||||
|
{
|
||||||
|
VHostVSockPCI *dev = VHOST_VSOCK_PCI(vpci_dev);
|
||||||
|
DeviceState *vdev = DEVICE(&dev->vdev);
|
||||||
|
+ VirtIODevice *virtio_dev = VIRTIO_DEVICE(vdev);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * To avoid migration issues, we force virtio version 1 only when
|
||||||
|
+ * legacy check is enabled in the new machine types (>= 5.1).
|
||||||
|
+ */
|
||||||
|
+ if (!virtio_legacy_check_disabled(virtio_dev)) {
|
||||||
|
+ virtio_pci_force_virtio_1(vpci_dev);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
qdev_realize(vdev, BUS(&vpci_dev->bus), errp);
|
||||||
|
}
|
||||||
|
@@ -72,7 +81,6 @@ static void vhost_vsock_pci_instance_init(Object *obj)
|
||||||
|
static const VirtioPCIDeviceTypeInfo vhost_vsock_pci_info = {
|
||||||
|
.base_name = TYPE_VHOST_VSOCK_PCI,
|
||||||
|
.generic_name = "vhost-vsock-pci",
|
||||||
|
- .transitional_name = "vhost-vsock-pci-transitional",
|
||||||
|
.non_transitional_name = "vhost-vsock-pci-non-transitional",
|
||||||
|
.instance_size = sizeof(VHostVSockPCI),
|
||||||
|
.instance_init = vhost_vsock_pci_instance_init,
|
55
0105-vhost-user-vsock-pci-force-virtio-version-1.patch
Normal file
55
0105-vhost-user-vsock-pci-force-virtio-version-1.patch
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
From: Stefano Garzarella <sgarzare@redhat.com>
|
||||||
|
Date: Mon, 21 Sep 2020 14:25:05 +0200
|
||||||
|
Subject: [PATCH] vhost-user-vsock-pci: force virtio version 1
|
||||||
|
|
||||||
|
Commit 9b3a35ec82 ("virtio: verify that legacy support is not
|
||||||
|
accidentally on") added a safety check that requires to set
|
||||||
|
'disable-legacy=on' on vhost-user-vsock-pci device:
|
||||||
|
|
||||||
|
$ ./qemu-system-x86_64 ... \
|
||||||
|
-chardev socket,id=char0,reconnect=0,path=/tmp/vhost4.socket \
|
||||||
|
-device vhost-user-vsock-pci,chardev=char0
|
||||||
|
qemu-system-x86_64: -device vhost-user-vsock-pci,chardev=char0:
|
||||||
|
device is modern-only, use disable-legacy=on
|
||||||
|
|
||||||
|
virtio-vsock was introduced after the release of VIRTIO 1.0
|
||||||
|
specifications, so it should be 'modern-only'.
|
||||||
|
|
||||||
|
This patch forces virtio version 1 and removes the 'transitional_name'
|
||||||
|
property, as done for vhost-vsock-pci, removing the need to specify
|
||||||
|
'disable-legacy=on' on vhost-user-vsock-pci device.
|
||||||
|
|
||||||
|
Cc: qemu-stable@nongnu.org
|
||||||
|
Suggested-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||||
|
Message-Id: <20200921122506.82515-4-sgarzare@redhat.com>
|
||||||
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
(cherry picked from commit 27eda699f59d430c33fc054a36a17251992e70dc)
|
||||||
|
---
|
||||||
|
hw/virtio/vhost-user-vsock-pci.c | 4 +++-
|
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/hw/virtio/vhost-user-vsock-pci.c b/hw/virtio/vhost-user-vsock-pci.c
|
||||||
|
index f4cf95873d..492df6418a 100644
|
||||||
|
--- a/hw/virtio/vhost-user-vsock-pci.c
|
||||||
|
+++ b/hw/virtio/vhost-user-vsock-pci.c
|
||||||
|
@@ -40,6 +40,9 @@ static void vhost_user_vsock_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
|
||||||
|
VHostUserVSockPCI *dev = VHOST_USER_VSOCK_PCI(vpci_dev);
|
||||||
|
DeviceState *vdev = DEVICE(&dev->vdev);
|
||||||
|
|
||||||
|
+ /* unlike vhost-vsock, we do not need to care about pre-5.1 compat */
|
||||||
|
+ virtio_pci_force_virtio_1(vpci_dev);
|
||||||
|
+
|
||||||
|
qdev_realize(vdev, BUS(&vpci_dev->bus), errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -68,7 +71,6 @@ static void vhost_user_vsock_pci_instance_init(Object *obj)
|
||||||
|
static const VirtioPCIDeviceTypeInfo vhost_user_vsock_pci_info = {
|
||||||
|
.base_name = TYPE_VHOST_USER_VSOCK_PCI,
|
||||||
|
.generic_name = "vhost-user-vsock-pci",
|
||||||
|
- .transitional_name = "vhost-user-vsock-pci-transitional",
|
||||||
|
.non_transitional_name = "vhost-user-vsock-pci-non-transitional",
|
||||||
|
.instance_size = sizeof(VHostUserVSockPCI),
|
||||||
|
.instance_init = vhost_user_vsock_pci_instance_init,
|
50
0106-vhost-vsock-ccw-force-virtio-version-1.patch
Normal file
50
0106-vhost-vsock-ccw-force-virtio-version-1.patch
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
From: Stefano Garzarella <sgarzare@redhat.com>
|
||||||
|
Date: Mon, 21 Sep 2020 14:25:06 +0200
|
||||||
|
Subject: [PATCH] vhost-vsock-ccw: force virtio version 1
|
||||||
|
|
||||||
|
virtio-vsock was introduced after the release of VIRTIO 1.0
|
||||||
|
specifications, so it should be 'modern-only'.
|
||||||
|
|
||||||
|
This patch forces virtio version 1 as done for vhost-vsock-pci.
|
||||||
|
|
||||||
|
To avoid migration issues, we force virtio version 1 only when
|
||||||
|
legacy check is enabled in the new machine types (>= 5.1).
|
||||||
|
|
||||||
|
Cc: qemu-stable@nongnu.org
|
||||||
|
Suggested-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
|
||||||
|
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||||
|
Message-Id: <20200921122506.82515-5-sgarzare@redhat.com>
|
||||||
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||||
|
(cherry picked from commit a6704a34cf02add13964149e0de6453ae62bd9db)
|
||||||
|
---
|
||||||
|
hw/s390x/vhost-vsock-ccw.c | 12 ++++++++++++
|
||||||
|
1 file changed, 12 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/hw/s390x/vhost-vsock-ccw.c b/hw/s390x/vhost-vsock-ccw.c
|
||||||
|
index 0822ecca89..246416a8f9 100644
|
||||||
|
--- a/hw/s390x/vhost-vsock-ccw.c
|
||||||
|
+++ b/hw/s390x/vhost-vsock-ccw.c
|
||||||
|
@@ -40,9 +40,21 @@ static void vhost_vsock_ccw_class_init(ObjectClass *klass, void *data)
|
||||||
|
static void vhost_vsock_ccw_instance_init(Object *obj)
|
||||||
|
{
|
||||||
|
VHostVSockCCWState *dev = VHOST_VSOCK_CCW(obj);
|
||||||
|
+ VirtioCcwDevice *ccw_dev = VIRTIO_CCW_DEVICE(obj);
|
||||||
|
+ VirtIODevice *virtio_dev;
|
||||||
|
|
||||||
|
virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
|
||||||
|
TYPE_VHOST_VSOCK);
|
||||||
|
+
|
||||||
|
+ virtio_dev = VIRTIO_DEVICE(&dev->vdev);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * To avoid migration issues, we force virtio version 1 only when
|
||||||
|
+ * legacy check is enabled in the new machine types (>= 5.1).
|
||||||
|
+ */
|
||||||
|
+ if (!virtio_legacy_check_disabled(virtio_dev)) {
|
||||||
|
+ ccw_dev->force_revision_1 = true;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
static const TypeInfo vhost_vsock_ccw_info = {
|
10
qemu-kvm.sh
10
qemu-kvm.sh
@ -1,10 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Libvirt introspects the binary using -M none. In that case, don't try
|
|
||||||
# to init KVM, which will fail and be noisy if the host has kvm disabled
|
|
||||||
opts="-machine accel=kvm"
|
|
||||||
if echo "$@" | grep -q " -M none "; then
|
|
||||||
opts=
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec /usr/bin/qemu-system-x86_64 $opts "$@"
|
|
15
qemu-pr-helper.service
Normal file
15
qemu-pr-helper.service
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Persistent Reservation Daemon for QEMU
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/tmp
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/libexec/qemu-pr-helper
|
||||||
|
PrivateTmp=yes
|
||||||
|
ProtectSystem=strict
|
||||||
|
ReadWritePaths=/var/run
|
||||||
|
RestrictAddressFamilies=AF_UNIX
|
||||||
|
Restart=always
|
||||||
|
RestartSec=0
|
||||||
|
|
||||||
|
[Install]
|
9
qemu-pr-helper.socket
Normal file
9
qemu-pr-helper.socket
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Persistent Reservation Daemon for QEMU
|
||||||
|
|
||||||
|
[Socket]
|
||||||
|
ListenStream=/run/qemu-pr-helper.sock
|
||||||
|
SocketMode=0600
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
2
sources
2
sources
@ -1 +1 @@
|
|||||||
SHA512 (qemu-5.2.0-rc4.tar.xz) = 47e918392609c34f904962e5759125485407ae52c273053729054300e10fc67fc7ed443c9af25d1d852a5f5c70eee125c703ce15d0e571068848f405de33db3b
|
SHA512 (qemu-5.1.0.tar.xz) = e213edb71d93d5167ddce7546220ecb7b52a7778586a4f476f65bd1e510c9cfc6d1876238a7b501d9cc3fd31cc2ae4b7fb9e753bc3f12cc17cd16dfce2a96ba3
|
||||||
|
Loading…
Reference in New Issue
Block a user