Author: kib
Date: Thu Jan 29 11:08:56 2009
New Revision: 187888
URL: http://svn.freebsd.org/changeset/base/187888

Log:
  MFC r186561:
  Drop the pseudofs vnode lock around call to pfs_read handler.

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/cxgb/   (props changed)
  stable/7/sys/fs/pseudofs/pseudofs_vnops.c

Modified: stable/7/sys/fs/pseudofs/pseudofs_vnops.c
==============================================================================
--- stable/7/sys/fs/pseudofs/pseudofs_vnops.c   Thu Jan 29 11:03:57 2009        
(r187887)
+++ stable/7/sys/fs/pseudofs/pseudofs_vnops.c   Thu Jan 29 11:08:56 2009        
(r187888)
@@ -476,7 +476,7 @@ pfs_read(struct vop_read_args *va)
        struct uio *uio = va->a_uio;
        struct proc *proc;
        struct sbuf *sb = NULL;
-       int error;
+       int error, locked;
        unsigned int buflen, offset, resid;
 
        PFS_TRACE(("%s", pn->pn_name));
@@ -502,13 +502,15 @@ pfs_read(struct vop_read_args *va)
                PROC_UNLOCK(proc);
        }
 
+       vhold(vn);
+       locked = VOP_ISLOCKED(vn, curthread);
+       VOP_UNLOCK(vn, 0, curthread);
+
        if (pn->pn_flags & PFS_RAWRD) {
                PFS_TRACE(("%lu resid", (unsigned long)uio->uio_resid));
                error = pn_fill(curthread, proc, pn, NULL, uio);
                PFS_TRACE(("%lu resid", (unsigned long)uio->uio_resid));
-               if (proc != NULL)
-                       PRELE(proc);
-               PFS_RETURN (error);
+               goto ret;
        }
 
        /* beaucoup sanity checks so we don't ask for bogus allocation */
@@ -518,34 +520,35 @@ pfs_read(struct vop_read_args *va)
            (buflen = offset + resid + 1) < offset || buflen > INT_MAX) {
                if (proc != NULL)
                        PRELE(proc);
-               PFS_RETURN (EINVAL);
+               error = EINVAL;
+               goto ret;
        }
        if (buflen > MAXPHYS + 1) {
-               if (proc != NULL)
-                       PRELE(proc);
-               PFS_RETURN (EIO);
+               error = EIO;
+               goto ret;
        }
 
        sb = sbuf_new(sb, NULL, buflen, 0);
        if (sb == NULL) {
-               if (proc != NULL)
-                       PRELE(proc);
-               PFS_RETURN (EIO);
+               error = EIO;
+               goto ret;
        }
 
        error = pn_fill(curthread, proc, pn, sb, uio);
 
-       if (proc != NULL)
-               PRELE(proc);
-
        if (error) {
                sbuf_delete(sb);
-               PFS_RETURN (error);
+               goto ret;
        }
 
        sbuf_finish(sb);
        error = uiomove_frombuf(sbuf_data(sb), sbuf_len(sb), uio);
        sbuf_delete(sb);
+ret:
+       vn_lock(vn, locked | LK_RETRY, curthread);
+       vdrop(vn);
+       if (proc != NULL)
+               PRELE(proc);
        PFS_RETURN (error);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to