From: "Guo Ren (Alibaba DAMO Academy)" <[email protected]>

RV64ILP32 ABI systems have BITS_PER_LONG set to 32, matching
sizeof(compat_ulong_t). Adjust code involving compat_ulong_t
accordingly.

Signed-off-by: Guo Ren (Alibaba DAMO Academy) <[email protected]>
---
 include/uapi/linux/auto_fs.h |  6 ++++++
 kernel/compat.c              | 15 ++++++++++++---
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/include/uapi/linux/auto_fs.h b/include/uapi/linux/auto_fs.h
index 8081df849743..7d925ee810b6 100644
--- a/include/uapi/linux/auto_fs.h
+++ b/include/uapi/linux/auto_fs.h
@@ -80,9 +80,15 @@ enum {
 #define AUTOFS_IOC_SETTIMEOUT32 _IOWR(AUTOFS_IOCTL, \
                                      AUTOFS_IOC_SETTIMEOUT_CMD, \
                                      compat_ulong_t)
+#if __riscv_xlen == 64
+#define AUTOFS_IOC_SETTIMEOUT   _IOWR(AUTOFS_IOCTL, \
+                                     AUTOFS_IOC_SETTIMEOUT_CMD, \
+                                     unsigned long long)
+#else
 #define AUTOFS_IOC_SETTIMEOUT   _IOWR(AUTOFS_IOCTL, \
                                      AUTOFS_IOC_SETTIMEOUT_CMD, \
                                      unsigned long)
+#endif
 #define AUTOFS_IOC_EXPIRE       _IOR(AUTOFS_IOCTL, \
                                     AUTOFS_IOC_EXPIRE_CMD, \
                                     struct autofs_packet_expire)
diff --git a/kernel/compat.c b/kernel/compat.c
index fb50f29d9b36..46ffdc5e7cc4 100644
--- a/kernel/compat.c
+++ b/kernel/compat.c
@@ -203,11 +203,17 @@ long compat_get_bitmap(unsigned long *mask, const 
compat_ulong_t __user *umask,
                return -EFAULT;
 
        while (nr_compat_longs > 1) {
-               compat_ulong_t l1, l2;
+               compat_ulong_t l1;
                unsafe_get_user(l1, umask++, Efault);
+               nr_compat_longs -= 1;
+#if BITS_PER_LONG == 64
+               compat_ulong_t l2;
                unsafe_get_user(l2, umask++, Efault);
                *mask++ = ((unsigned long)l2 << BITS_PER_COMPAT_LONG) | l1;
-               nr_compat_longs -= 2;
+               nr_compat_longs -= 1;
+#else
+               *mask++ = l1;
+#endif
        }
        if (nr_compat_longs)
                unsafe_get_user(*mask, umask++, Efault);
@@ -234,8 +240,11 @@ long compat_put_bitmap(compat_ulong_t __user *umask, 
unsigned long *mask,
        while (nr_compat_longs > 1) {
                unsigned long m = *mask++;
                unsafe_put_user((compat_ulong_t)m, umask++, Efault);
+               nr_compat_longs -= 1;
+#if BITS_PER_LONG == 64
                unsafe_put_user(m >> BITS_PER_COMPAT_LONG, umask++, Efault);
-               nr_compat_longs -= 2;
+               nr_compat_longs -= 1;
+#endif
        }
        if (nr_compat_longs)
                unsafe_put_user((compat_ulong_t)*mask, umask++, Efault);
-- 
2.40.1


Reply via email to