* [PATCH] fuse: uapi: use UAPI types
@ 2025-12-22 8:06 Thomas Weißschuh
2025-12-22 8:54 ` Arnd Bergmann
2025-12-22 21:16 ` Bernd Schubert
0 siblings, 2 replies; 6+ messages in thread
From: Thomas Weißschuh @ 2025-12-22 8:06 UTC (permalink / raw)
To: Miklos Szeredi
Cc: linux-fsdevel, linux-kernel, Arnd Bergmann, Thomas Weißschuh
Using libc types and headers from the UAPI headers is problematic as it
introduces a dependency on a full C toolchain.
Use the fixed-width integer types provided by the UAPI headers instead.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
include/uapi/linux/fuse.h | 614 +++++++++++++++++++++++-----------------------
1 file changed, 305 insertions(+), 309 deletions(-)
diff --git a/include/uapi/linux/fuse.h b/include/uapi/linux/fuse.h
index c13e1f9a2f12..dfbd407b7bfd 100644
--- a/include/uapi/linux/fuse.h
+++ b/include/uapi/linux/fuse.h
@@ -245,11 +245,7 @@
#ifndef _LINUX_FUSE_H
#define _LINUX_FUSE_H
-#ifdef __KERNEL__
#include <linux/types.h>
-#else
-#include <stdint.h>
-#endif
/*
* Version negotiation:
@@ -284,22 +280,22 @@
userspace works under 64bit kernels */
struct fuse_attr {
- uint64_t ino;
- uint64_t size;
- uint64_t blocks;
- uint64_t atime;
- uint64_t mtime;
- uint64_t ctime;
- uint32_t atimensec;
- uint32_t mtimensec;
- uint32_t ctimensec;
- uint32_t mode;
- uint32_t nlink;
- uint32_t uid;
- uint32_t gid;
- uint32_t rdev;
- uint32_t blksize;
- uint32_t flags;
+ __u64 ino;
+ __u64 size;
+ __u64 blocks;
+ __u64 atime;
+ __u64 mtime;
+ __u64 ctime;
+ __u32 atimensec;
+ __u32 mtimensec;
+ __u32 ctimensec;
+ __u32 mode;
+ __u32 nlink;
+ __u32 uid;
+ __u32 gid;
+ __u32 rdev;
+ __u32 blksize;
+ __u32 flags;
};
/*
@@ -307,53 +303,53 @@ struct fuse_attr {
* Linux.
*/
struct fuse_sx_time {
- int64_t tv_sec;
- uint32_t tv_nsec;
- int32_t __reserved;
+ __s64 tv_sec;
+ __u32 tv_nsec;
+ __s32 __reserved;
};
struct fuse_statx {
- uint32_t mask;
- uint32_t blksize;
- uint64_t attributes;
- uint32_t nlink;
- uint32_t uid;
- uint32_t gid;
- uint16_t mode;
- uint16_t __spare0[1];
- uint64_t ino;
- uint64_t size;
- uint64_t blocks;
- uint64_t attributes_mask;
+ __u32 mask;
+ __u32 blksize;
+ __u64 attributes;
+ __u32 nlink;
+ __u32 uid;
+ __u32 gid;
+ __u16 mode;
+ __u16 __spare0[1];
+ __u64 ino;
+ __u64 size;
+ __u64 blocks;
+ __u64 attributes_mask;
struct fuse_sx_time atime;
struct fuse_sx_time btime;
struct fuse_sx_time ctime;
struct fuse_sx_time mtime;
- uint32_t rdev_major;
- uint32_t rdev_minor;
- uint32_t dev_major;
- uint32_t dev_minor;
- uint64_t __spare2[14];
+ __u32 rdev_major;
+ __u32 rdev_minor;
+ __u32 dev_major;
+ __u32 dev_minor;
+ __u64 __spare2[14];
};
struct fuse_kstatfs {
- uint64_t blocks;
- uint64_t bfree;
- uint64_t bavail;
- uint64_t files;
- uint64_t ffree;
- uint32_t bsize;
- uint32_t namelen;
- uint32_t frsize;
- uint32_t padding;
- uint32_t spare[6];
+ __u64 blocks;
+ __u64 bfree;
+ __u64 bavail;
+ __u64 files;
+ __u64 ffree;
+ __u32 bsize;
+ __u32 namelen;
+ __u32 frsize;
+ __u32 padding;
+ __u32 spare[6];
};
struct fuse_file_lock {
- uint64_t start;
- uint64_t end;
- uint32_t type;
- uint32_t pid; /* tgid */
+ __u64 start;
+ __u64 end;
+ __u32 type;
+ __u32 pid; /* tgid */
};
/**
@@ -690,165 +686,165 @@ enum fuse_notify_code {
#define FUSE_COMPAT_ENTRY_OUT_SIZE 120
struct fuse_entry_out {
- uint64_t nodeid; /* Inode ID */
- uint64_t generation; /* Inode generation: nodeid:gen must
+ __u64 nodeid; /* Inode ID */
+ __u64 generation; /* Inode generation: nodeid:gen must
be unique for the fs's lifetime */
- uint64_t entry_valid; /* Cache timeout for the name */
- uint64_t attr_valid; /* Cache timeout for the attributes */
- uint32_t entry_valid_nsec;
- uint32_t attr_valid_nsec;
+ __u64 entry_valid; /* Cache timeout for the name */
+ __u64 attr_valid; /* Cache timeout for the attributes */
+ __u32 entry_valid_nsec;
+ __u32 attr_valid_nsec;
struct fuse_attr attr;
};
struct fuse_forget_in {
- uint64_t nlookup;
+ __u64 nlookup;
};
struct fuse_forget_one {
- uint64_t nodeid;
- uint64_t nlookup;
+ __u64 nodeid;
+ __u64 nlookup;
};
struct fuse_batch_forget_in {
- uint32_t count;
- uint32_t dummy;
+ __u32 count;
+ __u32 dummy;
};
struct fuse_getattr_in {
- uint32_t getattr_flags;
- uint32_t dummy;
- uint64_t fh;
+ __u32 getattr_flags;
+ __u32 dummy;
+ __u64 fh;
};
#define FUSE_COMPAT_ATTR_OUT_SIZE 96
struct fuse_attr_out {
- uint64_t attr_valid; /* Cache timeout for the attributes */
- uint32_t attr_valid_nsec;
- uint32_t dummy;
+ __u64 attr_valid; /* Cache timeout for the attributes */
+ __u32 attr_valid_nsec;
+ __u32 dummy;
struct fuse_attr attr;
};
struct fuse_statx_in {
- uint32_t getattr_flags;
- uint32_t reserved;
- uint64_t fh;
- uint32_t sx_flags;
- uint32_t sx_mask;
+ __u32 getattr_flags;
+ __u32 reserved;
+ __u64 fh;
+ __u32 sx_flags;
+ __u32 sx_mask;
};
struct fuse_statx_out {
- uint64_t attr_valid; /* Cache timeout for the attributes */
- uint32_t attr_valid_nsec;
- uint32_t flags;
- uint64_t spare[2];
+ __u64 attr_valid; /* Cache timeout for the attributes */
+ __u32 attr_valid_nsec;
+ __u32 flags;
+ __u64 spare[2];
struct fuse_statx stat;
};
#define FUSE_COMPAT_MKNOD_IN_SIZE 8
struct fuse_mknod_in {
- uint32_t mode;
- uint32_t rdev;
- uint32_t umask;
- uint32_t padding;
+ __u32 mode;
+ __u32 rdev;
+ __u32 umask;
+ __u32 padding;
};
struct fuse_mkdir_in {
- uint32_t mode;
- uint32_t umask;
+ __u32 mode;
+ __u32 umask;
};
struct fuse_rename_in {
- uint64_t newdir;
+ __u64 newdir;
};
struct fuse_rename2_in {
- uint64_t newdir;
- uint32_t flags;
- uint32_t padding;
+ __u64 newdir;
+ __u32 flags;
+ __u32 padding;
};
struct fuse_link_in {
- uint64_t oldnodeid;
+ __u64 oldnodeid;
};
struct fuse_setattr_in {
- uint32_t valid;
- uint32_t padding;
- uint64_t fh;
- uint64_t size;
- uint64_t lock_owner;
- uint64_t atime;
- uint64_t mtime;
- uint64_t ctime;
- uint32_t atimensec;
- uint32_t mtimensec;
- uint32_t ctimensec;
- uint32_t mode;
- uint32_t unused4;
- uint32_t uid;
- uint32_t gid;
- uint32_t unused5;
+ __u32 valid;
+ __u32 padding;
+ __u64 fh;
+ __u64 size;
+ __u64 lock_owner;
+ __u64 atime;
+ __u64 mtime;
+ __u64 ctime;
+ __u32 atimensec;
+ __u32 mtimensec;
+ __u32 ctimensec;
+ __u32 mode;
+ __u32 unused4;
+ __u32 uid;
+ __u32 gid;
+ __u32 unused5;
};
struct fuse_open_in {
- uint32_t flags;
- uint32_t open_flags; /* FUSE_OPEN_... */
+ __u32 flags;
+ __u32 open_flags; /* FUSE_OPEN_... */
};
struct fuse_create_in {
- uint32_t flags;
- uint32_t mode;
- uint32_t umask;
- uint32_t open_flags; /* FUSE_OPEN_... */
+ __u32 flags;
+ __u32 mode;
+ __u32 umask;
+ __u32 open_flags; /* FUSE_OPEN_... */
};
struct fuse_open_out {
- uint64_t fh;
- uint32_t open_flags;
- int32_t backing_id;
+ __u64 fh;
+ __u32 open_flags;
+ __s32 backing_id;
};
struct fuse_release_in {
- uint64_t fh;
- uint32_t flags;
- uint32_t release_flags;
- uint64_t lock_owner;
+ __u64 fh;
+ __u32 flags;
+ __u32 release_flags;
+ __u64 lock_owner;
};
struct fuse_flush_in {
- uint64_t fh;
- uint32_t unused;
- uint32_t padding;
- uint64_t lock_owner;
+ __u64 fh;
+ __u32 unused;
+ __u32 padding;
+ __u64 lock_owner;
};
struct fuse_read_in {
- uint64_t fh;
- uint64_t offset;
- uint32_t size;
- uint32_t read_flags;
- uint64_t lock_owner;
- uint32_t flags;
- uint32_t padding;
+ __u64 fh;
+ __u64 offset;
+ __u32 size;
+ __u32 read_flags;
+ __u64 lock_owner;
+ __u32 flags;
+ __u32 padding;
};
#define FUSE_COMPAT_WRITE_IN_SIZE 24
struct fuse_write_in {
- uint64_t fh;
- uint64_t offset;
- uint32_t size;
- uint32_t write_flags;
- uint64_t lock_owner;
- uint32_t flags;
- uint32_t padding;
+ __u64 fh;
+ __u64 offset;
+ __u32 size;
+ __u32 write_flags;
+ __u64 lock_owner;
+ __u32 flags;
+ __u32 padding;
};
struct fuse_write_out {
- uint32_t size;
- uint32_t padding;
+ __u32 size;
+ __u32 padding;
};
#define FUSE_COMPAT_STATFS_SIZE 48
@@ -858,36 +854,36 @@ struct fuse_statfs_out {
};
struct fuse_fsync_in {
- uint64_t fh;
- uint32_t fsync_flags;
- uint32_t padding;
+ __u64 fh;
+ __u32 fsync_flags;
+ __u32 padding;
};
#define FUSE_COMPAT_SETXATTR_IN_SIZE 8
struct fuse_setxattr_in {
- uint32_t size;
- uint32_t flags;
- uint32_t setxattr_flags;
- uint32_t padding;
+ __u32 size;
+ __u32 flags;
+ __u32 setxattr_flags;
+ __u32 padding;
};
struct fuse_getxattr_in {
- uint32_t size;
- uint32_t padding;
+ __u32 size;
+ __u32 padding;
};
struct fuse_getxattr_out {
- uint32_t size;
- uint32_t padding;
+ __u32 size;
+ __u32 padding;
};
struct fuse_lk_in {
- uint64_t fh;
- uint64_t owner;
+ __u64 fh;
+ __u64 owner;
struct fuse_file_lock lk;
- uint32_t lk_flags;
- uint32_t padding;
+ __u32 lk_flags;
+ __u32 padding;
};
struct fuse_lk_out {
@@ -895,117 +891,117 @@ struct fuse_lk_out {
};
struct fuse_access_in {
- uint32_t mask;
- uint32_t padding;
+ __u32 mask;
+ __u32 padding;
};
struct fuse_init_in {
- uint32_t major;
- uint32_t minor;
- uint32_t max_readahead;
- uint32_t flags;
- uint32_t flags2;
- uint32_t unused[11];
+ __u32 major;
+ __u32 minor;
+ __u32 max_readahead;
+ __u32 flags;
+ __u32 flags2;
+ __u32 unused[11];
};
#define FUSE_COMPAT_INIT_OUT_SIZE 8
#define FUSE_COMPAT_22_INIT_OUT_SIZE 24
struct fuse_init_out {
- uint32_t major;
- uint32_t minor;
- uint32_t max_readahead;
- uint32_t flags;
- uint16_t max_background;
- uint16_t congestion_threshold;
- uint32_t max_write;
- uint32_t time_gran;
- uint16_t max_pages;
- uint16_t map_alignment;
- uint32_t flags2;
- uint32_t max_stack_depth;
- uint16_t request_timeout;
- uint16_t unused[11];
+ __u32 major;
+ __u32 minor;
+ __u32 max_readahead;
+ __u32 flags;
+ __u16 max_background;
+ __u16 congestion_threshold;
+ __u32 max_write;
+ __u32 time_gran;
+ __u16 max_pages;
+ __u16 map_alignment;
+ __u32 flags2;
+ __u32 max_stack_depth;
+ __u16 request_timeout;
+ __u16 unused[11];
};
#define CUSE_INIT_INFO_MAX 4096
struct cuse_init_in {
- uint32_t major;
- uint32_t minor;
- uint32_t unused;
- uint32_t flags;
+ __u32 major;
+ __u32 minor;
+ __u32 unused;
+ __u32 flags;
};
struct cuse_init_out {
- uint32_t major;
- uint32_t minor;
- uint32_t unused;
- uint32_t flags;
- uint32_t max_read;
- uint32_t max_write;
- uint32_t dev_major; /* chardev major */
- uint32_t dev_minor; /* chardev minor */
- uint32_t spare[10];
+ __u32 major;
+ __u32 minor;
+ __u32 unused;
+ __u32 flags;
+ __u32 max_read;
+ __u32 max_write;
+ __u32 dev_major; /* chardev major */
+ __u32 dev_minor; /* chardev minor */
+ __u32 spare[10];
};
struct fuse_interrupt_in {
- uint64_t unique;
+ __u64 unique;
};
struct fuse_bmap_in {
- uint64_t block;
- uint32_t blocksize;
- uint32_t padding;
+ __u64 block;
+ __u32 blocksize;
+ __u32 padding;
};
struct fuse_bmap_out {
- uint64_t block;
+ __u64 block;
};
struct fuse_ioctl_in {
- uint64_t fh;
- uint32_t flags;
- uint32_t cmd;
- uint64_t arg;
- uint32_t in_size;
- uint32_t out_size;
+ __u64 fh;
+ __u32 flags;
+ __u32 cmd;
+ __u64 arg;
+ __u32 in_size;
+ __u32 out_size;
};
struct fuse_ioctl_iovec {
- uint64_t base;
- uint64_t len;
+ __u64 base;
+ __u64 len;
};
struct fuse_ioctl_out {
- int32_t result;
- uint32_t flags;
- uint32_t in_iovs;
- uint32_t out_iovs;
+ __s32 result;
+ __u32 flags;
+ __u32 in_iovs;
+ __u32 out_iovs;
};
struct fuse_poll_in {
- uint64_t fh;
- uint64_t kh;
- uint32_t flags;
- uint32_t events;
+ __u64 fh;
+ __u64 kh;
+ __u32 flags;
+ __u32 events;
};
struct fuse_poll_out {
- uint32_t revents;
- uint32_t padding;
+ __u32 revents;
+ __u32 padding;
};
struct fuse_notify_poll_wakeup_out {
- uint64_t kh;
+ __u64 kh;
};
struct fuse_fallocate_in {
- uint64_t fh;
- uint64_t offset;
- uint64_t length;
- uint32_t mode;
- uint32_t padding;
+ __u64 fh;
+ __u64 offset;
+ __u64 length;
+ __u32 mode;
+ __u32 padding;
};
/**
@@ -1029,37 +1025,37 @@ struct fuse_fallocate_in {
* FUSE_MKNOD, FUSE_SYMLINK, FUSE_MKDIR, FUSE_TMPFILE,
* FUSE_CREATE and FUSE_RENAME2 (with RENAME_WHITEOUT).
*/
-#define FUSE_INVALID_UIDGID ((uint32_t)(-1))
+#define FUSE_INVALID_UIDGID ((__u32)(-1))
struct fuse_in_header {
- uint32_t len;
- uint32_t opcode;
- uint64_t unique;
- uint64_t nodeid;
- uint32_t uid;
- uint32_t gid;
- uint32_t pid;
- uint16_t total_extlen; /* length of extensions in 8byte units */
- uint16_t padding;
+ __u32 len;
+ __u32 opcode;
+ __u64 unique;
+ __u64 nodeid;
+ __u32 uid;
+ __u32 gid;
+ __u32 pid;
+ __u16 total_extlen; /* length of extensions in 8byte units */
+ __u16 padding;
};
struct fuse_out_header {
- uint32_t len;
- int32_t error;
- uint64_t unique;
+ __u32 len;
+ __s32 error;
+ __u64 unique;
};
struct fuse_dirent {
- uint64_t ino;
- uint64_t off;
- uint32_t namelen;
- uint32_t type;
+ __u64 ino;
+ __u64 off;
+ __u32 namelen;
+ __u32 type;
char name[];
};
/* Align variable length records to 64bit boundary */
#define FUSE_REC_ALIGN(x) \
- (((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))
+ (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1))
#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
#define FUSE_DIRENT_ALIGN(x) FUSE_REC_ALIGN(x)
@@ -1077,127 +1073,127 @@ struct fuse_direntplus {
FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET_DIRENTPLUS + (d)->dirent.namelen)
struct fuse_notify_inval_inode_out {
- uint64_t ino;
- int64_t off;
- int64_t len;
+ __u64 ino;
+ __s64 off;
+ __s64 len;
};
struct fuse_notify_inval_entry_out {
- uint64_t parent;
- uint32_t namelen;
- uint32_t flags;
+ __u64 parent;
+ __u32 namelen;
+ __u32 flags;
};
struct fuse_notify_delete_out {
- uint64_t parent;
- uint64_t child;
- uint32_t namelen;
- uint32_t padding;
+ __u64 parent;
+ __u64 child;
+ __u32 namelen;
+ __u32 padding;
};
struct fuse_notify_store_out {
- uint64_t nodeid;
- uint64_t offset;
- uint32_t size;
- uint32_t padding;
+ __u64 nodeid;
+ __u64 offset;
+ __u32 size;
+ __u32 padding;
};
struct fuse_notify_retrieve_out {
- uint64_t notify_unique;
- uint64_t nodeid;
- uint64_t offset;
- uint32_t size;
- uint32_t padding;
+ __u64 notify_unique;
+ __u64 nodeid;
+ __u64 offset;
+ __u32 size;
+ __u32 padding;
};
/* Matches the size of fuse_write_in */
struct fuse_notify_retrieve_in {
- uint64_t dummy1;
- uint64_t offset;
- uint32_t size;
- uint32_t dummy2;
- uint64_t dummy3;
- uint64_t dummy4;
+ __u64 dummy1;
+ __u64 offset;
+ __u32 size;
+ __u32 dummy2;
+ __u64 dummy3;
+ __u64 dummy4;
};
struct fuse_notify_prune_out {
- uint32_t count;
- uint32_t padding;
- uint64_t spare;
+ __u32 count;
+ __u32 padding;
+ __u64 spare;
};
struct fuse_backing_map {
- int32_t fd;
- uint32_t flags;
- uint64_t padding;
+ __s32 fd;
+ __u32 flags;
+ __u64 padding;
};
/* Device ioctls: */
#define FUSE_DEV_IOC_MAGIC 229
-#define FUSE_DEV_IOC_CLONE _IOR(FUSE_DEV_IOC_MAGIC, 0, uint32_t)
+#define FUSE_DEV_IOC_CLONE _IOR(FUSE_DEV_IOC_MAGIC, 0, __u32)
#define FUSE_DEV_IOC_BACKING_OPEN _IOW(FUSE_DEV_IOC_MAGIC, 1, \
struct fuse_backing_map)
-#define FUSE_DEV_IOC_BACKING_CLOSE _IOW(FUSE_DEV_IOC_MAGIC, 2, uint32_t)
+#define FUSE_DEV_IOC_BACKING_CLOSE _IOW(FUSE_DEV_IOC_MAGIC, 2, __u32)
#define FUSE_DEV_IOC_SYNC_INIT _IO(FUSE_DEV_IOC_MAGIC, 3)
struct fuse_lseek_in {
- uint64_t fh;
- uint64_t offset;
- uint32_t whence;
- uint32_t padding;
+ __u64 fh;
+ __u64 offset;
+ __u32 whence;
+ __u32 padding;
};
struct fuse_lseek_out {
- uint64_t offset;
+ __u64 offset;
};
struct fuse_copy_file_range_in {
- uint64_t fh_in;
- uint64_t off_in;
- uint64_t nodeid_out;
- uint64_t fh_out;
- uint64_t off_out;
- uint64_t len;
- uint64_t flags;
+ __u64 fh_in;
+ __u64 off_in;
+ __u64 nodeid_out;
+ __u64 fh_out;
+ __u64 off_out;
+ __u64 len;
+ __u64 flags;
};
/* For FUSE_COPY_FILE_RANGE_64 */
struct fuse_copy_file_range_out {
- uint64_t bytes_copied;
+ __u64 bytes_copied;
};
#define FUSE_SETUPMAPPING_FLAG_WRITE (1ull << 0)
#define FUSE_SETUPMAPPING_FLAG_READ (1ull << 1)
struct fuse_setupmapping_in {
/* An already open handle */
- uint64_t fh;
+ __u64 fh;
/* Offset into the file to start the mapping */
- uint64_t foffset;
+ __u64 foffset;
/* Length of mapping required */
- uint64_t len;
+ __u64 len;
/* Flags, FUSE_SETUPMAPPING_FLAG_* */
- uint64_t flags;
+ __u64 flags;
/* Offset in Memory Window */
- uint64_t moffset;
+ __u64 moffset;
};
struct fuse_removemapping_in {
/* number of fuse_removemapping_one follows */
- uint32_t count;
+ __u32 count;
};
struct fuse_removemapping_one {
/* Offset into the dax window start the unmapping */
- uint64_t moffset;
+ __u64 moffset;
/* Length of mapping required */
- uint64_t len;
+ __u64 len;
};
#define FUSE_REMOVEMAPPING_MAX_ENTRY \
(PAGE_SIZE / sizeof(struct fuse_removemapping_one))
struct fuse_syncfs_in {
- uint64_t padding;
+ __u64 padding;
};
/*
@@ -1207,8 +1203,8 @@ struct fuse_syncfs_in {
* fuse_secctx, name, context
*/
struct fuse_secctx {
- uint32_t size;
- uint32_t padding;
+ __u32 size;
+ __u32 padding;
};
/*
@@ -1218,8 +1214,8 @@ struct fuse_secctx {
*
*/
struct fuse_secctx_header {
- uint32_t size;
- uint32_t nr_secctx;
+ __u32 size;
+ __u32 nr_secctx;
};
/**
@@ -1231,8 +1227,8 @@ struct fuse_secctx_header {
* FUSE_MAX_NR_SECCTX
*/
struct fuse_ext_header {
- uint32_t size;
- uint32_t type;
+ __u32 size;
+ __u32 type;
};
/**
@@ -1241,8 +1237,8 @@ struct fuse_ext_header {
* @groups: flexible array of group IDs
*/
struct fuse_supp_groups {
- uint32_t nr_groups;
- uint32_t groups[];
+ __u32 nr_groups;
+ __u32 groups[];
};
/**
@@ -1253,19 +1249,19 @@ struct fuse_supp_groups {
/* Used as part of the fuse_uring_req_header */
struct fuse_uring_ent_in_out {
- uint64_t flags;
+ __u64 flags;
/*
* commit ID to be used in a reply to a ring request (see also
* struct fuse_uring_cmd_req)
*/
- uint64_t commit_id;
+ __u64 commit_id;
/* size of user payload buffer */
- uint32_t payload_sz;
- uint32_t padding;
+ __u32 payload_sz;
+ __u32 padding;
- uint64_t reserved;
+ __u64 reserved;
};
/**
@@ -1298,14 +1294,14 @@ enum fuse_uring_cmd {
* In the 80B command area of the SQE.
*/
struct fuse_uring_cmd_req {
- uint64_t flags;
+ __u64 flags;
/* entry identifier for commits */
- uint64_t commit_id;
+ __u64 commit_id;
/* queue the command is for (queue index) */
- uint16_t qid;
- uint8_t padding[6];
+ __u16 qid;
+ __u8 padding[6];
};
#endif /* _LINUX_FUSE_H */
---
base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
change-id: 20251222-uapi-fuse-1acdfb5abf77
Best regards,
--
Thomas Weißschuh <thomas.weissschuh@linutronix.de>
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] fuse: uapi: use UAPI types
2025-12-22 8:06 [PATCH] fuse: uapi: use UAPI types Thomas Weißschuh
@ 2025-12-22 8:54 ` Arnd Bergmann
2025-12-22 10:10 ` Thomas Weißschuh
2025-12-22 21:16 ` Bernd Schubert
1 sibling, 1 reply; 6+ messages in thread
From: Arnd Bergmann @ 2025-12-22 8:54 UTC (permalink / raw)
To: Thomas Weißschuh, Miklos Szeredi; +Cc: linux-fsdevel, linux-kernel
On Mon, Dec 22, 2025, at 09:06, Thomas Weißschuh wrote:
> Using libc types and headers from the UAPI headers is problematic as it
> introduces a dependency on a full C toolchain.
>
> Use the fixed-width integer types provided by the UAPI headers instead.
>
> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Please check the whitespace though:
> @@ -307,53 +303,53 @@ struct fuse_attr {
> * Linux.
> */
> struct fuse_sx_time {
> - int64_t tv_sec;
> - uint32_t tv_nsec;
> - int32_t __reserved;
> + __s64 tv_sec;
> + __u32 tv_nsec;
> + __s32 __reserved;
> };
This looks misaligned now, same for any other struct that
mixes signed and unsigned types, like fuse_open_out.
> @@ -1298,14 +1294,14 @@ enum fuse_uring_cmd {
> * In the 80B command area of the SQE.
> */
> struct fuse_uring_cmd_req {
> - uint64_t flags;
> + __u64 flags;
>
> /* entry identifier for commits */
> - uint64_t commit_id;
> + __u64 commit_id;
>
> /* queue the command is for (queue index) */
> - uint16_t qid;
> - uint8_t padding[6];
> + __u16 qid;
> + __u8 padding[6];
> };
Maybe also change this to use tab for alignment like all
the other structures.
Arnd
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] fuse: uapi: use UAPI types
2025-12-22 8:54 ` Arnd Bergmann
@ 2025-12-22 10:10 ` Thomas Weißschuh
0 siblings, 0 replies; 6+ messages in thread
From: Thomas Weißschuh @ 2025-12-22 10:10 UTC (permalink / raw)
To: Arnd Bergmann; +Cc: Miklos Szeredi, linux-fsdevel, linux-kernel
On Mon, Dec 22, 2025 at 09:54:08AM +0100, Arnd Bergmann wrote:
> On Mon, Dec 22, 2025, at 09:06, Thomas Weißschuh wrote:
> > Using libc types and headers from the UAPI headers is problematic as it
> > introduces a dependency on a full C toolchain.
> >
> > Use the fixed-width integer types provided by the UAPI headers instead.
> >
> > Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
>
> Acked-by: Arnd Bergmann <arnd@arndb.de>
>
> Please check the whitespace though:
Yeah, I forgot to doublecheck this patch.
Thanks for noticing.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] fuse: uapi: use UAPI types
2025-12-22 8:06 [PATCH] fuse: uapi: use UAPI types Thomas Weißschuh
2025-12-22 8:54 ` Arnd Bergmann
@ 2025-12-22 21:16 ` Bernd Schubert
2025-12-23 8:37 ` Thomas Weißschuh
1 sibling, 1 reply; 6+ messages in thread
From: Bernd Schubert @ 2025-12-22 21:16 UTC (permalink / raw)
To: Thomas Weißschuh, Miklos Szeredi
Cc: linux-fsdevel, linux-kernel, Arnd Bergmann
On 12/22/25 09:06, Thomas Weißschuh wrote:
> Using libc types and headers from the UAPI headers is problematic as it
> introduces a dependency on a full C toolchain.
>
> Use the fixed-width integer types provided by the UAPI headers instead.
>
> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
I think that came up a couple of times already.
https://lkml.org/lkml/2015/10/15/672
Also see
https://git.zx2c4.com/linux-rng/commit/include/uapi/linux/fuse.h?id=4c82456eeb4da081dd63dc69e91aa6deabd29e03&follow=1
Thanks,
Bernd
> ---
> include/uapi/linux/fuse.h | 614 +++++++++++++++++++++++-----------------------
> 1 file changed, 305 insertions(+), 309 deletions(-)
>
> diff --git a/include/uapi/linux/fuse.h b/include/uapi/linux/fuse.h
> index c13e1f9a2f12..dfbd407b7bfd 100644
> --- a/include/uapi/linux/fuse.h
> +++ b/include/uapi/linux/fuse.h
> @@ -245,11 +245,7 @@
> #ifndef _LINUX_FUSE_H
> #define _LINUX_FUSE_H
>
> -#ifdef __KERNEL__
> #include <linux/types.h>
> -#else
> -#include <stdint.h>
> -#endif
>
> /*
> * Version negotiation:
> @@ -284,22 +280,22 @@
> userspace works under 64bit kernels */
>
> struct fuse_attr {
> - uint64_t ino;
> - uint64_t size;
> - uint64_t blocks;
> - uint64_t atime;
> - uint64_t mtime;
> - uint64_t ctime;
> - uint32_t atimensec;
> - uint32_t mtimensec;
> - uint32_t ctimensec;
> - uint32_t mode;
> - uint32_t nlink;
> - uint32_t uid;
> - uint32_t gid;
> - uint32_t rdev;
> - uint32_t blksize;
> - uint32_t flags;
> + __u64 ino;
> + __u64 size;
> + __u64 blocks;
> + __u64 atime;
> + __u64 mtime;
> + __u64 ctime;
> + __u32 atimensec;
> + __u32 mtimensec;
> + __u32 ctimensec;
> + __u32 mode;
> + __u32 nlink;
> + __u32 uid;
> + __u32 gid;
> + __u32 rdev;
> + __u32 blksize;
> + __u32 flags;
> };
>
> /*
> @@ -307,53 +303,53 @@ struct fuse_attr {
> * Linux.
> */
> struct fuse_sx_time {
> - int64_t tv_sec;
> - uint32_t tv_nsec;
> - int32_t __reserved;
> + __s64 tv_sec;
> + __u32 tv_nsec;
> + __s32 __reserved;
> };
>
> struct fuse_statx {
> - uint32_t mask;
> - uint32_t blksize;
> - uint64_t attributes;
> - uint32_t nlink;
> - uint32_t uid;
> - uint32_t gid;
> - uint16_t mode;
> - uint16_t __spare0[1];
> - uint64_t ino;
> - uint64_t size;
> - uint64_t blocks;
> - uint64_t attributes_mask;
> + __u32 mask;
> + __u32 blksize;
> + __u64 attributes;
> + __u32 nlink;
> + __u32 uid;
> + __u32 gid;
> + __u16 mode;
> + __u16 __spare0[1];
> + __u64 ino;
> + __u64 size;
> + __u64 blocks;
> + __u64 attributes_mask;
> struct fuse_sx_time atime;
> struct fuse_sx_time btime;
> struct fuse_sx_time ctime;
> struct fuse_sx_time mtime;
> - uint32_t rdev_major;
> - uint32_t rdev_minor;
> - uint32_t dev_major;
> - uint32_t dev_minor;
> - uint64_t __spare2[14];
> + __u32 rdev_major;
> + __u32 rdev_minor;
> + __u32 dev_major;
> + __u32 dev_minor;
> + __u64 __spare2[14];
> };
>
> struct fuse_kstatfs {
> - uint64_t blocks;
> - uint64_t bfree;
> - uint64_t bavail;
> - uint64_t files;
> - uint64_t ffree;
> - uint32_t bsize;
> - uint32_t namelen;
> - uint32_t frsize;
> - uint32_t padding;
> - uint32_t spare[6];
> + __u64 blocks;
> + __u64 bfree;
> + __u64 bavail;
> + __u64 files;
> + __u64 ffree;
> + __u32 bsize;
> + __u32 namelen;
> + __u32 frsize;
> + __u32 padding;
> + __u32 spare[6];
> };
>
> struct fuse_file_lock {
> - uint64_t start;
> - uint64_t end;
> - uint32_t type;
> - uint32_t pid; /* tgid */
> + __u64 start;
> + __u64 end;
> + __u32 type;
> + __u32 pid; /* tgid */
> };
>
> /**
> @@ -690,165 +686,165 @@ enum fuse_notify_code {
> #define FUSE_COMPAT_ENTRY_OUT_SIZE 120
>
> struct fuse_entry_out {
> - uint64_t nodeid; /* Inode ID */
> - uint64_t generation; /* Inode generation: nodeid:gen must
> + __u64 nodeid; /* Inode ID */
> + __u64 generation; /* Inode generation: nodeid:gen must
> be unique for the fs's lifetime */
> - uint64_t entry_valid; /* Cache timeout for the name */
> - uint64_t attr_valid; /* Cache timeout for the attributes */
> - uint32_t entry_valid_nsec;
> - uint32_t attr_valid_nsec;
> + __u64 entry_valid; /* Cache timeout for the name */
> + __u64 attr_valid; /* Cache timeout for the attributes */
> + __u32 entry_valid_nsec;
> + __u32 attr_valid_nsec;
> struct fuse_attr attr;
> };
>
> struct fuse_forget_in {
> - uint64_t nlookup;
> + __u64 nlookup;
> };
>
> struct fuse_forget_one {
> - uint64_t nodeid;
> - uint64_t nlookup;
> + __u64 nodeid;
> + __u64 nlookup;
> };
>
> struct fuse_batch_forget_in {
> - uint32_t count;
> - uint32_t dummy;
> + __u32 count;
> + __u32 dummy;
> };
>
> struct fuse_getattr_in {
> - uint32_t getattr_flags;
> - uint32_t dummy;
> - uint64_t fh;
> + __u32 getattr_flags;
> + __u32 dummy;
> + __u64 fh;
> };
>
> #define FUSE_COMPAT_ATTR_OUT_SIZE 96
>
> struct fuse_attr_out {
> - uint64_t attr_valid; /* Cache timeout for the attributes */
> - uint32_t attr_valid_nsec;
> - uint32_t dummy;
> + __u64 attr_valid; /* Cache timeout for the attributes */
> + __u32 attr_valid_nsec;
> + __u32 dummy;
> struct fuse_attr attr;
> };
>
> struct fuse_statx_in {
> - uint32_t getattr_flags;
> - uint32_t reserved;
> - uint64_t fh;
> - uint32_t sx_flags;
> - uint32_t sx_mask;
> + __u32 getattr_flags;
> + __u32 reserved;
> + __u64 fh;
> + __u32 sx_flags;
> + __u32 sx_mask;
> };
>
> struct fuse_statx_out {
> - uint64_t attr_valid; /* Cache timeout for the attributes */
> - uint32_t attr_valid_nsec;
> - uint32_t flags;
> - uint64_t spare[2];
> + __u64 attr_valid; /* Cache timeout for the attributes */
> + __u32 attr_valid_nsec;
> + __u32 flags;
> + __u64 spare[2];
> struct fuse_statx stat;
> };
>
> #define FUSE_COMPAT_MKNOD_IN_SIZE 8
>
> struct fuse_mknod_in {
> - uint32_t mode;
> - uint32_t rdev;
> - uint32_t umask;
> - uint32_t padding;
> + __u32 mode;
> + __u32 rdev;
> + __u32 umask;
> + __u32 padding;
> };
>
> struct fuse_mkdir_in {
> - uint32_t mode;
> - uint32_t umask;
> + __u32 mode;
> + __u32 umask;
> };
>
> struct fuse_rename_in {
> - uint64_t newdir;
> + __u64 newdir;
> };
>
> struct fuse_rename2_in {
> - uint64_t newdir;
> - uint32_t flags;
> - uint32_t padding;
> + __u64 newdir;
> + __u32 flags;
> + __u32 padding;
> };
>
> struct fuse_link_in {
> - uint64_t oldnodeid;
> + __u64 oldnodeid;
> };
>
> struct fuse_setattr_in {
> - uint32_t valid;
> - uint32_t padding;
> - uint64_t fh;
> - uint64_t size;
> - uint64_t lock_owner;
> - uint64_t atime;
> - uint64_t mtime;
> - uint64_t ctime;
> - uint32_t atimensec;
> - uint32_t mtimensec;
> - uint32_t ctimensec;
> - uint32_t mode;
> - uint32_t unused4;
> - uint32_t uid;
> - uint32_t gid;
> - uint32_t unused5;
> + __u32 valid;
> + __u32 padding;
> + __u64 fh;
> + __u64 size;
> + __u64 lock_owner;
> + __u64 atime;
> + __u64 mtime;
> + __u64 ctime;
> + __u32 atimensec;
> + __u32 mtimensec;
> + __u32 ctimensec;
> + __u32 mode;
> + __u32 unused4;
> + __u32 uid;
> + __u32 gid;
> + __u32 unused5;
> };
>
> struct fuse_open_in {
> - uint32_t flags;
> - uint32_t open_flags; /* FUSE_OPEN_... */
> + __u32 flags;
> + __u32 open_flags; /* FUSE_OPEN_... */
> };
>
> struct fuse_create_in {
> - uint32_t flags;
> - uint32_t mode;
> - uint32_t umask;
> - uint32_t open_flags; /* FUSE_OPEN_... */
> + __u32 flags;
> + __u32 mode;
> + __u32 umask;
> + __u32 open_flags; /* FUSE_OPEN_... */
> };
>
> struct fuse_open_out {
> - uint64_t fh;
> - uint32_t open_flags;
> - int32_t backing_id;
> + __u64 fh;
> + __u32 open_flags;
> + __s32 backing_id;
> };
>
> struct fuse_release_in {
> - uint64_t fh;
> - uint32_t flags;
> - uint32_t release_flags;
> - uint64_t lock_owner;
> + __u64 fh;
> + __u32 flags;
> + __u32 release_flags;
> + __u64 lock_owner;
> };
>
> struct fuse_flush_in {
> - uint64_t fh;
> - uint32_t unused;
> - uint32_t padding;
> - uint64_t lock_owner;
> + __u64 fh;
> + __u32 unused;
> + __u32 padding;
> + __u64 lock_owner;
> };
>
> struct fuse_read_in {
> - uint64_t fh;
> - uint64_t offset;
> - uint32_t size;
> - uint32_t read_flags;
> - uint64_t lock_owner;
> - uint32_t flags;
> - uint32_t padding;
> + __u64 fh;
> + __u64 offset;
> + __u32 size;
> + __u32 read_flags;
> + __u64 lock_owner;
> + __u32 flags;
> + __u32 padding;
> };
>
> #define FUSE_COMPAT_WRITE_IN_SIZE 24
>
> struct fuse_write_in {
> - uint64_t fh;
> - uint64_t offset;
> - uint32_t size;
> - uint32_t write_flags;
> - uint64_t lock_owner;
> - uint32_t flags;
> - uint32_t padding;
> + __u64 fh;
> + __u64 offset;
> + __u32 size;
> + __u32 write_flags;
> + __u64 lock_owner;
> + __u32 flags;
> + __u32 padding;
> };
>
> struct fuse_write_out {
> - uint32_t size;
> - uint32_t padding;
> + __u32 size;
> + __u32 padding;
> };
>
> #define FUSE_COMPAT_STATFS_SIZE 48
> @@ -858,36 +854,36 @@ struct fuse_statfs_out {
> };
>
> struct fuse_fsync_in {
> - uint64_t fh;
> - uint32_t fsync_flags;
> - uint32_t padding;
> + __u64 fh;
> + __u32 fsync_flags;
> + __u32 padding;
> };
>
> #define FUSE_COMPAT_SETXATTR_IN_SIZE 8
>
> struct fuse_setxattr_in {
> - uint32_t size;
> - uint32_t flags;
> - uint32_t setxattr_flags;
> - uint32_t padding;
> + __u32 size;
> + __u32 flags;
> + __u32 setxattr_flags;
> + __u32 padding;
> };
>
> struct fuse_getxattr_in {
> - uint32_t size;
> - uint32_t padding;
> + __u32 size;
> + __u32 padding;
> };
>
> struct fuse_getxattr_out {
> - uint32_t size;
> - uint32_t padding;
> + __u32 size;
> + __u32 padding;
> };
>
> struct fuse_lk_in {
> - uint64_t fh;
> - uint64_t owner;
> + __u64 fh;
> + __u64 owner;
> struct fuse_file_lock lk;
> - uint32_t lk_flags;
> - uint32_t padding;
> + __u32 lk_flags;
> + __u32 padding;
> };
>
> struct fuse_lk_out {
> @@ -895,117 +891,117 @@ struct fuse_lk_out {
> };
>
> struct fuse_access_in {
> - uint32_t mask;
> - uint32_t padding;
> + __u32 mask;
> + __u32 padding;
> };
>
> struct fuse_init_in {
> - uint32_t major;
> - uint32_t minor;
> - uint32_t max_readahead;
> - uint32_t flags;
> - uint32_t flags2;
> - uint32_t unused[11];
> + __u32 major;
> + __u32 minor;
> + __u32 max_readahead;
> + __u32 flags;
> + __u32 flags2;
> + __u32 unused[11];
> };
>
> #define FUSE_COMPAT_INIT_OUT_SIZE 8
> #define FUSE_COMPAT_22_INIT_OUT_SIZE 24
>
> struct fuse_init_out {
> - uint32_t major;
> - uint32_t minor;
> - uint32_t max_readahead;
> - uint32_t flags;
> - uint16_t max_background;
> - uint16_t congestion_threshold;
> - uint32_t max_write;
> - uint32_t time_gran;
> - uint16_t max_pages;
> - uint16_t map_alignment;
> - uint32_t flags2;
> - uint32_t max_stack_depth;
> - uint16_t request_timeout;
> - uint16_t unused[11];
> + __u32 major;
> + __u32 minor;
> + __u32 max_readahead;
> + __u32 flags;
> + __u16 max_background;
> + __u16 congestion_threshold;
> + __u32 max_write;
> + __u32 time_gran;
> + __u16 max_pages;
> + __u16 map_alignment;
> + __u32 flags2;
> + __u32 max_stack_depth;
> + __u16 request_timeout;
> + __u16 unused[11];
> };
>
> #define CUSE_INIT_INFO_MAX 4096
>
> struct cuse_init_in {
> - uint32_t major;
> - uint32_t minor;
> - uint32_t unused;
> - uint32_t flags;
> + __u32 major;
> + __u32 minor;
> + __u32 unused;
> + __u32 flags;
> };
>
> struct cuse_init_out {
> - uint32_t major;
> - uint32_t minor;
> - uint32_t unused;
> - uint32_t flags;
> - uint32_t max_read;
> - uint32_t max_write;
> - uint32_t dev_major; /* chardev major */
> - uint32_t dev_minor; /* chardev minor */
> - uint32_t spare[10];
> + __u32 major;
> + __u32 minor;
> + __u32 unused;
> + __u32 flags;
> + __u32 max_read;
> + __u32 max_write;
> + __u32 dev_major; /* chardev major */
> + __u32 dev_minor; /* chardev minor */
> + __u32 spare[10];
> };
>
> struct fuse_interrupt_in {
> - uint64_t unique;
> + __u64 unique;
> };
>
> struct fuse_bmap_in {
> - uint64_t block;
> - uint32_t blocksize;
> - uint32_t padding;
> + __u64 block;
> + __u32 blocksize;
> + __u32 padding;
> };
>
> struct fuse_bmap_out {
> - uint64_t block;
> + __u64 block;
> };
>
> struct fuse_ioctl_in {
> - uint64_t fh;
> - uint32_t flags;
> - uint32_t cmd;
> - uint64_t arg;
> - uint32_t in_size;
> - uint32_t out_size;
> + __u64 fh;
> + __u32 flags;
> + __u32 cmd;
> + __u64 arg;
> + __u32 in_size;
> + __u32 out_size;
> };
>
> struct fuse_ioctl_iovec {
> - uint64_t base;
> - uint64_t len;
> + __u64 base;
> + __u64 len;
> };
>
> struct fuse_ioctl_out {
> - int32_t result;
> - uint32_t flags;
> - uint32_t in_iovs;
> - uint32_t out_iovs;
> + __s32 result;
> + __u32 flags;
> + __u32 in_iovs;
> + __u32 out_iovs;
> };
>
> struct fuse_poll_in {
> - uint64_t fh;
> - uint64_t kh;
> - uint32_t flags;
> - uint32_t events;
> + __u64 fh;
> + __u64 kh;
> + __u32 flags;
> + __u32 events;
> };
>
> struct fuse_poll_out {
> - uint32_t revents;
> - uint32_t padding;
> + __u32 revents;
> + __u32 padding;
> };
>
> struct fuse_notify_poll_wakeup_out {
> - uint64_t kh;
> + __u64 kh;
> };
>
> struct fuse_fallocate_in {
> - uint64_t fh;
> - uint64_t offset;
> - uint64_t length;
> - uint32_t mode;
> - uint32_t padding;
> + __u64 fh;
> + __u64 offset;
> + __u64 length;
> + __u32 mode;
> + __u32 padding;
> };
>
> /**
> @@ -1029,37 +1025,37 @@ struct fuse_fallocate_in {
> * FUSE_MKNOD, FUSE_SYMLINK, FUSE_MKDIR, FUSE_TMPFILE,
> * FUSE_CREATE and FUSE_RENAME2 (with RENAME_WHITEOUT).
> */
> -#define FUSE_INVALID_UIDGID ((uint32_t)(-1))
> +#define FUSE_INVALID_UIDGID ((__u32)(-1))
>
> struct fuse_in_header {
> - uint32_t len;
> - uint32_t opcode;
> - uint64_t unique;
> - uint64_t nodeid;
> - uint32_t uid;
> - uint32_t gid;
> - uint32_t pid;
> - uint16_t total_extlen; /* length of extensions in 8byte units */
> - uint16_t padding;
> + __u32 len;
> + __u32 opcode;
> + __u64 unique;
> + __u64 nodeid;
> + __u32 uid;
> + __u32 gid;
> + __u32 pid;
> + __u16 total_extlen; /* length of extensions in 8byte units */
> + __u16 padding;
> };
>
> struct fuse_out_header {
> - uint32_t len;
> - int32_t error;
> - uint64_t unique;
> + __u32 len;
> + __s32 error;
> + __u64 unique;
> };
>
> struct fuse_dirent {
> - uint64_t ino;
> - uint64_t off;
> - uint32_t namelen;
> - uint32_t type;
> + __u64 ino;
> + __u64 off;
> + __u32 namelen;
> + __u32 type;
> char name[];
> };
>
> /* Align variable length records to 64bit boundary */
> #define FUSE_REC_ALIGN(x) \
> - (((x) + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1))
> + (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1))
>
> #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
> #define FUSE_DIRENT_ALIGN(x) FUSE_REC_ALIGN(x)
> @@ -1077,127 +1073,127 @@ struct fuse_direntplus {
> FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET_DIRENTPLUS + (d)->dirent.namelen)
>
> struct fuse_notify_inval_inode_out {
> - uint64_t ino;
> - int64_t off;
> - int64_t len;
> + __u64 ino;
> + __s64 off;
> + __s64 len;
> };
>
> struct fuse_notify_inval_entry_out {
> - uint64_t parent;
> - uint32_t namelen;
> - uint32_t flags;
> + __u64 parent;
> + __u32 namelen;
> + __u32 flags;
> };
>
> struct fuse_notify_delete_out {
> - uint64_t parent;
> - uint64_t child;
> - uint32_t namelen;
> - uint32_t padding;
> + __u64 parent;
> + __u64 child;
> + __u32 namelen;
> + __u32 padding;
> };
>
> struct fuse_notify_store_out {
> - uint64_t nodeid;
> - uint64_t offset;
> - uint32_t size;
> - uint32_t padding;
> + __u64 nodeid;
> + __u64 offset;
> + __u32 size;
> + __u32 padding;
> };
>
> struct fuse_notify_retrieve_out {
> - uint64_t notify_unique;
> - uint64_t nodeid;
> - uint64_t offset;
> - uint32_t size;
> - uint32_t padding;
> + __u64 notify_unique;
> + __u64 nodeid;
> + __u64 offset;
> + __u32 size;
> + __u32 padding;
> };
>
> /* Matches the size of fuse_write_in */
> struct fuse_notify_retrieve_in {
> - uint64_t dummy1;
> - uint64_t offset;
> - uint32_t size;
> - uint32_t dummy2;
> - uint64_t dummy3;
> - uint64_t dummy4;
> + __u64 dummy1;
> + __u64 offset;
> + __u32 size;
> + __u32 dummy2;
> + __u64 dummy3;
> + __u64 dummy4;
> };
>
> struct fuse_notify_prune_out {
> - uint32_t count;
> - uint32_t padding;
> - uint64_t spare;
> + __u32 count;
> + __u32 padding;
> + __u64 spare;
> };
>
> struct fuse_backing_map {
> - int32_t fd;
> - uint32_t flags;
> - uint64_t padding;
> + __s32 fd;
> + __u32 flags;
> + __u64 padding;
> };
>
> /* Device ioctls: */
> #define FUSE_DEV_IOC_MAGIC 229
> -#define FUSE_DEV_IOC_CLONE _IOR(FUSE_DEV_IOC_MAGIC, 0, uint32_t)
> +#define FUSE_DEV_IOC_CLONE _IOR(FUSE_DEV_IOC_MAGIC, 0, __u32)
> #define FUSE_DEV_IOC_BACKING_OPEN _IOW(FUSE_DEV_IOC_MAGIC, 1, \
> struct fuse_backing_map)
> -#define FUSE_DEV_IOC_BACKING_CLOSE _IOW(FUSE_DEV_IOC_MAGIC, 2, uint32_t)
> +#define FUSE_DEV_IOC_BACKING_CLOSE _IOW(FUSE_DEV_IOC_MAGIC, 2, __u32)
> #define FUSE_DEV_IOC_SYNC_INIT _IO(FUSE_DEV_IOC_MAGIC, 3)
>
> struct fuse_lseek_in {
> - uint64_t fh;
> - uint64_t offset;
> - uint32_t whence;
> - uint32_t padding;
> + __u64 fh;
> + __u64 offset;
> + __u32 whence;
> + __u32 padding;
> };
>
> struct fuse_lseek_out {
> - uint64_t offset;
> + __u64 offset;
> };
>
> struct fuse_copy_file_range_in {
> - uint64_t fh_in;
> - uint64_t off_in;
> - uint64_t nodeid_out;
> - uint64_t fh_out;
> - uint64_t off_out;
> - uint64_t len;
> - uint64_t flags;
> + __u64 fh_in;
> + __u64 off_in;
> + __u64 nodeid_out;
> + __u64 fh_out;
> + __u64 off_out;
> + __u64 len;
> + __u64 flags;
> };
>
> /* For FUSE_COPY_FILE_RANGE_64 */
> struct fuse_copy_file_range_out {
> - uint64_t bytes_copied;
> + __u64 bytes_copied;
> };
>
> #define FUSE_SETUPMAPPING_FLAG_WRITE (1ull << 0)
> #define FUSE_SETUPMAPPING_FLAG_READ (1ull << 1)
> struct fuse_setupmapping_in {
> /* An already open handle */
> - uint64_t fh;
> + __u64 fh;
> /* Offset into the file to start the mapping */
> - uint64_t foffset;
> + __u64 foffset;
> /* Length of mapping required */
> - uint64_t len;
> + __u64 len;
> /* Flags, FUSE_SETUPMAPPING_FLAG_* */
> - uint64_t flags;
> + __u64 flags;
> /* Offset in Memory Window */
> - uint64_t moffset;
> + __u64 moffset;
> };
>
> struct fuse_removemapping_in {
> /* number of fuse_removemapping_one follows */
> - uint32_t count;
> + __u32 count;
> };
>
> struct fuse_removemapping_one {
> /* Offset into the dax window start the unmapping */
> - uint64_t moffset;
> + __u64 moffset;
> /* Length of mapping required */
> - uint64_t len;
> + __u64 len;
> };
>
> #define FUSE_REMOVEMAPPING_MAX_ENTRY \
> (PAGE_SIZE / sizeof(struct fuse_removemapping_one))
>
> struct fuse_syncfs_in {
> - uint64_t padding;
> + __u64 padding;
> };
>
> /*
> @@ -1207,8 +1203,8 @@ struct fuse_syncfs_in {
> * fuse_secctx, name, context
> */
> struct fuse_secctx {
> - uint32_t size;
> - uint32_t padding;
> + __u32 size;
> + __u32 padding;
> };
>
> /*
> @@ -1218,8 +1214,8 @@ struct fuse_secctx {
> *
> */
> struct fuse_secctx_header {
> - uint32_t size;
> - uint32_t nr_secctx;
> + __u32 size;
> + __u32 nr_secctx;
> };
>
> /**
> @@ -1231,8 +1227,8 @@ struct fuse_secctx_header {
> * FUSE_MAX_NR_SECCTX
> */
> struct fuse_ext_header {
> - uint32_t size;
> - uint32_t type;
> + __u32 size;
> + __u32 type;
> };
>
> /**
> @@ -1241,8 +1237,8 @@ struct fuse_ext_header {
> * @groups: flexible array of group IDs
> */
> struct fuse_supp_groups {
> - uint32_t nr_groups;
> - uint32_t groups[];
> + __u32 nr_groups;
> + __u32 groups[];
> };
>
> /**
> @@ -1253,19 +1249,19 @@ struct fuse_supp_groups {
>
> /* Used as part of the fuse_uring_req_header */
> struct fuse_uring_ent_in_out {
> - uint64_t flags;
> + __u64 flags;
>
> /*
> * commit ID to be used in a reply to a ring request (see also
> * struct fuse_uring_cmd_req)
> */
> - uint64_t commit_id;
> + __u64 commit_id;
>
> /* size of user payload buffer */
> - uint32_t payload_sz;
> - uint32_t padding;
> + __u32 payload_sz;
> + __u32 padding;
>
> - uint64_t reserved;
> + __u64 reserved;
> };
>
> /**
> @@ -1298,14 +1294,14 @@ enum fuse_uring_cmd {
> * In the 80B command area of the SQE.
> */
> struct fuse_uring_cmd_req {
> - uint64_t flags;
> + __u64 flags;
>
> /* entry identifier for commits */
> - uint64_t commit_id;
> + __u64 commit_id;
>
> /* queue the command is for (queue index) */
> - uint16_t qid;
> - uint8_t padding[6];
> + __u16 qid;
> + __u8 padding[6];
> };
>
> #endif /* _LINUX_FUSE_H */
>
> ---
> base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
> change-id: 20251222-uapi-fuse-1acdfb5abf77
>
> Best regards,
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] fuse: uapi: use UAPI types
2025-12-22 21:16 ` Bernd Schubert
@ 2025-12-23 8:37 ` Thomas Weißschuh
2025-12-23 9:23 ` Arnd Bergmann
0 siblings, 1 reply; 6+ messages in thread
From: Thomas Weißschuh @ 2025-12-23 8:37 UTC (permalink / raw)
To: Bernd Schubert; +Cc: Miklos Szeredi, linux-fsdevel, linux-kernel, Arnd Bergmann
Hi Bernd,
On Mon, Dec 22, 2025 at 10:16:39PM +0100, Bernd Schubert wrote:
> On 12/22/25 09:06, Thomas Weißschuh wrote:
> > Using libc types and headers from the UAPI headers is problematic as it
> > introduces a dependency on a full C toolchain.
> >
> > Use the fixed-width integer types provided by the UAPI headers instead.
> >
> > Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
>
> I think that came up a couple of times already.
>
> https://lkml.org/lkml/2015/10/15/672
>
> Also see
> https://git.zx2c4.com/linux-rng/commit/include/uapi/linux/fuse.h?id=4c82456eeb4da081dd63dc69e91aa6deabd29e03&follow=1
Thanks for these pointers.
Looking at the linked commit 4c82456eeb4d ("fuse: fix type definitions in
uapi header"), it seems you were fine with custom typedefs/defines for
non-Linux targets. But the way it was done previously was problematic for
cross-compilation.
What about the following aproach:
#if defined(__KERNEL__)
#include <linux/types.h>
#elif defined(__linux__)
#include <linux/types.h>
#else
#include <stdint.h>
typedef uint32_t __u32;
...
#endif
(borrowed from include/uapi/drm/drm.h, the identical #if/#elif branches are
necessary for unifdef.
This works correctly when (cross-)compiling the kernel itself. It also uses
the standard UAPI types when used from Linux userspace and also works on
non-Linux userspace. And the header can still be copied into libfuse as is.
Thomas
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] fuse: uapi: use UAPI types
2025-12-23 8:37 ` Thomas Weißschuh
@ 2025-12-23 9:23 ` Arnd Bergmann
0 siblings, 0 replies; 6+ messages in thread
From: Arnd Bergmann @ 2025-12-23 9:23 UTC (permalink / raw)
To: Thomas Weißschuh, Bernd Schubert
Cc: Miklos Szeredi, linux-fsdevel, linux-kernel
On Tue, Dec 23, 2025, at 09:37, Thomas Weißschuh wrote:
> On Mon, Dec 22, 2025 at 10:16:39PM +0100, Bernd Schubert wrote:
>
> What about the following aproach:
>
> #if defined(__KERNEL__)
> #include <linux/types.h>
> #elif defined(__linux__)
> #include <linux/types.h>
> #else
> #include <stdint.h>
> typedef uint32_t __u32;
> ...
> #endif
>
> (borrowed from include/uapi/drm/drm.h, the identical #if/#elif branches are
> necessary for unifdef.
>
> This works correctly when (cross-)compiling the kernel itself. It also uses
> the standard UAPI types when used from Linux userspace and also works on
> non-Linux userspace. And the header can still be copied into libfuse as is.
Yes, I think that may be the best we can do here. I was wondering whether
The above can be simplified into '#if defined(__KERNEL__) || defined(__linux__'
but according to 00c9672606f7 ("drm: Untangle __KERNEL__ guards") it needs
to be two separate blocks.
Another header with the same problem is include/uapi/linux/coda.h,
which already has special cases for (at least) djgpp, cygwin and netbsd.
I have no idea if there is any hope of keeping that one generic and
while allowing it to be checked with nolibc. It looks like that one
has already diverged from the userspace version at
https://github.com/cmusatyalab/coda/blob/master/coda-src/kerndep/coda.h
which uses the c99 uint32_t instead of the BSD u_int32_t.
This hack got it to build with nolibc:
--- a/include/uapi/linux/coda.h
+++ b/include/uapi/linux/coda.h
@@ -114,6 +114,12 @@ typedef short int16_t;
typedef unsigned short u_int16_t;
typedef int int32_t;
typedef unsigned int u_int32_t;
+typedef long long int64_t;
+typedef unsigned long long u_int64_t;
+typedef u_int16_t u_short;
+typedef unsigned long u_long;
+typedef u_long ino_t;
+typedef void * caddr_t;
#endif
Arnd
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-12-23 9:24 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-22 8:06 [PATCH] fuse: uapi: use UAPI types Thomas Weißschuh
2025-12-22 8:54 ` Arnd Bergmann
2025-12-22 10:10 ` Thomas Weißschuh
2025-12-22 21:16 ` Bernd Schubert
2025-12-23 8:37 ` Thomas Weißschuh
2025-12-23 9:23 ` Arnd Bergmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox