svn commit: r327004 - in head/sys: cddl/contrib/opensolaris/uts/common/fs/zfs fs/ext2fs fs/fifofs fs/nandfs fs/nfsclient fs/tmpfs fs/udf kern ufs/ufs
John Baldwin
jhb at FreeBSD.org
Tue Dec 19 22:39:09 UTC 2017
Author: jhb
Date: Tue Dec 19 22:39:05 2017
New Revision: 327004
URL: https://svnweb.freebsd.org/changeset/base/327004
Log:
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.
Discussed with: bde
Reviewed by: kib (part of a larger patch)
MFC after: 1 month
Sponsored by: Chelsio Communications
Differential Revision: https://reviews.freebsd.org/D12572
Modified:
head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
head/sys/fs/ext2fs/ext2_vnops.c
head/sys/fs/fifofs/fifo_vnops.c
head/sys/fs/nandfs/nandfs_vnops.c
head/sys/fs/nfsclient/nfs_clvnops.c
head/sys/fs/tmpfs/tmpfs_fifoops.c
head/sys/fs/tmpfs/tmpfs_vnops.c
head/sys/fs/tmpfs/tmpfs_vnops.h
head/sys/fs/udf/udf_vnops.c
head/sys/kern/vfs_default.c
head/sys/ufs/ufs/ufs_vnops.c
Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Tue Dec 19 22:15:46 2017 (r327003)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Tue Dec 19 22:39:05 2017 (r327004)
@@ -5414,31 +5414,17 @@ 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 (vop_stdpathconf(ap));
}
}
-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));
- default:
- return (fifo_specops.vop_pathconf(ap));
- }
-}
-
/*
* FreeBSD's extended attributes namespace defines file name prefix for ZFS'
* extended attribute name:
@@ -6050,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: head/sys/fs/ext2fs/ext2_vnops.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_vnops.c Tue Dec 19 22:15:46 2017 (r327003)
+++ head/sys/fs/ext2fs/ext2_vnops.c Tue Dec 19 22:39:05 2017 (r327004)
@@ -180,6 +180,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,
@@ -1635,6 +1636,12 @@ ext2_pathconf(struct vop_pathconf_args *ap)
break;
case _PC_NAME_MAX:
*ap->a_retval = NAME_MAX;
+ break;
+ case _PC_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;
Modified: head/sys/fs/fifofs/fifo_vnops.c
==============================================================================
--- head/sys/fs/fifofs/fifo_vnops.c Tue Dec 19 22:15:46 2017 (r327003)
+++ head/sys/fs/fifofs/fifo_vnops.c Tue Dec 19 22:39:05 2017 (r327004)
@@ -88,7 +88,7 @@ struct vop_vector fifo_specops = {
.vop_mkdir = VOP_PANIC,
.vop_mknod = VOP_PANIC,
.vop_open = fifo_open,
- .vop_pathconf = vop_stdpathconf,
+ .vop_pathconf = VOP_PANIC,
.vop_print = fifo_print,
.vop_read = VOP_PANIC,
.vop_readdir = VOP_PANIC,
Modified: head/sys/fs/nandfs/nandfs_vnops.c
==============================================================================
--- head/sys/fs/nandfs/nandfs_vnops.c Tue Dec 19 22:15:46 2017 (r327003)
+++ head/sys/fs/nandfs/nandfs_vnops.c Tue Dec 19 22:39:05 2017 (r327004)
@@ -2244,6 +2244,12 @@ nandfs_pathconf(struct vop_pathconf_args *ap)
case _PC_NAME_MAX:
*ap->a_retval = NANDFS_NAME_LEN;
break;
+ case _PC_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;
break;
@@ -2414,6 +2420,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: head/sys/fs/nfsclient/nfs_clvnops.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clvnops.c Tue Dec 19 22:15:46 2017 (r327003)
+++ head/sys/fs/nfsclient/nfs_clvnops.c Tue Dec 19 22:39:05 2017 (r327004)
@@ -189,6 +189,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,
@@ -3464,6 +3465,12 @@ nfs_pathconf(struct vop_pathconf_args *ap)
break;
case _PC_NAME_MAX:
*ap->a_retval = pc.pc_namemax;
+ break;
+ case _PC_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;
Modified: head/sys/fs/tmpfs/tmpfs_fifoops.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_fifoops.c Tue Dec 19 22:15:46 2017 (r327003)
+++ head/sys/fs/tmpfs/tmpfs_fifoops.c Tue Dec 19 22:39:05 2017 (r327004)
@@ -71,5 +71,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: head/sys/fs/tmpfs/tmpfs_vnops.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_vnops.c Tue Dec 19 22:15:46 2017 (r327003)
+++ head/sys/fs/tmpfs/tmpfs_vnops.c Tue Dec 19 22:39:05 2017 (r327004)
@@ -1338,9 +1338,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;
@@ -1355,6 +1356,13 @@ tmpfs_pathconf(struct vop_pathconf_args *v)
case _PC_NAME_MAX:
*retval = NAME_MAX;
+ break;
+
+ case _PC_PIPE_BUF:
+ if (vp->v_type == VDIR || vp->v_type == VFIFO)
+ *retval = PIPE_BUF;
+ else
+ error = EINVAL;
break;
case _PC_CHOWN_RESTRICTED:
Modified: head/sys/fs/tmpfs/tmpfs_vnops.h
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_vnops.h Tue Dec 19 22:15:46 2017 (r327003)
+++ head/sys/fs/tmpfs/tmpfs_vnops.h Tue Dec 19 22:39:05 2017 (r327004)
@@ -51,6 +51,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: head/sys/fs/udf/udf_vnops.c
==============================================================================
--- head/sys/fs/udf/udf_vnops.c Tue Dec 19 22:15:46 2017 (r327003)
+++ head/sys/fs/udf/udf_vnops.c Tue Dec 19 22:39:05 2017 (r327004)
@@ -102,6 +102,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,
@@ -400,6 +401,12 @@ udf_pathconf(struct vop_pathconf_args *a)
case _PC_NO_TRUNC:
*a->a_retval = 1;
return (0);
+ 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: head/sys/kern/vfs_default.c
==============================================================================
--- head/sys/kern/vfs_default.c Tue Dec 19 22:15:46 2017 (r327003)
+++ head/sys/kern/vfs_default.c Tue Dec 19 22:39:05 2017 (r327004)
@@ -482,9 +482,6 @@ vop_stdpathconf(ap)
case _PC_PATH_MAX:
*ap->a_retval = PATH_MAX;
return (0);
- case _PC_PIPE_BUF:
- *ap->a_retval = PIPE_BUF;
- return (0);
default:
return (EINVAL);
}
Modified: head/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- head/sys/ufs/ufs/ufs_vnops.c Tue Dec 19 22:15:46 2017 (r327003)
+++ head/sys/ufs/ufs/ufs_vnops.c Tue Dec 19 22:39:05 2017 (r327004)
@@ -124,7 +124,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");
@@ -2406,30 +2405,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
@@ -2450,6 +2425,12 @@ ufs_pathconf(ap)
case _PC_NAME_MAX:
*ap->a_retval = UFS_MAXNAMLEN;
break;
+ case _PC_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;
break;
@@ -2803,7 +2784,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,
More information about the svn-src-head
mailing list