1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

f_flags in Linux statfs implementation.

The 2.6.36 kernel provides an additional field in the statfs results.
Use this value in the statvfs emulation to avoid filling in f_flag
the hard way.
This commit is contained in:
Ulrich Drepper
2010-08-11 14:07:28 -07:00
parent 754f7da38b
commit 3cdaa6adb1
5 changed files with 47 additions and 11 deletions

View File

@ -1,5 +1,18 @@
2010-08-11 Ulrich Drepper <drepper@redhat.com> 2010-08-11 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/bits/statfs.h (struct statfs): Add f_flags
field.
(struct statfs64): Likewise.
(_STATFS_F_FLAGS): Define.
* sysdeps/unix/sysv/linux/s390/bits/statfs.h: Likewise.
* sysdeps/unix/sysv/linux/internal_statvfs.c (__statvfs_getflags):
Don't define if __ASSUME_STATFS_F_FLAGS is defined.
(ST_VALID): Define locally.
(INTERNAL_STATVFS): If f_flags has ST_VALID set don't call
__statvfs_getflags, use the provided value.
* sysdeps/unix/sysv/linux/kernel-features.h: Define
__ASSUME_STATFS_F_FLAGS.
* sysdeps/unix/sysv/linux/sys/inotify.h (IN_EXCL_UNLINK): Define. * sysdeps/unix/sysv/linux/sys/inotify.h (IN_EXCL_UNLINK): Define.
* sysdeps/unix/sysv/linux/Makefile [subdir=misc] (sysdep_headers): * sysdeps/unix/sysv/linux/Makefile [subdir=misc] (sysdep_headers):

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc. /* Copyright (C) 1997,1998,2000,2002,2003,2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -42,7 +42,8 @@ struct statfs
__fsid_t f_fsid; __fsid_t f_fsid;
__SWORD_TYPE f_namelen; __SWORD_TYPE f_namelen;
__SWORD_TYPE f_frsize; __SWORD_TYPE f_frsize;
__SWORD_TYPE f_spare[5]; __SWORD_TYPE f_flags;
__SWORD_TYPE f_spare[4];
}; };
#ifdef __USE_LARGEFILE64 #ifdef __USE_LARGEFILE64
@ -58,10 +59,12 @@ struct statfs64
__fsid_t f_fsid; __fsid_t f_fsid;
__SWORD_TYPE f_namelen; __SWORD_TYPE f_namelen;
__SWORD_TYPE f_frsize; __SWORD_TYPE f_frsize;
__SWORD_TYPE f_spare[5]; __SWORD_TYPE f_flags;
__SWORD_TYPE f_spare[4];
}; };
#endif #endif
/* Tell code we have these members. */ /* Tell code we have these members. */
#define _STATFS_F_NAMELEN #define _STATFS_F_NAMELEN
#define _STATFS_F_FRSIZE #define _STATFS_F_FRSIZE
#define _STATFS_F_FLAGS

View File

@ -29,6 +29,11 @@
#include <sys/statfs.h> #include <sys/statfs.h>
#include <sys/statvfs.h> #include <sys/statvfs.h>
#include "linux_fsinfo.h" #include "linux_fsinfo.h"
#include "kernel-features.h"
/* Special internal-only bit value. */
#define ST_VALID 0x0020
#ifndef STATFS #ifndef STATFS
@ -37,6 +42,7 @@
# define INTERNAL_STATVFS __internal_statvfs # define INTERNAL_STATVFS __internal_statvfs
# ifndef __ASSUME_STATFS_F_FLAGS
int int
__statvfs_getflags (const char *name, int fstype, struct stat64 *st) __statvfs_getflags (const char *name, int fstype, struct stat64 *st)
{ {
@ -200,6 +206,7 @@ __statvfs_getflags (const char *name, int fstype, struct stat64 *st)
return result; return result;
} }
# endif
#else #else
extern int __statvfs_getflags (const char *name, int fstype, extern int __statvfs_getflags (const char *name, int fstype,
struct stat64 *st); struct stat64 *st);
@ -240,9 +247,14 @@ INTERNAL_STATVFS (const char *name, struct STATVFS *buf,
/* XXX I have no idea how to compute f_favail. Any idea??? */ /* XXX I have no idea how to compute f_favail. Any idea??? */
buf->f_favail = buf->f_ffree; buf->f_favail = buf->f_ffree;
#ifndef __ASSUME_STATFS_F_FLAGS
if ((fsbuf->f_flags & ST_VALID) == 0)
/* Determining the flags is tricky. We have to read /proc/mounts or /* Determining the flags is tricky. We have to read /proc/mounts or
the /etc/mtab file and search for the entry which matches the given the /etc/mtab file and search for the entry which matches the given
file. The way we can test for matching filesystem is using the file. The way we can test for matching filesystem is using the
device number. */ device number. */
buf->f_flag = __statvfs_getflags (name, fsbuf->f_type, st); buf->f_flag = __statvfs_getflags (name, fsbuf->f_type, st);
else
#endif
buf->f_flag = fsbuf->f_flags ^ ST_VALID;
} }

View File

@ -530,3 +530,8 @@
#if __LINUX_KERNEL_VERSION >= 0x020621 #if __LINUX_KERNEL_VERSION >= 0x020621
# define __ASSUME_RECVMMSG 1 # define __ASSUME_RECVMMSG 1
#endif #endif
/* statfs fills in f_flags since 2.6.36. */
#if __LINUX_KERNEL_VERSION >= 0x020624
# define __ASSUME_STATFS_F_FLAGS 1
#endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1997, 1998, 2000, 2003 Free Software Foundation, Inc. /* Copyright (C) 1997, 1998, 2000, 2003, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -42,7 +42,8 @@ struct statfs
__fsid_t f_fsid; __fsid_t f_fsid;
int f_namelen; int f_namelen;
int f_frsize; int f_frsize;
int f_spare[5]; int f_flags;
int f_spare[4];
}; };
#ifdef __USE_LARGEFILE64 #ifdef __USE_LARGEFILE64
@ -58,10 +59,12 @@ struct statfs64
__fsid_t f_fsid; __fsid_t f_fsid;
int f_namelen; int f_namelen;
int f_frsize; int f_frsize;
int f_spare[5]; int f_flags;
int f_spare[4];
}; };
#endif #endif
/* Tell code we have this member. */ /* Tell code we have this member. */
#define _STATFS_F_NAMELEN #define _STATFS_F_NAMELEN
#define _STATFS_F_FRSIZE #define _STATFS_F_FRSIZE
#define _STATFS_F_FLAGS