On Tue, Nov 24, 2020 at 5:13 PM David Laight <david.lai...@aculab.com> wrote: > > From: Arnd Bergmann > > Sent: 24 November 2020 15:18 > > > > SIOCGIFMAP and SIOCSIFMAP currently require compat_alloc_user_space() > > and copy_in_user() for compat mode. > > > > Move the compat handling into the location where the structures are > > actually used, to avoid using those interfaces and get a clearer > > implementation. > > > > Signed-off-by: Arnd Bergmann <a...@arndb.de> > > --- > > changes in v3: > > - complete rewrite > ... > > include/linux/compat.h | 18 ++++++------ > > net/core/dev_ioctl.c | 64 +++++++++++++++++++++++++++++++++--------- > > net/socket.c | 39 ++----------------------- > > 3 files changed, 62 insertions(+), 59 deletions(-) > > > > diff --git a/include/linux/compat.h b/include/linux/compat.h > > index 08dbd34bb7a5..47496c5eb5eb 100644 > > --- a/include/linux/compat.h > > +++ b/include/linux/compat.h > > @@ -96,6 +96,15 @@ struct compat_iovec { > > compat_size_t iov_len; > > }; > > > > +struct compat_ifmap { > > + compat_ulong_t mem_start; > > + compat_ulong_t mem_end; > > + unsigned short base_addr; > > + unsigned char irq; > > + unsigned char dma; > > + unsigned char port; > > +}; > > Isn't the only difference the number of pad bytes at the end?
No, the main difference is in the first two fields, which are 'unsigned long' and therefore different. The three-byte padding is in fact the same on all architectures (including x86) that have a compat mode, though it might be different on m68k and arm-oabi, which have slightly special struct alignment rules. It could be done with two assignments and a memcpy, but I like the individual assignments better here. Arnd