svn commit: r195458 - in head: include lib/libc/sys sys/bsm sys/compat/freebsd32 sys/compat/svr4 sys/i386/ibcs2 sys/kern sys/sys

Edward Tomasz Napierala trasz at FreeBSD.org
Wed Jul 8 15:23:19 UTC 2009


Author: trasz
Date: Wed Jul  8 15:23:18 2009
New Revision: 195458
URL: http://svn.freebsd.org/changeset/base/195458

Log:
  There is an optimization in chmod(1), that makes it not to call chmod(2)
  if the new file mode is the same as it was before; however, this
  optimization must be disabled for filesystems that support NFSv4 ACLs.
  Chmod uses pathconf(2) to determine whether this is the case - however,
  pathconf(2) always follows symbolic links, while the 'chmod -h' doesn't.
  
  This change adds lpathconf(3) to make it possible to solve that problem
  in a clean way.
  
  Reviewed by:	rwatson (earlier version)
  Approved by:	re (kib)

Modified:
  head/include/unistd.h
  head/lib/libc/sys/Makefile.inc
  head/lib/libc/sys/Symbol.map
  head/lib/libc/sys/pathconf.2
  head/sys/bsm/audit_kevents.h
  head/sys/compat/freebsd32/syscalls.master
  head/sys/compat/svr4/svr4_stat.c
  head/sys/i386/ibcs2/ibcs2_misc.c
  head/sys/kern/syscalls.master
  head/sys/kern/vfs_syscalls.c
  head/sys/sys/syscallsubr.h

Modified: head/include/unistd.h
==============================================================================
--- head/include/unistd.h	Wed Jul  8 15:02:56 2009	(r195457)
+++ head/include/unistd.h	Wed Jul  8 15:23:18 2009	(r195458)
@@ -513,6 +513,7 @@ int	 initgroups(const char *, gid_t);
 int	 iruserok(unsigned long, int, const char *, const char *);
 int	 iruserok_sa(const void *, int, int, const char *, const char *);
 int	 issetugid(void);
+long	 lpathconf(const char *, int);
 #ifndef _MKDTEMP_DECLARED
 char	*mkdtemp(char *);
 #define	_MKDTEMP_DECLARED

Modified: head/lib/libc/sys/Makefile.inc
==============================================================================
--- head/lib/libc/sys/Makefile.inc	Wed Jul  8 15:02:56 2009	(r195457)
+++ head/lib/libc/sys/Makefile.inc	Wed Jul  8 15:23:18 2009	(r195458)
@@ -159,6 +159,7 @@ MLINKS+=mq_send.2 mq_timedsend.2
 MLINKS+=ntp_adjtime.2 ntp_gettime.2
 MLINKS+=open.2 openat.2
 MLINKS+=pathconf.2 fpathconf.2
+MLINKS+=pathconf.2 lpathconf.2
 MLINKS+=read.2 pread.2 read.2 preadv.2 read.2 readv.2
 MLINKS+=readlink.2 readlinkat.2
 MLINKS+=recv.2 recvfrom.2 recv.2 recvmsg.2

Modified: head/lib/libc/sys/Symbol.map
==============================================================================
--- head/lib/libc/sys/Symbol.map	Wed Jul  8 15:02:56 2009	(r195457)
+++ head/lib/libc/sys/Symbol.map	Wed Jul  8 15:23:18 2009	(r195458)
@@ -346,6 +346,7 @@ FBSD_1.1 {
 	jail_set;
 	jail_remove;
 	linkat;
+	lpathconf;
 	mkdirat;
 	mkfifoat;
 	mknodat;

Modified: head/lib/libc/sys/pathconf.2
==============================================================================
--- head/lib/libc/sys/pathconf.2	Wed Jul  8 15:02:56 2009	(r195457)
+++ head/lib/libc/sys/pathconf.2	Wed Jul  8 15:23:18 2009	(r195458)
@@ -28,11 +28,12 @@
 .\"	@(#)pathconf.2	8.1 (Berkeley) 6/4/93
 .\" $FreeBSD$
 .\"
-.Dd June 25, 2009
+.Dd July 7, 2009
 .Dt PATHCONF 2
 .Os
 .Sh NAME
 .Nm pathconf ,
+.Nm lpathconf ,
 .Nm fpathconf
 .Nd get configurable pathname variables
 .Sh LIBRARY
@@ -42,10 +43,13 @@
 .Ft long
 .Fn pathconf "const char *path" "int name"
 .Ft long
+.Fn lpathconf "const char *path" "int name"
+.Ft long
 .Fn fpathconf "int fd" "int name"
 .Sh DESCRIPTION
 The
-.Fn pathconf
+.Fn pathconf ,
+.Fn lpathconf
 and
 .Fn fpathconf
 system calls provide a method for applications to determine the current
@@ -53,7 +57,9 @@ value of a configurable system limit or 
 with a pathname or file descriptor.
 .Pp
 For
-.Fn pathconf ,
+.Fn pathconf
+and
+.Fn lpathconf ,
 the
 .Fa path
 argument is the name of a file or directory.
@@ -68,6 +74,18 @@ argument specifies the system variable t
 Symbolic constants for each name value are found in the include file
 .Li <unistd.h> .
 .Pp
+The
+.Fn lpathconf
+system call is like
+.Fn pathconf
+except in the case where the named file is a symbolic link,
+in which case
+.Fn lpathconf
+returns information about the link,
+while
+.Fn pathconf
+returns information about the file the link references.
+.Pp
 The available values are as follows:
 .Pp
 .Bl -tag -width 6n
@@ -239,3 +257,7 @@ and
 .Fn fpathconf
 system calls first appeared in
 .Bx 4.4 .
+The
+.Fn lpathconf
+system call first appeared in
+.Fx 8.0 .

Modified: head/sys/bsm/audit_kevents.h
==============================================================================
--- head/sys/bsm/audit_kevents.h	Wed Jul  8 15:02:56 2009	(r195457)
+++ head/sys/bsm/audit_kevents.h	Wed Jul  8 15:23:18 2009	(r195458)
@@ -597,6 +597,7 @@
 #define	AUE_PWRITE		43193	/* Darwin/FreeBSD. */
 #define	AUE_FSCTL		43194	/* Darwin. */
 #define	AUE_FFSCTL		43195	/* Darwin. */
+#define	AUE_LPATHCONF		43196	/* FreeBSD. */
 
 /*
  * Darwin BSM uses a number of AUE_O_* definitions, which are aliased to the

Modified: head/sys/compat/freebsd32/syscalls.master
==============================================================================
--- head/sys/compat/freebsd32/syscalls.master	Wed Jul  8 15:02:56 2009	(r195457)
+++ head/sys/compat/freebsd32/syscalls.master	Wed Jul  8 15:23:18 2009	(r195458)
@@ -900,3 +900,4 @@
 				    struct msqid_ds32 *buf); }
 512	AUE_SHMCTL	STD	{ int freebsd32_shmctl(int shmid, int cmd, \
 				    struct shmid_ds32 *buf); }
+513	AUE_LPATHCONF	STD	{ int lpathconf(char *path, int name); }

Modified: head/sys/compat/svr4/svr4_stat.c
==============================================================================
--- head/sys/compat/svr4/svr4_stat.c	Wed Jul  8 15:02:56 2009	(r195457)
+++ head/sys/compat/svr4/svr4_stat.c	Wed Jul  8 15:23:18 2009	(r195458)
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/jail.h>
 #include <sys/kernel.h>
 #include <sys/malloc.h>
+#include <sys/namei.h>
 #include <sys/unistd.h>
 #include <sys/time.h>
 #include <sys/syscallsubr.h>
@@ -669,7 +670,7 @@ svr4_sys_pathconf(td, uap)
 		return (0);
 	default:
 		CHECKALTEXIST(td, uap->path, &path);
-		error = kern_pathconf(td, path, UIO_SYSSPACE, name);
+		error = kern_pathconf(td, path, UIO_SYSSPACE, name, FOLLOW);
 		free(path, M_TEMP);
 		return (error);
 	}

Modified: head/sys/i386/ibcs2/ibcs2_misc.c
==============================================================================
--- head/sys/i386/ibcs2/ibcs2_misc.c	Wed Jul  8 15:02:56 2009	(r195457)
+++ head/sys/i386/ibcs2/ibcs2_misc.c	Wed Jul  8 15:23:18 2009	(r195458)
@@ -66,6 +66,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/malloc.h>
 #include <sys/file.h>			/* Must come after sys/malloc.h */
 #include <sys/mutex.h>
+#include <sys/namei.h>
 #include <sys/priv.h>
 #include <sys/reboot.h>
 #include <sys/resourcevar.h>
@@ -763,7 +764,7 @@ ibcs2_pathconf(td, uap)
 
 	CHECKALTEXIST(td, uap->path, &path);
 	uap->name++;	/* iBCS2 _PC_* defines are offset by one */
-	error = kern_pathconf(td, path, UIO_SYSSPACE, uap->name);
+	error = kern_pathconf(td, path, UIO_SYSSPACE, uap->name, FOLLOW);
 	free(path, M_TEMP);
 	return (error);
 }

Modified: head/sys/kern/syscalls.master
==============================================================================
--- head/sys/kern/syscalls.master	Wed Jul  8 15:02:56 2009	(r195457)
+++ head/sys/kern/syscalls.master	Wed Jul  8 15:23:18 2009	(r195458)
@@ -910,5 +910,6 @@
 				    struct msqid_ds *buf); }
 512	AUE_SHMCTL	NOSTD	{ int shmctl(int shmid, int cmd, \
 				    struct shmid_ds *buf); }
+513	AUE_LPATHCONF	STD	{ int lpathconf(char *path, int name); }
 ; Please copy any additions and changes to the following compatability tables:
 ; sys/compat/freebsd32/syscalls.master

Modified: head/sys/kern/vfs_syscalls.c
==============================================================================
--- head/sys/kern/vfs_syscalls.c	Wed Jul  8 15:02:56 2009	(r195457)
+++ head/sys/kern/vfs_syscalls.c	Wed Jul  8 15:23:18 2009	(r195458)
@@ -2506,17 +2506,36 @@ pathconf(td, uap)
 	} */ *uap;
 {
 
-	return (kern_pathconf(td, uap->path, UIO_USERSPACE, uap->name));
+	return (kern_pathconf(td, uap->path, UIO_USERSPACE, uap->name, FOLLOW));
+}
+
+#ifndef _SYS_SYSPROTO_H_
+struct lpathconf_args {
+	char	*path;
+	int	name;
+};
+#endif
+int
+lpathconf(td, uap)
+	struct thread *td;
+	register struct lpathconf_args /* {
+		char *path;
+		int name;
+	} */ *uap;
+{
+
+	return (kern_pathconf(td, uap->path, UIO_USERSPACE, uap->name, NOFOLLOW));
 }
 
 int
-kern_pathconf(struct thread *td, char *path, enum uio_seg pathseg, int name)
+kern_pathconf(struct thread *td, char *path, enum uio_seg pathseg, int name,
+    u_long flags)
 {
 	struct nameidata nd;
 	int error, vfslocked;
 
-	NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF | MPSAFE |
-	    AUDITVNODE1, pathseg, path, td);
+	NDINIT(&nd, LOOKUP, LOCKSHARED | LOCKLEAF | MPSAFE | AUDITVNODE1 |
+	    flags, pathseg, path, td);
 	if ((error = namei(&nd)) != 0)
 		return (error);
 	vfslocked = NDHASGIANT(&nd);

Modified: head/sys/sys/syscallsubr.h
==============================================================================
--- head/sys/sys/syscallsubr.h	Wed Jul  8 15:02:56 2009	(r195457)
+++ head/sys/sys/syscallsubr.h	Wed Jul  8 15:23:18 2009	(r195458)
@@ -145,7 +145,7 @@ int	kern_open(struct thread *td, char *p
 int	kern_openat(struct thread *td, int fd, char *path,
 	    enum uio_seg pathseg, int flags, int mode);
 int	kern_pathconf(struct thread *td, char *path, enum uio_seg pathseg,
-	    int name);
+	    int name, u_long flags);
 int	kern_pipe(struct thread *td, int fildes[2]);
 int	kern_preadv(struct thread *td, int fd, struct uio *auio, off_t offset);
 int	kern_ptrace(struct thread *td, int req, pid_t pid, void *addr,


More information about the svn-src-all mailing list