Hi Vineet!

Thanks for your remarks - I will fix my patches. Some comments below.

> > However these arguments in fallocate
> > wrapper in uClibc may have 32-bit types. In this case it's necessary
> > to pass two 32-bit words to the systemc call for every argument - an
> > actual argument and its sign extension.
> 
> No - this is not technically accurate. User space in theory can pass a true 
> 64 bit
> value, not just a 32 bit value and a 32 bit sign extension.

That is why 2 functions exist in uClibc: fallocate and fallocate64. If you want 
to pass a true 64-bit value on 32-bit machine you need to use fallocate64. In 
my comment I meant a case when fallocate (not fallocate64) is used on 32-bit 
machine. I will make it clearer in the next version of patch.

> > ---
> >  libc/sysdeps/linux/common/fallocate.c | 10 ++++------
> >  1 file changed, 4 insertions(+), 6 deletions(-)
> >
> > diff --git a/libc/sysdeps/linux/common/fallocate.c
> > b/libc/sysdeps/linux/common/fallocate.c
> > index b2309e9..446d9ef 100644
> > --- a/libc/sysdeps/linux/common/fallocate.c
> > +++ b/libc/sysdeps/linux/common/fallocate.c
> > @@ -21,14 +21,12 @@ int attribute_hidden __libc_fallocate(int fd, int
> mode, __off_t offset, __off_t
> >     int ret;
> >
> >  # if __WORDSIZE == 32
> > -   uint32_t off_low = offset;
> > -   uint32_t len_low = len;
> > -   /* may assert that these >>31 are 0 */
> > -   uint32_t zero = 0;
> > +   int32_t offset_sign_extension = (offset < 0) ? 0xFFFFFFFF : 0;
> > +   int32_t len_sign_extension = (len < 0) ? 0xFFFFFFFF : 0;
> >     INTERNAL_SYSCALL_DECL(err);
> >     ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, mode,
> > -           __LONG_LONG_PAIR (zero, off_low),
> > -           __LONG_LONG_PAIR (zero, len_low)));
> > +           __LONG_LONG_PAIR (offset_sign_extension, offset),
> > +           __LONG_LONG_PAIR (len_sign_extension, len)));
> 
> This is too ugly.  Can u use existing macro OFF64_HI_LO() macro.
> Something like below:
> 
> int64_t offset_ll = offset ; /* does appropriate sign extension */ int64_t 
> len_ll
> = len;
> 
> ret = (int) (INTERNAL_SYSCALL(fallocate, err, 6, fd, mode,
>             OFF64_HI_LO(offset_ll),
>             OFF64_HI_LO(len_ll));

I think it would be easier to call fallocate64 from fallocate:

int attribute_hidden __libc_fallocate(int fd, int mode, __off_t offset, __off_t 
len)
{
# if __WORDSIZE == 32
        return fallocate64(fd, mode, offset, len);
# elif __WORDSIZE == 64
        int ret;
        ...
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to