configure | 21 +++++++++++++++++++ linux-user/syscall.c | 3 +++ linux-user/syscall_defs.h | 53 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+)
Signed-off-by: Shea Levy <shea@shealevy.com>
---
configure | 21 +++++++++++++++++++
linux-user/syscall.c | 3 +++
linux-user/syscall_defs.h | 53 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 77 insertions(+)
diff --git a/configure b/configure
index 913e14839d..91082aa1dc 100755
--- a/configure
+++ b/configure
@@ -5303,6 +5303,23 @@ if compile_prog "" "" ; then
have_utmpx=yes
fi
+##########################################
+# Check for newer fields of struct statfs on Linux
+
+if test "$linux_user" = "yes"; then
+ cat > $TMPC <<EOF
+#include <sys/vfs.h>
+
+int main(void) {
+ struct statfs fs;
+ fs.f_flags = 0;
+ return fs.f_flags;
+}
+EOF
+ if compile_object ; then
+ have_statfs_flags=yes
+ fi
+fi
##########################################
# checks for sanitizers
@@ -6518,6 +6535,10 @@ if test "$have_utmpx" = "yes" ; then
echo "HAVE_UTMPX=y" >> $config_host_mak
fi
+if test "$have_statfs_flags" = "yes" ; then
+ echo "HAVE_STATFS_FLAGS=y" >> $config_host_mak
+fi
+
if test "$ivshmem" = "yes" ; then
echo "CONFIG_IVSHMEM=y" >> $config_host_mak
fi
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 82b35a6bdf..77481eca2c 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -9534,6 +9534,9 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
__put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]);
__put_user(stfs.f_namelen, &target_stfs->f_namelen);
__put_user(stfs.f_frsize, &target_stfs->f_frsize);
+#ifdef HAVE_STATFS_FLAGS
+ __put_user(stfs.f_flags, &target_stfs->f_flags);
+#endif
memset(target_stfs->f_spare, 0, sizeof(target_stfs->f_spare));
unlock_user_struct(target_stfs, arg2, 1);
}
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index a35c52a60a..64aa49d3c5 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -362,7 +362,14 @@ struct kernel_statfs {
int f_ffree;
kernel_fsid_t f_fsid;
int f_namelen;
+#ifdef HAVE_STATFS_FLAGS
+ int f_frsize;
+ int f_flags;
+ int f_spare[4];
+#else
int f_spare[6];
+#endif
+
};
struct target_dirent {
@@ -2223,7 +2230,12 @@ struct target_statfs {
/* Linux specials */
target_fsid_t f_fsid;
int32_t f_namelen;
+#ifdef HAVE_STATFS_FLAGS
+ int32_t f_flags;
+ int32_t f_spare[5];
+#else
int32_t f_spare[6];
+#endif
};
#else
struct target_statfs {
@@ -2239,7 +2251,12 @@ struct target_statfs {
/* Linux specials */
target_fsid_t f_fsid;
abi_long f_namelen;
+#ifdef HAVE_STATFS_FLAGS
+ abi_long f_flags;
+ abi_long f_spare[5];
+#else
abi_long f_spare[6];
+#endif
};
#endif
@@ -2255,7 +2272,12 @@ struct target_statfs64 {
uint64_t f_bavail;
target_fsid_t f_fsid;
uint32_t f_namelen;
+#ifdef HAVE_STATFS_FLAGS
+ uint32_t f_flags;
+ uint32_t f_spare[5];
+#else
uint32_t f_spare[6];
+#endif
};
#elif (defined(TARGET_PPC64) || defined(TARGET_X86_64) || \
defined(TARGET_SPARC64) || defined(TARGET_AARCH64)) && \
@@ -2271,7 +2293,12 @@ struct target_statfs {
target_fsid_t f_fsid;
abi_long f_namelen;
abi_long f_frsize;
+#ifdef HAVE_STATFS_FLAGS
+ abi_long f_flags;
+ abi_long f_spare[4];
+#else
abi_long f_spare[5];
+#endif
};
struct target_statfs64 {
@@ -2285,7 +2312,12 @@ struct target_statfs64 {
target_fsid_t f_fsid;
abi_long f_namelen;
abi_long f_frsize;
+#ifdef HAVE_STATFS_FLAGS
+ abi_long f_flags;
+ abi_long f_spare[4];
+#else
abi_long f_spare[5];
+#endif
};
#elif defined(TARGET_S390X)
struct target_statfs {
@@ -2299,7 +2331,13 @@ struct target_statfs {
kernel_fsid_t f_fsid;
int32_t f_namelen;
int32_t f_frsize;
+#ifdef HAVE_STATFS_FLAGS
+ int32_t f_flags;
+ int32_t f_spare[4];
+#else
int32_t f_spare[5];
+#endif
+
};
struct target_statfs64 {
@@ -2313,7 +2351,12 @@ struct target_statfs64 {
kernel_fsid_t f_fsid;
int32_t f_namelen;
int32_t f_frsize;
+#ifdef HAVE_STATFS_FLAGS
+ int32_t f_flags;
+ int32_t f_spare[4];
+#else
int32_t f_spare[5];
+#endif
};
#else
struct target_statfs {
@@ -2327,7 +2370,12 @@ struct target_statfs {
target_fsid_t f_fsid;
uint32_t f_namelen;
uint32_t f_frsize;
+#ifdef HAVE_STATFS_FLAGS
+ uint32_t f_flags;
+ uint32_t f_spare[4];
+#else
uint32_t f_spare[5];
+#endif
};
struct target_statfs64 {
@@ -2341,7 +2389,12 @@ struct target_statfs64 {
target_fsid_t f_fsid;
uint32_t f_namelen;
uint32_t f_frsize;
+#ifdef HAVE_STATFS_FLAGS
+ uint32_t f_flags;
+ uint32_t f_spare[4];
+#else
uint32_t f_spare[5];
+#endif
};
#endif
--
2.16.1
Hi, This series seems to have some coding style problems. See output below for more information: Type: series Message-id: 20180223045735.1288-1-shea@shealevy.com Subject: [Qemu-devel] [PATCH v3] linux-user: Support f_flags in statfs when available. === TEST SCRIPT BEGIN === #!/bin/bash BASE=base n=1 total=$(git log --oneline $BASE.. | wc -l) failed=0 git config --local diff.renamelimit 0 git config --local diff.renames True git config --local diff.algorithm histogram commits="$(git log --format=%H --reverse $BASE..)" for c in $commits; do echo "Checking PATCH $n/$total: $(git log -n 1 --format=%s $c)..." if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then failed=1 echo fi n=$((n+1)) done exit $failed === TEST SCRIPT END === Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384 From https://github.com/patchew-project/qemu * [new tag] patchew/20180223045735.1288-1-shea@shealevy.com -> patchew/20180223045735.1288-1-shea@shealevy.com Switched to a new branch 'test' badf89878a linux-user: Support f_flags in statfs when available. === OUTPUT BEGIN === Checking PATCH 1/1: linux-user: Support f_flags in statfs when available.... ERROR: code indent should never use tabs #71: FILE: linux-user/syscall_defs.h:366: +^Iint f_frsize;$ ERROR: code indent should never use tabs #72: FILE: linux-user/syscall_defs.h:367: +^Iint f_flags;$ ERROR: code indent should never use tabs #73: FILE: linux-user/syscall_defs.h:368: +^Iint f_spare[4];$ ERROR: code indent should never use tabs #86: FILE: linux-user/syscall_defs.h:2234: +^Iint32_t^I^I^If_flags;$ ERROR: code indent should never use tabs #87: FILE: linux-user/syscall_defs.h:2235: +^Iint32_t^I^I^If_spare[5];$ ERROR: code indent should never use tabs #99: FILE: linux-user/syscall_defs.h:2255: +^Iabi_long^I^If_flags;$ ERROR: code indent should never use tabs #100: FILE: linux-user/syscall_defs.h:2256: +^Iabi_long^I^If_spare[5];$ ERROR: code indent should never use tabs #112: FILE: linux-user/syscall_defs.h:2276: +^Iuint32_t^If_flags;$ ERROR: code indent should never use tabs #113: FILE: linux-user/syscall_defs.h:2277: +^Iuint32_t^If_spare[5];$ ERROR: code indent should never use tabs #125: FILE: linux-user/syscall_defs.h:2297: +^Iabi_long f_flags;$ ERROR: code indent should never use tabs #126: FILE: linux-user/syscall_defs.h:2298: +^Iabi_long f_spare[4];$ ERROR: code indent should never use tabs #138: FILE: linux-user/syscall_defs.h:2316: +^Iabi_long f_flags;$ ERROR: code indent should never use tabs #139: FILE: linux-user/syscall_defs.h:2317: +^Iabi_long f_spare[4];$ ERROR: code indent should never use tabs #178: FILE: linux-user/syscall_defs.h:2374: +^Iuint32_t f_flags;$ ERROR: code indent should never use tabs #179: FILE: linux-user/syscall_defs.h:2375: +^Iuint32_t f_spare[4];$ ERROR: code indent should never use tabs #191: FILE: linux-user/syscall_defs.h:2393: +^Iuint32_t f_flags;$ ERROR: code indent should never use tabs #192: FILE: linux-user/syscall_defs.h:2394: +^Iuint32_t f_spare[4];$ total: 17 errors, 0 warnings, 165 lines checked Your patch has style problems, please review. If any of these errors are false positives report them to the maintainer, see CHECKPATCH in MAINTAINERS. === OUTPUT END === Test command exited with code: 1 --- Email generated automatically by Patchew [http://patchew.org/]. Please send your feedback to patchew-devel@freelists.org
Le 23/02/2018 à 05:57, Shea Levy a écrit : > Signed-off-by: Shea Levy <shea@shealevy.com> > --- > configure | 21 +++++++++++++++++++ > linux-user/syscall.c | 3 +++ > linux-user/syscall_defs.h | 53 +++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 77 insertions(+) > > diff --git a/configure b/configure > index 913e14839d..91082aa1dc 100755 > --- a/configure > +++ b/configure > @@ -5303,6 +5303,23 @@ if compile_prog "" "" ; then > have_utmpx=yes > fi > > +########################################## > +# Check for newer fields of struct statfs on Linux > + > +if test "$linux_user" = "yes"; then > + cat > $TMPC <<EOF > +#include <sys/vfs.h> > + > +int main(void) { > + struct statfs fs; > + fs.f_flags = 0; > + return fs.f_flags; > +} > +EOF > + if compile_object ; then > + have_statfs_flags=yes > + fi > +fi I don't think you need this. statfs is provided by glibc and glibc as a flag to tell code we have this member: _STATFS_F_FLAGS (see glibc commit: 3cdaa6adb1 f_flags in Linux statfs implementation. (Wed Aug 11 14:07:28 2010 -0700) since glibc 2.13) > ########################################## > # checks for sanitizers > > @@ -6518,6 +6535,10 @@ if test "$have_utmpx" = "yes" ; then > echo "HAVE_UTMPX=y" >> $config_host_mak > fi > > +if test "$have_statfs_flags" = "yes" ; then > + echo "HAVE_STATFS_FLAGS=y" >> $config_host_mak > +fi > + > if test "$ivshmem" = "yes" ; then > echo "CONFIG_IVSHMEM=y" >> $config_host_mak > fi > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 82b35a6bdf..77481eca2c 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -9534,6 +9534,9 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > __put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]); > __put_user(stfs.f_namelen, &target_stfs->f_namelen); > __put_user(stfs.f_frsize, &target_stfs->f_frsize); > +#ifdef HAVE_STATFS_FLAGS #ifdef _STATFS_F_FLAGS > + __put_user(stfs.f_flags, &target_stfs->f_flags); I think you should define f_flags in target_statfs unconditionally (see below), so you should clear target_stfs->f_flags if host kernel doesn't support it: glibc will check for "ST_VALID" flag to see if this field is implemented by the kernel, and we must be sure in this case it is not set. > +#endif > memset(target_stfs->f_spare, 0, sizeof(target_stfs->f_spare)); > unlock_user_struct(target_stfs, arg2, 1); > } > diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h > index a35c52a60a..64aa49d3c5 100644 > --- a/linux-user/syscall_defs.h > +++ b/linux-user/syscall_defs.h > @@ -362,7 +362,14 @@ struct kernel_statfs { > int f_ffree; > kernel_fsid_t f_fsid; > int f_namelen; > +#ifdef HAVE_STATFS_FLAGS > + int f_frsize; > + int f_flags; > + int f_spare[4]; > +#else > int f_spare[6]; > +#endif > + > }; I think the kernel_statfs structure can be removed totally, as it is not used anymore since: 56c8f68f1d statfs fix (Mon Nov 28 22:28:41 2005) > > struct target_dirent { > @@ -2223,7 +2230,12 @@ struct target_statfs { I think you can update unconditionally all target_statfs to be in sync with current kernel structures, that have been updated by: commit 365b18189789bfa1acd9939e6312b8a4b4577b28 Author: Christoph Hellwig <hch@lst.de> Date: Wed Jul 7 18:53:25 2010 +0200 add f_flags to struct statfs(64) 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. Thanks, Laurent
Signed-off-by: Shea Levy <shea@shealevy.com>
---
linux-user/syscall.c | 5 +++++
linux-user/syscall_defs.h | 41 +++++++++++++++++++----------------------
2 files changed, 24 insertions(+), 22 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 82b35a6bdf..03dca7ea77 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -9534,6 +9534,11 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
__put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]);
__put_user(stfs.f_namelen, &target_stfs->f_namelen);
__put_user(stfs.f_frsize, &target_stfs->f_frsize);
+#ifdef _STATFS_F_FLAGS
+ __put_user(stfs.f_flags, &target_stfs->f_flags);
+#else
+ __put_user(0, &target_stfs->f_flags);
+#endif
memset(target_stfs->f_spare, 0, sizeof(target_stfs->f_spare));
unlock_user_struct(target_stfs, arg2, 1);
}
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index a35c52a60a..ee340b8eac 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -352,19 +352,6 @@ typedef struct {
int val[2];
} kernel_fsid_t;
-struct kernel_statfs {
- int f_type;
- int f_bsize;
- int f_blocks;
- int f_bfree;
- int f_bavail;
- int f_files;
- int f_ffree;
- kernel_fsid_t f_fsid;
- int f_namelen;
- int f_spare[6];
-};
-
struct target_dirent {
abi_long d_ino;
abi_long d_off;
@@ -2223,7 +2210,8 @@ struct target_statfs {
/* Linux specials */
target_fsid_t f_fsid;
int32_t f_namelen;
- int32_t f_spare[6];
+ int32_t f_flags;
+ int32_t f_spare[5];
};
#else
struct target_statfs {
@@ -2239,7 +2227,8 @@ struct target_statfs {
/* Linux specials */
target_fsid_t f_fsid;
abi_long f_namelen;
- abi_long f_spare[6];
+ abi_long f_flags;
+ abi_long f_spare[5];
};
#endif
@@ -2255,7 +2244,8 @@ struct target_statfs64 {
uint64_t f_bavail;
target_fsid_t f_fsid;
uint32_t f_namelen;
- uint32_t f_spare[6];
+ uint32_t f_flags;
+ uint32_t f_spare[5];
};
#elif (defined(TARGET_PPC64) || defined(TARGET_X86_64) || \
defined(TARGET_SPARC64) || defined(TARGET_AARCH64)) && \
@@ -2271,7 +2261,8 @@ struct target_statfs {
target_fsid_t f_fsid;
abi_long f_namelen;
abi_long f_frsize;
- abi_long f_spare[5];
+ abi_long f_flags;
+ abi_long f_spare[4];
};
struct target_statfs64 {
@@ -2285,7 +2276,8 @@ struct target_statfs64 {
target_fsid_t f_fsid;
abi_long f_namelen;
abi_long f_frsize;
- abi_long f_spare[5];
+ abi_long f_flags;
+ abi_long f_spare[4];
};
#elif defined(TARGET_S390X)
struct target_statfs {
@@ -2299,7 +2291,9 @@ struct target_statfs {
kernel_fsid_t f_fsid;
int32_t f_namelen;
int32_t f_frsize;
- int32_t f_spare[5];
+ int32_t f_flags;
+ int32_t f_spare[4];
+
};
struct target_statfs64 {
@@ -2313,7 +2307,8 @@ struct target_statfs64 {
kernel_fsid_t f_fsid;
int32_t f_namelen;
int32_t f_frsize;
- int32_t f_spare[5];
+ int32_t f_flags;
+ int32_t f_spare[4];
};
#else
struct target_statfs {
@@ -2327,7 +2322,8 @@ struct target_statfs {
target_fsid_t f_fsid;
uint32_t f_namelen;
uint32_t f_frsize;
- uint32_t f_spare[5];
+ uint32_t f_flags;
+ uint32_t f_spare[4];
};
struct target_statfs64 {
@@ -2341,7 +2337,8 @@ struct target_statfs64 {
target_fsid_t f_fsid;
uint32_t f_namelen;
uint32_t f_frsize;
- uint32_t f_spare[5];
+ uint32_t f_flags;
+ uint32_t f_spare[4];
};
#endif
--
2.16.1
Le 01/03/2018 à 12:15, Shea Levy a écrit : > Signed-off-by: Shea Levy <shea@shealevy.com> > --- > linux-user/syscall.c | 5 +++++ > linux-user/syscall_defs.h | 41 +++++++++++++++++++---------------------- > 2 files changed, 24 insertions(+), 22 deletions(-) > Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Hi, This series seems to have some coding style problems. See output below for more information: Type: series Message-id: 20180301111500.15717-1-shea@shealevy.com Subject: [Qemu-devel] [PATCH v4] linux-user: Support f_flags in statfs when available. === TEST SCRIPT BEGIN === #!/bin/bash BASE=base n=1 total=$(git log --oneline $BASE.. | wc -l) failed=0 git config --local diff.renamelimit 0 git config --local diff.renames True git config --local diff.algorithm histogram commits="$(git log --format=%H --reverse $BASE..)" for c in $commits; do echo "Checking PATCH $n/$total: $(git log -n 1 --format=%s $c)..." if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then failed=1 echo fi n=$((n+1)) done exit $failed === TEST SCRIPT END === Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384 From https://github.com/patchew-project/qemu * [new tag] patchew/20180301111500.15717-1-shea@shealevy.com -> patchew/20180301111500.15717-1-shea@shealevy.com Switched to a new branch 'test' 86c0c495f9 linux-user: Support f_flags in statfs when available. === OUTPUT BEGIN === Checking PATCH 1/1: linux-user: Support f_flags in statfs when available.... ERROR: code indent should never use tabs #55: FILE: linux-user/syscall_defs.h:2213: +^Iint32_t^I^I^If_flags;$ ERROR: code indent should never use tabs #56: FILE: linux-user/syscall_defs.h:2214: +^Iint32_t^I^I^If_spare[5];$ ERROR: code indent should never use tabs #65: FILE: linux-user/syscall_defs.h:2230: +^Iabi_long^I^If_flags;$ ERROR: code indent should never use tabs #66: FILE: linux-user/syscall_defs.h:2231: +^Iabi_long^I^If_spare[5];$ ERROR: code indent should never use tabs #75: FILE: linux-user/syscall_defs.h:2247: +^Iuint32_t^If_flags;$ ERROR: code indent should never use tabs #76: FILE: linux-user/syscall_defs.h:2248: +^Iuint32_t^If_spare[5];$ ERROR: code indent should never use tabs #85: FILE: linux-user/syscall_defs.h:2264: +^Iabi_long f_flags;$ ERROR: code indent should never use tabs #86: FILE: linux-user/syscall_defs.h:2265: +^Iabi_long f_spare[4];$ ERROR: code indent should never use tabs #95: FILE: linux-user/syscall_defs.h:2279: +^Iabi_long f_flags;$ ERROR: code indent should never use tabs #96: FILE: linux-user/syscall_defs.h:2280: +^Iabi_long f_spare[4];$ ERROR: code indent should never use tabs #126: FILE: linux-user/syscall_defs.h:2325: +^Iuint32_t f_flags;$ ERROR: code indent should never use tabs #127: FILE: linux-user/syscall_defs.h:2326: +^Iuint32_t f_spare[4];$ ERROR: code indent should never use tabs #136: FILE: linux-user/syscall_defs.h:2340: +^Iuint32_t f_flags;$ ERROR: code indent should never use tabs #137: FILE: linux-user/syscall_defs.h:2341: +^Iuint32_t f_spare[4];$ total: 14 errors, 0 warnings, 112 lines checked Your patch has style problems, please review. If any of these errors are false positives report them to the maintainer, see CHECKPATCH in MAINTAINERS. === OUTPUT END === Test command exited with code: 1 --- Email generated automatically by Patchew [http://patchew.org/]. Please send your feedback to patchew-devel@freelists.org
Le 01/03/2018 à 12:15, Shea Levy a écrit : > Signed-off-by: Shea Levy <shea@shealevy.com> > --- > linux-user/syscall.c | 5 +++++ > linux-user/syscall_defs.h | 41 +++++++++++++++++++---------------------- > 2 files changed, 24 insertions(+), 22 deletions(-) Applied to my 'linux-user-for-2.12' branch. Thanks, Laurent
© 2016 - 2025 Red Hat, Inc.