public inbox for libc-hacker@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Fix {,f}pathconf
@ 2002-10-18 11:59 Jakub Jelinek
  2002-10-18 12:04 ` Roland McGrath
  2002-10-18 12:53 ` Roland McGrath
  0 siblings, 2 replies; 3+ messages in thread
From: Jakub Jelinek @ 2002-10-18 11:59 UTC (permalink / raw)
  To: Roland McGrath, Ulrich Drepper; +Cc: Glibc hackers

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  <jakub@redhat.com>

	* 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 <unistd.h>
-#include <sys/statfs.h>
-
-static long int linux_pathconf (const char *file, int name);
-
-/* Define this first, so it can be inlined.  */
-#define __pathconf static linux_pathconf
-#include <sysdeps/unix/sysv/linux/pathconf.c>
-
-
-/* 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 <unistd.h>
-#include <sys/statfs.h>
-
-
-static long int linux_fpathconf (int fd, int name);
-
-/* Define this first, so it can be inlined.  */
-#define __fpathconf static linux_fpathconf
-#include <sysdeps/unix/sysv/linux/fpathconf.c>
-
-
-/* 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

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Fix {,f}pathconf
  2002-10-18 11:59 [PATCH] Fix {,f}pathconf Jakub Jelinek
@ 2002-10-18 12:04 ` Roland McGrath
  2002-10-18 12:53 ` Roland McGrath
  1 sibling, 0 replies; 3+ messages in thread
From: Roland McGrath @ 2002-10-18 12:04 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Ulrich Drepper, Glibc hackers

> Recent pathconf changes broke alpha build (both linux/pathconf.c and
> alpha/linux/pathconf.c are redefining __pathconf).

Oops, braino on my part.

> 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.

Ok, but this changes the answers seen now and I don't know what users expect.

I like your changes to make the code generic, but the exact values you use
are wrong.  I think users will expect to see 32 or 64 and not anything
else.  FILESIZEBITS is not specified as the exact log2 of the maximum file
size, but rather as the minimum number of bits needed to represent *as a
signed integer* the maximum file size.  So, for 2GB files it needs to be
32, not 31--moreover, POSIX.1 specifies that 32 is the minimum value an
implementation can define.  It would meet the spec to return 42 when the
max size if 2^41-1, but I think it's a better plan to return 64, and in the
general case to return the bitcount of the off_t equivalent type
appropriate for the filesystem rather than its internal storage format limit.

> 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).

We are all agreed here, but the kernel people never helped in the past.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Fix {,f}pathconf
  2002-10-18 11:59 [PATCH] Fix {,f}pathconf Jakub Jelinek
  2002-10-18 12:04 ` Roland McGrath
@ 2002-10-18 12:53 ` Roland McGrath
  1 sibling, 0 replies; 3+ messages in thread
From: Roland McGrath @ 2002-10-18 12:53 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Ulrich Drepper, Glibc hackers

I put the change in modified to return only 32 or 64.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2002-10-18 19:04 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-18 11:59 [PATCH] Fix {,f}pathconf Jakub Jelinek
2002-10-18 12:04 ` Roland McGrath
2002-10-18 12:53 ` Roland McGrath

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).