diff mbox

linux-user: Correct type for LOOP_GET_STATUS{, 64} ioctls

Message ID 1467732989-12028-1-git-send-email-peter.maydell@linaro.org (mailing list archive)
State New, archived
Headers show

Commit Message

Peter Maydell July 5, 2016, 3:36 p.m. UTC
The LOOP_GET_STATUS and LOOP_GET_STATUS64 ioctls were incorrectly
defined as IOC_W rather than IOC_R, which meant we weren't
correctly copying the information back from the kernel to the guest.
The loop_info64 structure definition was also missing a member
and using the wrong type for several 32-bit fields.

In particular, this meant that "kpartx -d image.img" didn't work
and "losetup -a" behaved strangely. Correct the ioctl type definitions.

Reported-by: Chanho Park <chanho61.park@samsung.com>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
This is intended to be applied on top of the other ioctl patches I've
sent out recently.

 linux-user/ioctls.h        | 4 ++--
 linux-user/syscall_types.h | 9 +++++----
 2 files changed, 7 insertions(+), 6 deletions(-)

Comments

Laurent Vivier July 5, 2016, 4:13 p.m. UTC | #1
Le 05/07/2016 à 17:36, Peter Maydell a écrit :
> The LOOP_GET_STATUS and LOOP_GET_STATUS64 ioctls were incorrectly
> defined as IOC_W rather than IOC_R, which meant we weren't
> correctly copying the information back from the kernel to the guest.
> The loop_info64 structure definition was also missing a member
> and using the wrong type for several 32-bit fields.
> 
> In particular, this meant that "kpartx -d image.img" didn't work
> and "losetup -a" behaved strangely. Correct the ioctl type definitions.
> 
> Reported-by: Chanho Park <chanho61.park@samsung.com>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Reviewed-by: Laurent Vivier <laurent@vivier.eu>

> ---
> This is intended to be applied on top of the other ioctl patches I've
> sent out recently.
> 
>  linux-user/ioctls.h        | 4 ++--
>  linux-user/syscall_types.h | 9 +++++----
>  2 files changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
> index 8978eb3..4b36baa 100644
> --- a/linux-user/ioctls.h
> +++ b/linux-user/ioctls.h
> @@ -351,9 +351,9 @@
>    IOCTL(LOOP_SET_FD, 0, TYPE_INT)
>    IOCTL(LOOP_CLR_FD, 0, TYPE_INT)
>    IOCTL(LOOP_SET_STATUS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info)))
> -  IOCTL(LOOP_GET_STATUS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info)))
> +  IOCTL(LOOP_GET_STATUS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_loop_info)))
>    IOCTL(LOOP_SET_STATUS64, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info64)))
> -  IOCTL(LOOP_GET_STATUS64, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info64)))
> +  IOCTL(LOOP_GET_STATUS64, IOC_R, MK_PTR(MK_STRUCT(STRUCT_loop_info64)))
>    IOCTL(LOOP_CHANGE_FD, 0, TYPE_INT)
>  
>    IOCTL(LOOP_CTL_ADD, 0, TYPE_INT)
> diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
> index 1fd4ee0..af79fbf 100644
> --- a/linux-user/syscall_types.h
> +++ b/linux-user/syscall_types.h
> @@ -103,10 +103,11 @@ STRUCT(loop_info64,
>         TYPE_ULONGLONG,           /* lo_inode */
>         TYPE_ULONGLONG,           /* lo_rdevice */
>         TYPE_ULONGLONG,           /* lo_offset */
> -       TYPE_ULONG,               /* lo_number */
> -       TYPE_ULONG,               /* lo_encrypt_type */
> -       TYPE_ULONG,               /* lo_encrypt_key_size */
> -       TYPE_ULONG,               /* lo_flags */
> +       TYPE_ULONGLONG,           /* lo_sizelimit */
> +       TYPE_INT,                 /* lo_number */
> +       TYPE_INT,                 /* lo_encrypt_type */
> +       TYPE_INT,                 /* lo_encrypt_key_size */
> +       TYPE_INT,                 /* lo_flags */
>         MK_ARRAY(TYPE_CHAR, 64),  /* lo_name */
>         MK_ARRAY(TYPE_CHAR, 64),  /* lo_crypt_name */
>         MK_ARRAY(TYPE_CHAR, 32),  /* lo_encrypt_key */
>
Chanho Park July 7, 2016, 6:27 a.m. UTC | #2
Hi Peter,

On Wednesday, July 6, 2016, Peter Maydell <peter.maydell@linaro.org> wrote:

> The LOOP_GET_STATUS and LOOP_GET_STATUS64 ioctls were incorrectly
> defined as IOC_W rather than IOC_R, which meant we weren't
> correctly copying the information back from the kernel to the guest.
> The loop_info64 structure definition was also missing a member
> and using the wrong type for several 32-bit fields.
>
> In particular, this meant that "kpartx -d image.img" didn't work
> and "losetup -a" behaved strangely. Correct the ioctl type definitions.
>
> Reported-by: Chanho Park <chanho61.park@samsung.com <javascript:;>>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org <javascript:;>>
> ---


It worked well for me.
Tested-by: Chanho Park <parkch98@gmail.com>


>
diff mbox

Patch

diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
index 8978eb3..4b36baa 100644
--- a/linux-user/ioctls.h
+++ b/linux-user/ioctls.h
@@ -351,9 +351,9 @@ 
   IOCTL(LOOP_SET_FD, 0, TYPE_INT)
   IOCTL(LOOP_CLR_FD, 0, TYPE_INT)
   IOCTL(LOOP_SET_STATUS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info)))
-  IOCTL(LOOP_GET_STATUS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info)))
+  IOCTL(LOOP_GET_STATUS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_loop_info)))
   IOCTL(LOOP_SET_STATUS64, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info64)))
-  IOCTL(LOOP_GET_STATUS64, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info64)))
+  IOCTL(LOOP_GET_STATUS64, IOC_R, MK_PTR(MK_STRUCT(STRUCT_loop_info64)))
   IOCTL(LOOP_CHANGE_FD, 0, TYPE_INT)
 
   IOCTL(LOOP_CTL_ADD, 0, TYPE_INT)
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
index 1fd4ee0..af79fbf 100644
--- a/linux-user/syscall_types.h
+++ b/linux-user/syscall_types.h
@@ -103,10 +103,11 @@  STRUCT(loop_info64,
        TYPE_ULONGLONG,           /* lo_inode */
        TYPE_ULONGLONG,           /* lo_rdevice */
        TYPE_ULONGLONG,           /* lo_offset */
-       TYPE_ULONG,               /* lo_number */
-       TYPE_ULONG,               /* lo_encrypt_type */
-       TYPE_ULONG,               /* lo_encrypt_key_size */
-       TYPE_ULONG,               /* lo_flags */
+       TYPE_ULONGLONG,           /* lo_sizelimit */
+       TYPE_INT,                 /* lo_number */
+       TYPE_INT,                 /* lo_encrypt_type */
+       TYPE_INT,                 /* lo_encrypt_key_size */
+       TYPE_INT,                 /* lo_flags */
        MK_ARRAY(TYPE_CHAR, 64),  /* lo_name */
        MK_ARRAY(TYPE_CHAR, 64),  /* lo_crypt_name */
        MK_ARRAY(TYPE_CHAR, 32),  /* lo_encrypt_key */