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,
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to