From: Neil Brown <neilb@suse.de>
To: Christoph Hellwig <hch@lst.de>
Cc: viro@zeniv.linux.org.uk, drepper@redhat.com,
linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 2/2] add f_flags to struct statfs(64)
Date: Sat, 26 Jun 2010 22:55:47 +1000 [thread overview]
Message-ID: <20100626225547.52e76eb2@notabene.brown> (raw)
In-Reply-To: <20100626093507.GB26371@lst.de>
On Sat, 26 Jun 2010 11:35:07 +0200
Christoph Hellwig <hch@lst.de> 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
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
>
> Index: linux-2.6/arch/mips/include/asm/statfs.h
> ===================================================================
> --- linux-2.6.orig/arch/mips/include/asm/statfs.h 2010-06-26 09:26:56.000000000 +0200
> +++ linux-2.6/arch/mips/include/asm/statfs.h 2010-06-26 10:00:33.864004297 +0200
> @@ -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
> ===================================================================
> --- linux-2.6.orig/arch/s390/include/asm/statfs.h 2010-06-26 09:26:56.000000000 +0200
> +++ linux-2.6/arch/s390/include/asm/statfs.h 2010-06-26 10:00:33.864004297 +0200
> @@ -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
> ===================================================================
> --- linux-2.6.orig/include/asm-generic/statfs.h 2010-06-26 09:26:56.000000000 +0200
> +++ linux-2.6/include/asm-generic/statfs.h 2010-06-26 10:00:33.868047809 +0200
> @@ -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
> ===================================================================
> --- linux-2.6.orig/include/linux/statfs.h 2010-06-26 09:26:56.000000000 +0200
> +++ linux-2.6/include/linux/statfs.h 2010-06-26 10:19:53.609016448 +0200
> @@ -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
> ===================================================================
> --- linux-2.6.orig/fs/statfs.c 2010-06-26 09:40:08.000000000 +0200
> +++ linux-2.6/fs/statfs.c 2010-06-26 10:24:27.674272979 +0200
> @@ -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 majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2010-06-26 12:56 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-26 9:35 [PATCH 2/2] add f_flags to struct statfs(64) Christoph Hellwig
2010-06-26 9:56 ` Nick Piggin
2010-06-26 13:09 ` Christoph Hellwig
2010-06-26 13:16 ` Nick Piggin
2010-06-26 12:55 ` Neil Brown [this message]
2010-06-26 13:12 ` Christoph Hellwig
2010-06-27 7:55 ` Tao Ma
2010-06-27 9:20 ` Christoph Hellwig
2010-06-28 18:43 ` Andreas Dilger
2010-06-28 19:52 ` Ulrich Drepper
2010-06-28 20:07 ` Andreas Dilger
2010-06-29 8:57 ` Nick Piggin
2010-06-29 9:25 ` Christoph Hellwig
2010-06-29 9:59 ` Ulrich Drepper
2010-06-29 11:05 ` Nick Piggin
2010-06-29 12:57 ` Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2010-07-07 16:53 Christoph Hellwig
2010-07-07 17:11 ` Ulrich Drepper
2010-07-07 17:31 ` Linus Torvalds
2010-07-07 17:33 ` Christoph Hellwig
2010-07-07 17:55 ` Miklos Szeredi
2010-07-07 18:06 ` Linus Torvalds
2010-07-07 18:50 ` Nick Piggin
2010-07-07 19:30 ` Linus Torvalds
2010-07-18 6:41 ` Christoph Hellwig
2010-07-18 17:03 ` Linus Torvalds
2010-07-07 18:16 ` Nick Piggin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100626225547.52e76eb2@notabene.brown \
--to=neilb@suse.de \
--cc=drepper@redhat.com \
--cc=hch@lst.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.