Re: [PATCH v4 2/3] tools/nolibc: Add statfs()

From: Thomas Weißschuh

Date: Thu May 14 2026 - 10:33:34 EST


On 2026-05-14 22:05:37+0900, Daniel Palmer wrote:
> Hi Thomas,
>
> On Thu, 14 May 2026 at 21:40, Thomas Weißschuh <linux@xxxxxxxxxxxxxx> wrote:
> >
> > On 2026-05-14 21:28:19+0900, Daniel Palmer wrote:
> > > On Thu, 14 May 2026 at 20:42, Thomas Weißschuh <linux@xxxxxxxxxxxxxx> wrote:
> > > > > +/* Some preprocessor hackery to get struct statfs to
> > > > > + * always be the 64bit one.
> > > > > + */
> > > > > +#define statfs __nolibc_kernel_statfs
> > > > > +#define statfs64 __nolibc_kernel_statfs64
> > > > > +#include <asm/statfs.h>
> > > > > +#undef statfs
> > > > > +#undef statfs64
> > > > > +
> > > > > +#ifdef __NR_statfs64
> > > > > +#define statfs __nolibc_kernel_statfs64
> > > > > +#else
> > > > > +#define statfs __nolibc_kernel_statfs
> > > > > +#endif
> > > >
> > > > This #define can wreak havoc in user code.
> > > > While it would be nice to have statfs() in nolibc,
> > > > I don't see a proper way to work with the current UAPI header.
> > > > Can we do without statfs() for now?

(...)

> Do you think there is a way to do statfs() properly in the future? I
> actually started using it in a mini (~64KB) userland I am building so
> I can get Linux to boot in 3.5MB of RAM.

What exactly do you need out of statfs?

> I considered just copying the 64bit version of the statfs struct into
> nolibc so we don't need to use the UAPI header but it seemed like MIPS
> has a bunch of different versions of it so it wouldn't work on MIPS.

I think we can do something like this:

#define statfs __nolibc_kernel_statfs
#define statfs64 __nolibc_kernel_statfs64
#include <asm/statfs.h>
#undef statfs
#undef statfs64

#define __nolibc_cloned_member(_orig_struct, _name) \
__nolibc_typeof_member(_orig_struct, _name) _name __nolibc_alignof_member(_orig_struct, _name)

struct statfs {
__nolibc_cloned_member(struct __nolibc_kernel_statfs64, f_type);
__nolibc_cloned_member(struct __nolibc_kernel_statfs64, f_bsize);
...
};

And then in nolibc-test add a bunch of assertions which makes sure that
the structures are actually compatible. (Fields have the same offsets
and the structures are the same size). This way we can reuse the
structure definitions from the UAPI definitions but avoid the macro
pollution.

We do something similar for the time types, too.


Thomas