[RFC PATCH] src/locktest.c: fix build failure of struct delegation

Zorro Lang <[email protected]> Mon, 20 Jul 2026 02:52:38 +0800
Newsgroups org.kernel.vger.fstests
Message-ID <[email protected]>
Since glibc commit f2e3dacbff88 ("Add new constants from Linux 6.12,
6.18 and 6.19 to bits/fcntl-linux.h"), the F_GETDELEG and F_SETDELEG
constants from Linux 6.19 have been added directly into <fcntl.h>.
However, the corresponding full definition for 'struct delegation'
was not included in glibc's userspace wrapper. That causes below
build error:

 locktest.c:1065:16: error: variable 'deleg' has initializer but incomplete type
  1065 |         struct delegation deleg = { .d_type = F_UNLCK };
 ...

Fix this by isolating the definition of 'struct delegation' from the
command macros via autoconf capability probing:

1. Add an AC_CHECK_TYPES check for 'struct delegation' in configure.ac.
2. In locktest.c, unbind 'struct delegation' from the '#ifndef F_GETDELEG'
   guard and wrap it with '#ifndef HAVE_STRUCT_DELEGATION' instead.

Signed-off-by: Zorro Lang <[email protected]>
---

Hi,

fstests currently fails to build against the latest glibc, with the root
cause detailed in the commit log above. I'm tagging this patch as an RFC
since I'd like to get more feedback on whether this is the right approach.

The glibc now defines F_GETDELEG and F_SETDELEG, but leaves out the actual
'struct delegation' definition. The complete struct is available in <linux/fcntl.h>,
but we cannot simply include both <fcntl.h> and <linux/fcntl.h> due to nasty
namespace redefinition conflicts.

I am not entirely sure if glibc will bring in 'struct delegation', so for now,
I chose to decouple and handle the structure definition independently via
autoconf. 

Any thoughts or better suggestions on how we should handle this transition?

Thanks,
Zorro

 configure.ac   | 4 ++++
 src/locktest.c | 2 ++
 2 files changed, 6 insertions(+)

diff --git a/configure.ac b/configure.ac
index 441f543c..8967f117 100644
--- a/configure.ac
+++ b/configure.ac
@@ -110,6 +110,10 @@ AC_CHECK_TYPES([struct btrfs_ioctl_received_subvol_args], [], [], [[
 #include <stddef.h>
 #include <linux/btrfs.h>
 ]])
+AC_CHECK_TYPES([struct delegation], [], [], [[
+#include <stddef.h>
+#include <fcntl.h>
+]])
 AC_CHECK_HEADERS([linux/btrfs.h linux/btrfs_tree.h])
 AC_CHECK_MEMBERS([struct btrfs_ioctl_vol_args_v2.subvolid], [], [], [[
 #include <stddef.h>
diff --git a/src/locktest.c b/src/locktest.c
index 54ee1f07..d0264c94 100644
--- a/src/locktest.c
+++ b/src/locktest.c
@@ -80,7 +80,9 @@ extern int h_errno;
 #ifndef F_GETDELEG
 #define F_GETDELEG	(1024 + 15)
 #define F_SETDELEG	(1024 + 16)
+#endif
 
+#ifndef HAVE_STRUCT_DELEGATION
 struct delegation {
 	uint32_t d_flags;
 	uint16_t d_type;
-- 
2.55.0