Print this page
6474 getupeercred causes spurious event port wakeups on FIFOs

@@ -1125,10 +1125,25 @@
         return ((VTOF(vp)->fn_flag & FIFOFAST) ?
             fifo_fastioctl(vp, cmd, arg, mode, cr, rvalp) :
             fifo_strioctl(vp, cmd, arg, mode, cr, rvalp));
 }
 
+static inline int
+fifo_ioctl_getpeercred(fifonode_t *fnp, intptr_t arg, int mode)
+{
+        k_peercred_t *kp = (k_peercred_t *)arg;
+
+        if (mode == FKIOCTL && fnp->fn_pcredp != NULL) {
+                crhold(fnp->fn_pcredp);
+                kp->pc_cr = fnp->fn_pcredp;
+                kp->pc_cpid = fnp->fn_cpid;
+                return (0);
+        } else {
+                return (ENOTSUP);
+        }
+}
+
 static int
 fifo_fastioctl(vnode_t *vp, int cmd, intptr_t arg, int mode, cred_t *cr,
     int *rvalp)
 {
         fifonode_t      *fnp            = VTOF(vp);

@@ -1344,10 +1359,14 @@
         case I_FLUSHBAND:
                 error = 0;
                 *rvalp = 0;
                 break;
 
+        case _I_GETPEERCRED:
+                error = fifo_ioctl_getpeercred(fnp, arg, mode);
+                break;
+
         /*
          * invalid calls for stream head or fifos
          */
 
         case I_POP:             /* shouldn't happen */

@@ -1391,21 +1410,12 @@
 {
         fifonode_t      *fnp = VTOF(vp);
         int             error;
         fifolock_t      *fn_lock;
 
-        if (cmd == _I_GETPEERCRED) {
-                if (mode == FKIOCTL && fnp->fn_pcredp != NULL) {
-                        k_peercred_t *kp = (k_peercred_t *)arg;
-                        crhold(fnp->fn_pcredp);
-                        kp->pc_cr = fnp->fn_pcredp;
-                        kp->pc_cpid = fnp->fn_cpid;
-                        return (0);
-                } else {
-                        return (ENOTSUP);
-                }
-        }
+        if (cmd == _I_GETPEERCRED)
+                return (fifo_ioctl_getpeercred(fnp, arg, mode));
 
         error = strioctl(vp, cmd, arg, mode, U_TO_K, cr, rvalp);
 
         switch (cmd) {
         /*