[PATCH 0/3] Extended file stat system call [ver #2]

J. Bruce Fields bfields at fieldses.org
Thu Nov 14 12:19:54 MST 2013


On Tue, Nov 12, 2013 at 06:41:27PM +0000, David Howells wrote:
> 
> Implement a new system call to provide an extended and further extensible stat
> function.
> 
> =======
> CHANGES
> =======
> 
>  (*) Added an optional auxiliary data buffer pointer argument to sys_statxat()
>      and moved some of the stuff into it.
> 
>  (*) Discarded "has an ACL info flag" for now.
> 
>  (*) AFS doesn't need to set time granularity itself as the default is 1s
>      anyway.
> 
> 
> ===========
> DESCRIPTION
> ===========
> 
> The second of the associated patches is the main patch that provides this new
> system call:
> 
> 	long ret = statxat(int dfd,
> 			   const char *filename,
> 			   unsigned atflag,
> 			   unsigned mask,
> 			   struct statx *buffer,
> 			   struct statx_auxinfo *auxinfo);
> 
> which is more fully documented in the main patch's description.
> 
> This new stat function provides a number of useful features, in summary:
> 
>  (1) More information: creation time, data version number, flags/attributes.
>      A subset of these is available through a number of filesystems (such as
>      CIFS, NFS, AFS, Ext4 and BTRFS).
> 
>  (2) Lightweight stat: Ask for just those details of interest, and allow a
>      netfs (such as NFS) to approximate anything not of interest, possibly
>      without going to the server.
> 
>  (3) Heavyweight stat: Force a netfs to go to the server, even if it thinks its
>      cached attributes are up to date.

I'm not following the lightweight/heavyweight thing: so this is encoded
in the mask?  So it's just a 1-bit value per attribute?  Because it
seems like there are potentially 3 different behaviors:

	- definitely get this from the server now even if you normally
	  wouldn't.
	- definitely don't go to the server even if you know your cache
	  is stale.
	- do whatever you'd normally do (check how old your cache is or
	  whatever).

I guess this is what you're asking in "considerations" below.

--b.

>  (4) Allow the filesystem to indicate what it can/cannot provide: A filesystem
>      can now say it doesn't support a standard stat feature if that isn't
>      available.
> 
>  (5) Make the fields a consistent size on all arches, and make them large.
> 
>  (6) Can be extended by using more request flags and appending further data
>      after the end of the standard return data.
> 
> Note that no lstat() equivalent is required as that can be implemented through
> statxat() with atflag == 0.  There is also no fstat() equivalent as that can be
> implemented through statxat() with filename == NULL and the relevant fd passed
> as dfd.
> 
> 
> =======
> PATCHES
> =======
> 
> Patch 1 introduces IOC flags for Windows Hidden, Archive and System attributes.
> 
> Patch 2 defines the statxat() system call.
> 
> Patch 3 implements extended stat facilities for AFS.  Other fs patches to go
> through their respective trees once the core is in.
> 
> 
> ==============
> CONSIDERATIONS
> ==============
> 
> Should the default for a network fs be to do an unconditional (heavyweight)
> stat with a flag to suppress going to the server to update the locally held
> attributes and flushing pending writebacks?
> 
> Is it useful to pass the volume ID out?  Or should statfs() be used for this?
> 
> Is there anything else I can usefully add at the moment?
> 
> 
> ==========
> TO BE DONE
> ==========
> 
> Autofs, ntfs, btrfs, ...
> 
> I should perhaps use u8/u32/u64 rather than uint8/32/64_t.
> 
> Handle remote filesystems being offline and indicate this with
> STATX_INFO_OFFLINE.
> 
> Should a "light stat" be explicitly requested by its own AT_ flag?
> 
> 
> =======
> TESTING
> =======
> 
> There's a test program attached to the description for the main patch.  It can
> be run as follows:
> [root at andromeda tmp]# ./xstat -R /mnt/foo
> 
> 	xstat(/mnt/foo) = 0
> 	0000: 000081a40000ffef 0000000000000001 0000020000000000 0000100000080000
> 	0020: 0000000000000000 0000000600000008 000000004f88499a 0000000136fd9208
> 	0040: 000000004f88499a 0000000136fd9208 000000004f8849b9 0000000106daf187
> 	0060: 000000004f8849b9 0000000106daf187 000000000000000c 000000000000000f
> 	0080: 0000000000000008 00000000484ebbef 0000000000000025 5949ebd4711efd82
> 	00a0: d3250b5c15d5e380 0000000000000000 0000000000000000 0000000000000000
> 	00c0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
> 	00e0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
> 	results=ffef
> 	  Size: 15              Blocks: 8          IO Block: 4096    regular file
> 	Device: 08:06           Inode: 12          Links: 1    
> 	Access: (0644/-rw-r--r--)  Uid: 0   
> 	Gid: 0
> 	Access: 2012-04-13 16:43:22.922587656+0100
> 	Modify: 2012-04-13 16:43:53.115011975+0100
> 	Change: 2012-04-13 16:43:53.115011975+0100
> 	Create: 2012-04-13 16:43:22.922587656+0100
> 	Inode version: 484ebbefh
> 	Data version: 25h
> 	Inode flags: 00080000 (-------- ----e--- -------- --------)
> 	Information: 00000200 (-------- -------- ------a- --------)
> 	Volume ID: 82fd1e71d4eb4959-80e3d5155c0b25d3
> 
> David
> ---
> David Howells (3):
>       statxat: Provide IOC flags for Windows fs attributes
>       statxat: Add a system call to make extended file stats available
>       statxat: AFS: Return enhanced basic attributes
> 
> 
>  arch/x86/ia32/sys_ia32.c         |    2 
>  arch/x86/syscalls/syscall_32.tbl |    1 
>  arch/x86/syscalls/syscall_64.tbl |    1 
>  fs/afs/inode.c                   |   46 ++++-
>  fs/ceph/inode.c                  |    2 
>  fs/cifs/inode.c                  |    5 -
>  fs/compat.c                      |    2 
>  fs/nfsd/nfsxdr.c                 |    2 
>  fs/stat.c                        |  348 ++++++++++++++++++++++++++++++++++++--
>  include/linux/fs.h               |    3 
>  include/linux/stat.h             |   16 ++
>  include/linux/syscalls.h         |    6 +
>  include/uapi/linux/fcntl.h       |    1 
>  include/uapi/linux/fs.h          |    7 +
>  include/uapi/linux/stat.h        |  164 ++++++++++++++++++
>  15 files changed, 567 insertions(+), 39 deletions(-)
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


More information about the samba-technical mailing list