Message ID | 1467732989-12028-1-git-send-email-peter.maydell@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 */ >
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 --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 */
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(-)