[Ocfs2-test-devel] [REPORT] splice_test.h: conflicting types for ‘splice' comes again

tristan.ye tristan.ye at oracle.com
Mon Apr 13 00:35:23 PDT 2009


On Mon, 2009-04-13 at 14:51 +0800, Coly Li wrote:
> 
> tristan.ye Wrote:
> > On Mon, 2009-04-13 at 02:21 +0800, Coly Li wrote:
> >> Several days passed since last time I observed the splice conflicted definition
> >> and submitted a patch[1]. Today I saw the same error again.
> >>
> >> This time, I pull the code up-to-date, run autogen.sh and make. The similar
> >> error comes:
> >> make -C splice
> >> make[2]: Entering directory `/root/ocfs2-test/programs/splice'
> >> gcc -O2 -Wall -g       -MD -MP -MF ./.splice_read.d -o splice_read.o -c
> >> splice_read.c
> >> In file included from splice_read.c:2:
> >> splice_test.h:34: error: conflicting types for ‘splice’
> >> /usr/include/bits/fcntl.h:244: error: previous declaration of ‘splice’ was here
> >> make[2]: *** [splice_read.o] Error 1
> >> make[2]: Leaving directory `/root/ocfs2-test/programs/splice'
> >> make[1]: *** [splice] Error 2
> >> make[1]: Leaving directory `/root/ocfs2-test/programs'
> >> make: *** [programs] Error 2
> >>
> >> I past the whole compile log on: http://nopaste.com/p/aRz7tukuc , will be
> >> available for several days.
> >>
> >> Can anybody reproduce the issue ?
> >>
> >> Thanks.
> >>
> > 
> > Coly, 
> > 
> > I remembered you passed the compilation last time without modifying the
> > src a bit, but just by a refresh 'autogen':)?
> > 
> Yes, but this time the refreshing does not work any more :(
> 
> > Such a compiling error may have something to do with your enviornment.
> > under my development env,  the splice() defined in bits/fcntl.h like
> > following,
> > 
> > /* Splice two files together.  */
> > extern int splice (int __fdin, __off64_t *__offin, int __fdout,
> >                    __off64_t *__offout, size_t __len, unsigned int
> > __flags)
> >     __THROW;
> > 
> > And in our ocfs2-test/splice/splice_test.h, such declaration as follows,
> > int splice(int fdin, loff_t *off_in, int fdout,
> >                          loff_t *off_out, size_t len, unsigned int
> > flags)
> > 
> > We saw the only thing could potentially casue the conflicting type error
> > is the difference between 'loff_t' and '__off64_t', in my testing env,
> > such two data type were perfectly the same as we can prove this by
> > observing file bits/types.h:
> > 
> > typedef __off64_t __loff_t;     /* Type of file sizes and offsets (LFS).
> > */
> > 
> > And that's also why most of us will not likely to hit such error!
> > 
> > Would you please paste the corresponding codes as described above from
> > bits/fcntl.h and bits/types.h to see what's happening in your testing
> > env? not sure why loff_t and __off64_t were different in your env.
> > 
> 
> On openSuSE 11.1 (almost same to SLES11) the splice in bits/fcntl.h is:
> /* Splice two files together.  */
> extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
>                        __off64_t *__offout, size_t __len,
>                        unsigned int __flags);
> 
> And the bits/types.h is:
> /* These few don't really vary by system, they always correspond
>    to one of the other defined types.  */
> typedef __off64_t __loff_t;     /* Type of file sizes and offsets (LFS).  */
> 
> The conflict is on the return value of splice() in bits/fcntl.h, which is int
> VS. ssize_t.

It's interesting, the return value of splice from bits/fcntl.h was 'int'
instead of ssize_t, that mean I will hit type conflicting error when
applying your patch this time:-), things are going to run into a loop..

The best solution for us anyway is to explicitly use splice() defined in
splice_test.h by force(I thought that's also the intention of original
author) regardless of glibc's splice().

That means we can use a different name such as my_splice() from glibc
one.

How do you think about it?


Regards,
Tristan

> 
> On 32bit system, ssize_t is identical to int, on my 64bit openSuSE 11.1, ssize_t
> is defined to long int. And from the splice(2) man page, the return value should
> be 'long' other than 'int'. This might be how type conflict comes.
> 
> 
> > I guess it's safe to use 'loff_t' in original splice_test.h without any
> > patch needed:)
> 
> Such a patch fixes the compiling error:
> 
>  programs/splice/splice_test.h |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/programs/splice/splice_test.h b/programs/splice/splice_test.h
> index 5113bbb..daf02a5 100644
> --- a/programs/splice/splice_test.h
> +++ b/programs/splice/splice_test.h
> @@ -31,7 +31,7 @@
>  #error unsupported arch
>  #endif
> 
> -int splice(int fdin, loff_t *off_in, int fdout,
> +ssize_t splice(int fdin, loff_t *off_in, int fdout,
>                          loff_t *off_out, size_t len, unsigned int flags)
>  {
>         return syscall(__NR_splice, fdin, off_in, fdout, off_out, len, flags);
> 
> (This is just a copy+past, I will post a real patch later)
> 
> 
> Thanks for your kindly feedback :)
> 




More information about the Ocfs2-test-devel mailing list