All of lore.kernel.org
 help / color / mirror / Atom feed
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


  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.