| .\" Copyright (C) 2003 Andries Brouwer (aeb@cwi.nl) |
| .\" |
| .\" %%%LICENSE_START(VERBATIM) |
| .\" Permission is granted to make and distribute verbatim copies of this |
| .\" manual provided the copyright notice and this permission notice are |
| .\" preserved on all copies. |
| .\" |
| .\" Permission is granted to copy and distribute modified versions of this |
| .\" manual under the conditions for verbatim copying, provided that the |
| .\" entire resulting derived work is distributed under the terms of a |
| .\" permission notice identical to this one. |
| .\" |
| .\" Since the Linux kernel and libraries are constantly changing, this |
| .\" manual page may be incorrect or out-of-date. The author(s) assume no |
| .\" responsibility for errors or omissions, or for damages resulting from |
| .\" the use of the information contained herein. The author(s) may not |
| .\" have taken the same level of care in the production of this manual, |
| .\" which is licensed free of charge, as they might when working |
| .\" professionally. |
| .\" |
| .\" Formatted or processed versions of this manual, if unaccompanied by |
| .\" the source, must acknowledge the copyright and authors of this work. |
| .\" %%%LICENSE_END |
| .\" |
| .\" Modified 2003-08-17 by Walter Harms |
| .\" Modified 2004-06-23 by Michael Kerrisk <mtk.manpages@gmail.com> |
| .\" |
| .TH STATFS 2 2017-09-15 "Linux" "Linux Programmer's Manual" |
| .SH NAME |
| statfs, fstatfs \- get filesystem statistics |
| .SH SYNOPSIS |
| .BR "#include <sys/vfs.h> " "/* or <sys/statfs.h> */" |
| .PP |
| .BI "int statfs(const char *" path ", struct statfs *" buf ); |
| .br |
| .BI "int fstatfs(int " fd ", struct statfs *" buf ); |
| .SH DESCRIPTION |
| The |
| .BR statfs () |
| system call returns information about a mounted filesystem. |
| .I path |
| is the pathname of any file within the mounted filesystem. |
| .I buf |
| is a pointer to a |
| .I statfs |
| structure defined approximately as follows: |
| .PP |
| .in +4n |
| .EX |
| struct statfs { |
| __fsword_t f_type; /* Type of filesystem (see below) */ |
| __fsword_t f_bsize; /* Optimal transfer block size */ |
| fsblkcnt_t f_blocks; /* Total data blocks in filesystem */ |
| fsblkcnt_t f_bfree; /* Free blocks in filesystem */ |
| fsblkcnt_t f_bavail; /* Free blocks available to |
| unprivileged user */ |
| fsfilcnt_t f_files; /* Total file nodes in filesystem */ |
| fsfilcnt_t f_ffree; /* Free file nodes in filesystem */ |
| fsid_t f_fsid; /* Filesystem ID */ |
| __fsword_t f_namelen; /* Maximum length of filenames */ |
| __fsword_t f_frsize; /* Fragment size (since Linux 2.6) */ |
| __fsword_t f_flags; /* Mount flags of filesystem |
| (since Linux 2.6.36) */ |
| __fsword_t f_spare[xxx]; |
| /* Padding bytes reserved for future use */ |
| }; |
| .EE |
| .in |
| .PP |
| The following filesystem types may appear in |
| .IR f_type : |
| .PP |
| .in +4n |
| .EX |
| ADFS_SUPER_MAGIC 0xadf5 |
| AFFS_SUPER_MAGIC 0xadff |
| AFS_SUPER_MAGIC 0x5346414f |
| ANON_INODE_FS_MAGIC 0x09041934 /* Anonymous inode FS (for |
| pseudofiles that have no name; |
| e.g., epoll, signalfd, bpf) */ |
| AUTOFS_SUPER_MAGIC 0x0187 |
| BDEVFS_MAGIC 0x62646576 |
| BEFS_SUPER_MAGIC 0x42465331 |
| BFS_MAGIC 0x1badface |
| BINFMTFS_MAGIC 0x42494e4d |
| BPF_FS_MAGIC 0xcafe4a11 |
| BTRFS_SUPER_MAGIC 0x9123683e |
| BTRFS_TEST_MAGIC 0x73727279 |
| CGROUP_SUPER_MAGIC 0x27e0eb /* Cgroup pseudo FS */ |
| CGROUP2_SUPER_MAGIC 0x63677270 /* Cgroup v2 pseudo FS */ |
| CIFS_MAGIC_NUMBER 0xff534d42 |
| CODA_SUPER_MAGIC 0x73757245 |
| COH_SUPER_MAGIC 0x012ff7b7 |
| CRAMFS_MAGIC 0x28cd3d45 |
| DEBUGFS_MAGIC 0x64626720 |
| DEVFS_SUPER_MAGIC 0x1373 /* Linux 2.6.17 and earlier */ |
| DEVPTS_SUPER_MAGIC 0x1cd1 |
| ECRYPTFS_SUPER_MAGIC 0xf15f |
| EFIVARFS_MAGIC 0xde5e81e4 |
| EFS_SUPER_MAGIC 0x00414a53 |
| EXT_SUPER_MAGIC 0x137d /* Linux 2.0 and earlier */ |
| EXT2_OLD_SUPER_MAGIC 0xef51 |
| EXT2_SUPER_MAGIC 0xef53 |
| EXT3_SUPER_MAGIC 0xef53 |
| EXT4_SUPER_MAGIC 0xef53 |
| F2FS_SUPER_MAGIC 0xf2f52010 |
| FUSE_SUPER_MAGIC 0x65735546 |
| FUTEXFS_SUPER_MAGIC 0xbad1dea /* Unused */ |
| HFS_SUPER_MAGIC 0x4244 |
| HOSTFS_SUPER_MAGIC 0x00c0ffee |
| HPFS_SUPER_MAGIC 0xf995e849 |
| HUGETLBFS_MAGIC 0x958458f6 |
| ISOFS_SUPER_MAGIC 0x9660 |
| JFFS2_SUPER_MAGIC 0x72b6 |
| JFS_SUPER_MAGIC 0x3153464a |
| MINIX_SUPER_MAGIC 0x137f /* original minix FS */ |
| MINIX_SUPER_MAGIC2 0x138f /* 30 char minix FS */ |
| MINIX2_SUPER_MAGIC 0x2468 /* minix V2 FS */ |
| MINIX2_SUPER_MAGIC2 0x2478 /* minix V2 FS, 30 char names */ |
| MINIX3_SUPER_MAGIC 0x4d5a /* minix V3 FS, 60 char names */ |
| MQUEUE_MAGIC 0x19800202 /* POSIX message queue FS */ |
| MSDOS_SUPER_MAGIC 0x4d44 |
| MTD_INODE_FS_MAGIC 0x11307854 |
| NCP_SUPER_MAGIC 0x564c |
| NFS_SUPER_MAGIC 0x6969 |
| NILFS_SUPER_MAGIC 0x3434 |
| NSFS_MAGIC 0x6e736673 |
| NTFS_SB_MAGIC 0x5346544e |
| OCFS2_SUPER_MAGIC 0x7461636f |
| OPENPROM_SUPER_MAGIC 0x9fa1 |
| OVERLAYFS_SUPER_MAGIC 0x794c7630 |
| PIPEFS_MAGIC 0x50495045 |
| PROC_SUPER_MAGIC 0x9fa0 /* /proc FS */ |
| PSTOREFS_MAGIC 0x6165676c |
| QNX4_SUPER_MAGIC 0x002f |
| QNX6_SUPER_MAGIC 0x68191122 |
| RAMFS_MAGIC 0x858458f6 |
| REISERFS_SUPER_MAGIC 0x52654973 |
| ROMFS_MAGIC 0x7275 |
| SECURITYFS_MAGIC 0x73636673 |
| SELINUX_MAGIC 0xf97cff8c |
| SMACK_MAGIC 0x43415d53 |
| SMB_SUPER_MAGIC 0x517b |
| SOCKFS_MAGIC 0x534f434b |
| SQUASHFS_MAGIC 0x73717368 |
| SYSFS_MAGIC 0x62656572 |
| SYSV2_SUPER_MAGIC 0x012ff7b6 |
| SYSV4_SUPER_MAGIC 0x012ff7b5 |
| TMPFS_MAGIC 0x01021994 |
| TRACEFS_MAGIC 0x74726163 |
| UDF_SUPER_MAGIC 0x15013346 |
| UFS_MAGIC 0x00011954 |
| USBDEVICE_SUPER_MAGIC 0x9fa2 |
| V9FS_MAGIC 0x01021997 |
| VXFS_SUPER_MAGIC 0xa501fcf5 |
| XENFS_SUPER_MAGIC 0xabba1974 |
| XENIX_SUPER_MAGIC 0x012ff7b4 |
| XFS_SUPER_MAGIC 0x58465342 |
| _XIAFS_SUPER_MAGIC 0x012fd16d /* Linux 2.0 and earlier */ |
| .EE |
| .in |
| .PP |
| Most of these MAGIC constants are defined in |
| .IR /usr/include/linux/magic.h , |
| and some are hardcoded in kernel sources. |
| .PP |
| The |
| .IR f_flags |
| field is a bit mask indicating mount options for the filesystem. |
| It contains zero or more of the following bits: |
| .\" XXX Keep this list in sync with statvfs(3) |
| .TP |
| .B ST_MANDLOCK |
| Mandatory locking is permitted on the filesystem (see |
| .BR fcntl (2)). |
| .TP |
| .B ST_NOATIME |
| Do not update access times; see |
| .BR mount (2). |
| .TP |
| .B ST_NODEV |
| Disallow access to device special files on this filesystem. |
| .TP |
| .B ST_NODIRATIME |
| Do not update directory access times; see |
| .BR mount (2). |
| .TP |
| .B ST_NOEXEC |
| Execution of programs is disallowed on this filesystem. |
| .TP |
| .B ST_NOSUID |
| The set-user-ID and set-group-ID bits are ignored by |
| .BR exec (3) |
| for executable files on this filesystem |
| .TP |
| .B ST_RDONLY |
| This filesystem is mounted read-only. |
| .TP |
| .B ST_RELATIME |
| Update atime relative to mtime/ctime; see |
| .BR mount (2). |
| .TP |
| .B ST_SYNCHRONOUS |
| Writes are synched to the filesystem immediately (see the description of |
| .B O_SYNC |
| in |
| .BR open (2)). |
| .PP |
| Nobody knows what |
| .I f_fsid |
| is supposed to contain (but see below). |
| .PP |
| Fields that are undefined for a particular filesystem are set to 0. |
| .PP |
| .BR fstatfs () |
| returns the same information about an open file referenced by descriptor |
| .IR fd . |
| .SH RETURN VALUE |
| On success, zero is returned. |
| On error, \-1 is returned, and |
| .I errno |
| is set appropriately. |
| .SH ERRORS |
| .TP |
| .B EACCES |
| .RB ( statfs ()) |
| Search permission is denied for a component of the path prefix of |
| .IR path . |
| (See also |
| .BR path_resolution (7).) |
| .TP |
| .B EBADF |
| .RB ( fstatfs ()) |
| .I fd |
| is not a valid open file descriptor. |
| .TP |
| .B EFAULT |
| .I buf |
| or |
| .I path |
| points to an invalid address. |
| .TP |
| .B EINTR |
| The call was interrupted by a signal; see |
| .BR signal (7). |
| .TP |
| .B EIO |
| An I/O error occurred while reading from the filesystem. |
| .TP |
| .B ELOOP |
| .RB ( statfs ()) |
| Too many symbolic links were encountered in translating |
| .IR path . |
| .TP |
| .B ENAMETOOLONG |
| .RB ( statfs ()) |
| .I path |
| is too long. |
| .TP |
| .B ENOENT |
| .RB ( statfs ()) |
| The file referred to by |
| .I path |
| does not exist. |
| .TP |
| .B ENOMEM |
| Insufficient kernel memory was available. |
| .TP |
| .B ENOSYS |
| The filesystem does not support this call. |
| .TP |
| .B ENOTDIR |
| .RB ( statfs ()) |
| A component of the path prefix of |
| .I path |
| is not a directory. |
| .TP |
| .B EOVERFLOW |
| Some values were too large to be represented in the returned struct. |
| .SH CONFORMING TO |
| Linux-specific. |
| The Linux |
| .BR statfs () |
| was inspired by the 4.4BSD one |
| (but they do not use the same structure). |
| .SH NOTES |
| The |
| .I __fsword_t |
| type used for various fields in the |
| .I statfs |
| structure definition is a glibc internal type, |
| not intended for public use. |
| This leaves the programmer in a bit of a conundrum when trying to copy |
| or compare these fields to local variables in a program. |
| Using |
| .I "unsigned\ int" |
| for such variables suffices on most systems. |
| .PP |
| The original Linux |
| .BR statfs () |
| and |
| .BR fstatfs () |
| system calls were not designed with extremely large file sizes in mind. |
| Subsequently, Linux 2.6 |
| added new |
| .BR statfs64 () |
| and |
| .BR fstatfs64 () |
| system calls that employ a new structure, |
| .IR statfs64 . |
| The new structure contains the same fields as the original |
| .I statfs |
| structure, but the sizes of various fields are increased, |
| to accommodate large file sizes. |
| The glibc |
| .BR statfs () |
| and |
| .BR fstatfs () |
| wrapper functions transparently deal with the kernel differences. |
| .PP |
| Some systems have only \fI<sys/vfs.h>\fP, other systems also have |
| \fI<sys/statfs.h>\fP, where the former includes the latter. |
| So it seems |
| including the former is the best choice. |
| .PP |
| LSB has deprecated the library calls |
| .BR statfs () |
| and |
| .BR fstatfs () |
| and tells us to use |
| .BR statvfs (2) |
| and |
| .BR fstatvfs (2) |
| instead. |
| .SS The f_fsid field |
| Solaris, Irix and POSIX have a system call |
| .BR statvfs (2) |
| that returns a |
| .I "struct statvfs" |
| (defined in |
| .IR <sys/statvfs.h> ) |
| containing an |
| .I "unsigned long" |
| .IR f_fsid . |
| Linux, SunOS, HP-UX, 4.4BSD have a system call |
| .BR statfs () |
| that returns a |
| .I "struct statfs" |
| (defined in |
| .IR <sys/vfs.h> ) |
| containing a |
| .I fsid_t |
| .IR f_fsid , |
| where |
| .I fsid_t |
| is defined as |
| .IR "struct { int val[2]; }" . |
| The same holds for FreeBSD, except that it uses the include file |
| .IR <sys/mount.h> . |
| .PP |
| The general idea is that |
| .I f_fsid |
| contains some random stuff such that the pair |
| .RI ( f_fsid , ino ) |
| uniquely determines a file. |
| Some operating systems use (a variation on) the device number, |
| or the device number combined with the filesystem type. |
| Several operating systems restrict giving out the |
| .I f_fsid |
| field to the superuser only (and zero it for unprivileged users), |
| because this field is used in the filehandle of the filesystem |
| when NFS-exported, and giving it out is a security concern. |
| .PP |
| Under some operating systems, the |
| .I fsid |
| can be used as the second argument to the |
| .BR sysfs (2) |
| system call. |
| .SH BUGS |
| From Linux 2.6.38 up to and including Linux 3.1, |
| .\" broken in commit ff0c7d15f9787b7e8c601533c015295cc68329f8 |
| .\" fixed in commit d70ef97baf048412c395bb5d65791d8fe133a52b |
| .BR fstatfs () |
| failed with the error |
| .B ENOSYS |
| for file descriptors created by |
| .BR pipe (2). |
| .SH SEE ALSO |
| .BR stat (2), |
| .BR statvfs (3), |
| .BR path_resolution (7) |