[PATCH] Generic compat_sys_fallocate - Kernel

This is a discussion on [PATCH] Generic compat_sys_fallocate - Kernel ; Basically everyone is using the same sys32_fallocate. Delete a whole bunch of archdep code and move the compat wrapper to fs/compat.c Signed-off-by: Kyle McMartin --- NOTE: Patch hunk in scall64-o32.S depends on a patch going in through Ralf's linux-mips tree. ...

+ Reply to Thread
Results 1 to 4 of 4

Thread: [PATCH] Generic compat_sys_fallocate

  1. [PATCH] Generic compat_sys_fallocate

    Basically everyone is using the same sys32_fallocate. Delete a whole bunch of
    archdep code and move the compat wrapper to fs/compat.c

    Signed-off-by: Kyle McMartin
    ---

    NOTE: Patch hunk in scall64-o32.S depends on a patch going in through
    Ralf's linux-mips tree.

    ---
    arch/mips/kernel/linux32.c | 7 -------
    arch/mips/kernel/scall64-o32.S | 2 +-
    arch/powerpc/kernel/sys_ppc32.c | 7 -------
    arch/sparc64/kernel/sys_sparc32.c | 6 ------
    arch/x86_64/ia32/ia32entry.S | 2 +-
    arch/x86_64/ia32/sys_ia32.c | 7 -------
    fs/compat.c | 10 ++++++++++
    include/linux/compat.h | 2 ++
    8 files changed, 14 insertions(+), 29 deletions(-)

    diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c
    index 135d9a5..c37568d 100644
    --- a/arch/mips/kernel/linux32.c
    +++ b/arch/mips/kernel/linux32.c
    @@ -566,13 +566,6 @@ asmlinkage long sys32_fadvise64_64(int fd, int __pad,
    flags);
    }

    -asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_a2,
    - unsigned offset_a3, unsigned len_a4, unsigned len_a5)
    -{
    - return sys_fallocate(fd, mode, merge_64(offset_a2, offset_a3),
    - merge_64(len_a4, len_a5));
    -}
    -
    save_static_function(sys32_clone);
    static int noinline __used
    _sys32_clone(nabi_no_regargs struct pt_regs regs)
    diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S
    index dd68afc..bb724cc 100644
    --- a/arch/mips/kernel/scall64-o32.S
    +++ b/arch/mips/kernel/scall64-o32.S
    @@ -525,5 +525,5 @@ sys_call_table:
    PTR compat_sys_signalfd
    PTR compat_sys_timerfd
    PTR sys_eventfd
    - PTR sys32_fallocate /* 4320 */
    + PTR compat_sys_fallocate /* 4320 */
    .size sys_call_table,.-sys_call_table
    diff --git a/arch/powerpc/kernel/sys_ppc32.c b/arch/powerpc/kernel/sys_ppc32.c
    index bd85b5f..b42cbf1 100644
    --- a/arch/powerpc/kernel/sys_ppc32.c
    +++ b/arch/powerpc/kernel/sys_ppc32.c
    @@ -773,13 +773,6 @@ asmlinkage int compat_sys_truncate64(const char __user * path, u32 reg4,
    return sys_truncate(path, (high << 32) | low);
    }

    -asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offhi, u32 offlo,
    - u32 lenhi, u32 lenlo)
    -{
    - return sys_fallocate(fd, mode, ((loff_t)offhi << 32) | offlo,
    - ((loff_t)lenhi << 32) | lenlo);
    -}
    -
    asmlinkage int compat_sys_ftruncate64(unsigned int fd, u32 reg4, unsigned long high,
    unsigned long low)
    {
    diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c
    index e8dce90..5d60883 100644
    --- a/arch/sparc64/kernel/sys_sparc32.c
    +++ b/arch/sparc64/kernel/sys_sparc32.c
    @@ -1028,9 +1028,3 @@ long compat_sync_file_range(int fd, unsigned long off_high, unsigned long off_lo
    flags);
    }

    -asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offhi, u32 offlo,
    - u32 lenhi, u32 lenlo)
    -{
    - return sys_fallocate(fd, mode, ((loff_t)offhi << 32) | offlo,
    - ((loff_t)lenhi << 32) | lenlo);
    -}
    diff --git a/arch/x86_64/ia32/ia32entry.S b/arch/x86_64/ia32/ia32entry.S
    index 18b2318..28d8fff 100644
    --- a/arch/x86_64/ia32/ia32entry.S
    +++ b/arch/x86_64/ia32/ia32entry.S
    @@ -732,5 +732,5 @@ ia32_sys_call_table:
    .quad compat_sys_signalfd
    .quad compat_sys_timerfd
    .quad sys_eventfd
    - .quad sys32_fallocate
    + .quad compat_sys_fallocate
    ia32_syscall_end:
    diff --git a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c
    index bee96d6..ca8deac 100644
    --- a/arch/x86_64/ia32/sys_ia32.c
    +++ b/arch/x86_64/ia32/sys_ia32.c
    @@ -880,10 +880,3 @@ asmlinkage long sys32_fadvise64(int fd, unsigned offset_lo, unsigned offset_hi,
    len, advice);
    }

    -asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_lo,
    - unsigned offset_hi, unsigned len_lo,
    - unsigned len_hi)
    -{
    - return sys_fallocate(fd, mode, ((u64)offset_hi << 32) | offset_lo,
    - ((u64)len_hi << 32) | len_lo);
    -}
    diff --git a/fs/compat.c b/fs/compat.c
    index 15078ce..2629a25 100644
    --- a/fs/compat.c
    +++ b/fs/compat.c
    @@ -2226,3 +2226,13 @@ asmlinkage long compat_sys_timerfd(int ufd, int clockid, int flags,
    }

    #endif /* CONFIG_TIMERFD */
    +
    +asmlinkage long compat_sys_fallocate(int fd, int mode,
    + u32 offset_lo, u32 offset_hi,
    + u32 len_lo, u32 len_hi)
    +{
    + u64 offset = ((u64)offset_hi << 32) | offset_lo;
    + u64 len = ((u64)len_hi << 32) | len_hi;
    +
    + return sys_fallocate(fd, mode, offset, len);
    +}
    diff --git a/include/linux/compat.h b/include/linux/compat.h
    index 0e69d2c..a770c6c 100644
    --- a/include/linux/compat.h
    +++ b/include/linux/compat.h
    @@ -266,6 +266,8 @@ asmlinkage long compat_sys_signalfd(int ufd,
    compat_size_t sigsetsize);
    asmlinkage long compat_sys_timerfd(int ufd, int clockid, int flags,
    const struct compat_itimerspec __user *utmr);
    +asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offset_lo,
    + u32 offset_hi, u32 len_lo, u32 len_hi);

    #endif /* CONFIG_COMPAT */
    #endif /* _LINUX_COMPAT_H */
    --
    1.5.3.2

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. Re: [PATCH] Generic compat_sys_fallocate

    On Sat, Sep 29, 2007 at 07:06:10AM +0200, Heiko Carstens wrote:
    >
    > These are not identical... the least and most significant parts seem to get
    > passed in a different way on little and big endian machines.
    > Maybe it would be worth to have something like compat_merge_64() which does
    > the right thing?
    >


    yeah, that's what i've just done.

    cheers,
    Kyle
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  3. Re: [PATCH] Generic compat_sys_fallocate

    On Fri, Sep 28, 2007 at 09:01:37PM +0200, Arnd Bergmann wrote:
    >
    > This code assumes little-endian register ordering for 64 bit
    > arguments. AFAICS, this is wrong at aleast on mipseb and powerpc.
    >


    Yeah, you're right. I've an idea for how to fix this, will update patch
    soon.

    Cheers,
    Kyle
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  4. Re: [PATCH] Generic compat_sys_fallocate

    On Fri, Sep 28, 2007 at 02:11:11PM -0400, Kyle McMartin wrote:
    > Basically everyone is using the same sys32_fallocate. Delete a whole bunch of
    > archdep code and move the compat wrapper to fs/compat.c
    >
    > Signed-off-by: Kyle McMartin
    > --- a/arch/sparc64/kernel/sys_sparc32.c
    > +++ b/arch/sparc64/kernel/sys_sparc32.c
    > @@ -1028,9 +1028,3 @@ long compat_sync_file_range(int fd, unsigned long off_high, unsigned long off_lo
    > flags);
    > }
    >
    > -asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offhi, u32 offlo,
    > - u32 lenhi, u32 lenlo)
    > -{
    > - return sys_fallocate(fd, mode, ((loff_t)offhi << 32) | offlo,
    > - ((loff_t)lenhi << 32) | lenlo);
    > -}
    > diff --git a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c
    > index bee96d6..ca8deac 100644
    > --- a/arch/x86_64/ia32/sys_ia32.c
    > +++ b/arch/x86_64/ia32/sys_ia32.c
    > @@ -880,10 +880,3 @@ asmlinkage long sys32_fadvise64(int fd, unsigned offset_lo, unsigned offset_hi,
    > len, advice);
    > }
    >
    > -asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_lo,
    > - unsigned offset_hi, unsigned len_lo,
    > - unsigned len_hi)
    > -{
    > - return sys_fallocate(fd, mode, ((u64)offset_hi << 32) | offset_lo,
    > - ((u64)len_hi << 32) | len_lo);
    > -}


    These are not identical... the least and most significant parts seem to get
    passed in a different way on little and big endian machines.
    Maybe it would be worth to have something like compat_merge_64() which does
    the right thing?
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

+ Reply to Thread