Skip to contentSkip to conversation

add f_flags to struct statfs(64)

PATCH In review Christoph Hellwig 7 participants 16 messages Jun 26, 2010 – Jun 29, 2010

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 2/2 add f_flags to struct statfs(64)

Add a flags field to help glibc implementing statvfs(3) efficiently.

We copy the flag values from glibc, and add a new ST_VALID flag to denote that f_flags is implemented.

arch/mips/include/asm/statfs.h +8 -4
Index: linux-2.6/arch/mips/include/asm/statfs.h
===================================================================
@@ -33,7 +33,8 @@ struct statfs {
 	/* Linux specials */
 	__kernel_fsid_t	f_fsid;
 	long		f_namelen;
-	long		f_spare[6];
+	long		f_flags;
+	long		f_spare[5];
 };
 
 #if (_MIPS_SIM == _MIPS_SIM_ABI32) || (_MIPS_SIM == _MIPS_SIM_NABI32)
@@ -53,7 +54,8 @@ struct statfs64 {
 	__u64	f_bavail;
 	__kernel_fsid_t f_fsid;
 	__u32	f_namelen;
-	__u32	f_spare[6];
+	__u32	f_flags;
+	__u32	f_spare[5];
 };
 
 #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
@@ -73,7 +75,8 @@ struct statfs64 {			/* Same as struct st
 	/* Linux specials */
 	__kernel_fsid_t	f_fsid;
 	long		f_namelen;
-	long		f_spare[6];
+	long		f_flags;
+	long		f_spare[5];
 };
 
 struct compat_statfs64 {
@@ -88,7 +91,8 @@ struct compat_statfs64 {
 	__u64	f_bavail;
 	__kernel_fsid_t f_fsid;
 	__u32	f_namelen;
-	__u32	f_spare[6];
+	__u32	f_flags;
+	__u32	f_spare[5];
 };
 
 #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
arch/s390/include/asm/statfs.h +6 -3
Index: linux-2.6/arch/s390/include/asm/statfs.h
===================================================================
@@ -33,7 +33,8 @@ struct statfs {
 	__kernel_fsid_t f_fsid;
 	int  f_namelen;
 	int  f_frsize;
-	int  f_spare[5];
+	int  f_flags;
+	int  f_spare[4];
 };
 
 struct statfs64 {
@@ -47,7 +48,8 @@ struct statfs64 {
 	__kernel_fsid_t f_fsid;
 	int  f_namelen;
 	int  f_frsize;
-	int  f_spare[5];
+	int  f_flags;
+	int  f_spare[4];
 };
 
 struct compat_statfs64 {
@@ -61,7 +63,8 @@ struct compat_statfs64 {
 	__kernel_fsid_t f_fsid;
 	__u32 f_namelen;
 	__u32 f_frsize;
-	__u32 f_spare[5];
+	__u32 f_flags;
+	__u32 f_spare[4];
 };
 
 #endif /* __s390x__ */
include/asm-generic/statfs.h +5 -2
Index: linux-2.6/include/asm-generic/statfs.h
===================================================================
@@ -33,7 +33,8 @@ struct statfs {
 	__kernel_fsid_t f_fsid;
 	__statfs_word f_namelen;
 	__statfs_word f_frsize;
-	__statfs_word f_spare[5];
+	__statfs_word f_flags;
+	__statfs_word f_spare[4];
 };
 
 /*
@@ -55,7 +56,8 @@ struct statfs64 {
 	__kernel_fsid_t f_fsid;
 	__statfs_word f_namelen;
 	__statfs_word f_frsize;
-	__statfs_word f_spare[5];
+	__statfs_word f_flags;
+	__statfs_word f_spare[4];
 } ARCH_PACK_STATFS64;
 
 /* 
@@ -77,6 +79,7 @@ struct compat_statfs64 {
 	__kernel_fsid_t f_fsid;
 	__u32 f_namelen;
 	__u32 f_frsize;
+	__u32 f_flags[5];
 	__u32 f_spare[5];
 } ARCH_PACK_COMPAT_STATFS64;
 
include/linux/statfs.h +23 -2
Index: linux-2.6/include/linux/statfs.h
===================================================================
@@ -2,7 +2,6 @@
 #define _LINUX_STATFS_H
 
 #include <linux/types.h>
-
 #include <asm/statfs.h>
 
 struct kstatfs {
@@ -16,7 +15,29 @@ struct kstatfs {
 	__kernel_fsid_t f_fsid;
 	long f_namelen;
 	long f_frsize;
-	long f_spare[5];
+	long f_flags;
+	long f_spare[4];
 };
 
+/*
+ * Definitions for the flag in f_flag.
+ *
+ * Generally these flags are equivalent to the MS_ flags used in the mount
+ * ABI.  The exception is ST_VALID which has the same value as MS_REMOUNT
+ * which doesn't make any sense for statfs.
+ */
+#define ST_RDONLY	0x0001	/* mount read-only */
+#define ST_NOSUID	0x0002	/* ignore suid and sgid bits */
+#define ST_NODEV	0x0004	/* disallow access to device special files */
+#define ST_NOEXEC	0x0008	/* disallow program execution */
+#define ST_SYNCHRONOUS	0x0010	/* writes are synced at once */
+#define ST_VALID	0x0020	/* f_flags support is implemented */
+#define ST_MANDLOCK	0x0040	/* allow mandatory locks on an FS */
+/* 0x0080 used for ST_WRITE in glibc */
+/* 0x0100 used for ST_APPEND in glibc */
+/* 0x0200 used for ST_IMMUTABLE in glibc */
+#define ST_NOATIME	0x0400	/* do not update access times */
+#define ST_NODIRATIME	0x0800	/* do not update directory access times */
+#define ST_RELATIME	0x1000	/* update atime relative to mtime/ctime */
+
 #endif
fs/statfs.c +37 -1
Index: linux-2.6/fs/statfs.c
===================================================================
@@ -2,11 +2,40 @@
 #include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/file.h>
+#include <linux/mount.h>
 #include <linux/namei.h>
 #include <linux/statfs.h>
 #include <linux/security.h>
 #include <linux/uaccess.h>
 
+static int calculate_f_flags(struct vfsmount *mnt)
+{
+	struct super_block *sb = mnt->mnt_sb;
+	long flags = ST_VALID;
+
+	if (mnt->mnt_flags & MNT_READONLY)
+		flags |= ST_RDONLY;
+	if (mnt->mnt_flags & MNT_NOSUID)
+		flags |= ST_NOSUID;
+	if (mnt->mnt_flags & MNT_NODEV)
+		flags |= ST_NODEV;
+	if (mnt->mnt_flags & MNT_NOEXEC)
+		flags |= ST_NOEXEC;
+	if (mnt->mnt_flags & MNT_NOATIME)
+		flags |= ST_NOATIME;
+	if (mnt->mnt_flags & MNT_NODIRATIME)
+		flags |= ST_NODIRATIME;
+	if (mnt->mnt_flags & MNT_RELATIME)
+		flags |= ST_RELATIME;
+
+	if (sb->s_flags & MS_SYNCHRONOUS)
+		flags |= ST_SYNCHRONOUS;
+	if (sb->s_flags & MS_MANDLOCK)
+		flags |= ST_MANDLOCK;
+
+	return flags;
+}
+
 int statfs_by_dentry(struct dentry *dentry, struct kstatfs *buf)
 {
 	int retval;
@@ -26,7 +55,12 @@ int statfs_by_dentry(struct dentry *dent
 
 int vfs_statfs(struct path *path, struct kstatfs *buf)
 {
-	return statfs_by_dentry(path->dentry, buf);
+	int error;
+
+	error = statfs_by_dentry(path->dentry, buf);
+	if (!error)
+		buf->f_flags = calculate_f_flags(path->mnt);
+	return error;
 }
 EXPORT_SYMBOL(vfs_statfs);
 
@@ -69,6 +103,7 @@ static int do_statfs_native(struct path
 		buf->f_fsid = st.f_fsid;
 		buf->f_namelen = st.f_namelen;
 		buf->f_frsize = st.f_frsize;
+		buf->f_flags = st.f_flags;
 		memset(buf->f_spare, 0, sizeof(buf->f_spare));
 	}
 	return 0;
@@ -96,6 +131,7 @@ static int do_statfs64(struct path *path
 		buf->f_fsid = st.f_fsid;
 		buf->f_namelen = st.f_namelen;
 		buf->f_frsize = st.f_frsize;
+		buf->f_flags = st.f_flags;
 		memset(buf->f_spare, 0, sizeof(buf->f_spare));
 	}
 	return 0;
Acked-by on v1 2/2
#1 lore raw
Quoted 4 lines · Christoph Hellwig

Add a flags field to help glibc implementing statvfs(3) efficiently.

We copy the flag values from glibc, and add a new ST_VALID flag to denote that f_flags is implemented.

Thanks.

Is f_favail important enough to add as well?

#2 lore raw
Quoted 1 line · Nick Piggin

Is f_favail important enough to add as well?

As Uli if he needs it. Adding real support for it won't be quite as easy as adding f_flags, as the individual filesystems would need to support it. And those not derived from FFS generally don't have any different accounting of inodes allocates vs inodes allocated to non-root user. In fact faking up any kind of free inodes values is already difficult enough for modern filesystems.

#3 lore raw
Quoted 11 lines · Christoph Hellwig
Quoted 1 line · Nick Piggin

Is f_favail important enough to add as well?

As Uli if he needs it. Adding real support for it won't be quite as easy as adding f_flags, as the individual filesystems would need to support it.

And those not derived from FFS generally don't
have any different accounting of inodes allocates vs inodes allocated to non-root user. In fact faking up any kind of free inodes values is already difficult enough for modern filesystems.

Yeah, quite likely it is not worth using up another field for this, and instead the statvfs Linux man page should be updated instead.

#4 lore raw
In reply to Christoph Hellwig
Quoted 4 lines · On Sat, 26 Jun 2010 11:35:07 +0200 Christoph Hellwig <[email protected]> wrote:

Add a flags field to help glibc implementing statvfs(3) efficiently.

We copy the flag values from glibc, and add a new ST_VALID flag to denote that f_flags is implemented.

Hi Christoph,
while we are adding flags to statfs, I wonder if it might be possible to do something to make f_fsid more useful - particularly for nfs-utils.

Currently some filesystems (e.g. VFAT) set f_fsid based on the device that the filesystem is mounted from, while others (e.g. ext3) set f_fsid based on the filesystem itself (i.e. from the UUID stored in the superblock).

This makes f_fsid not generally usable to make the filesystem part of a filehandle, as we really don't want to based it in the device if at all
possible. This is particularly frustrating as for btrfs, f_fsid is the
only way to differentiate between subvolumes.

If we could have a flag "ST_FSID_STABLE" (or similar) which indicates that the f_fsid is known to be stable across device renames, then I could remove some special casing that was recently added to nfs-utils for btrfs (or at least deprecate it).

And if it was acceptable to use a couple more of the 'spares' to provide a full 128bit fsid rather than just a 64bit one, that would be even better. But I'm not sure it is worth it (64bits is still quite a lot).

Thanks,
NeilBrown

Quoted 235 lines

Index: linux-2.6/arch/mips/include/asm/statfs.h
===================================================================

arch/mips/include/asm/statfs.h +8 -4
@@ -33,7 +33,8 @@ struct statfs {
 	/* Linux specials */
 	__kernel_fsid_t	f_fsid;
 	long		f_namelen;
-	long		f_spare[6];
+	long		f_flags;
+	long		f_spare[5];
 };
 
 #if (_MIPS_SIM == _MIPS_SIM_ABI32) || (_MIPS_SIM == _MIPS_SIM_NABI32)
@@ -53,7 +54,8 @@ struct statfs64 {
 	__u64	f_bavail;
 	__kernel_fsid_t f_fsid;
 	__u32	f_namelen;
-	__u32	f_spare[6];
+	__u32	f_flags;
+	__u32	f_spare[5];
 };
 
 #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
@@ -73,7 +75,8 @@ struct statfs64 {			/* Same as struct st
 	/* Linux specials */
 	__kernel_fsid_t	f_fsid;
 	long		f_namelen;
-	long		f_spare[6];
+	long		f_flags;
+	long		f_spare[5];
 };
 
 struct compat_statfs64 {
@@ -88,7 +91,8 @@ struct compat_statfs64 {
 	__u64	f_bavail;
 	__kernel_fsid_t f_fsid;
 	__u32	f_namelen;
-	__u32	f_spare[6];
+	__u32	f_flags;
+	__u32	f_spare[5];
 };
 
 #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */

Index: linux-2.6/arch/s390/include/asm/statfs.h
===================================================================

arch/s390/include/asm/statfs.h +6 -3
@@ -33,7 +33,8 @@ struct statfs {
 	__kernel_fsid_t f_fsid;
 	int  f_namelen;
 	int  f_frsize;
-	int  f_spare[5];
+	int  f_flags;
+	int  f_spare[4];
 };
 
 struct statfs64 {
@@ -47,7 +48,8 @@ struct statfs64 {
 	__kernel_fsid_t f_fsid;
 	int  f_namelen;
 	int  f_frsize;
-	int  f_spare[5];
+	int  f_flags;
+	int  f_spare[4];
 };
 
 struct compat_statfs64 {
@@ -61,7 +63,8 @@ struct compat_statfs64 {
 	__kernel_fsid_t f_fsid;
 	__u32 f_namelen;
 	__u32 f_frsize;
-	__u32 f_spare[5];
+	__u32 f_flags;
+	__u32 f_spare[4];
 };
 
 #endif /* __s390x__ */

Index: linux-2.6/include/asm-generic/statfs.h
===================================================================

include/asm-generic/statfs.h +5 -2
@@ -33,7 +33,8 @@ struct statfs {
 	__kernel_fsid_t f_fsid;
 	__statfs_word f_namelen;
 	__statfs_word f_frsize;
-	__statfs_word f_spare[5];
+	__statfs_word f_flags;
+	__statfs_word f_spare[4];
 };
 
 /*
@@ -55,7 +56,8 @@ struct statfs64 {
 	__kernel_fsid_t f_fsid;
 	__statfs_word f_namelen;
 	__statfs_word f_frsize;
-	__statfs_word f_spare[5];
+	__statfs_word f_flags;
+	__statfs_word f_spare[4];
 } ARCH_PACK_STATFS64;
 
 /* 
@@ -77,6 +79,7 @@ struct compat_statfs64 {
 	__kernel_fsid_t f_fsid;
 	__u32 f_namelen;
 	__u32 f_frsize;
+	__u32 f_flags[5];
 	__u32 f_spare[5];
 } ARCH_PACK_COMPAT_STATFS64;
 

Index: linux-2.6/include/linux/statfs.h
===================================================================

include/linux/statfs.h +23 -2
@@ -2,7 +2,6 @@
 #define _LINUX_STATFS_H
 
 #include <linux/types.h>
-
 #include <asm/statfs.h>
 
 struct kstatfs {
@@ -16,7 +15,29 @@ struct kstatfs {
 	__kernel_fsid_t f_fsid;
 	long f_namelen;
 	long f_frsize;
-	long f_spare[5];
+	long f_flags;
+	long f_spare[4];
 };
 
+/*
+ * Definitions for the flag in f_flag.
+ *
+ * Generally these flags are equivalent to the MS_ flags used in the mount
+ * ABI.  The exception is ST_VALID which has the same value as MS_REMOUNT
+ * which doesn't make any sense for statfs.
+ */
+#define ST_RDONLY	0x0001	/* mount read-only */
+#define ST_NOSUID	0x0002	/* ignore suid and sgid bits */
+#define ST_NODEV	0x0004	/* disallow access to device special files */
+#define ST_NOEXEC	0x0008	/* disallow program execution */
+#define ST_SYNCHRONOUS	0x0010	/* writes are synced at once */
+#define ST_VALID	0x0020	/* f_flags support is implemented */
+#define ST_MANDLOCK	0x0040	/* allow mandatory locks on an FS */
+/* 0x0080 used for ST_WRITE in glibc */
+/* 0x0100 used for ST_APPEND in glibc */
+/* 0x0200 used for ST_IMMUTABLE in glibc */
+#define ST_NOATIME	0x0400	/* do not update access times */
+#define ST_NODIRATIME	0x0800	/* do not update directory access times */
+#define ST_RELATIME	0x1000	/* update atime relative to mtime/ctime */
+
 #endif

Index: linux-2.6/fs/statfs.c
===================================================================

fs/statfs.c +37 -2
@@ -2,11 +2,40 @@
 #include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/file.h>
+#include <linux/mount.h>
 #include <linux/namei.h>
 #include <linux/statfs.h>
 #include <linux/security.h>
 #include <linux/uaccess.h>
 
+static int calculate_f_flags(struct vfsmount *mnt)
+{
+	struct super_block *sb = mnt->mnt_sb;
+	long flags = ST_VALID;
+
+	if (mnt->mnt_flags & MNT_READONLY)
+		flags |= ST_RDONLY;
+	if (mnt->mnt_flags & MNT_NOSUID)
+		flags |= ST_NOSUID;
+	if (mnt->mnt_flags & MNT_NODEV)
+		flags |= ST_NODEV;
+	if (mnt->mnt_flags & MNT_NOEXEC)
+		flags |= ST_NOEXEC;
+	if (mnt->mnt_flags & MNT_NOATIME)
+		flags |= ST_NOATIME;
+	if (mnt->mnt_flags & MNT_NODIRATIME)
+		flags |= ST_NODIRATIME;
+	if (mnt->mnt_flags & MNT_RELATIME)
+		flags |= ST_RELATIME;
+
+	if (sb->s_flags & MS_SYNCHRONOUS)
+		flags |= ST_SYNCHRONOUS;
+	if (sb->s_flags & MS_MANDLOCK)
+		flags |= ST_MANDLOCK;
+
+	return flags;
+}
+
 int statfs_by_dentry(struct dentry *dentry, struct kstatfs *buf)
 {
 	int retval;
@@ -26,7 +55,12 @@ int statfs_by_dentry(struct dentry *dent
 
 int vfs_statfs(struct path *path, struct kstatfs *buf)
 {
-	return statfs_by_dentry(path->dentry, buf);
+	int error;
+
+	error = statfs_by_dentry(path->dentry, buf);
+	if (!error)
+		buf->f_flags = calculate_f_flags(path->mnt);
+	return error;
 }
 EXPORT_SYMBOL(vfs_statfs);
 
@@ -69,6 +103,7 @@ static int do_statfs_native(struct path
 		buf->f_fsid = st.f_fsid;
 		buf->f_namelen = st.f_namelen;
 		buf->f_frsize = st.f_frsize;
+		buf->f_flags = st.f_flags;
 		memset(buf->f_spare, 0, sizeof(buf->f_spare));
 	}
 	return 0;
@@ -96,6 +131,7 @@ static int do_statfs64(struct path *path
 		buf->f_fsid = st.f_fsid;
 		buf->f_namelen = st.f_namelen;
 		buf->f_frsize = st.f_frsize;
+		buf->f_flags = st.f_flags;
 		memset(buf->f_spare, 0, sizeof(buf->f_spare));
 	}
 	return 0;
--

To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#5 lore raw
Quoted 2 lines · Neil Brown

while we are adding flags to statfs, I wonder if it might be possible to do something to make f_fsid more useful - particularly for nfs-utils.

f_fsid really isn't suitable for that. Even filesystems that had UUIDs since the dawn of days don't always store it there, e.g. XFS. I wish people had left it with that, but the recent rush to stupidly overload it with an uuid light and using it in nfs-tools didn't help.

Having an API to expose a UUID to userspace would be useful, but f_fsid isn't it. If we'll have to add real statvfs syscalls we can add an f_uuid field, but I'd rather not use up the reamining space in the statfs structure for that.

#6 lore raw
In reply to Christoph Hellwig

Hi Christoph,

Quoted 7 lines · Christoph Hellwig

Add a flags field to help glibc implementing statvfs(3) efficiently.

We copy the flag values from glibc, and add a new ST_VALID flag to denote that f_flags is implemented.

<snip>

Quoted 25 lines

Index: linux-2.6/include/asm-generic/statfs.h
===================================================================

include/asm-generic/statfs.h +4 -2
@@ -33,7 +33,8 @@ struct statfs {
  	__kernel_fsid_t f_fsid;
  	__statfs_word f_namelen;
  	__statfs_word f_frsize;
-	__statfs_word f_spare[5];
+	__statfs_word f_flags;
+	__statfs_word f_spare[4];
  };
 
  /*
@@ -55,7 +56,8 @@ struct statfs64 {
  	__kernel_fsid_t f_fsid;
  	__statfs_word f_namelen;
  	__statfs_word f_frsize;
-	__statfs_word f_spare[5];
+	__statfs_word f_flags;
+	__statfs_word f_spare[4];
  } ARCH_PACK_STATFS64;
 
  /*

include/asm-generic/statfs.h struct compat_statfs64 { · line 84

Quoted 6 lines
include/asm-generic/statfs.h +1 -0
@@ -77,6 +79,7 @@ struct compat_statfs64 {
  	__kernel_fsid_t f_fsid;
  	__u32 f_namelen;
  	__u32 f_frsize;
+	__u32 f_flags[5];
  	__u32 f_spare[5];
  } ARCH_PACK_COMPAT_STATFS64;

This is a typo?

Regards,
Tao

#7 lore raw
Quoted 4 lines · Tao Ma

include/asm-generic/statfs.h struct compat_statfs64 { · line 84

Quoted 3 lines
include/asm-generic/statfs.h +1 -0
+	__u32 f_flags[5];
 	__u32 f_spare[5];
 } ARCH_PACK_COMPAT_STATFS64;

This is a typo?

Yes, it is.

#8 lore raw
In reply to Christoph Hellwig
Quoted 2 lines · Christoph Hellwig

We copy the flag values from glibc, and add a new ST_VALID flag to denote that f_flags is implemented.

Adding ST_VALID is only of marginal use, IMHO. If we are worried about this field being filled with garbage, then a single bit still has a 50% chance of being set.

When there was a transition to binary flags in the mount(2) API, we had a full 16-bit magic value (0xC0ED0000, IIRC) in the high bits to verify the validity of the low 16-bit flags. Then, a couple years later, when all of the tools and kernels were handling the binary flags properly the 16-bit magic was removed and we could use the full 32-bit value.

I would advocate at least an 8-bit magic value, if there is a concern about this field not always being 0-filled on older kernels, or not using any ST_VALID flag at all, if it was always zero-filled in the past.

Cheers, Andreas

#9 lore raw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 4 lines · Andreas Dilger

I would advocate at least an 8-bit magic value, if there is a concern about this field not always being 0-filled on older kernels, or not using any ST_VALID flag at all, if it was always zero-filled in the past.

Did anyone go back and check which kernel versions didn't clear the spare fields (if any)?

Instead of using a magic number which doesn't provide 100% security in that case and steals a number of bits which might be needed in future I rather see a new syscall. The new {,f}statfs would be an alias for the old one, exactly the same implementation. With this it is much safer to check for the new kernel behavior. In future this isn't necessary since from point on it is guaranteed that the spare bits are zeroed.

- --
➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖ -----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.14 (GNU/Linux)

iEYEARECAAYFAkwo/ZgACgkQ2ijCOnn/RHSdVQCgzgHQj5A3/MLSYMbxX2xotoye aPsAnRzGEK0pz7LYQ9mIYUHa/upoFuoS
=3oan
-----END PGP SIGNATURE-----
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#10 lore raw
Quoted 2 lines · Ulrich Drepper

Did anyone go back and check which kernel versions didn't clear the spare fields (if any)?

I haven't had a chance to do so (out of town for the weekend), so before we talk of a new system call I'd prefer to check that it is actually needed.

Cheers, Andreas

#11 lore raw
In reply to Ulrich Drepper
Quoted 8 lines · Ulrich Drepper

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 4 lines · Andreas Dilger

I would advocate at least an 8-bit magic value, if there is a concern about this field not always being 0-filled on older kernels, or not using any ST_VALID flag at all, if it was always zero-filled in the past.

ST_VALID is required to differentiate between no flags, and flags field unsupported of course.

Quoted 2 lines

Did anyone go back and check which kernel versions didn't clear the spare fields (if any)?

At least from 2.4.0 does memset it. 2.2.26 does not. Can you live with that?

#12 lore raw
Quoted 4 lines · Nick Piggin
Quoted 3 lines · Ulrich Drepper

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 8 lines
Quoted 5 lines · Andreas Dilger
Quoted 4 lines

I would advocate at least an 8-bit magic value, if there is a concern about this field not always being 0-filled on older kernels, or not using any ST_VALID flag at all, if it was always zero-filled in the past.

ST_VALID is required to differentiate between no flags, and flags field unsupported of course.

Yes, that was my intention for it.

Quoted 5 lines
Quoted 2 lines

spare fields (if any)?

At least from 2.4.0 does memset it. 2.2.26 does not. Can you live with that?

The spare fields in struct statfs have been zeroed since 2.3.99pre3-8, before that they were set to a pattern of 0xff.

#13 lore raw
In reply to Nick Piggin

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 2 lines · Nick Piggin

ST_VALID is required to differentiate between no flags, and flags field unsupported of course.

Not needed if a new syscall would be used.

Quoted 2 lines

At least from 2.4.0 does memset it. 2.2.26 does not. Can you live with that?

We still support building glibc for everything from linux 2.0 on, at least for x86. I really have no idea whether such old kernels are still in use and if yes, whether userland gets updated. I wouldn't have a problem with bumping the minimum required kernel version.

- --
➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖ -----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.14 (GNU/Linux)

iEYEARECAAYFAkwpw/kACgkQ2ijCOnn/RHT02gCcCOGJj/fr/WCHJpuJ8CYVMKRu KhwAoKXX7L5sDXTk8g6CZdIHL0y7S+i4
=tlZM
-----END PGP SIGNATURE-----
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#14 lore raw
Quoted 8 lines · Ulrich Drepper

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 2 lines · Nick Piggin

ST_VALID is required to differentiate between no flags, and flags field unsupported of course.

Not needed if a new syscall would be used.

True, but we have the spare fields.

Quoted 7 lines
Quoted 2 lines

At least from 2.4.0 does memset it. 2.2.26 does not. Can you live with that?

We still support building glibc for everything from linux 2.0 on, at least for x86. I really have no idea whether such old kernels are still in use and if yes, whether userland gets updated. I wouldn't have a problem with bumping the minimum required kernel version.

I guess most would assume a 2.6 kernel nowadays? With either the new syscall or Christoph's patch, you need to keep the fallback around too.

#15 lore raw
In reply to Ulrich Drepper
Quoted 8 lines · Ulrich Drepper

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 2 lines · Nick Piggin

ST_VALID is required to differentiate between no flags, and flags field unsupported of course.

Not needed if a new syscall would be used.

True. But if we add a new syscall anyway I'd rather implement the glibc statvfs64 structure directly. The gives filesystem which really want to a chance to implement f_favail, and we could also store the full uuid in the f_spare fields now that we have more space.