diff mbox series

[1/2] lapi/fs: Include lapi/fcntl.h + define _GNU_SOURCE

Message ID 20240423132823.194179-2-pvorel@suse.cz
State Changes Requested
Headers show
Series Build fixes | expand

Commit Message

Petr Vorel April 23, 2024, 1:28 p.m. UTC
This fixes build error on musl (alpine):

In file included from unlink09.c:18:
../../../../include/lapi/fs.h:58:15: error: unknown type name 'loff_t'
   58 | static inline loff_t tst_max_lfs_filesize(void)

loff_t is defined in <fcntl.h> (but guarded _GNU_SOURCE), but just for
safety include lapi/fcntl.h in case lapi/fs.h is included in test which
needs fallback definitions from lapi/fs.h.

Because we require _GNU_SOURCE definition for code in lapi/fs.h, that's
why there is the definition in both unlink09.c (the actual fix) and
lapi/fs.h for visibility of the problem.

Fixes: 2cf78f47a ("unlink: Add error tests for EPERM and EROFS")
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
#define _GNU_SOURCE pain again. Would you solve it differently?

 include/lapi/fs.h                           | 5 ++++-
 testcases/kernel/syscalls/unlink/unlink09.c | 2 ++
 2 files changed, 6 insertions(+), 1 deletion(-)

Comments

Jan Stancek April 24, 2024, 7:59 a.m. UTC | #1
On Tue, Apr 23, 2024 at 3:28 PM Petr Vorel <pvorel@suse.cz> wrote:
>
> This fixes build error on musl (alpine):
>
> In file included from unlink09.c:18:
> ../../../../include/lapi/fs.h:58:15: error: unknown type name 'loff_t'
>    58 | static inline loff_t tst_max_lfs_filesize(void)
>
> loff_t is defined in <fcntl.h> (but guarded _GNU_SOURCE), but just for
> safety include lapi/fcntl.h in case lapi/fs.h is included in test which
> needs fallback definitions from lapi/fs.h.

You probably meant lapi/fcntl.h here ^^

>
> Because we require _GNU_SOURCE definition for code in lapi/fs.h, that's
> why there is the definition in both unlink09.c (the actual fix) and
> lapi/fs.h for visibility of the problem.
>
> Fixes: 2cf78f47a ("unlink: Add error tests for EPERM and EROFS")
> Signed-off-by: Petr Vorel <pvorel@suse.cz>
> ---
> #define _GNU_SOURCE pain again. Would you solve it differently?

I'd likely go similar route, but I'd drop the hunk from unlink09.c.
The test is not using loff_t directly, it includes a header, so it
should be up to
that header to work without pre-existing defines.

>
>  include/lapi/fs.h                           | 5 ++++-
>  testcases/kernel/syscalls/unlink/unlink09.c | 2 ++
>  2 files changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/include/lapi/fs.h b/include/lapi/fs.h
> index c19ee821d..4680f0090 100644
> --- a/include/lapi/fs.h
> +++ b/include/lapi/fs.h
> @@ -9,15 +9,18 @@
>  #ifndef LAPI_FS_H__
>  #define LAPI_FS_H__
>
> +#define _GNU_SOURCE /* loff_t in <fcntl.h> */

I'd also add to comment here that it's included via lapi/fcntl.h

> +
>  #include "config.h"
> +
>  #ifndef HAVE_MOUNT_SETATTR
>  # ifdef HAVE_LINUX_FS_H
>  #  include <linux/fs.h>
>  # endif
>  #endif
>
> -#include <sys/user.h>
>  #include <limits.h>
> +#include "lapi/fcntl.h"
>  #include "lapi/abisize.h"
>
>  #ifndef FS_IOC_GETFLAGS
> diff --git a/testcases/kernel/syscalls/unlink/unlink09.c b/testcases/kernel/syscalls/unlink/unlink09.c
> index cc4b4a07e..7e3fffe5c 100644
> --- a/testcases/kernel/syscalls/unlink/unlink09.c
> +++ b/testcases/kernel/syscalls/unlink/unlink09.c
> @@ -13,6 +13,8 @@
>   * - EROFS when target file is on a read-only filesystem.
>   */
>
> +#define _GNU_SOURCE /* loff_t in <fcntl.h> */
> +
>  #include <sys/ioctl.h>
>  #include "tst_test.h"
>  #include "lapi/fs.h"
> --
> 2.43.0
>
Petr Vorel April 24, 2024, 12:17 p.m. UTC | #2
Hi Jan,

> On Tue, Apr 23, 2024 at 3:28 PM Petr Vorel <pvorel@suse.cz> wrote:

> > This fixes build error on musl (alpine):

> > In file included from unlink09.c:18:
> > ../../../../include/lapi/fs.h:58:15: error: unknown type name 'loff_t'
> >    58 | static inline loff_t tst_max_lfs_filesize(void)

> > loff_t is defined in <fcntl.h> (but guarded _GNU_SOURCE), but just for
> > safety include lapi/fcntl.h in case lapi/fs.h is included in test which
> > needs fallback definitions from lapi/fs.h.

> You probably meant lapi/fcntl.h here ^^

+1

> > Because we require _GNU_SOURCE definition for code in lapi/fs.h, that's
> > why there is the definition in both unlink09.c (the actual fix) and
> > lapi/fs.h for visibility of the problem.

> > Fixes: 2cf78f47a ("unlink: Add error tests for EPERM and EROFS")
> > Signed-off-by: Petr Vorel <pvorel@suse.cz>
> > ---
> > #define _GNU_SOURCE pain again. Would you solve it differently?

> I'd likely go similar route, but I'd drop the hunk from unlink09.c.
> The test is not using loff_t directly, it includes a header, so it
> should be up to

First, thanks a lot for your review!

OK, this will work, just lapi/fs.h must be loaded before tst_test.h,
othewise it would fail on Alpine:

In file included from unlink09.c:20:
../../../../include/lapi/fs.h:61:15: error: unknown type name 'loff_t'
   61 | static inline loff_t tst_max_lfs_filesize(void)
      |               ^~~~~~
../../../../include/lapi/fs.h: In function 'tst_max_lfs_filesize':
../../../../include/lapi/fs.h:64:17: error: 'loff_t' undeclared (first use in this function); did you mean 'off_t'?
   64 |         return (loff_t)LLONG_MAX;
      |                 ^~~~~~
      |                 off_t
../../../../include/lapi/fs.h:64:17: note: each undeclared identifier is reported only once for each function it appears in
../../../../include/lapi/fs.h:64:24: error: expected ';' before numeric constant
   64 |         return (loff_t)LLONG_MAX;
      |                        ^
      |                        ;
make: *** [../../../../include/mk/rules.mk:45: unlink09] Error 1

(glibc hides loff_t behind __USE_MISC, which I thought it it's in the end
_GNU_SOURCE, but obviously not).

And using include/lapi/fs.h and most of lapi headers it's ok to use them before
tst_test.h (some of them are still used for the old API). But
include/lapi/getrandom.h will break this assumption and it can cause the
troubles if include/lapi/getrandom.h needs include/lapi/fcntl.h or <fcntl.h>).

Also my not-yet-finished effort with safe_fallocate() [1] had this problem
(requires <fcntl.h>), but I'll solve this with providing fallocate() declaration
as you suggested.

> that header to work without pre-existing defines.


> >  include/lapi/fs.h                           | 5 ++++-
> >  testcases/kernel/syscalls/unlink/unlink09.c | 2 ++
> >  2 files changed, 6 insertions(+), 1 deletion(-)

> > diff --git a/include/lapi/fs.h b/include/lapi/fs.h
> > index c19ee821d..4680f0090 100644
> > --- a/include/lapi/fs.h
> > +++ b/include/lapi/fs.h
> > @@ -9,15 +9,18 @@
> >  #ifndef LAPI_FS_H__
> >  #define LAPI_FS_H__

> > +#define _GNU_SOURCE /* loff_t in <fcntl.h> */

> I'd also add to comment here that it's included via lapi/fcntl.h

+1

Kind regards,
Petr

[1] https://lore.kernel.org/ltp/20240412114616.GB427746@pevik/
Jan Stancek April 25, 2024, 1:23 p.m. UTC | #3
On Wed, Apr 24, 2024 at 2:17 PM Petr Vorel <pvorel@suse.cz> wrote:
>
> Hi Jan,
>
> > On Tue, Apr 23, 2024 at 3:28 PM Petr Vorel <pvorel@suse.cz> wrote:
>
> > > This fixes build error on musl (alpine):
>
> > > In file included from unlink09.c:18:
> > > ../../../../include/lapi/fs.h:58:15: error: unknown type name 'loff_t'
> > >    58 | static inline loff_t tst_max_lfs_filesize(void)
>
> > > loff_t is defined in <fcntl.h> (but guarded _GNU_SOURCE), but just for
> > > safety include lapi/fcntl.h in case lapi/fs.h is included in test which
> > > needs fallback definitions from lapi/fs.h.
>
> > You probably meant lapi/fcntl.h here ^^
>
> +1
>
> > > Because we require _GNU_SOURCE definition for code in lapi/fs.h, that's
> > > why there is the definition in both unlink09.c (the actual fix) and
> > > lapi/fs.h for visibility of the problem.
>
> > > Fixes: 2cf78f47a ("unlink: Add error tests for EPERM and EROFS")
> > > Signed-off-by: Petr Vorel <pvorel@suse.cz>
> > > ---
> > > #define _GNU_SOURCE pain again. Would you solve it differently?
>
> > I'd likely go similar route, but I'd drop the hunk from unlink09.c.
> > The test is not using loff_t directly, it includes a header, so it
> > should be up to
>
> First, thanks a lot for your review!
>
> OK, this will work, just lapi/fs.h must be loaded before tst_test.h,
> othewise it would fail on Alpine:

So this is essentially:
------------------------------------------
#include <fcntl.h> // from tst_test.h include chain
#define _GNU_SOURCE // from lapi/fs.h
#include <fcntl.h>

int main(void)
{
        loff_t asd;
        return 0;
}
------------------------------------------

and it doesn't compile. And same applies if you include first any of
these first:
include/lapi/fcntl.h:#include <fcntl.h>
include/lapi/io_uring.h:#include <fcntl.h>
include/lapi/pidfd.h:#include <fcntl.h>
include/safe_macros_fn.h:#include <fcntl.h>
include/tst_safe_macros.h:#include <fcntl.h>

Do we really need for tst_max_lfs_filesize() to return loff_t? If we
changed it to "long long",
we'd avoid lot of issues with includes and _GNU_SOURCE for just single
user of this function.






>
> In file included from unlink09.c:20:
> ../../../../include/lapi/fs.h:61:15: error: unknown type name 'loff_t'
>    61 | static inline loff_t tst_max_lfs_filesize(void)
>       |               ^~~~~~
> ../../../../include/lapi/fs.h: In function 'tst_max_lfs_filesize':
> ../../../../include/lapi/fs.h:64:17: error: 'loff_t' undeclared (first use in this function); did you mean 'off_t'?
>    64 |         return (loff_t)LLONG_MAX;
>       |                 ^~~~~~
>       |                 off_t
> ../../../../include/lapi/fs.h:64:17: note: each undeclared identifier is reported only once for each function it appears in
> ../../../../include/lapi/fs.h:64:24: error: expected ';' before numeric constant
>    64 |         return (loff_t)LLONG_MAX;
>       |                        ^
>       |                        ;
> make: *** [../../../../include/mk/rules.mk:45: unlink09] Error 1
>
> (glibc hides loff_t behind __USE_MISC, which I thought it it's in the end
> _GNU_SOURCE, but obviously not).
>
> And using include/lapi/fs.h and most of lapi headers it's ok to use them before
> tst_test.h (some of them are still used for the old API). But
> include/lapi/getrandom.h will break this assumption and it can cause the
> troubles if include/lapi/getrandom.h needs include/lapi/fcntl.h or <fcntl.h>).
>
> Also my not-yet-finished effort with safe_fallocate() [1] had this problem
> (requires <fcntl.h>), but I'll solve this with providing fallocate() declaration
> as you suggested.
>
> > that header to work without pre-existing defines.
>
>
> > >  include/lapi/fs.h                           | 5 ++++-
> > >  testcases/kernel/syscalls/unlink/unlink09.c | 2 ++
> > >  2 files changed, 6 insertions(+), 1 deletion(-)
>
> > > diff --git a/include/lapi/fs.h b/include/lapi/fs.h
> > > index c19ee821d..4680f0090 100644
> > > --- a/include/lapi/fs.h
> > > +++ b/include/lapi/fs.h
> > > @@ -9,15 +9,18 @@
> > >  #ifndef LAPI_FS_H__
> > >  #define LAPI_FS_H__
>
> > > +#define _GNU_SOURCE /* loff_t in <fcntl.h> */
>
> > I'd also add to comment here that it's included via lapi/fcntl.h
>
> +1
>
> Kind regards,
> Petr
>
> [1] https://lore.kernel.org/ltp/20240412114616.GB427746@pevik/
>
Petr Vorel April 25, 2024, 3:38 p.m. UTC | #4
Hi Jan, all,

...
> > OK, this will work, just lapi/fs.h must be loaded before tst_test.h,
> > othewise it would fail on Alpine:

> So this is essentially:
> ------------------------------------------
> #include <fcntl.h> // from tst_test.h include chain
> #define _GNU_SOURCE // from lapi/fs.h
> #include <fcntl.h>

> int main(void)
> {
>         loff_t asd;
>         return 0;
> }
> ------------------------------------------

> and it doesn't compile. And same applies if you include first any of
> these first:
> include/lapi/fcntl.h:#include <fcntl.h>
> include/lapi/io_uring.h:#include <fcntl.h>
> include/lapi/pidfd.h:#include <fcntl.h>
> include/safe_macros_fn.h:#include <fcntl.h>
> include/tst_safe_macros.h:#include <fcntl.h>

> Do we really need for tst_max_lfs_filesize() to return loff_t? If we
> changed it to "long long",
> we'd avoid lot of issues with includes and _GNU_SOURCE for just single
> user of this function.

+1. We might get extra warning when there is 32 bit, but it would make things
much easier => I'll send another version.

Kind regards,
Petr


> > In file included from unlink09.c:20:
> > ../../../../include/lapi/fs.h:61:15: error: unknown type name 'loff_t'
> >    61 | static inline loff_t tst_max_lfs_filesize(void)
> >       |               ^~~~~~
> > ../../../../include/lapi/fs.h: In function 'tst_max_lfs_filesize':
> > ../../../../include/lapi/fs.h:64:17: error: 'loff_t' undeclared (first use in this function); did you mean 'off_t'?
> >    64 |         return (loff_t)LLONG_MAX;
> >       |                 ^~~~~~
> >       |                 off_t
> > ../../../../include/lapi/fs.h:64:17: note: each undeclared identifier is reported only once for each function it appears in
> > ../../../../include/lapi/fs.h:64:24: error: expected ';' before numeric constant
> >    64 |         return (loff_t)LLONG_MAX;
> >       |                        ^
> >       |                        ;
> > make: *** [../../../../include/mk/rules.mk:45: unlink09] Error 1

> > (glibc hides loff_t behind __USE_MISC, which I thought it it's in the end
> > _GNU_SOURCE, but obviously not).
...
diff mbox series

Patch

diff --git a/include/lapi/fs.h b/include/lapi/fs.h
index c19ee821d..4680f0090 100644
--- a/include/lapi/fs.h
+++ b/include/lapi/fs.h
@@ -9,15 +9,18 @@ 
 #ifndef LAPI_FS_H__
 #define LAPI_FS_H__
 
+#define _GNU_SOURCE /* loff_t in <fcntl.h> */
+
 #include "config.h"
+
 #ifndef HAVE_MOUNT_SETATTR
 # ifdef HAVE_LINUX_FS_H
 #  include <linux/fs.h>
 # endif
 #endif
 
-#include <sys/user.h>
 #include <limits.h>
+#include "lapi/fcntl.h"
 #include "lapi/abisize.h"
 
 #ifndef FS_IOC_GETFLAGS
diff --git a/testcases/kernel/syscalls/unlink/unlink09.c b/testcases/kernel/syscalls/unlink/unlink09.c
index cc4b4a07e..7e3fffe5c 100644
--- a/testcases/kernel/syscalls/unlink/unlink09.c
+++ b/testcases/kernel/syscalls/unlink/unlink09.c
@@ -13,6 +13,8 @@ 
  * - EROFS when target file is on a read-only filesystem.
  */
 
+#define _GNU_SOURCE /* loff_t in <fcntl.h> */
+
 #include <sys/ioctl.h>
 #include "tst_test.h"
 #include "lapi/fs.h"