From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23462 invoked by alias); 18 Oct 2002 14:59:56 -0000 Mailing-List: contact libc-hacker-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sources.redhat.com Received: (qmail 23446 invoked from network); 18 Oct 2002 14:59:55 -0000 Received: from unknown (HELO sunsite.mff.cuni.cz) (195.113.19.66) by sources.redhat.com with SMTP; 18 Oct 2002 14:59:55 -0000 Received: (from jakub@localhost) by sunsite.mff.cuni.cz (8.11.6/8.11.6) id g9IExoN03490; Fri, 18 Oct 2002 16:59:50 +0200 Date: Fri, 18 Oct 2002 11:59:00 -0000 From: Jakub Jelinek To: Roland McGrath , Ulrich Drepper Cc: Glibc hackers Subject: [PATCH] Fix {,f}pathconf Message-ID: <20021018165950.T3451@sunsite.ms.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-SW-Source: 2002-10/txt/msg00068.txt.bz2 Hi! Recent pathconf changes broke alpha build (both linux/pathconf.c and alpha/linux/pathconf.c are redefining __pathconf). But looking at it I found that alpha/*pathconf.c is bogus, not just alpha but all linux platforms support files >= 2GB on some filesystems. Looking at the kernel, it is really a mess to find out what the maximum filesizes are, but I've at least tried. Ideally kernel would implement itself *pathconf (and even then s_maxbytes would have to be cleaned up). 2002-10-18 Jakub Jelinek * sysdeps/unix/sysv/linux/pathconf.h (statfs_link_max): Add inline. (statfs_filesize_max): New function. * sysdeps/unix/sysv/linux/linux_fsinfo.h (JFFS_SUPER_MAGIC, JFFS2_SUPER_MAGIC, JFS_SUPER_MAGIC, NTFS_SUPER_MAGIC, ROMFS_SUPER_MAGIC, UDF_SUPER_MAGIC): Define. * sysdeps/unix/sysv/linux/fpathconf.c (__fpathconf): Use statfs_filesize_max. * sysdeps/unix/sysv/linux/pathconf.c (__pathconf): Likewise. * sysdeps/unix/sysv/linux/alpha/fpathconf.c: Removed. * sysdeps/unix/sysv/linux/alpha/pathconf.c: Removed. --- libc/sysdeps/unix/sysv/linux/alpha/pathconf.c.jj 2002-10-17 13:34:33.000000000 +0200 +++ libc/sysdeps/unix/sysv/linux/alpha/pathconf.c 2002-10-18 14:02:21.000000000 +0200 @@ -1,51 +0,0 @@ -/* Get file-specific information about a file. Linux/Alpha version. - Copyright (C) 1991,95,96,98,99,2000,2001,2002 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include -#include - -static long int linux_pathconf (const char *file, int name); - -/* Define this first, so it can be inlined. */ -#define __pathconf static linux_pathconf -#include - - -/* Get file-specific information about FILE. */ -long int -__pathconf (const char *file, int name) -{ - if (name == _PC_FILESIZEBITS) - { - /* Test whether this is on a ext2 or UFS filesystem which - support large files. */ - struct statfs fs; - - if (__statfs (file, &fs) < 0 - || (fs.f_type != EXT2_SUPER_MAGIC - && fs.f_type != UFS_MAGIC - && fs.f_type != UFS_CIGAM)) - return 32; - - /* This filesystem supported files >2GB. */ - return 64; - } - - return linux_pathconf (file, name); -} --- libc/sysdeps/unix/sysv/linux/alpha/fpathconf.c.jj 2002-10-17 13:34:33.000000000 +0200 +++ libc/sysdeps/unix/sysv/linux/alpha/fpathconf.c 2002-10-18 14:02:28.000000000 +0200 @@ -1,52 +0,0 @@ -/* Get file-specific information about a descriptor. Linux/Alpha version. - Copyright (C) 1991,95,96,98,99,2000,2001,2002 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include -#include - - -static long int linux_fpathconf (int fd, int name); - -/* Define this first, so it can be inlined. */ -#define __fpathconf static linux_fpathconf -#include - - -/* Get file-specific information about FD. */ -long int -__pathconf (int fd, int name) -{ - if (name == _PC_FILESIZEBITS) - { - /* Test whether this is on a ext2 or UFS filesystem which - support large files. */ - struct statfs fs; - - if (__fstatfs (fd, &fs) < 0 - || (fs.f_type != EXT2_SUPER_MAGIC - && fs.f_type != UFS_MAGIC - && fs.f_type != UFS_CIGAM)) - return 32; - - /* This filesystem supported files >2GB. */ - return 64; - } - - return linux_fpathconf (fd, name); -} --- libc/sysdeps/unix/sysv/linux/pathconf.h.jj 2002-10-17 00:09:42.000000000 +0200 +++ libc/sysdeps/unix/sysv/linux/pathconf.h 2002-10-18 14:35:58.000000000 +0200 @@ -24,7 +24,7 @@ /* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */ -static long int +static inline long int statfs_link_max (int result, const struct statfs *fsbuf) { if (result < 0) @@ -74,3 +74,49 @@ statfs_link_max (int result, const struc return LINUX_LINK_MAX; } } + +/* Used like: return statfs_filesize_max (__statfs (name, &buf), &buf); */ + +static inline long int +statfs_filesize_max (int result, const struct statfs *fsbuf) +{ + if (result < 0) + { + if (errno == ENOSYS) + /* Not possible, return the default value. */ + return 31; + + /* Some error occured. */ + return -1; + } + + switch (fsbuf->f_type) + { + case EXT2_SUPER_MAGIC: + case UFS_MAGIC: + case UFS_CIGAM: + case REISERFS_SUPER_MAGIC: + return 41; + + case MSDOS_SUPER_MAGIC: + case JFFS_SUPER_MAGIC: + case JFFS2_SUPER_MAGIC: + case NCP_SUPER_MAGIC: + case ROMFS_SUPER_MAGIC: + return 32; + + case XFS_SUPER_MAGIC: + return 43; + + case SMB_SUPER_MAGIC: + case NTFS_SUPER_MAGIC: + case UDF_SUPER_MAGIC: + case JFS_SUPER_MAGIC: + /* These claim s_maxbytes MAX_LFS_FILESIZE, but I don't think they + actually support that much yet. */ + return 41; + + default: + return 31; + } +} --- libc/sysdeps/unix/sysv/linux/linux_fsinfo.h.jj 2002-10-17 13:34:33.000000000 +0200 +++ libc/sysdeps/unix/sysv/linux/linux_fsinfo.h 2002-10-18 14:34:58.000000000 +0200 @@ -58,6 +58,15 @@ /* Constant that identifies the `iso9660' filesystem. */ #define ISOFS_SUPER_MAGIC 0x9660 +/* Constant that identifies the `jffs' filesystem. */ +#define JFFS_SUPER_MAGIC 0x07c0 + +/* Constant that identifies the `jffs2' filesystem. */ +#define JFFS2_SUPER_MAGIC 0x72b6 + +/* Constant that identifies the `jfs' filesystem. */ +#define JFS_SUPER_MAGIC 0x3153464a + /* Constants that identify the `minix2' filesystem. */ #define MINIX2_SUPER_MAGIC 0x2468 #define MINIX2_SUPER_MAGIC2 0x2478 @@ -75,6 +84,9 @@ /* Constants that identify the `nfs' filesystem. */ #define NFS_SUPER_MAGIC 0x6969 +/* Constants that identify the `ntfs' filesystem. */ +#define NTFS_SUPER_MAGIC 0x5346544e + /* Constants that identify the `proc' filesystem. */ #define PROC_SUPER_MAGIC 0x9fa0 @@ -84,6 +96,9 @@ /* Constants that identify the `reiser' filesystem. */ #define REISERFS_SUPER_MAGIC 0x52654973 +/* Constant that identifies the `romfs' filesystem. */ +#define ROMFS_SUPER_MAGIC 0x7275 + /* Constants that identify the `smb' filesystem. */ #define SMB_SUPER_MAGIC 0x517b @@ -91,6 +106,9 @@ #define SYSV2_SUPER_MAGIC 0x012ff7b6 #define SYSV4_SUPER_MAGIC 0x012ff7b5 +/* Constants that identify the `udf' filesystem. */ +#define UDF_SUPER_MAGIC 0x15013346 + /* Constants that identify the `ufs' filesystem. */ #define UFS_MAGIC 0x00011954 #define UFS_CIGAM 0x54190100 /* byteswapped MAGIC */ --- libc/sysdeps/unix/sysv/linux/pathconf.c.jj 2002-10-17 13:34:33.000000000 +0200 +++ libc/sysdeps/unix/sysv/linux/pathconf.c 2002-10-18 14:39:07.000000000 +0200 @@ -30,11 +30,15 @@ static long int posix_pathconf (const ch long int __pathconf (const char *file, int name) { - if (name == _PC_LINK_MAX) + struct statfs fsbuf; + + switch (name) { - struct statfs fsbuf; + case _PC_LINK_MAX: return statfs_link_max (__statfs (file, &fsbuf), &fsbuf); + case _PC_FILESIZEBITS: + return statfs_filesize_max (__statfs (file, &fsbuf), &fsbuf); + default: + return posix_pathconf (file, name); } - - return posix_pathconf (file, name); } --- libc/sysdeps/unix/sysv/linux/fpathconf.c.jj 2002-10-17 13:34:33.000000000 +0200 +++ libc/sysdeps/unix/sysv/linux/fpathconf.c 2002-10-18 14:39:37.000000000 +0200 @@ -32,11 +32,15 @@ __fpathconf (fd, name) int fd; int name; { - if (name == _PC_LINK_MAX) + struct statfs fsbuf; + + switch (name) { - struct statfs fsbuf; + case _PC_LINK_MAX: return statfs_link_max (__fstatfs (fd, &fsbuf), &fsbuf); + case _PC_FILESIZEBITS: + return statfs_filesize_max (__fstatfs (fd, &fsbuf), &fsbuf); + default: + return posix_fpathconf (fd, name); } - - return posix_fpathconf (fd, name); } Jakub