Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Jan 2018 20:08:25 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r328298 - in stable/11/sys: cddl/contrib/opensolaris/uts/common/fs/zfs fs/cd9660 fs/devfs fs/ext2fs fs/fdescfs fs/fifofs fs/fuse fs/msdosfs fs/nandfs fs/nfsclient fs/smbfs fs/tmpfs fs/u...
Message-ID:  <201801232008.w0NK8PCY035206@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Tue Jan 23 20:08:25 2018
New Revision: 328298
URL: https://svnweb.freebsd.org/changeset/base/328298

Log:
  MFC 320900,323882,324224,324226,324228,326986,326988,326989,326990,326993,
  326994,326995,327004: Various fixes for pathconf(2).
  
  The original change to use vop_stdpathconf() more widely was motivated
  by a panic due to recent AIO-related changes.  However, bde@ reported
  that vop_stdpathconf() contained too many settings that were not
  filesystem-independent.  The end result of this set of patches is to
  fix the AIO-related panic via use of a trimmed-down vop_stdpathconf()
  while also adding support for missing pathconf variables in various
  filesystems (and removing a few settings incorrectly reported as
  supported).
  
  320900:
  Consistently use vop_stdpathconf() for default pathconf values.
  
  Update filesystems not currently using vop_stdpathconf() in pathconf
  VOPs to use vop_stdpathconf() for any configuration variables that do
  not have filesystem-specific values.  vop_stdpathconf() is used for
  variables that have system-wide settings as well as providing default
  values for some values based on system limits.  Filesystems can still
  explicitly override individual settings.
  
  323882:
  Only handle _PC_MAX_CANON, _PC_MAX_INPUT, and _PC_VDISABLE for TTY devices.
  
  Move handling of these three pathconf() variables out of vop_stdpathconf()
  and into devfs_pathconf() as TTY devices can only be devfs files.  In
  addition, only return settings for these three variables for devfs devices
  whose device switch has the D_TTY flag set.
  
  324224:
  Handle _PC_FILESIZEBITS and _PC_SYMLINK_MAX pathconf() requests in cd9660.
  
  cd9660 only supports symlinks with Rock Ridge extensions, so
  _PC_SYMLINK_MAX is conditional on Rock Ridge.
  
  324226:
  Return 64 for pathconf(_PC_FILESIZEBITS) on tmpfs.
  
  324228:
  Flesh out pathconf() on UDF.
  
  - Return 64 bits for _PC_FILESIZEBITS.
  - Handle _PC_SYMLINK_MAX.
  - Defer _PC_PATH_MAX to vop_stdpathconf().
  
  326986:
  Add a custom VOP_PATHCONF method for fdescfs.
  
  The method handles NAME_MAX and LINK_MAX explicitly.  For all other
  pathconf variables, the method passes the request down to the underlying
  file descriptor.  This requires splitting a kern_fpathconf() syscallsubr
  routine out of sys_fpathconf().  Also, to avoid lock order reversals with
  vnode locks, the fdescfs vnode is unlocked around the call to
  kern_fpathconf(), but with the usecount of the vnode bumped.
  
  326988:
  Add a custom VOP_PATHCONF method for fuse.
  
  This method handles _PC_FILESIZEBITS, _PC_SYMLINK_MAX, and _PC_NO_TRUNC.
  For other values it defers to vop_stdpathconf().
  
  326989:
  Support _PC_FILESIZEBITS in msdosfs' VOP_PATHCONF().
  
  326990:
  Handle _PC_FILESIZEBITS and _PC_NO_TRUNC for smbfs' VOP_PATHCONF().
  
  326993:
  Move NAME_MAX, LINK_MAX, and CHOWN_RESTRICTED out of vop_stdpathconf().
  
  Having all filesystems fall through to default values isn't always correct
  and these values can vary for different filesystem implementations.  Most
  of these changes just use the existing default values with a few exceptions:
  - Don't report CHOWN_RESTRICTED for ZFS since it doesn't do the exact
    permissions check this claims for chown().
  - Use NANDFS_NAME_LEN for NAME_MAX for nandfs.
  - Don't report a LINK_MAX of 0 on smbfs.  Now fail with EINVAL to
    indicate hard links aren't supported.
  
  326994:
  Handle _PC_FILESIZEBITS and _PC_SYMLINK_MAX for devfs' VOP_PATHCONF().
  
  326995:
  Use FUSE_LINK_MAX for LINK_MAX in fuse' VOP_PATHCONF().
  
  Should have included this in r326993.
  
  327004:
  Rework pathconf handling for FIFOs.
  
  On the one hand, FIFOs should respect other variables not supported by
  the fifofs vnode operation (such as _PC_NAME_MAX, _PC_LINK_MAX, etc.).
  These values are fs-specific and must come from a fs-specific method.
  On the other hand, filesystems that support FIFOs are required to
  support _PC_PIPE_BUF on directory vnodes that can contain FIFOs.
  Given this latter requirement, once the fs-specific VOP_PATHCONF
  method supports _PC_PIPE_BUF for directories, it is also suitable for
  FIFOs permitting a single VOP_PATHCONF method to be used for both
  FIFOs and non-FIFOs.
  
  To that end, retire all of the FIFO-specific pathconf methods from
  filesystems and change FIFO-specific vnode operation switches to use
  the existing fs-specific VOP_PATHCONF method.  For fifofs, set it's
  VOP_PATHCONF to VOP_PANIC since it should no longer be used.
  
  While here, move _PC_PIPE_BUF handling out of vop_stdpathconf() so that
  only filesystems supporting FIFOs will report a value.  In addition,
  only report a valid _PC_PIPE_BUF for directories and FIFOs.
  
  PR:		219851
  Sponsored by:	Chelsio Communications

Modified:
  stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  stable/11/sys/fs/cd9660/cd9660_vnops.c
  stable/11/sys/fs/devfs/devfs_vnops.c
  stable/11/sys/fs/ext2fs/ext2_vnops.c
  stable/11/sys/fs/fdescfs/fdesc_vnops.c
  stable/11/sys/fs/fifofs/fifo_vnops.c
  stable/11/sys/fs/fuse/fuse_vnops.c
  stable/11/sys/fs/msdosfs/msdosfs_vnops.c
  stable/11/sys/fs/nandfs/nandfs_vnops.c
  stable/11/sys/fs/nfsclient/nfs_clvnops.c
  stable/11/sys/fs/smbfs/smbfs_vnops.c
  stable/11/sys/fs/tmpfs/tmpfs_fifoops.c
  stable/11/sys/fs/tmpfs/tmpfs_vnops.c
  stable/11/sys/fs/tmpfs/tmpfs_vnops.h
  stable/11/sys/fs/udf/udf_vnops.c
  stable/11/sys/kern/kern_descrip.c
  stable/11/sys/kern/vfs_default.c
  stable/11/sys/sys/syscallsubr.h
  stable/11/sys/ufs/ufs/ufs_vnops.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -5404,30 +5404,25 @@ zfs_freebsd_pathconf(ap)
 	int error;
 
 	error = zfs_pathconf(ap->a_vp, ap->a_name, &val, curthread->td_ucred, NULL);
-	if (error == 0)
+	if (error == 0) {
 		*ap->a_retval = val;
-	else if (error == EOPNOTSUPP)
-		error = vop_stdpathconf(ap);
-	return (error);
-}
+		return (error);
+	}
+	if (error != EOPNOTSUPP)
+		return (error);
 
-static int
-zfs_freebsd_fifo_pathconf(ap)
-	struct vop_pathconf_args /* {
-		struct vnode *a_vp;
-		int a_name;
-		register_t *a_retval;
-	} */ *ap;
-{
-
 	switch (ap->a_name) {
-	case _PC_ACL_EXTENDED:
-	case _PC_ACL_NFS4:
-	case _PC_ACL_PATH_MAX:
-	case _PC_MAC_PRESENT:
-		return (zfs_freebsd_pathconf(ap));
+	case _PC_NAME_MAX:
+		*ap->a_retval = NAME_MAX;
+		return (0);
+	case _PC_PIPE_BUF:
+		if (ap->a_vp->v_type == VDIR || ap->a_vp->v_type == VFIFO) {
+			*ap->a_retval = PIPE_BUF;
+			return (0);
+		}
+		return (EINVAL);
 	default:
-		return (fifo_specops.vop_pathconf(ap));
+		return (vop_stdpathconf(ap));
 	}
 }
 
@@ -6041,7 +6036,7 @@ struct vop_vector zfs_fifoops = {
 	.vop_reclaim =		zfs_freebsd_reclaim,
 	.vop_setattr =		zfs_freebsd_setattr,
 	.vop_write =		VOP_PANIC,
-	.vop_pathconf = 	zfs_freebsd_fifo_pathconf,
+	.vop_pathconf = 	zfs_freebsd_pathconf,
 	.vop_fid =		zfs_freebsd_fid,
 	.vop_getacl =		zfs_freebsd_getacl,
 	.vop_setacl =		zfs_freebsd_setacl,

Modified: stable/11/sys/fs/cd9660/cd9660_vnops.c
==============================================================================
--- stable/11/sys/fs/cd9660/cd9660_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/cd9660/cd9660_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -780,6 +780,9 @@ cd9660_pathconf(ap)
 {
 
 	switch (ap->a_name) {
+	case _PC_FILESIZEBITS:
+		*ap->a_retval = 32;
+		return (0);
 	case _PC_LINK_MAX:
 		*ap->a_retval = 1;
 		return (0);
@@ -789,20 +792,17 @@ cd9660_pathconf(ap)
 		else
 			*ap->a_retval = 37;
 		return (0);
-	case _PC_PATH_MAX:
-		*ap->a_retval = PATH_MAX;
-		return (0);
-	case _PC_PIPE_BUF:
-		*ap->a_retval = PIPE_BUF;
-		return (0);
-	case _PC_CHOWN_RESTRICTED:
-		*ap->a_retval = 1;
-		return (0);
+	case _PC_SYMLINK_MAX:
+		if (VTOI(ap->a_vp)->i_mnt->iso_ftype == ISO_FTYPE_RRIP) {
+			*ap->a_retval = MAXPATHLEN;
+			return (0);
+		}
+		return (EINVAL);
 	case _PC_NO_TRUNC:
 		*ap->a_retval = 1;
 		return (0);
 	default:
-		return (EINVAL);
+		return (vop_stdpathconf(ap));
 	}
 	/* NOTREACHED */
 }

Modified: stable/11/sys/fs/devfs/devfs_vnops.c
==============================================================================
--- stable/11/sys/fs/devfs/devfs_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/devfs/devfs_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -1165,6 +1165,36 @@ devfs_pathconf(struct vop_pathconf_args *ap)
 {
 
 	switch (ap->a_name) {
+	case _PC_FILESIZEBITS:
+		*ap->a_retval = 64;
+		return (0);
+	case _PC_NAME_MAX:
+		*ap->a_retval = NAME_MAX;
+		return (0);
+	case _PC_LINK_MAX:
+		*ap->a_retval = LINK_MAX;
+		return (0);
+	case _PC_SYMLINK_MAX:
+		*ap->a_retval = MAXPATHLEN;
+		return (0);
+	case _PC_MAX_CANON:
+		if (ap->a_vp->v_vflag & VV_ISTTY) {
+			*ap->a_retval = MAX_CANON;
+			return (0);
+		}
+		return (EINVAL);
+	case _PC_MAX_INPUT:
+		if (ap->a_vp->v_vflag & VV_ISTTY) {
+			*ap->a_retval = MAX_INPUT;
+			return (0);
+		}
+		return (EINVAL);
+	case _PC_VDISABLE:
+		if (ap->a_vp->v_vflag & VV_ISTTY) {
+			*ap->a_retval = _POSIX_VDISABLE;
+			return (0);
+		}
+		return (EINVAL);
 	case _PC_MAC_PRESENT:
 #ifdef MAC
 		/*
@@ -1175,6 +1205,9 @@ devfs_pathconf(struct vop_pathconf_args *ap)
 #else
 		*ap->a_retval = 0;
 #endif
+		return (0);
+	case _PC_CHOWN_RESTRICTED:
+		*ap->a_retval = 1;
 		return (0);
 	default:
 		return (vop_stdpathconf(ap));

Modified: stable/11/sys/fs/ext2fs/ext2_vnops.c
==============================================================================
--- stable/11/sys/fs/ext2fs/ext2_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/ext2fs/ext2_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -179,6 +179,7 @@ struct vop_vector ext2_fifoops = {
 	.vop_getattr =		ext2_getattr,
 	.vop_inactive =		ext2_inactive,
 	.vop_kqfilter =		ext2fifo_kqfilter,
+	.vop_pathconf =		ext2_pathconf,
 	.vop_print =		ext2_print,
 	.vop_read =		VOP_PANIC,
 	.vop_reclaim =		ext2_reclaim,
@@ -1596,11 +1597,11 @@ ext2_pathconf(struct vop_pathconf_args *ap)
 	case _PC_NAME_MAX:
 		*ap->a_retval = NAME_MAX;
 		break;
-	case _PC_PATH_MAX:
-		*ap->a_retval = PATH_MAX;
-		break;
 	case _PC_PIPE_BUF:
-		*ap->a_retval = PIPE_BUF;
+		if (ap->a_vp->v_type == VDIR || ap->a_vp->v_type == VFIFO)
+			*ap->a_retval = PIPE_BUF;
+		else
+			error = EINVAL;
 		break;
 	case _PC_CHOWN_RESTRICTED:
 		*ap->a_retval = 1;
@@ -1627,11 +1628,6 @@ ext2_pathconf(struct vop_pathconf_args *ap)
 	case _PC_MIN_HOLE_SIZE:
 		*ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize;
 		break;
-	case _PC_ASYNC_IO:
-		/* _PC_ASYNC_IO should have been handled by upper layers. */
-		KASSERT(0, ("_PC_ASYNC_IO should not get here"));
-		error = EINVAL;
-		break;
 	case _PC_PRIO_IO:
 		*ap->a_retval = 0;
 		break;
@@ -1661,7 +1657,7 @@ ext2_pathconf(struct vop_pathconf_args *ap)
 		break;
 
 	default:
-		error = EINVAL;
+		error = vop_stdpathconf(ap);
 		break;
 	}
 	return (error);

Modified: stable/11/sys/fs/fdescfs/fdesc_vnops.c
==============================================================================
--- stable/11/sys/fs/fdescfs/fdesc_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/fdescfs/fdesc_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -53,6 +53,8 @@
 #include <sys/namei.h>
 #include <sys/proc.h>
 #include <sys/stat.h>
+#include <sys/syscallsubr.h>
+#include <sys/unistd.h>
 #include <sys/vnode.h>
 
 #include <fs/fdescfs/fdesc.h>
@@ -68,6 +70,7 @@ struct mtx fdesc_hashmtx;
 static vop_getattr_t	fdesc_getattr;
 static vop_lookup_t	fdesc_lookup;
 static vop_open_t	fdesc_open;
+static vop_pathconf_t	fdesc_pathconf;
 static vop_readdir_t	fdesc_readdir;
 static vop_readlink_t	fdesc_readlink;
 static vop_reclaim_t	fdesc_reclaim;
@@ -80,7 +83,7 @@ static struct vop_vector fdesc_vnodeops = {
 	.vop_getattr =		fdesc_getattr,
 	.vop_lookup =		fdesc_lookup,
 	.vop_open =		fdesc_open,
-	.vop_pathconf =		vop_stdpathconf,
+	.vop_pathconf =		fdesc_pathconf,
 	.vop_readdir =		fdesc_readdir,
 	.vop_readlink =		fdesc_readlink,
 	.vop_reclaim =		fdesc_reclaim,
@@ -391,6 +394,33 @@ fdesc_open(struct vop_open_args *ap)
 	 */
 	ap->a_td->td_dupfd = VTOFDESC(vp)->fd_fd;	/* XXX */
 	return (ENODEV);
+}
+
+static int
+fdesc_pathconf(struct vop_pathconf_args *ap)
+{
+	struct vnode *vp = ap->a_vp;
+	int error;
+
+	switch (ap->a_name) {
+	case _PC_NAME_MAX:
+		*ap->a_retval = NAME_MAX;
+		return (0);
+	case _PC_LINK_MAX:
+		if (VTOFDESC(vp)->fd_type == Froot)
+			*ap->a_retval = 2;
+		else
+			*ap->a_retval = 1;
+		return (0);
+	default:
+		vref(vp);
+		VOP_UNLOCK(vp, 0);
+		error = kern_fpathconf(curthread, VTOFDESC(vp)->fd_fd,
+		    ap->a_name);
+		vn_lock(vp, LK_SHARED | LK_RETRY);
+		vunref(vp);
+		return (error);
+	}
 }
 
 static int

Modified: stable/11/sys/fs/fifofs/fifo_vnops.c
==============================================================================
--- stable/11/sys/fs/fifofs/fifo_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/fifofs/fifo_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -71,7 +71,6 @@ struct fifoinfo {
 static vop_print_t	fifo_print;
 static vop_open_t	fifo_open;
 static vop_close_t	fifo_close;
-static vop_pathconf_t	fifo_pathconf;
 static vop_advlock_t	fifo_advlock;
 
 struct vop_vector fifo_specops = {
@@ -87,7 +86,7 @@ struct vop_vector fifo_specops = {
 	.vop_mkdir =		VOP_PANIC,
 	.vop_mknod =		VOP_PANIC,
 	.vop_open =		fifo_open,
-	.vop_pathconf =		fifo_pathconf,
+	.vop_pathconf =		VOP_PANIC,
 	.vop_print =		fifo_print,
 	.vop_read =		VOP_PANIC,
 	.vop_readdir =		VOP_PANIC,
@@ -337,34 +336,6 @@ fifo_print(ap)
 	fifo_printinfo(ap->a_vp);
 	printf("\n");
 	return (0);
-}
-
-/*
- * Return POSIX pathconf information applicable to fifo's.
- */
-static int
-fifo_pathconf(ap)
-	struct vop_pathconf_args /* {
-		struct vnode *a_vp;
-		int a_name;
-		int *a_retval;
-	} */ *ap;
-{
-
-	switch (ap->a_name) {
-	case _PC_LINK_MAX:
-		*ap->a_retval = LINK_MAX;
-		return (0);
-	case _PC_PIPE_BUF:
-		*ap->a_retval = PIPE_BUF;
-		return (0);
-	case _PC_CHOWN_RESTRICTED:
-		*ap->a_retval = 1;
-		return (0);
-	default:
-		return (EINVAL);
-	}
-	/* NOTREACHED */
 }
 
 /*

Modified: stable/11/sys/fs/fuse/fuse_vnops.c
==============================================================================
--- stable/11/sys/fs/fuse/fuse_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/fuse/fuse_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -123,6 +123,7 @@ static vop_lookup_t fuse_vnop_lookup;
 static vop_mkdir_t fuse_vnop_mkdir;
 static vop_mknod_t fuse_vnop_mknod;
 static vop_open_t fuse_vnop_open;
+static vop_pathconf_t fuse_vnop_pathconf;
 static vop_read_t fuse_vnop_read;
 static vop_readdir_t fuse_vnop_readdir;
 static vop_readlink_t fuse_vnop_readlink;
@@ -155,7 +156,7 @@ struct vop_vector fuse_vnops = {
 	.vop_mkdir = fuse_vnop_mkdir,
 	.vop_mknod = fuse_vnop_mknod,
 	.vop_open = fuse_vnop_open,
-	.vop_pathconf = vop_stdpathconf,
+	.vop_pathconf = fuse_vnop_pathconf,
 	.vop_read = fuse_vnop_read,
 	.vop_readdir = fuse_vnop_readdir,
 	.vop_readlink = fuse_vnop_readlink,
@@ -1170,6 +1171,31 @@ fuse_vnop_open(struct vop_open_args *ap)
 	error = fuse_filehandle_open(vp, fufh_type, NULL, td, cred);
 
 	return error;
+}
+
+static int
+fuse_vnop_pathconf(struct vop_pathconf_args *ap)
+{
+
+	switch (ap->a_name) {
+	case _PC_FILESIZEBITS:
+		*ap->a_retval = 64;
+		return (0);
+	case _PC_NAME_MAX:
+		*ap->a_retval = NAME_MAX;
+		return (0);
+	case _PC_LINK_MAX:
+		*ap->a_retval = FUSE_LINK_MAX;
+		return (0);
+	case _PC_SYMLINK_MAX:
+		*ap->a_retval = MAXPATHLEN;
+		return (0);
+	case _PC_NO_TRUNC:
+		*ap->a_retval = 1;
+		return (0);
+	default:
+		return (vop_stdpathconf(ap));
+	}
 }
 
 /*

Modified: stable/11/sys/fs/msdosfs/msdosfs_vnops.c
==============================================================================
--- stable/11/sys/fs/msdosfs/msdosfs_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/msdosfs/msdosfs_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -1891,15 +1891,15 @@ msdosfs_pathconf(struct vop_pathconf_args *ap)
 	struct msdosfsmount *pmp = VTODE(ap->a_vp)->de_pmp;
 
 	switch (ap->a_name) {
+	case _PC_FILESIZEBITS:
+		*ap->a_retval = 32;
+		return (0);
 	case _PC_LINK_MAX:
 		*ap->a_retval = 1;
 		return (0);
 	case _PC_NAME_MAX:
 		*ap->a_retval = pmp->pm_flags & MSDOSFSMNT_LONGNAME ? WIN_MAXLEN : 12;
 		return (0);
-	case _PC_PATH_MAX:
-		*ap->a_retval = PATH_MAX;
-		return (0);
 	case _PC_CHOWN_RESTRICTED:
 		*ap->a_retval = 1;
 		return (0);
@@ -1907,7 +1907,7 @@ msdosfs_pathconf(struct vop_pathconf_args *ap)
 		*ap->a_retval = 0;
 		return (0);
 	default:
-		return (EINVAL);
+		return (vop_stdpathconf(ap));
 	}
 	/* NOTREACHED */
 }

Modified: stable/11/sys/fs/nandfs/nandfs_vnops.c
==============================================================================
--- stable/11/sys/fs/nandfs/nandfs_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/nandfs/nandfs_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -2240,13 +2240,13 @@ nandfs_pathconf(struct vop_pathconf_args *ap)
 		*ap->a_retval = LINK_MAX;
 		break;
 	case _PC_NAME_MAX:
-		*ap->a_retval = NAME_MAX;
+		*ap->a_retval = NANDFS_NAME_LEN;
 		break;
-	case _PC_PATH_MAX:
-		*ap->a_retval = PATH_MAX;
-		break;
 	case _PC_PIPE_BUF:
-		*ap->a_retval = PIPE_BUF;
+		if (ap->a_vp->v_type == VDIR || ap->a_vp->v_type == VFIFO)
+			*ap->a_retval = PIPE_BUF;
+		else
+			error = EINVAL;
 		break;
 	case _PC_CHOWN_RESTRICTED:
 		*ap->a_retval = 1;
@@ -2273,7 +2273,7 @@ nandfs_pathconf(struct vop_pathconf_args *ap)
 		*ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize;
 		break;
 	default:
-		error = EINVAL;
+		error = vop_stdpathconf(ap);
 		break;
 	}
 	return (error);
@@ -2418,6 +2418,7 @@ struct vop_vector nandfs_fifoops = {
 	.vop_close =		nandfsfifo_close,
 	.vop_getattr =		nandfs_getattr,
 	.vop_inactive =		nandfs_inactive,
+	.vop_pathconf =		nandfs_pathconf,
 	.vop_print =		nandfs_print,
 	.vop_read =		VOP_PANIC,
 	.vop_reclaim =		nandfs_reclaim,

Modified: stable/11/sys/fs/nfsclient/nfs_clvnops.c
==============================================================================
--- stable/11/sys/fs/nfsclient/nfs_clvnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/nfsclient/nfs_clvnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -187,6 +187,7 @@ struct vop_vector newnfs_fifoops = {
 	.vop_fsync =		nfs_fsync,
 	.vop_getattr =		nfs_getattr,
 	.vop_inactive =		ncl_inactive,
+	.vop_pathconf =		nfs_pathconf,
 	.vop_print =		nfs_print,
 	.vop_read =		nfsfifo_read,
 	.vop_reclaim =		ncl_reclaim,
@@ -3465,11 +3466,11 @@ nfs_pathconf(struct vop_pathconf_args *ap)
 	case _PC_NAME_MAX:
 		*ap->a_retval = pc.pc_namemax;
 		break;
-	case _PC_PATH_MAX:
-		*ap->a_retval = PATH_MAX;
-		break;
 	case _PC_PIPE_BUF:
-		*ap->a_retval = PIPE_BUF;
+		if (ap->a_vp->v_type == VDIR || ap->a_vp->v_type == VFIFO)
+			*ap->a_retval = PIPE_BUF;
+		else
+			error = EINVAL;
 		break;
 	case _PC_CHOWN_RESTRICTED:
 		*ap->a_retval = pc.pc_chownrestricted;
@@ -3496,11 +3497,6 @@ nfs_pathconf(struct vop_pathconf_args *ap)
 	case _PC_MAC_PRESENT:
 		*ap->a_retval = 0;
 		break;
-	case _PC_ASYNC_IO:
-		/* _PC_ASYNC_IO should have been handled by upper layers. */
-		KASSERT(0, ("_PC_ASYNC_IO should not get here"));
-		error = EINVAL;
-		break;
 	case _PC_PRIO_IO:
 		*ap->a_retval = 0;
 		break;
@@ -3533,7 +3529,7 @@ nfs_pathconf(struct vop_pathconf_args *ap)
 		break;
 
 	default:
-		error = EINVAL;
+		error = vop_stdpathconf(ap);
 		break;
 	}
 	return (error);

Modified: stable/11/sys/fs/smbfs/smbfs_vnops.c
==============================================================================
--- stable/11/sys/fs/smbfs/smbfs_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/smbfs/smbfs_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -897,8 +897,12 @@ smbfs_pathconf (ap)
 	int error = 0;
 	
 	switch (ap->a_name) {
-	    case _PC_LINK_MAX:
-		*retval = 0;
+	    case _PC_FILESIZEBITS:
+		if (vcp->vc_sopt.sv_caps & (SMB_CAP_LARGE_READX |
+		    SMB_CAP_LARGE_WRITEX))
+		    *retval = 64;
+		else
+		    *retval = 32;
 		break;
 	    case _PC_NAME_MAX:
 		*retval = (vcp->vc_hflags2 & SMB_FLAGS2_KNOWS_LONG_NAMES) ? 255 : 12;
@@ -906,8 +910,11 @@ smbfs_pathconf (ap)
 	    case _PC_PATH_MAX:
 		*retval = 800;	/* XXX: a correct one ? */
 		break;
+	    case _PC_NO_TRUNC:
+		*retval = 1;
+		break;
 	    default:
-		error = EINVAL;
+		error = vop_stdpathconf(ap);
 	}
 	return error;
 }

Modified: stable/11/sys/fs/tmpfs/tmpfs_fifoops.c
==============================================================================
--- stable/11/sys/fs/tmpfs/tmpfs_fifoops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/tmpfs/tmpfs_fifoops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -69,5 +69,6 @@ struct vop_vector tmpfs_fifoop_entries = {
 	.vop_access =			tmpfs_access,
 	.vop_getattr =			tmpfs_getattr,
 	.vop_setattr =			tmpfs_setattr,
+	.vop_pathconf =                 tmpfs_pathconf,
 	.vop_print =			tmpfs_print,
 };

Modified: stable/11/sys/fs/tmpfs/tmpfs_vnops.c
==============================================================================
--- stable/11/sys/fs/tmpfs/tmpfs_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/tmpfs/tmpfs_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -1333,9 +1333,10 @@ tmpfs_print(struct vop_print_args *v)
 	return 0;
 }
 
-static int
+int
 tmpfs_pathconf(struct vop_pathconf_args *v)
 {
+	struct vnode *vp = v->a_vp;
 	int name = v->a_name;
 	register_t *retval = v->a_retval;
 
@@ -1352,12 +1353,11 @@ tmpfs_pathconf(struct vop_pathconf_args *v)
 		*retval = NAME_MAX;
 		break;
 
-	case _PC_PATH_MAX:
-		*retval = PATH_MAX;
-		break;
-
 	case _PC_PIPE_BUF:
-		*retval = PIPE_BUF;
+		if (vp->v_type == VDIR || vp->v_type == VFIFO)
+			*retval = PIPE_BUF;
+		else
+			error = EINVAL;
 		break;
 
 	case _PC_CHOWN_RESTRICTED:
@@ -1373,11 +1373,11 @@ tmpfs_pathconf(struct vop_pathconf_args *v)
 		break;
 
 	case _PC_FILESIZEBITS:
-		*retval = 0; /* XXX Don't know which value should I return. */
+		*retval = 64;
 		break;
 
 	default:
-		error = EINVAL;
+		error = vop_stdpathconf(v);
 	}
 
 	return error;

Modified: stable/11/sys/fs/tmpfs/tmpfs_vnops.h
==============================================================================
--- stable/11/sys/fs/tmpfs/tmpfs_vnops.h	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/tmpfs/tmpfs_vnops.h	Tue Jan 23 20:08:25 2018	(r328298)
@@ -49,6 +49,7 @@ extern struct vop_vector tmpfs_vnodeop_nonc_entries;
 vop_access_t	tmpfs_access;
 vop_getattr_t	tmpfs_getattr;
 vop_setattr_t	tmpfs_setattr;
+vop_pathconf_t	tmpfs_pathconf;
 vop_print_t	tmpfs_print;
 vop_reclaim_t	tmpfs_reclaim;
 

Modified: stable/11/sys/fs/udf/udf_vnops.c
==============================================================================
--- stable/11/sys/fs/udf/udf_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/fs/udf/udf_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -100,6 +100,7 @@ struct vop_vector udf_fifoops = {
 	.vop_default =		&fifo_specops,
 	.vop_access =		udf_access,
 	.vop_getattr =		udf_getattr,
+	.vop_pathconf =		udf_pathconf,
 	.vop_print =		udf_print,
 	.vop_reclaim =		udf_reclaim,
 	.vop_setattr =		udf_setattr,
@@ -383,20 +384,29 @@ udf_pathconf(struct vop_pathconf_args *a)
 {
 
 	switch (a->a_name) {
+	case _PC_FILESIZEBITS:
+		*a->a_retval = 64;
+		return (0);
 	case _PC_LINK_MAX:
 		*a->a_retval = 65535;
 		return (0);
 	case _PC_NAME_MAX:
 		*a->a_retval = NAME_MAX;
 		return (0);
-	case _PC_PATH_MAX:
-		*a->a_retval = PATH_MAX;
+	case _PC_SYMLINK_MAX:
+		*a->a_retval = MAXPATHLEN;
 		return (0);
 	case _PC_NO_TRUNC:
 		*a->a_retval = 1;
 		return (0);
-	default:
+	case _PC_PIPE_BUF:
+		if (a->a_vp->v_type == VDIR || a->a_vp->v_type == VFIFO) {
+			*a->a_retval = PIPE_BUF;
+			return (0);
+		}
 		return (EINVAL);
+	default:
+		return (vop_stdpathconf(a));
 	}
 }
 

Modified: stable/11/sys/kern/kern_descrip.c
==============================================================================
--- stable/11/sys/kern/kern_descrip.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/kern/kern_descrip.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -1386,26 +1386,33 @@ struct fpathconf_args {
 int
 sys_fpathconf(struct thread *td, struct fpathconf_args *uap)
 {
+
+	return (kern_fpathconf(td, uap->fd, uap->name));
+}
+
+int
+kern_fpathconf(struct thread *td, int fd, int name)
+{
 	struct file *fp;
 	struct vnode *vp;
 	cap_rights_t rights;
 	int error;
 
-	error = fget(td, uap->fd, cap_rights_init(&rights, CAP_FPATHCONF), &fp);
+	error = fget(td, fd, cap_rights_init(&rights, CAP_FPATHCONF), &fp);
 	if (error != 0)
 		return (error);
 
-	if (uap->name == _PC_ASYNC_IO) {
+	if (name == _PC_ASYNC_IO) {
 		td->td_retval[0] = _POSIX_ASYNCHRONOUS_IO;
 		goto out;
 	}
 	vp = fp->f_vnode;
 	if (vp != NULL) {
 		vn_lock(vp, LK_SHARED | LK_RETRY);
-		error = VOP_PATHCONF(vp, uap->name, td->td_retval);
+		error = VOP_PATHCONF(vp, name, td->td_retval);
 		VOP_UNLOCK(vp, 0);
 	} else if (fp->f_type == DTYPE_PIPE || fp->f_type == DTYPE_SOCKET) {
-		if (uap->name != _PC_PIPE_BUF) {
+		if (name != _PC_PIPE_BUF) {
 			error = EINVAL;
 		} else {
 			td->td_retval[0] = PIPE_BUF;

Modified: stable/11/sys/kern/vfs_default.c
==============================================================================
--- stable/11/sys/kern/vfs_default.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/kern/vfs_default.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -477,29 +477,8 @@ vop_stdpathconf(ap)
 		case _PC_ASYNC_IO:
 			*ap->a_retval = _POSIX_ASYNCHRONOUS_IO;
 			return (0);
-		case _PC_NAME_MAX:
-			*ap->a_retval = NAME_MAX;
-			return (0);
 		case _PC_PATH_MAX:
 			*ap->a_retval = PATH_MAX;
-			return (0);
-		case _PC_LINK_MAX:
-			*ap->a_retval = LINK_MAX;
-			return (0);
-		case _PC_MAX_CANON:
-			*ap->a_retval = MAX_CANON;
-			return (0);
-		case _PC_MAX_INPUT:
-			*ap->a_retval = MAX_INPUT;
-			return (0);
-		case _PC_PIPE_BUF:
-			*ap->a_retval = PIPE_BUF;
-			return (0);
-		case _PC_CHOWN_RESTRICTED:
-			*ap->a_retval = 1;
-			return (0);
-		case _PC_VDISABLE:
-			*ap->a_retval = _POSIX_VDISABLE;
 			return (0);
 		default:
 			return (EINVAL);

Modified: stable/11/sys/sys/syscallsubr.h
==============================================================================
--- stable/11/sys/sys/syscallsubr.h	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/sys/syscallsubr.h	Tue Jan 23 20:08:25 2018	(r328298)
@@ -110,6 +110,7 @@ int	kern_fcntl(struct thread *td, int fd, int cmd, int
 int	kern_fcntl_freebsd(struct thread *td, int fd, int cmd, long arg);
 int	kern_fhstat(struct thread *td, fhandle_t fh, struct stat *buf);
 int	kern_fhstatfs(struct thread *td, fhandle_t fh, struct statfs *buf);
+int	kern_fpathconf(struct thread *td, int fd, int name);
 int	kern_fstat(struct thread *td, int fd, struct stat *sbp);
 int	kern_fstatfs(struct thread *td, int fd, struct statfs *buf);
 int	kern_fsync(struct thread *td, int fd, bool fullsync);

Modified: stable/11/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- stable/11/sys/ufs/ufs/ufs_vnops.c	Tue Jan 23 20:07:51 2018	(r328297)
+++ stable/11/sys/ufs/ufs/ufs_vnops.c	Tue Jan 23 20:08:25 2018	(r328298)
@@ -122,7 +122,6 @@ static vop_symlink_t	ufs_symlink;
 static vop_whiteout_t	ufs_whiteout;
 static vop_close_t	ufsfifo_close;
 static vop_kqfilter_t	ufsfifo_kqfilter;
-static vop_pathconf_t	ufsfifo_pathconf;
 
 SYSCTL_NODE(_vfs, OID_AUTO, ufs, CTLFLAG_RD, 0, "UFS filesystem");
 
@@ -2405,30 +2404,6 @@ ufsfifo_kqfilter(ap)
 }
 
 /*
- * Return POSIX pathconf information applicable to fifos.
- */
-static int
-ufsfifo_pathconf(ap)
-	struct vop_pathconf_args /* {
-		struct vnode *a_vp;
-		int a_name;
-		int *a_retval;
-	} */ *ap;
-{
-
-	switch (ap->a_name) {
-	case _PC_ACL_EXTENDED:
-	case _PC_ACL_NFS4:
-	case _PC_ACL_PATH_MAX:
-	case _PC_MAC_PRESENT:
-		return (ufs_pathconf(ap));
-	default:
-		return (fifo_specops.vop_pathconf(ap));
-	}
-	/* NOTREACHED */
-}
-
-/*
  * Return POSIX pathconf information applicable to ufs filesystems.
  */
 static int
@@ -2443,17 +2418,14 @@ ufs_pathconf(ap)
 
 	error = 0;
 	switch (ap->a_name) {
-	case _PC_LINK_MAX:
-		*ap->a_retval = LINK_MAX;
-		break;
 	case _PC_NAME_MAX:
 		*ap->a_retval = NAME_MAX;
 		break;
-	case _PC_PATH_MAX:
-		*ap->a_retval = PATH_MAX;
-		break;
 	case _PC_PIPE_BUF:
-		*ap->a_retval = PIPE_BUF;
+		if (ap->a_vp->v_type == VDIR || ap->a_vp->v_type == VFIFO)
+			*ap->a_retval = PIPE_BUF;
+		else
+			error = EINVAL;
 		break;
 	case _PC_CHOWN_RESTRICTED:
 		*ap->a_retval = 1;
@@ -2506,11 +2478,6 @@ ufs_pathconf(ap)
 	case _PC_MIN_HOLE_SIZE:
 		*ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize;
 		break;
-	case _PC_ASYNC_IO:
-		/* _PC_ASYNC_IO should have been handled by upper layers. */
-		KASSERT(0, ("_PC_ASYNC_IO should not get here"));
-		error = EINVAL;
-		break;
 	case _PC_PRIO_IO:
 		*ap->a_retval = 0;
 		break;
@@ -2540,7 +2507,7 @@ ufs_pathconf(ap)
 		break;
 
 	default:
-		error = EINVAL;
+		error = vop_stdpathconf(ap);
 		break;
 	}
 	return (error);
@@ -2813,7 +2780,7 @@ struct vop_vector ufs_fifoops = {
 	.vop_inactive =		ufs_inactive,
 	.vop_kqfilter =		ufsfifo_kqfilter,
 	.vop_markatime =	ufs_markatime,
-	.vop_pathconf = 	ufsfifo_pathconf,
+	.vop_pathconf = 	ufs_pathconf,
 	.vop_print =		ufs_print,
 	.vop_read =		VOP_PANIC,
 	.vop_reclaim =		ufs_reclaim,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201801232008.w0NK8PCY035206>