On Thu, Mar 16, 2017 at 9:53 AM, Abhishek Tiwari
<erabhishektiwar...@gmail.com> wrote:
> On Wed, Mar 15, 2017 at 11:14 PM, Abhishek Tiwari
> <erabhishektiwar...@gmail.com> wrote:
>> On Tue, Mar 14, 2017 at 8:44 AM, Abhishek Tiwari
>> <erabhishektiwar...@gmail.com> wrote:
>>> On Tue, Mar 14, 2017 at 2:00 AM, Dmitry V. Levin <l...@altlinux.org> wrote:
>>>> On Tue, Mar 14, 2017 at 12:40:46AM +0530, Abhishek Tiwari wrote:
>>>>> > Per-file summary is not in GNU change log format, please refer to
>>>>> > https://www.gnu.org/prep/standards/html_node/Style-of-Change-Logs.html .
>>>>> > Specifically, it lacks asterisks at the beginning of each new file
>>>>> > description and has excess spaces between file part and description,
>>>>> > otherwise looks fine.
>>>>> >
>>>>> > The patch wires up {,l}stat{,64}, fstatat/fstatat64 syscalls (used for 
>>>>> > obtaining
>>>>> > file status), ustat syscall (which is a deprecated way to get some FS
>>>>> > statistics) and some statfs syscalls (which are more contemporary way
>>>>> > obtaining FS statistics information). On the other side, at least
>>>>> > fstat/fstat64, fstatfs/fstatfs64, old{,f,l}stat, osf_{,f}statfs, and 
>>>>> > various
>>>>> > (mostly unsupported) syscalls with osf_, svr4_, sysv_, bsd43_, and 
>>>>> > posix_
>>>>> > prefixes, present on alpha and mips, are omitted. I'm not sure whether
>>>>> > it was intended.
>>>>> >
>>>>> > There are minor tabulation irregularities introduced (at least) for
>>>>> > newfstatat and fstatat64 syscall entries, it is better to avoid this.
>>>>>
>>>>> I have fixed the commit entries.
>>>>> Now the patch includes all the stat-like syscalls that can be
>>>>> displayed by following command->
>>>>
>>>> The idea is not to throw all syscalls that do some kind of stat into a
>>>> single class, but to create a class of syscalls that could be useful.
>>>> As Eugene already noted, there is little use of grouping syscalls that
>>>> stat files with those that stat filesystems.
>>>>
>>>> Actually, there is a software project that could benefit from more
>>>> fine-grained classes, e.g. oldstat+stat+stat64, oldlstat+lstat+lstat64,
>>>> and newfstatat+fstatat64.
>>>
>>> Ok, so oldstat+stat+stat64 is one class that is to be grouped under
>>> %stat, oldstat+lstat+lstat64 as another class and
>>> fstatat+newfstatat+fstatat64 and some other class.
>>>
>>> I read in mailing list it is intended to group syscalls that perform
>>> same action across different versions.
>>>
>>> But it is little confusing to decide what to group into one class.
>>>
>>>
>>>> There may be some use of a class that groups all filesystem stat syscalls
>>>> like ustat and *statfs*.  This might appear to be easier for you to
>>>> implement, especially the part that tests it.
>>>
>>> I would be doing this part first. Grouping ustat and *statfs* under
>>> %statfs. Is this class name fine?
>>>
>>>
>>>>> grep -nr stat linux/*/syscallent*
>>>>
>>>> btw, why do you pass -nr to this grep command?
>>>
>>> This grep command is just to display the places where I have made the
>>> change. The command actually used is mentioned in commit.
>>>>> >> --- a/syscall.c
>>>>> >> +++ b/syscall.c
>>>>> >> @@ -77,6 +77,7 @@
>>>>> >>  #define TS TRACE_SIGNAL
>>>>> >>  #define TM TRACE_MEMORY
>>>>> >>  #define TSC TRACE_SCHED
>>>>> >> +#define TST  TRACE_STAT
>>>>> > Tabulation is used for separating macro declaration and definition, but
>>>>> > neighbouring lines utilise space for this purpose.
>>>>>
>>>>> Please elaborate, i don't get what correction is intended here?
>>>>
>>>> The rule of thumb is simple:
>>>> when patching a piece of code, follow its coding style.
>>>>
>>>> If the code uses spaces, use spaces.  If it uses tabs, use tabs.
>>>> strace has a long history with a lot of contributors so the style
>>>> used in different parts might differ slightly.
>>>
>>> Sorry, that space was not intensional.
>>>
>>>>> >> +++ b/tests/stat_like.test
>>>>> >> @@ -0,0 +1,58 @@
>>>>> >> +#!/bin/sh
>>>>> >> +
>>>>> >> +# Check how stat-like syscalls are traced.
>>>>> >> +#
>>>>> >> +# Copyright (c) 2017 The strace developers.
>>>>> >> +# All rights reserved.
>>>>> >> +#
>>>>> >> +# Redistribution and use in source and binary forms, with or without
>>>>> >> +# modification, are permitted provided that the following conditions
>>>>> >> +# are met:
>>>>> >> +# 1. Redistributions of source code must retain the above copyright
>>>>> >> +#    notice, this list of conditions and the following disclaimer.
>>>>> >> +# 2. Redistributions in binary form must reproduce the above copyright
>>>>> >> +#    notice, this list of conditions and the following disclaimer in 
>>>>> >> the
>>>>> >> +#    documentation and/or other materials provided with the 
>>>>> >> distribution.
>>>>> >> +# 3. The name of the author may not be used to endorse or promote 
>>>>> >> products
>>>>> >> +#    derived from this software without specific prior written 
>>>>> >> permission.
>>>>> >> +#
>>>>> >> +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
>>>>> >> +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
>>>>> >> WARRANTIES
>>>>> >> +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
>>>>> >> DISCLAIMED.
>>>>> >> +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
>>>>> >> +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
>>>>> >> (INCLUDING, BUT
>>>>> >> +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 
>>>>> >> OF USE,
>>>>> >> +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
>>>>> >> ANY
>>>>> >> +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
>>>>> >> +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
>>>>> >> USE OF
>>>>> >> +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>>>>> >> +
>>>>> >> +STAT_TESTS='21 fstat
>>>>> >> +33 ustat
>>>>> >> +32 statx
>>>>> >> +17 statfs
>>>>> >> +21 oldfstat'
>>>>> >> +
>>>>> >> +NON_STAT_TESTS='11 fchdir
>>>>> >> +27 futex
>>>>> >> +10 fsync'
>>>>> >> +
>>>>> >> +. "${srcdir=.}/init.sh"
>>>>> >> +
>>>>> >> +echo "$STAT_TESTS" | while read w i
>>>>> >> +do
>>>>> >> +     run_prog ./$i > /dev/null
>>>>> >> +     run_strace -a$w -e%stat ./$i > "$EXP"
>>>>> >> +     match_diff "$LOG" "$EXP"
>>>>> >> +done
>>>>> >> +
>>>>> >> +echo '+++ exited with 0 +++' > "$EXP"
>>>>> >> +
>>>>> >> +echo "$NON_STAT_TESTS" | while read w i
>>>>> >> +do
>>>>> >> +     run_prog ./$i > /dev/null
>>>>> >> +     run_strace -a$w -e%stat ./$i > /dev/null
>>>>> >> +     match_diff "$LOG" "$EXP"
>>>>> >> +done
>>>>> >> +
>>>>> >> +rm "$EXP"
>>>>> > This test produces the following diagnostics:
>>>>> >
>>>>> >     1,2c1,2
>>>>> >     < fstat(0, 0x7f4dc9b2ffe0) = -1 EFAULT (Bad address)
>>>>> >     < fstat(0, {st_dev=makedev(9, 1), st_ino=8761399, 
>>>>> > st_mode=S_IFREG|0640, st_nlink=1, st_uid=1000, st_gid=1000, 
>>>>> > st_blksize=4096, st_blocks=0, st_size=43147718418, 
>>>>> > st_atime=1969-12-31T21:59:17+0100.000000135, 
>>>>> > st_mtime=1969-12-31T21:59:19+0100.000000246, 
>>>>> > st_ctime=2017-03-13T07:03:55+0100.962268762}) = 0
>>>>> >     ---
>>>>> >     > stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2246, ...}) 
>>>>> > = 0
>>>>> >     > stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2246, ...}) 
>>>>> > = 0
>>>>> >     stat_like.test: failed test: ../strace -a21 -e%stat ./fstat output 
>>>>> > mismatch
>>>>> >
>>>>> > It exits with status 0, however.
>>>>>
>>>>> Please help me with this part, how can I run this test on my machine.
>>>>
>>>> Do you ask about running this particular test?  I think it's as simple as
>>>> $ make check TESTS=stat_like VERBOSE=1
>>>
>>> Thank you, I just never did testing this way and I am new to this part.
>>>>
>>>> --
>>>> ldv
>>>>
>>>> ------------------------------------------------------------------------------
>>>> Check out the vibrant tech community on one of the world's most
>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>> _______________________________________________
>>>> Strace-devel mailing list
>>>> Strace-devel@lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/strace-devel
>>>>
>>
>>
>> Is it fine to group statfs+ statfs64+ fstatfs + fstatfs64 + ustat  as
>> %statfs or it should be (statfs+statfs64 + ustat) and
>> (fstatfs+ftsatfs64) i.e. two different classes ?
>
> Please reply


Implemented -e trace=%statfs option. It groups statfs+statfs64+ustat
Below is patch attached. Please review.
From 38ea98c7ba87bc485d8af34fc401f46b05b2c035 Mon Sep 17 00:00:00 2001
From: Abhishek Tiwari <erabhishektiwar...@gmail.com>
Date: Thu, 16 Mar 2017 16:55:44 +0530
Subject: [PATCH v4] Implement -e trace=%statfs option for tracing statfs like syscalls.

	linux/*/syscallent.h part is modified automatically by:

	git grep -Fl 'statfs' linux/*/syscallent* | xargs sed -i 's/TD\(,[[:space:]]*SEN(statfs\)/TD|SFS\1/'
	git grep -Fl 'statfs' linux/*/syscallent* | xargs sed -i 's/TF\(,[[:space:]]*SEN(statfs\)/TF|SFS\1/'
	git grep -Fl 'statfs' linux/*/syscallent* | xargs sed -i 's/0\(,[[:space:]]*SEN(osf_statfs\)/SFS\1/'
	git grep -Fl 'statfs' linux/*/syscallent* | xargs sed -i 's/0\(,[[:space:]]*SEN(.*_statfs\)/SFS\1/'
	git grep -Fl 'ustat' linux/*/syscallent* | xargs sed -i 's/0\(,[[:space:]]*SEN(.*_ustat\)/SFS\1/'

* linux/32/syscallent.h: Add SFS flag for stat-like sycalls.
* linux/64/syscallent.h: Likewise.
* linux/aarch64/syscallent.h: Likewise.
* linux/alpha/syscallent.h: Likewise.
* linux/arm/syscallent.h: Likewise.
* linux/avr32/syscallent.h: Likewise.
* linux/bfin/syscallent.h: Likewise.
* linux/crisv10/syscallent.h: Likewise.
* linux/hppa/syscallent.h: Likewise.
* linux/i386/syscallent.h: Likewise.
* linux/ia64/syscallent.h: Likewise.
* linux/m68k/syscallent.h: Likewise.
* linux/microblaze/syscallent.h: Likewise.
* linux/mips/syscallent-compat.h: Likewise.
* linux/mips/syscallent-n32.h: Likewise.
* linux/mips/syscallent-n64.h: Likewise.
* linux/mips/syscallent-o32.h: Likewise.
* linux/powerpc/syscallent.h: Likewise.
* linux/powerpc64/syscallent.h: Likewise.
* linux/s390/syscallent.h: Likewise.
* linux/s390x/syscallent.h: Likewise.
* linux/sh/syscallent.h: Likewise.
* linux/sh64/syscallent.h: Likewise.
* linux/sparc/syscallent.h: Likewise.
* linux/sparc64/syscallent.h: Likewise.
* linux/x32/syscallent.h: Likewise.
* linux/x86_64/syscallent.h: Likewise.
* linux/xtensa/syscallent.h: Likewise.
* qualify.c (lookup_class): Add SCHED_STAT for "%statfs".
* strace.1 (.SS Filtering): Add information about %statfs syscall class.
* syscall.c: Alias SFS to TRACE_STATFS around syscallent.h inclusion.
* sysent.h (TRACE_STATFS): New definition.
* tests/Makefile.am (DECODER_TESTS): Add trace_statfs.test.
* tests/ksysent.c: Define SFS to 0.
* tests/nsyscalls.c: Likewise.
* tests/trace_statfs.test: New test.
---
 linux/32/syscallent.h          |  2 +-
 linux/64/syscallent.h          |  2 +-
 linux/aarch64/syscallent.h     |  4 +--
 linux/alpha/syscallent.h       |  8 +++---
 linux/arm/syscallent.h         |  6 ++---
 linux/avr32/syscallent.h       |  6 ++---
 linux/bfin/syscallent.h        |  6 ++---
 linux/crisv10/syscallent.h     |  6 ++---
 linux/hppa/syscallent.h        |  6 ++---
 linux/i386/syscallent.h        |  6 ++---
 linux/ia64/syscallent.h        |  6 ++---
 linux/m68k/syscallent.h        |  6 ++---
 linux/microblaze/syscallent.h  |  6 ++---
 linux/mips/syscallent-compat.h |  8 +++---
 linux/mips/syscallent-n32.h    |  6 ++---
 linux/mips/syscallent-n64.h    |  4 +--
 linux/mips/syscallent-o32.h    |  6 ++---
 linux/powerpc/syscallent.h     |  6 ++---
 linux/powerpc64/syscallent.h   |  6 ++---
 linux/s390/syscallent.h        |  6 ++---
 linux/s390x/syscallent.h       |  6 ++---
 linux/sh/syscallent.h          |  6 ++---
 linux/sh64/syscallent.h        |  6 ++---
 linux/sparc/syscallent.h       |  6 ++---
 linux/sparc64/syscallent.h     |  6 ++---
 linux/x32/syscallent.h         |  4 +--
 linux/x86_64/syscallent.h      |  4 +--
 linux/xtensa/syscallent.h      |  6 ++---
 qualify.c                      |  1 +
 strace.1                       |  3 +++
 syscall.c                      |  2 ++
 sysent.h                       |  1 +
 tests/Makefile.am              |  1 +
 tests/ksysent.c                |  1 +
 tests/nsyscalls.c              |  1 +
 tests/trace_statfs.test        | 55 ++++++++++++++++++++++++++++++++++++++++++
 36 files changed, 143 insertions(+), 78 deletions(-)
 create mode 100755 tests/trace_statfs.test

diff --git a/linux/32/syscallent.h b/linux/32/syscallent.h
index a8f9510..72a3ebe 100644
--- a/linux/32/syscallent.h
+++ b/linux/32/syscallent.h
@@ -44,7 +44,7 @@
 [ 40] = { 5,	TF,		SEN(mount),			"mount"			},
 [ 41] = { 2,	TF,		SEN(pivotroot),			"pivot_root"		},
 [ 42] = { 3,	0,		SEN(nfsservctl),		"nfsservctl"		},
-[ 43] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[ 43] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [ 44] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [ 45] = { 3,	TF,		SEN(truncate64),		"truncate64"		},
 [ 46] = { 3,	TD,		SEN(ftruncate64),		"ftruncate64"		},
diff --git a/linux/64/syscallent.h b/linux/64/syscallent.h
index b5a09d4..413b91a 100644
--- a/linux/64/syscallent.h
+++ b/linux/64/syscallent.h
@@ -41,7 +41,7 @@
 [ 40] = { 5,	TF,		SEN(mount),			"mount"			},
 [ 41] = { 2,	TF,		SEN(pivotroot),			"pivot_root"		},
 [ 42] = { 3,	0,		SEN(nfsservctl),		"nfsservctl"		},
-[ 43] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 43] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [ 44] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [ 45] = { 2,	TF,		SEN(truncate),			"truncate"		},
 [ 46] = { 2,	TD,		SEN(ftruncate),			"ftruncate"		},
diff --git a/linux/aarch64/syscallent.h b/linux/aarch64/syscallent.h
index 6b23f8c..4bd981e 100644
--- a/linux/aarch64/syscallent.h
+++ b/linux/aarch64/syscallent.h
@@ -45,7 +45,7 @@
 [1053] = { 4,	TD,		SEN(fadvise64),		"fadvise64"	},
 [1054] = { 4,	TD|TF,		SEN(newfstatat),	"newfstatat"	},
 [1055] = { 2,	TD,		SEN(fstatfs),		"fstatfs"	},
-[1056] = { 2,	TF,		SEN(statfs),		"statfs"	},
+[1056] = { 2,	TF|SFS,	SEN(statfs),		"statfs"	},
 [1057] = { 3,	TD,		SEN(lseek),		"lseek"		},
 [1058] = { 6,	TD|TM|SI,	SEN(mmap),		"mmap"		},
 [1059] = { 1,	0,		SEN(alarm),		"alarm"		},
@@ -59,7 +59,7 @@
 [1067] = { 5,	TD,		SEN(select),		"select"	},
 [1068] = { 3,	TD,		SEN(poll),		"poll"		},
 [1069] = { 4,	TD,		SEN(epoll_wait),	"epoll_wait"	},
-[1070] = { 2,	0,		SEN(ustat),		"ustat"		},
+[1070] = { 2,	SFS,	SEN(ustat),		"ustat"		},
 [1071] = { 0,	TP,		SEN(vfork),		"vfork"		},
 [1072] = { 4,	TP,		SEN(wait4),		"wait4"		},
 [1073] = { 4,	TN,		SEN(recv),		"recv"		},
diff --git a/linux/alpha/syscallent.h b/linux/alpha/syscallent.h
index 4449f22..7c1bc71 100644
--- a/linux/alpha/syscallent.h
+++ b/linux/alpha/syscallent.h
@@ -185,7 +185,7 @@
 [157] = { 5,	0,		SEN(printargs),			"osf_sigwaitprim"	}, /*not implemented */
 [158] = { 5,	0,		SEN(printargs),			"osf_nfssvc"		}, /*not implemented */
 [159] = { 4,	0,		SEN(printargs),			"osf_getdirentries"	},
-[160] = { 3,	0,		SEN(osf_statfs),		"osf_statfs"		},
+[160] = { 3,	SFS,	SEN(osf_statfs),		"osf_statfs"		},
 [161] = { 3,	0,		SEN(osf_fstatfs),		"osf_fstatfs"		},
 [162] = { },
 [163] = { 5,	0,		SEN(printargs),			"osf_asynch_daemon"	}, /*not implemented */
@@ -230,7 +230,7 @@
 [224] = { 5,	0,		SEN(printargs),			"osf_stat"		}, /*not implemented */
 [225] = { 5,	0,		SEN(printargs),			"osf_lstat"		}, /*not implemented */
 [226] = { 5,	0,		SEN(printargs),			"osf_fstat"		}, /*not implemented */
-[227] = { 3,	0,		SEN(osf_statfs),		"osf_statfs64"		}, /*not implemented */
+[227] = { 3,	SFS,	SEN(osf_statfs),		"osf_statfs64"		}, /*not implemented */
 [228] = { 3,	0,		SEN(osf_fstatfs),		"osf_fstatfs64"		}, /*not implemented */
 [229 ... 232] = { },
 [233] = { 1,	0,		SEN(getpgid),			"getpgid"		},
@@ -290,8 +290,8 @@
 [324] = { 1,	NF,		SEN(personality),		"personality"		},
 [325] = { 1,	NF,		SEN(setfsuid),			"setfsuid"		},
 [326] = { 1,	NF,		SEN(setfsgid),			"setfsgid"		},
-[327] = { 2,	0,		SEN(ustat),			"ustat"			},
-[328] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[327] = { 2,	SFS,	SEN(ustat),			"ustat"			},
+[328] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [329] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [330] = { 2,	TSC,		SEN(sched_setparam),		"sched_setparam"	},
 [331] = { 2,	TSC,		SEN(sched_getparam),		"sched_getparam"	},
diff --git a/linux/arm/syscallent.h b/linux/arm/syscallent.h
index ed9ec9a..006bb55 100644
--- a/linux/arm/syscallent.h
+++ b/linux/arm/syscallent.h
@@ -88,7 +88,7 @@
 [ 59] = { 1,	0,		SEN(oldolduname),		"oldolduname"		},
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -125,7 +125,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	0,		SEN(profil),			"profil"		},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -290,7 +290,7 @@
 [263] = { 2,	0,		SEN(clock_gettime),		"clock_gettime"		},
 [264] = { 2,	0,		SEN(clock_getres),		"clock_getres"		},
 [265] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
-[266] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[266] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [267] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [268] = { 3,	TS,		SEN(tgkill),			"tgkill"		},
 [269] = { 2,	TF,		SEN(utimes),			"utimes"		},
diff --git a/linux/avr32/syscallent.h b/linux/avr32/syscallent.h
index 7f50934..3aac256 100644
--- a/linux/avr32/syscallent.h
+++ b/linux/avr32/syscallent.h
@@ -87,7 +87,7 @@
 [ 59] = { 3,	0,		SEN(getresuid),			"getresuid"		},
 [ 60] = { 2,	0,		SEN(setreuid),			"setreuid"		},
 [ 61] = { 2,	0,		SEN(setregid),			"setregid"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -124,7 +124,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	TP,		SEN(wait4),			"wait4"			},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 0,	0,		SEN(vhangup),			"vhangup"		},
 [102] = { 2,	TS,		SEN(sigaltstack),		"sigaltstack"		},
@@ -244,7 +244,7 @@
 [216] = { 2,	0,		SEN(clock_gettime),		"clock_gettime"		},
 [217] = { 2,	0,		SEN(clock_getres),		"clock_getres"		},
 [218] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
-[219] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[219] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [220] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [221] = { 3,	TS,		SEN(tgkill),			"tgkill"		},
 [222] = { },
diff --git a/linux/bfin/syscallent.h b/linux/bfin/syscallent.h
index 800b943..80b8951 100644
--- a/linux/bfin/syscallent.h
+++ b/linux/bfin/syscallent.h
@@ -88,7 +88,7 @@
 [ 59] = { 1,	0,		SEN(oldolduname),		"oldolduname"		},
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -125,7 +125,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	0,		SEN(profil),			"profil"		},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -294,7 +294,7 @@
 [266] = { 2,	0,		SEN(clock_gettime),		"clock_gettime"		},
 [267] = { 2,	0,		SEN(clock_getres),		"clock_getres"		},
 [268] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
-[269] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[269] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [270] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [271] = { 3,	TS,		SEN(tgkill),			"tgkill"		},
 [272] = { 2,	TF,		SEN(utimes),			"utimes"		},
diff --git a/linux/crisv10/syscallent.h b/linux/crisv10/syscallent.h
index 96fb6bd..acf3917 100644
--- a/linux/crisv10/syscallent.h
+++ b/linux/crisv10/syscallent.h
@@ -60,7 +60,7 @@
 [ 59] = { 1,	0,		SEN(oldolduname),		"oldolduname"		},
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -97,7 +97,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	0,		SEN(profil),			"profil"		},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -262,7 +262,7 @@
 [265] = { 2,	0,		SEN(clock_gettime),		"clock_gettime"		},
 [266] = { 2,	0,		SEN(clock_getres),		"clock_getres"		},
 [267] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
-[268] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[268] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [269] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [270] = { 3,	TS,		SEN(tgkill),			"tgkill"		},
 [271] = { 2,	TF,		SEN(utimes),			"utimes"		},
diff --git a/linux/hppa/syscallent.h b/linux/hppa/syscallent.h
index f59ea57..9fa9248 100644
--- a/linux/hppa/syscallent.h
+++ b/linux/hppa/syscallent.h
@@ -64,7 +64,7 @@
 [ 59] = { 1,	0,		SEN(uname),			"uname"			},
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -101,7 +101,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	TN,		SEN(recv),			"recv"			},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 2,	TF,		SEN(stat64),			"stat64"		},
 [102] = { },
@@ -300,7 +300,7 @@
 [295] = { 6,	TM,		SEN(move_pages),		"move_pages"		},
 [296] = { 3,	0,		SEN(getcpu),			"getcpu"		},
 [297] = { 6,	TD,		SEN(epoll_pwait),		"epoll_pwait"		},
-[298] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[298] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [299] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [300] = { 4,	0,		SEN(kexec_load),		"kexec_load"		},
 [301] = { 4,	TD|TF,		SEN(utimensat),			"utimensat"		},
diff --git a/linux/i386/syscallent.h b/linux/i386/syscallent.h
index 8ef1b1c..eb07fc1 100644
--- a/linux/i386/syscallent.h
+++ b/linux/i386/syscallent.h
@@ -88,7 +88,7 @@
 [ 59] = { 1,	0,		SEN(oldolduname),		"oldolduname"		},
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -125,7 +125,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	0,		SEN(profil),			"profil"		},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -293,7 +293,7 @@
 [265] = { 2,	0,		SEN(clock_gettime),		"clock_gettime"		},
 [266] = { 2,	0,		SEN(clock_getres),		"clock_getres"		},
 [267] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
-[268] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[268] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [269] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [270] = { 3,	TS,		SEN(tgkill),			"tgkill"		},
 [271] = { 2,	TF,		SEN(utimes),			"utimes"		},
diff --git a/linux/ia64/syscallent.h b/linux/ia64/syscallent.h
index 47b71d6..915c871 100644
--- a/linux/ia64/syscallent.h
+++ b/linux/ia64/syscallent.h
@@ -86,7 +86,7 @@
 [1066] = { 3,	TD,		SEN(fcntl),			"fcntl"			},
 [1067] = { 1,	NF,		SEN(umask),			"umask"			},
 [1068] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[1069] = { 2,	0,		SEN(ustat),			"ustat"			},
+[1069] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [1070] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [1071] = { 2,	0,		SEN(setreuid),			"setreuid"		},
 [1072] = { 2,	0,		SEN(setregid),			"setregid"		},
@@ -120,7 +120,7 @@
 [1100] = { 3,	TD,		SEN(fchown),			"fchown"		},
 [1101] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [1102] = { 3,	0,		SEN(setpriority),		"setpriority"		},
-[1103] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[1103] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [1104] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [1105] = { 0,	NF,		SEN(gettid),			"gettid"		},
 [1106] = { 3,	TI,		SEN(semget),			"semget"		},
@@ -275,7 +275,7 @@
 [1255] = { 2,	0,		SEN(clock_getres),		"clock_getres"		},
 [1256] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
 [1257] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
-[1258] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[1258] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [1259] = { 6,	TM,		SEN(mbind),			"mbind"			},
 [1260] = { 5,	TM,		SEN(get_mempolicy),		"get_mempolicy"		},
 [1261] = { 3,	TM,		SEN(set_mempolicy),		"set_mempolicy"		},
diff --git a/linux/m68k/syscallent.h b/linux/m68k/syscallent.h
index 8e7dd97..149f06f 100644
--- a/linux/m68k/syscallent.h
+++ b/linux/m68k/syscallent.h
@@ -88,7 +88,7 @@
 [ 59] = { 1,	0,		SEN(oldolduname),		"oldolduname"		},
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -125,7 +125,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	0,		SEN(profil),			"profil"		},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -288,7 +288,7 @@
 [260] = { 2,	0,		SEN(clock_gettime),		"clock_gettime"		},
 [261] = { 2,	0,		SEN(clock_getres),		"clock_getres"		},
 [262] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
-[263] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[263] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [264] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [265] = { 3,	TS,		SEN(tgkill),			"tgkill"		},
 [266] = { 2,	TF,		SEN(utimes),			"utimes"		},
diff --git a/linux/microblaze/syscallent.h b/linux/microblaze/syscallent.h
index 2a59eb3..f85de2f 100644
--- a/linux/microblaze/syscallent.h
+++ b/linux/microblaze/syscallent.h
@@ -88,7 +88,7 @@
 [ 59] = { 1,	0,		SEN(oldolduname),		"oldolduname"		},
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -125,7 +125,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	0,		SEN(profil),			"profil"		},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -293,7 +293,7 @@
 [265] = { 2,	0,		SEN(clock_gettime),		"clock_gettime"		},
 [266] = { 2,	0,		SEN(clock_getres),		"clock_getres"		},
 [267] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
-[268] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[268] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [269] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [270] = { 3,	TS,		SEN(tgkill),			"tgkill"		},
 [271] = { 2,	TF,		SEN(utimes),			"utimes"		},
diff --git a/linux/mips/syscallent-compat.h b/linux/mips/syscallent-compat.h
index 82a373b..c5214b7 100644
--- a/linux/mips/syscallent-compat.h
+++ b/linux/mips/syscallent-compat.h
@@ -33,7 +33,7 @@
 [  32] = { 0,	0,	SEN(printargs),		"svr4_gtty"	},
 [  33] = { 0,	0,	SEN(printargs),		"svr4_access"	},
 [  34] = { 0,	0,	SEN(printargs),		"svr4_nice"	},
-[  35] = { 0,	0,	SEN(printargs),		"svr4_statfs"	},
+[  35] = { 0,	SFS,	SEN(printargs),		"svr4_statfs"	},
 [  36] = { 0,	0,	SEN(printargs),		"svr4_sync"	},
 [  37] = { 0,	0,	SEN(printargs),		"svr4_kill"	},
 [  38] = { 0,	0,	SEN(printargs),		"svr4_fstatfs"	},
@@ -184,7 +184,7 @@
 [1032] = { 0,	0,	SEN(printargs),		"sysv_gtty"	},
 [1033] = { 0,	0,	SEN(printargs),		"sysv_access"	},
 [1034] = { 0,	0,	SEN(printargs),		"sysv_nice"	},
-[1035] = { 0,	0,	SEN(printargs),		"sysv_statfs"	},
+[1035] = { 0,	SFS,	SEN(printargs),		"sysv_statfs"	},
 [1036] = { 0,	0,	SEN(printargs),		"sysv_sync"	},
 [1037] = { 0,	0,	SEN(printargs),		"sysv_kill"	},
 [1038] = { 0,	0,	SEN(printargs),		"sysv_fstatfs"	},
@@ -494,7 +494,7 @@
 [2157] = { 0,	0,	SEN(printargs),		"bsd43_nfs_mount"	},
 [2158] = { 0,	0,	SEN(printargs),		"bsd43_nfs_svc"	},
 [2159] = { 0,	0,	SEN(printargs),		"bsd43_getdirentries"	},
-[2160] = { 0,	0,	SEN(printargs),		"bsd43_statfs"	},
+[2160] = { 0,	SFS,	SEN(printargs),		"bsd43_statfs"	},
 [2161] = { 0,	0,	SEN(printargs),		"bsd43_fstatfs"	},
 [2162] = { 0,	0,	SEN(printargs),		"bsd43_unmount"	},
 [2163] = { 0,	0,	SEN(printargs),		"bsd43_async_daemon"	},
@@ -562,7 +562,7 @@
 [3032] = { 0,	0,	SEN(printargs),		"posix_gtty"	},
 [3033] = { 0,	0,	SEN(printargs),		"posix_access"	},
 [3034] = { 0,	0,	SEN(printargs),		"posix_nice"	},
-[3035] = { 0,	0,	SEN(printargs),		"posix_statfs"	},
+[3035] = { 0,	SFS,	SEN(printargs),		"posix_statfs"	},
 [3036] = { 0,	0,	SEN(printargs),		"posix_sync"	},
 [3037] = { 0,	0,	SEN(printargs),		"posix_kill"	},
 [3038] = { 0,	0,	SEN(printargs),		"posix_fstatfs"	},
diff --git a/linux/mips/syscallent-n32.h b/linux/mips/syscallent-n32.h
index 052af4f..dfa3b1e 100644
--- a/linux/mips/syscallent-n32.h
+++ b/linux/mips/syscallent-n32.h
@@ -133,8 +133,8 @@
 [6130] = { 2,	TF,		SEN(utime),			"utime"			},
 [6131] = { 3,	TF,		SEN(mknod),			"mknod"			},
 [6132] = { 1,	NF,		SEN(personality),		"personality"		},
-[6133] = { 2,	0,		SEN(ustat),			"ustat"			},
-[6134] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[6133] = { 2,	SFS,	SEN(ustat),			"ustat"			},
+[6134] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [6135] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [6136] = { 3,	0,		SEN(sysfs),			"sysfs"			},
 [6137] = { 2,	0,		SEN(getpriority),		"getpriority"		},
@@ -217,7 +217,7 @@
 [6214] = { 0,	0,		SEN(restart_syscall),		"restart_syscall"	},
 [6215] = { 4,	TI,		SEN(semtimedop),		"semtimedop"		},
 [6216] = { 4,	TD,		SEN(fadvise64_64),		"fadvise64"		},
-[6217] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[6217] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [6218] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [6219] = { 4,	TD|TN,		SEN(sendfile64),		"sendfile64"		},
 [6220] = { 3,	0,		SEN(timer_create),		"timer_create"		},
diff --git a/linux/mips/syscallent-n64.h b/linux/mips/syscallent-n64.h
index fdd778b..44c2acd 100644
--- a/linux/mips/syscallent-n64.h
+++ b/linux/mips/syscallent-n64.h
@@ -133,8 +133,8 @@
 [5130] = { 2,	TF,		SEN(utime),			"utime"			},
 [5131] = { 3,	TF,		SEN(mknod),			"mknod"			},
 [5132] = { 1,	NF,		SEN(personality),		"personality"		},
-[5133] = { 2,	0,		SEN(ustat),			"ustat"			},
-[5134] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[5133] = { 2,	SFS,	SEN(ustat),			"ustat"			},
+[5134] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [5135] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [5136] = { 3,	0,		SEN(sysfs),			"sysfs"			},
 [5137] = { 2,	0,		SEN(getpriority),		"getpriority"		},
diff --git a/linux/mips/syscallent-o32.h b/linux/mips/syscallent-o32.h
index 509a719..06219fa 100644
--- a/linux/mips/syscallent-o32.h
+++ b/linux/mips/syscallent-o32.h
@@ -62,7 +62,7 @@
 [4059] = { 1,	0,		SEN(oldolduname),		"oldolduname"		},
 [4060] = { 1,	NF,		SEN(umask),			"umask"			},
 [4061] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[4062] = { 2,	0,		SEN(ustat),			"ustat"			},
+[4062] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [4063] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [4064] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [4065] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -99,7 +99,7 @@
 [4096] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [4097] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [4098] = { 0,	0,		SEN(profil),			"profil"		},
-[4099] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[4099] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [4100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [4101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [4102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -255,7 +255,7 @@
 [4252] = { 1,	0,		SEN(set_tid_address),		"set_tid_address"	},
 [4253] = { 0,	0,		SEN(restart_syscall),		"restart_syscall"	},
 [4254] = { 7,	TD,		SEN(fadvise64_64),		"fadvise64"		},
-[4255] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[4255] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [4256] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [4257] = { 3,	0,		SEN(timer_create),		"timer_create"		},
 [4258] = { 4,	0,		SEN(timer_settime),		"timer_settime"		},
diff --git a/linux/powerpc/syscallent.h b/linux/powerpc/syscallent.h
index 1431f8a..618218c 100644
--- a/linux/powerpc/syscallent.h
+++ b/linux/powerpc/syscallent.h
@@ -88,7 +88,7 @@
 [ 59] = { 1,	0,		SEN(oldolduname),		"oldolduname"		},
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -125,7 +125,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	0,		SEN(profil),			"profil"		},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -278,7 +278,7 @@
 [249] = { 2,	0,		SEN(printargs),			"swapcontext"		},
 [250] = { 3,	TS,		SEN(tgkill),			"tgkill"		},
 [251] = { 2,	TF,		SEN(utimes),			"utimes"		},
-[252] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[252] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [253] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [254] = { 6,	TD,		SEN(fadvise64_64),		"fadvise64_64"		},
 [255] = { 1,	0,		SEN(printargs),			"rtas"			},
diff --git a/linux/powerpc64/syscallent.h b/linux/powerpc64/syscallent.h
index eae3b57..20f6e8e 100644
--- a/linux/powerpc64/syscallent.h
+++ b/linux/powerpc64/syscallent.h
@@ -88,7 +88,7 @@
 [ 59] = { 1,	0,		SEN(oldolduname),		"oldolduname"		},
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -125,7 +125,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	0,		SEN(profil),			"profil"		},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -273,7 +273,7 @@
 [249] = { 2,	0,		SEN(printargs),			"swapcontext"		},
 [250] = { 3,	TS,		SEN(tgkill),			"tgkill"		},
 [251] = { 2,	TF,		SEN(utimes),			"utimes"		},
-[252] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[252] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [253] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [254] = { },
 [255] = { 1,	0,		SEN(printargs),			"rtas"			},
diff --git a/linux/s390/syscallent.h b/linux/s390/syscallent.h
index 105e511..d3ba5fe 100644
--- a/linux/s390/syscallent.h
+++ b/linux/s390/syscallent.h
@@ -90,7 +90,7 @@
 [ 59] = { },
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -127,7 +127,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { },
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -293,7 +293,7 @@
 [262] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
 [263] = { 5,	0,		SEN(vserver),			"vserver"		},
 [264] = { 6,	TD,		SEN(fadvise64_64),		"fadvise64_64"		},
-[265] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[265] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [266] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [267] = { 5,	TM|SI,		SEN(remap_file_pages),		"remap_file_pages"	},
 [268] = { 6,	TM,		SEN(mbind),			"mbind"			},
diff --git a/linux/s390x/syscallent.h b/linux/s390x/syscallent.h
index d5b5459..80b68d7 100644
--- a/linux/s390x/syscallent.h
+++ b/linux/s390x/syscallent.h
@@ -89,7 +89,7 @@
 [ 59] = { },
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -121,7 +121,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { },
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { },
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -277,7 +277,7 @@
 [262] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
 [263] = { 5,	0,		SEN(vserver),			"vserver"		},
 [264] = { },
-[265] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[265] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [266] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [267] = { 5,	TM|SI,		SEN(remap_file_pages),		"remap_file_pages"	},
 [268] = { 6,	TM,		SEN(mbind),			"mbind"			},
diff --git a/linux/sh/syscallent.h b/linux/sh/syscallent.h
index 1388416..41de292 100644
--- a/linux/sh/syscallent.h
+++ b/linux/sh/syscallent.h
@@ -90,7 +90,7 @@
 [ 59] = { 1,	0,		SEN(oldolduname),		"oldolduname"		},
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -127,7 +127,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	0,		SEN(profil),			"profil"		},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -293,7 +293,7 @@
 [265] = { 2,	0,		SEN(clock_gettime),		"clock_gettime"		},
 [266] = { 2,	0,		SEN(clock_getres),		"clock_getres"		},
 [267] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
-[268] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[268] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [269] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [270] = { 3,	TS,		SEN(tgkill),			"tgkill"		},
 [271] = { 2,	TF,		SEN(utimes),			"utimes"		},
diff --git a/linux/sh64/syscallent.h b/linux/sh64/syscallent.h
index e935104..c5de8e1 100644
--- a/linux/sh64/syscallent.h
+++ b/linux/sh64/syscallent.h
@@ -88,7 +88,7 @@
 [ 59] = { 1,	0,		SEN(oldolduname),		"oldolduname"		},
 [ 60] = { 1,	NF,		SEN(umask),			"umask"			},
 [ 61] = { 1,	TF,		SEN(chroot),			"chroot"		},
-[ 62] = { 2,	0,		SEN(ustat),			"ustat"			},
+[ 62] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [ 63] = { 2,	TD,		SEN(dup2),			"dup2"			},
 [ 64] = { 0,	NF,		SEN(getppid),			"getppid"		},
 [ 65] = { 0,	0,		SEN(getpgrp),			"getpgrp"		},
@@ -125,7 +125,7 @@
 [ 96] = { 2,	0,		SEN(getpriority),		"getpriority"		},
 [ 97] = { 3,	0,		SEN(setpriority),		"setpriority"		},
 [ 98] = { 4,	0,		SEN(profil),			"profil"		},
-[ 99] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[ 99] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [100] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [101] = { 3,	0,		SEN(ioperm),			"ioperm"		},
 [102] = { 2,	TD,		SEN(socketcall),		"socketcall"		},
@@ -319,7 +319,7 @@
 [293] = { 2,	0,		SEN(clock_gettime),		"clock_gettime"		},
 [294] = { 2,	0,		SEN(clock_getres),		"clock_getres"		},
 [295] = { 4,	0,		SEN(clock_nanosleep),		"clock_nanosleep"	},
-[296] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[296] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [297] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [298] = { 3,	TS,		SEN(tgkill),			"tgkill"		},
 [299] = { 2,	TF,		SEN(utimes),			"utimes"		},
diff --git a/linux/sparc/syscallent.h b/linux/sparc/syscallent.h
index 30d8819..3988688 100644
--- a/linux/sparc/syscallent.h
+++ b/linux/sparc/syscallent.h
@@ -155,7 +155,7 @@
 [154] = { 3,	TD,		SEN(getdents64),		"getdents64"		},
 [155] = { 3,	TD,		SEN(fcntl64),			"fcntl64"		},
 [156] = { 2,	TD,		SEN(inotify_rm_watch),		"inotify_rm_watch"	},
-[157] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[157] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [158] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [159] = { 1,	TF,		SEN(umount),			"umount"		},
 [160] = { 3,	TSC,		SEN(sched_setaffinity),		"sched_set_affinity"	},
@@ -166,7 +166,7 @@
 [165] = { 4,	TF,		SEN(quotactl),			"quotactl"		},
 [166] = { 1,	0,		SEN(set_tid_address),		"set_tid_address"	},
 [167] = { 5,	TF,		SEN(mount),			"mount"			},
-[168] = { 2,	0,		SEN(ustat),			"ustat"			},
+[168] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [169] = { 5,	TF,		SEN(setxattr),			"setxattr"		},
 [170] = { 5,	TF,		SEN(setxattr),			"lsetxattr"		},
 [171] = { 5,	TD,		SEN(fsetxattr),			"fsetxattr"		},
@@ -232,7 +232,7 @@
 [231] = { 1,	0,		SEN(time),			"time"			},
 [232] = { 6,	TD,		SEN(splice),			"splice"		},
 [233] = { 1,	0,		SEN(stime),			"stime"			},
-[234] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[234] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [235] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [236] = { 5,	TD,		SEN(llseek),			"_llseek"		},
 [237] = { 2,	TM,		SEN(mlock),			"mlock"			},
diff --git a/linux/sparc64/syscallent.h b/linux/sparc64/syscallent.h
index 1137a3e..530faab 100644
--- a/linux/sparc64/syscallent.h
+++ b/linux/sparc64/syscallent.h
@@ -153,7 +153,7 @@
 [154] = { 3,	TD,		SEN(getdents64),		"getdents64"		},
 [155] = { },
 [156] = { 2,	TD,		SEN(inotify_rm_watch),		"inotify_rm_watch"	},
-[157] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[157] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [158] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [159] = { 1,	TF,		SEN(umount),			"umount"		},
 [160] = { 3,	TSC,		SEN(sched_setaffinity),		"sched_set_affinity"	},
@@ -164,7 +164,7 @@
 [165] = { 4,	TF,		SEN(quotactl),			"quotactl"		},
 [166] = { 1,	0,		SEN(set_tid_address),		"set_tid_address"	},
 [167] = { 5,	TF,		SEN(mount),			"mount"			},
-[168] = { 2,	0,		SEN(ustat),			"ustat"			},
+[168] = { 2,	SFS,	SEN(ustat),			"ustat"			},
 [169] = { 5,	TF,		SEN(setxattr),			"setxattr"		},
 [170] = { 5,	TF,		SEN(setxattr),			"lsetxattr"		},
 [171] = { 5,	TD,		SEN(fsetxattr),			"fsetxattr"		},
@@ -230,7 +230,7 @@
 [231] = { },
 [232] = { 6,	TD,		SEN(splice),			"splice"		},
 [233] = { 1,	0,		SEN(stime),			"stime"			},
-[234] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[234] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [235] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [236] = { 5,	TD,		SEN(llseek),			"_llseek"		},
 [237] = { 2,	TM,		SEN(mlock),			"mlock"			},
diff --git a/linux/x32/syscallent.h b/linux/x32/syscallent.h
index 30a684a..088161f 100644
--- a/linux/x32/syscallent.h
+++ b/linux/x32/syscallent.h
@@ -134,8 +134,8 @@
 [133] = { 3,	TF,		SEN(mknod),			"mknod"			},
 [134] = { 1,	TF,		SEN(printargs),			"64:uselib"		},
 [135] = { 1,	NF,		SEN(personality),		"personality"		},
-[136] = { 2,	0,		SEN(ustat),			"ustat"			},
-[137] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[136] = { 2,	SFS,	SEN(ustat),			"ustat"			},
+[137] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [138] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [139] = { 3,	0,		SEN(sysfs),			"sysfs"			},
 [140] = { 2,	0,		SEN(getpriority),		"getpriority"		},
diff --git a/linux/x86_64/syscallent.h b/linux/x86_64/syscallent.h
index 62960d2..03cd44a 100644
--- a/linux/x86_64/syscallent.h
+++ b/linux/x86_64/syscallent.h
@@ -134,8 +134,8 @@
 [133] = { 3,	TF,		SEN(mknod),			"mknod"			},
 [134] = { 1,	TF,		SEN(uselib),			"uselib"		},
 [135] = { 1,	NF,		SEN(personality),		"personality"		},
-[136] = { 2,	0,		SEN(ustat),			"ustat"			},
-[137] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[136] = { 2,	SFS,	SEN(ustat),			"ustat"			},
+[137] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [138] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
 [139] = { 3,	0,		SEN(sysfs),			"sysfs"			},
 [140] = { 2,	0,		SEN(getpriority),		"getpriority"		},
diff --git a/linux/xtensa/syscallent.h b/linux/xtensa/syscallent.h
index 63995bc..dc956b0 100644
--- a/linux/xtensa/syscallent.h
+++ b/linux/xtensa/syscallent.h
@@ -175,10 +175,10 @@
 [180] = { 1,	NF,		SEN(setfsuid),			"setfsuid"		},
 [181] = { 1,	NF,		SEN(setfsgid),			"setfsgid"		},
 [182] = { 3,	0,		SEN(sysfs),			"sysfs"			},
-[183] = { 2,	0,		SEN(ustat),			"ustat"			},
-[184] = { 2,	TF,		SEN(statfs),			"statfs"		},
+[183] = { 2,	SFS,	SEN(ustat),			"ustat"			},
+[184] = { 2,	TF|SFS,	SEN(statfs),			"statfs"		},
 [185] = { 2,	TD,		SEN(fstatfs),			"fstatfs"		},
-[186] = { 3,	TF,		SEN(statfs64),			"statfs64"		},
+[186] = { 3,	TF|SFS,	SEN(statfs64),			"statfs64"		},
 [187] = { 3,	TD,		SEN(fstatfs64),			"fstatfs64"		},
 [188] = { 2,	0,		SEN(setrlimit),			"setrlimit"		},
 [189] = { 2,	0,		SEN(getrlimit),			"getrlimit"		},
diff --git a/qualify.c b/qualify.c
index b5023f2..692f7ec 100644
--- a/qualify.c
+++ b/qualify.c
@@ -220,6 +220,7 @@ lookup_class(const char *s)
 		{ "%ipc",	TRACE_IPC	},
 		{ "%network",	TRACE_NETWORK	},
 		{ "%sched",	TRACE_SCHED	},
+		{ "%statfs",	TRACE_STATFS	},
 	};
 
 	unsigned int i;
diff --git a/strace.1 b/strace.1
index 9b69ec2..155d215 100644
--- a/strace.1
+++ b/strace.1
@@ -429,6 +429,9 @@ Trace all memory mapping related system calls.
 .BR "\-e\ trace" = %sched
 Trace all scheduler-related (sched_*) system calls.
 .TP
+.BR "\-e\ trace" = %statfs
+Trace all statfs-related (*statfs* or ustat) system calls.
+.TP
 \fB\-e\ abbrev\fR=\,\fIset\fR
 Abbreviate the output from printing each member of large structures.
 The default is
diff --git a/syscall.c b/syscall.c
index 569055f..5925cb8 100644
--- a/syscall.c
+++ b/syscall.c
@@ -77,6 +77,7 @@
 #define TS TRACE_SIGNAL
 #define TM TRACE_MEMORY
 #define TSC TRACE_SCHED
+#define SFS TRACE_STATFS
 #define NF SYSCALL_NEVER_FAILS
 #define MA MAX_ARGS
 #define SI STACKTRACE_INVALIDATE_CACHE
@@ -113,6 +114,7 @@ static const struct_sysent sysent2[] = {
 #undef TS
 #undef TM
 #undef TSC
+#undef SFS
 #undef NF
 #undef MA
 #undef SI
diff --git a/sysent.h b/sysent.h
index f4eaa93..42cdbc5 100644
--- a/sysent.h
+++ b/sysent.h
@@ -22,5 +22,6 @@ typedef struct sysent {
 #define TRACE_INDIRECT_SUBCALL	02000	/* Syscall is an indirect socket/ipc subcall. */
 #define COMPAT_SYSCALL_TYPES	04000	/* A compat syscall that uses compat types. */
 #define TRACE_SCHED		010000  /* Trace scheduler-related syscalls. */
+#define TRACE_STATFS		040000  /* Trace statfs-related syscalls. */
 
 #endif /* !STRACE_SYSENT_H */
diff --git a/tests/Makefile.am b/tests/Makefile.am
index c5c124c..a4f34057 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -733,6 +733,7 @@ DECODER_TESTS = \
 	rt_sigtimedwait.test \
 	rt_tgsigqueueinfo.test \
 	sched.test \
+	trace_statfs.test \
 	sched_get_priority_mxx.test \
 	sched_rr_get_interval.test \
 	sched_xetaffinity.test \
diff --git a/tests/ksysent.c b/tests/ksysent.c
index 252feff..301d6e4 100644
--- a/tests/ksysent.c
+++ b/tests/ksysent.c
@@ -41,6 +41,7 @@
 #define TS 0
 #define TM 0
 #define TSC 0
+#define SFS 0
 #define NF 0
 #define MA 0
 #define SI 0
diff --git a/tests/nsyscalls.c b/tests/nsyscalls.c
index c2bdb20..881fc86 100644
--- a/tests/nsyscalls.c
+++ b/tests/nsyscalls.c
@@ -42,6 +42,7 @@
 #define TS 0
 #define TM 0
 #define TSC 0
+#define SFS 0
 #define NF 0
 #define MA 0
 #define SI 0
diff --git a/tests/trace_statfs.test b/tests/trace_statfs.test
new file mode 100755
index 0000000..abf97b3
--- /dev/null
+++ b/tests/trace_statfs.test
@@ -0,0 +1,55 @@
+#!/bin/sh
+
+# Check how statfs-related syscalls are traced.
+#
+# Copyright (c) 2017 The strace developers.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote products
+#    derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+STATFS_TESTS='33 ustat
+17 statfs'
+
+NON_STATFS_TESTS='11 fchdir
+27 futex
+10 fsync'
+
+. "${srcdir=.}/init.sh"
+
+echo "$STATFS_TESTS" | while read w i
+do
+	run_prog ./$i > /dev/null
+	run_strace -a$w -e%statfs ./$i > "$EXP"
+	match_diff "$LOG" "$EXP"
+done
+
+echo '+++ exited with 0 +++' > "$EXP"
+
+echo "$NON_STATFS_TESTS" | while read w i
+do
+	run_prog ./$i > /dev/null
+	run_strace -a$w -e%statfs ./$i > /dev/null
+	match_diff "$LOG" "$EXP"
+done
+
+rm "$EXP"
-- 
2.7.4

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to