Pass LK_PCATCH instead of trying to store tsleep flags in the lock
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 2 Mar 2006 19:08:00 +0000 (19:08 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 2 Mar 2006 19:08:00 +0000 (19:08 +0000)
structure, so multiple entities competing for the same lock do not
use unexpected flags when sleeping.

Only NFS really uses PCATCH with lockmgr locks.

25 files changed:
sys/bus/usb/ehci.c
sys/dev/agp/agp.c
sys/dev/drm/drm_drv.h
sys/dev/pccard/pccbb/pccbb.c
sys/kern/imgact_resident.c
sys/kern/kern_linker.c
sys/kern/kern_lock.c
sys/kern/kern_sysctl.c
sys/kern/vfs_bio.c
sys/kern/vfs_lock.c
sys/kern/vfs_mount.c
sys/kern/vfs_subr.c
sys/kern/vfs_syscalls.c
sys/netproto/ncp/ncp_conn.c
sys/netproto/smb/smb_conn.c
sys/sys/buf2.h
sys/sys/lock.h
sys/vfs/hpfs/hpfs_hash.c
sys/vfs/nfs/nfs_node.c
sys/vfs/nfs/nfs_vnops.c
sys/vfs/ntfs/ntfs_ihash.c
sys/vfs/ntfs/ntfs_subr.c
sys/vfs/nwfs/nwfs_node.c
sys/vfs/smbfs/smbfs_vfsops.c
sys/vm/vm_map.c

index 73bb124..5877ee4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * $NetBSD: ehci.c,v 1.67 2004/07/06 04:18:05 mycroft Exp $
  * $FreeBSD: src/sys/dev/usb/ehci.c,v 1.5 2003/11/10 00:20:52 joe Exp $
- * $DragonFly: src/sys/bus/usb/ehci.c,v 1.16 2006/01/22 14:03:51 swildner Exp $
+ * $DragonFly: src/sys/bus/usb/ehci.c,v 1.17 2006/03/02 19:07:54 dillon Exp $
  */
 
 /*
@@ -449,7 +449,7 @@ ehci_init(ehci_softc_t *sc)
 
        usb_callout_init(sc->sc_tmo_pcd);
 
-       lockinit(&sc->sc_doorbell_lock, 0, "ehcidb", 0, 0);
+       lockinit(&sc->sc_doorbell_lock, "ehcidb", 0, 0);
 
        /* Turn on controller */
        EOWRITE4(sc, EHCI_USBCMD,
index 8c99067..79ce11c 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/pci/agp.c,v 1.3.2.4 2002/08/11 19:58:12 alc Exp $
- *     $DragonFly: src/sys/dev/agp/agp.c,v 1.16 2005/12/11 01:54:07 swildner Exp $
+ *     $DragonFly: src/sys/dev/agp/agp.c,v 1.17 2006/03/02 19:07:56 dillon Exp $
  */
 
 #include "opt_bus.h"
@@ -251,7 +251,7 @@ agp_generic_attach(device_t dev)
         * The lock is used to prevent re-entry to
         * agp_generic_bind_memory() since that function can sleep.
         */
-       lockinit(&sc->as_lock, PCATCH, "agplk", 0, 0);
+       lockinit(&sc->as_lock, "agplk", 0, 0);
 
        /*
         * Initialise stuff for the userland device.
@@ -272,7 +272,7 @@ agp_generic_detach(device_t dev)
 {
        struct agp_softc *sc = device_get_softc(dev);
        bus_release_resource(dev, SYS_RES_MEMORY, AGP_APBASE, sc->as_aperture);
-       lockmgr(&sc->as_lock, LK_DRAIN, NULL, curthread); /* XXX */
+       lockmgr(&sc->as_lock, LK_DRAIN | LK_PCATCH, NULL, curthread); /* XXX */
        agp_flush_cache();
        cdevsw_remove(&agp_cdevsw, -1, device_get_unit(dev));
        return 0;
@@ -485,7 +485,7 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem,
        vm_page_t m;
        int error;
 
-       lockmgr(&sc->as_lock, LK_EXCLUSIVE, NULL, curthread); /* XXX */
+       lockmgr(&sc->as_lock, LK_EXCLUSIVE | LK_PCATCH, NULL, curthread); /* XXX */
 
        if (mem->am_is_bound) {
                device_printf(dev, "memory already bound\n");
@@ -546,7 +546,7 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem,
                                                           OFF_TO_IDX(k));
                                        vm_page_unwire(m, 0);
                                }
-                               lockmgr(&sc->as_lock, LK_RELEASE, NULL, curthread); /* XXX */
+                               lockmgr(&sc->as_lock, LK_RELEASE | LK_PCATCH, NULL, curthread); /* XXX */
                                return error;
                        }
                }
@@ -567,7 +567,7 @@ agp_generic_bind_memory(device_t dev, struct agp_memory *mem,
        mem->am_offset = offset;
        mem->am_is_bound = 1;
 
-       lockmgr(&sc->as_lock, LK_RELEASE, NULL, curthread); /* XXX */
+       lockmgr(&sc->as_lock, LK_RELEASE | LK_PCATCH, NULL, curthread); /* XXX */
 
        return 0;
 }
@@ -579,7 +579,7 @@ agp_generic_unbind_memory(device_t dev, struct agp_memory *mem)
        vm_page_t m;
        int i;
 
-       lockmgr(&sc->as_lock, LK_EXCLUSIVE, NULL, curthread); /* XXX */
+       lockmgr(&sc->as_lock, LK_EXCLUSIVE | LK_PCATCH, NULL, curthread); /* XXX */
 
        if (!mem->am_is_bound) {
                device_printf(dev, "memory is not bound\n");
@@ -604,7 +604,7 @@ agp_generic_unbind_memory(device_t dev, struct agp_memory *mem)
        mem->am_offset = 0;
        mem->am_is_bound = 0;
 
-       lockmgr(&sc->as_lock, LK_RELEASE, NULL, curthread); /* XXX */
+       lockmgr(&sc->as_lock, LK_RELEASE | LK_PCATCH, NULL, curthread); /* XXX */
 
        return 0;
 }
index e88044d..0139d63 100644 (file)
@@ -29,7 +29,7 @@
  *    Gareth Hughes <gareth@valinux.com>
  *
  * $FreeBSD: src/sys/dev/drm/drm_drv.h,v 1.13.2.1 2003/04/26 07:05:28 anholt Exp $
- * $DragonFly: src/sys/dev/drm/Attic/drm_drv.h,v 1.11 2005/03/01 00:43:02 corecode Exp $
+ * $DragonFly: src/sys/dev/drm/Attic/drm_drv.h,v 1.12 2006/03/02 19:07:57 dillon Exp $
  */
 
 /*
@@ -666,7 +666,7 @@ static int DRM(init)( device_t nbdev )
        unit = minor(dev->device.dv_unit);
 #endif
        DRM_SPININIT(dev->count_lock, "drm device");
-       lockinit(&dev->dev_lock, 0, "drmlk", 0, 0);
+       lockinit(&dev->dev_lock, "drmlk", 0, 0);
        dev->name = DRIVER_NAME;
        DRM(mem_init)();
        DRM(sysctl_init)(dev);
index 67ace82..e9f576b 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/pccbb/pccbb.c,v 1.64 2002/11/23 23:09:45 imp Exp $
- * $DragonFly: src/sys/dev/pccard/pccbb/pccbb.c,v 1.12 2005/12/19 01:18:58 dillon Exp $
+ * $DragonFly: src/sys/dev/pccard/pccbb/pccbb.c,v 1.13 2006/03/02 19:07:59 dillon Exp $
  */
 
 /*
@@ -563,7 +563,7 @@ cbb_attach(device_t brdev)
        struct cbb_softc *sc = (struct cbb_softc *)device_get_softc(brdev);
        int rid;
 
-       lockinit(&sc->lock, 0, "cbb", 0, 0);
+       lockinit(&sc->lock, "cbb", 0, 0);
        sc->chipset = cbb_chipset(pci_get_devid(brdev), NULL);
        sc->dev = brdev;
        sc->cbdev = NULL;
index 1aae6a6..b56b6c5 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/imgact_resident.c,v 1.7 2005/01/31 17:53:57 joerg Exp $
+ * $DragonFly: src/sys/kern/imgact_resident.c,v 1.8 2006/03/02 19:07:59 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -72,7 +72,7 @@ static struct lock exec_list_lock;
 static void
 vm_resident_init(void *__dummy)
 {
-       lockinit(&exec_list_lock, 0, "vmres", 0, 0);
+       lockinit(&exec_list_lock, "vmres", 0, 0);
        TAILQ_INIT(&exec_res_list);
 }
 SYSINIT(vmres, SI_SUB_VM, SI_ORDER_ANY, vm_resident_init, 0);
index 1c48a08..2e82112 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_linker.c,v 1.41.2.3 2001/11/21 17:50:35 luigi Exp $
- * $DragonFly: src/sys/kern/kern_linker.c,v 1.24 2006/01/19 04:49:45 corecode Exp $
+ * $DragonFly: src/sys/kern/kern_linker.c,v 1.25 2006/03/02 19:07:59 dillon Exp $
  */
 
 #include "opt_ddb.h"
@@ -66,7 +66,7 @@ static int next_file_id = 1;
 static void
 linker_init(void* arg)
 {
-    lockinit(&lock, 0, "klink", 0, 0);
+    lockinit(&lock, "klink", 0, 0);
     TAILQ_INIT(&classes);
     TAILQ_INIT(&linker_files);
 }
index 9cdad6c..148fd23 100644 (file)
@@ -39,7 +39,7 @@
  *
  *     @(#)kern_lock.c 8.18 (Berkeley) 5/21/95
  * $FreeBSD: src/sys/kern/kern_lock.c,v 1.31.2.3 2001/12/25 01:44:44 dillon Exp $
- * $DragonFly: src/sys/kern/kern_lock.c,v 1.15 2005/11/19 17:19:47 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_lock.c,v 1.16 2006/03/02 19:07:59 dillon Exp $
  */
 
 #include "opt_lint.h"
@@ -137,8 +137,10 @@ acquire(struct lock *lkp, int extflags, int wanted)
                 */
                tsleep_interlock(lkp);
                spin_unlock_quick(&lkp->lk_spinlock);
-               error = tsleep(lkp, lkp->lk_prio, lkp->lk_wmesg, 
-                           ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0));
+               error = tsleep(lkp, 
+                              ((extflags & LK_PCATCH) ? PCATCH : 0),
+                              lkp->lk_wmesg, 
+                              ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0));
                spin_lock_quick(&lkp->lk_spinlock);
                if (lkp->lk_waitcount == 1) {
                        lkp->lk_flags &= ~LK_WAIT_NONZERO;
@@ -494,9 +496,10 @@ acquiredrain(struct lock *lkp, int extflags)
                 */
                tsleep_interlock(&lkp->lk_flags);
                spin_unlock_quick(&lkp->lk_spinlock);
-               error = tsleep(&lkp->lk_flags, lkp->lk_prio,
-                       lkp->lk_wmesg, 
-                       ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0));
+               error = tsleep(&lkp->lk_flags,
+                              ((extflags & LK_PCATCH) ? PCATCH : 0),
+                              lkp->lk_wmesg, 
+                              ((extflags & LK_TIMELOCK) ? lkp->lk_timo : 0));
                spin_lock_quick(&lkp->lk_spinlock);
                if (error)
                        return error;
@@ -511,14 +514,13 @@ acquiredrain(struct lock *lkp, int extflags)
  * Initialize a lock; required before use.
  */
 void
-lockinit(struct lock *lkp, int prio, char *wmesg, int timo, int flags)
+lockinit(struct lock *lkp, char *wmesg, int timo, int flags)
 {
        spin_init(&lkp->lk_spinlock);
        lkp->lk_flags = (flags & LK_EXTFLG_MASK);
        lkp->lk_sharecount = 0;
        lkp->lk_waitcount = 0;
        lkp->lk_exclusivecount = 0;
-       lkp->lk_prio = prio;
        lkp->lk_wmesg = wmesg;
        lkp->lk_timo = timo;
        lkp->lk_lockholder = LK_NOTHREAD;
@@ -530,11 +532,10 @@ lockinit(struct lock *lkp, int prio, char *wmesg, int timo, int flags)
  * must already hold the interlock.
  */
 void
-lockreinit(struct lock *lkp, int prio, char *wmesg, int timo, int flags)
+lockreinit(struct lock *lkp, char *wmesg, int timo, int flags)
 {
        lkp->lk_flags = (lkp->lk_flags & ~(LK_EXTFLG_MASK|LK_DRAINING)) |
                        (flags & LK_EXTFLG_MASK);
-       lkp->lk_prio = prio;
        lkp->lk_wmesg = wmesg;
        lkp->lk_timo = timo;
 }
index a1e491c..1afd351 100644 (file)
@@ -38,7 +38,7 @@
  *
  *     @(#)kern_sysctl.c       8.4 (Berkeley) 4/14/94
  * $FreeBSD: src/sys/kern/kern_sysctl.c,v 1.92.2.9 2003/05/01 22:48:09 trhodes Exp $
- * $DragonFly: src/sys/kern/kern_sysctl.c,v 1.18 2005/02/05 23:04:28 joerg Exp $
+ * $DragonFly: src/sys/kern/kern_sysctl.c,v 1.19 2006/03/02 19:07:59 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -464,8 +464,8 @@ static void sysctl_register_all(void *arg)
 {
        struct sysctl_oid **oidp;
 
-       lockinit(&sysctl_lkp, 0, "sysctl", 0, 0);
-       lockinit(&sysctl_ctx_lkp, 0, "sysctl ctx", 0, 0);
+       lockinit(&sysctl_lkp, "sysctl", 0, 0);
+       lockinit(&sysctl_ctx_lkp, "sysctl ctx", 0, 0);
        SET_FOREACH(oidp, sysctl_set)
                sysctl_register_oid_int(*oidp);
 }
index 0d7a86c..fe9e49e 100644 (file)
@@ -12,7 +12,7 @@
  *             John S. Dyson.
  *
  * $FreeBSD: src/sys/kern/vfs_bio.c,v 1.242.2.20 2003/05/28 18:38:10 alc Exp $
- * $DragonFly: src/sys/kern/vfs_bio.c,v 1.54 2006/02/17 19:18:06 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_bio.c,v 1.55 2006/03/02 19:07:59 dillon Exp $
  */
 
 /*
@@ -2280,11 +2280,15 @@ loop:
                 * once the lock has been obtained.
                 */
                if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) {
-                       if (BUF_TIMELOCK(bp, LK_EXCLUSIVE | LK_SLEEPFAIL,
-                           "getblk", slpflag, slptimeo) == ENOLCK)
+                       int lkflags = LK_EXCLUSIVE | LK_SLEEPFAIL;
+                       if (slpflag & PCATCH)
+                               lkflags |= LK_PCATCH;
+                       if (BUF_TIMELOCK(bp, lkflags, "getblk", slptimeo) ==
+                           ENOLCK) {
                                goto loop;
+                       }
                        crit_exit();
-                       return (struct buf *) NULL;
+                       return (NULL);
                }
 
                /*
index dac1263..05870f8 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/kern/vfs_lock.c,v 1.8 2006/02/17 19:18:06 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_lock.c,v 1.9 2006/03/02 19:07:59 dillon Exp $
  */
 
 /*
@@ -470,7 +470,7 @@ allocvnode(int lktimeout, int lkflags)
                vp->v_clen = 0;
                vp->v_socket = 0;
                vp->v_writecount = 0;   /* XXX */
-               lockreinit(&vp->v_lock, 0, "vnode", lktimeout, lkflags);
+               lockreinit(&vp->v_lock, "vnode", lktimeout, lkflags);
                KKASSERT(TAILQ_FIRST(&vp->v_namecache) == NULL);
        } else {
                /*
@@ -478,7 +478,7 @@ allocvnode(int lktimeout, int lkflags)
                 */
                vp = malloc(sizeof(struct vnode), M_VNODE, M_WAITOK|M_ZERO);
                lwkt_token_init(&vp->v_pollinfo.vpi_token);
-               lockinit(&vp->v_lock, 0, "vnode", lktimeout, lkflags);
+               lockinit(&vp->v_lock, "vnode", lktimeout, lkflags);
                TAILQ_INIT(&vp->v_namecache);
 
                /*
index c766657..a3a92d0 100644 (file)
@@ -67,7 +67,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/kern/vfs_mount.c,v 1.11 2005/06/06 15:02:28 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_mount.c,v 1.12 2006/03/02 19:07:59 dillon Exp $
  */
 
 /*
@@ -300,7 +300,7 @@ vfs_rootmountalloc(char *fstypename, char *devname, struct mount **mpp)
                return (ENODEV);
        mp = malloc(sizeof(struct mount), M_MOUNT, M_WAITOK);
        bzero((char *)mp, (u_long)sizeof(struct mount));
-       lockinit(&mp->mnt_lock, 0, "vfslock", VLKTIMEOUT, LK_NOPAUSE);
+       lockinit(&mp->mnt_lock, "vfslock", VLKTIMEOUT, LK_NOPAUSE);
        vfs_busy(mp, LK_NOWAIT, td);
        TAILQ_INIT(&mp->mnt_nvnodelist);
        TAILQ_INIT(&mp->mnt_reservedvnlist);
index 7941451..dd99046 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_subr.c  8.31 (Berkeley) 5/26/95
  * $FreeBSD: src/sys/kern/vfs_subr.c,v 1.249.2.30 2003/04/04 20:35:57 tegge Exp $
- * $DragonFly: src/sys/kern/vfs_subr.c,v 1.66 2006/02/17 19:18:06 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_subr.c,v 1.67 2006/03/02 19:07:59 dillon Exp $
  */
 
 /*
@@ -269,7 +269,7 @@ static int vinvalbuf_bp(struct buf *bp, void *data);
 struct vinvalbuf_bp_info {
        struct vnode *vp;
        int slptimeo;
-       int slpflag;
+       int lkflags;
        int flags;
 };
 
@@ -309,7 +309,9 @@ vinvalbuf(struct vnode *vp, int flags, struct thread *td,
        }
        crit_enter();
        info.slptimeo = slptimeo;
-       info.slpflag = slpflag;
+       info.lkflags = LK_EXCLUSIVE | LK_SLEEPFAIL;
+       if (slpflag & PCATCH)
+               info.lkflags |= LK_PCATCH;
        info.flags = flags;
        info.vp = vp;
 
@@ -364,9 +366,8 @@ vinvalbuf_bp(struct buf *bp, void *data)
        int error;
 
        if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) {
-               error = BUF_TIMELOCK(bp,
-                   LK_EXCLUSIVE | LK_SLEEPFAIL,
-                   "vinvalbuf", info->slpflag, info->slptimeo);
+               error = BUF_TIMELOCK(bp, info->lkflags,
+                                    "vinvalbuf", info->slptimeo);
                if (error == 0) {
                        BUF_UNLOCK(bp);
                        error = ENOLCK;
index c82c609..ec199ca 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_syscalls.c      8.13 (Berkeley) 4/15/94
  * $FreeBSD: src/sys/kern/vfs_syscalls.c,v 1.151.2.18 2003/04/04 20:35:58 tegge Exp $
- * $DragonFly: src/sys/kern/vfs_syscalls.c,v 1.76 2006/01/04 18:11:26 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_syscalls.c,v 1.77 2006/03/02 19:07:59 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -293,7 +293,7 @@ mount(struct mount_args *uap)
        TAILQ_INIT(&mp->mnt_reservedvnlist);
        TAILQ_INIT(&mp->mnt_jlist);
        mp->mnt_nvnodelistsize = 0;
-       lockinit(&mp->mnt_lock, 0, "vfslock", 0, LK_NOPAUSE);
+       lockinit(&mp->mnt_lock, "vfslock", 0, LK_NOPAUSE);
        vfs_busy(mp, LK_NOWAIT, td);
        mp->mnt_op = vfsp->vfc_vfsops;
        mp->mnt_vfc = vfsp;
index 78c7e38..e5b3fa4 100644 (file)
@@ -29,7 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * $FreeBSD: src/sys/netncp/ncp_conn.c,v 1.3.2.5 2001/02/22 08:54:11 bp Exp $
- * $DragonFly: src/sys/netproto/ncp/ncp_conn.c,v 1.8 2005/02/15 18:20:50 joerg Exp $
+ * $DragonFly: src/sys/netproto/ncp/ncp_conn.c,v 1.9 2006/03/02 19:07:59 dillon Exp $
  *
  * Connection tables
  */
@@ -72,8 +72,8 @@ MALLOC_DEFINE(M_NCPDATA, "NCP data", "NCP private data");
 
 int
 ncp_conn_init(void) {
-       lockinit(&listlock, 0, "ncpll", 0, 0);
-       lockinit(&lhlock, 0, "ncplh", 0, 0);
+       lockinit(&listlock, "ncpll", 0, 0);
+       lockinit(&lhlock, "ncplh", 0, 0);
        return 0;
 }
 
@@ -195,7 +195,7 @@ ncp_conn_alloc(struct thread *td, struct ucred *cred, struct ncp_conn **conn)
        MALLOC(ncp, struct ncp_conn *, sizeof(struct ncp_conn), 
            M_NCPDATA, M_WAITOK | M_ZERO);
        error = 0;
-       lockinit(&ncp->nc_lock, 0, "ncplck", 0, 0);
+       lockinit(&ncp->nc_lock, "ncplck", 0, 0);
        ncp_conn_cnt++;
        ncp->nc_id = ncp_next_ref++;
        ncp->nc_owner = cred;
index 2997e79..abfe78e 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netsmb/smb_conn.c,v 1.1.2.1 2001/05/22 08:32:33 bp Exp $
- * $DragonFly: src/sys/netproto/smb/smb_conn.c,v 1.9 2005/12/06 04:03:56 dillon Exp $
+ * $DragonFly: src/sys/netproto/smb/smb_conn.c,v 1.10 2006/03/02 19:07:59 dillon Exp $
  */
 
 /*
@@ -223,7 +223,7 @@ smb_co_init(struct smb_connobj *cp, int level, char *objname, struct thread *td)
 {
        SLIST_INIT(&cp->co_children);
        smb_sl_init(&cp->co_interlock, objname);
-       lockinit(&cp->co_lock, 0, objname, 0, 0);
+       lockinit(&cp->co_lock, objname, 0, 0);
        cp->co_level = level;
        cp->co_usecount = 1;
        KASSERT(smb_co_lock(cp, NULL, LK_EXCLUSIVE, td) == 0,
index 1c61be2..c42a685 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)buf.h       8.9 (Berkeley) 3/30/95
  * $FreeBSD: src/sys/sys/buf.h,v 1.88.2.10 2003/01/25 19:02:23 dillon Exp $
- * $DragonFly: src/sys/sys/buf2.h,v 1.12 2006/02/17 19:18:07 dillon Exp $
+ * $DragonFly: src/sys/sys/buf2.h,v 1.13 2006/03/02 19:08:00 dillon Exp $
  */
 
 #ifndef _SYS_BUF2_H_
@@ -59,7 +59,7 @@
  * Initialize a lock.
  */
 #define BUF_LOCKINIT(bp) \
-       lockinit(&(bp)->b_lock, 0, buf_wmesg, 0, 0)
+       lockinit(&(bp)->b_lock, buf_wmesg, 0, 0)
 
 /*
  *
@@ -72,23 +72,24 @@ BUF_LOCK(struct buf *bp, int locktype)
 
        spin_lock(&buftimespinlock);
        bp->b_lock.lk_wmesg = buf_wmesg;
-       bp->b_lock.lk_prio = 0;         /* tsleep flags */
-       /* bp->b_lock.lk_timo = 0;   not necessary */
        ret = lockmgr(&(bp)->b_lock, locktype | LK_INTERLOCK,
                        &buftimespinlock, curthread);
        return ret;
 }
 /*
  * Get a lock sleeping with specified interruptably and timeout.
+ *
+ * XXX different entities calling BUF_TIMELOCK with different timeouts
+ * will conflict, only one of the multiply specified timeouts may wind
+ * up being used.
  */
 static __inline int
-BUF_TIMELOCK(struct buf *bp, int locktype, char *wmesg, int catch, int timo)
+BUF_TIMELOCK(struct buf *bp, int locktype, char *wmesg, int timo)
 {
        int ret;
 
        spin_lock(&buftimespinlock);
        bp->b_lock.lk_wmesg = wmesg;
-       bp->b_lock.lk_prio = catch;     /* tsleep flags */
        bp->b_lock.lk_timo = timo;
        ret = lockmgr(&(bp)->b_lock, locktype | LK_INTERLOCK | LK_TIMELOCK,
                        &buftimespinlock, curthread);
index fbbd1d6..2b62547 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     @(#)lock.h      8.12 (Berkeley) 5/19/95
  * $FreeBSD: src/sys/sys/lock.h,v 1.17.2.3 2001/12/25 01:44:44 dillon Exp $
- * $DragonFly: src/sys/sys/lock.h,v 1.11 2005/11/19 17:19:48 dillon Exp $
+ * $DragonFly: src/sys/sys/lock.h,v 1.12 2006/03/02 19:08:00 dillon Exp $
  */
 
 #ifndef        _SYS_LOCK_H_
@@ -69,7 +69,7 @@ struct lock {
        int     lk_sharecount;          /* # of accepted shared locks */
        int     lk_waitcount;           /* # of processes sleeping for lock */
        short   lk_exclusivecount;      /* # of recursive exclusive locks */
-       short   lk_prio;                /* tsleep flags */
+       short   lk_unused1;
        char    *lk_wmesg;              /* resource sleeping (for tsleep) */
        int     lk_timo;                /* maximum sleep time (for tsleep) */
        struct thread *lk_lockholder;   /* thread of excl lock holder */
@@ -130,13 +130,14 @@ struct lock {
  * or passed in as arguments to the lock manager. The LK_REENABLE flag may be
  * set only at the release of a lock obtained by drain.
  */
-#define LK_EXTFLG_MASK 0x03000070      /* mask of external flags */
+#define LK_EXTFLG_MASK 0x07000070      /* mask of external flags */
 #define LK_NOWAIT      0x00000010      /* do not sleep to await lock */
 #define LK_SLEEPFAIL   0x00000020      /* sleep, then return failure */
 #define LK_CANRECURSE  0x00000040      /* allow recursive exclusive lock */
 #define LK_REENABLE    0x00000080      /* lock is be reenabled after drain */
 #define        LK_NOPAUSE      0x01000000      /* no spinloop */
 #define LK_TIMELOCK    0x02000000
+#define LK_PCATCH      0x04000000      /* timelocked with signal catching */
 /*
  * Internal lock flags.
  *
@@ -192,8 +193,8 @@ struct lock {
 void dumplockinfo(struct lock *lkp);
 struct proc;
 
-void   lockinit (struct lock *, int prio, char *wmesg, int timo, int flags);
-void   lockreinit (struct lock *, int prio, char *wmesg, int timo, int flags);
+void   lockinit (struct lock *, char *wmesg, int timo, int flags);
+void   lockreinit (struct lock *, char *wmesg, int timo, int flags);
 #ifdef DEBUG_LOCKS
 int    debuglockmgr (struct lock *, u_int flags,
                        struct spinlock *, struct thread *p,
index c67296e..8b2ec5d 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)ufs_ihash.c 8.7 (Berkeley) 5/17/95
  * $FreeBSD: src/sys/fs/hpfs/hpfs_hash.c,v 1.1 1999/12/09 19:09:58 semenu Exp $
- * $DragonFly: src/sys/vfs/hpfs/hpfs_hash.c,v 1.12 2004/10/12 19:20:56 dillon Exp $
+ * $DragonFly: src/sys/vfs/hpfs/hpfs_hash.c,v 1.13 2006/03/02 19:08:00 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -66,7 +66,7 @@ void
 hpfs_hphashinit(void)
 {
 
-       lockinit (&hpfs_hphash_lock, 0, "hpfs_hphashlock", 0, 0);
+       lockinit (&hpfs_hphash_lock, "hpfs_hphashlock", 0, 0);
        hpfs_hphashtbl = HASHINIT(desiredvnodes, M_HPFSHASH, M_WAITOK,
            &hpfs_hphash);
        lwkt_token_init(&hpfs_hphash_token);
index 8720f08..7ab29ed 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_node.c  8.6 (Berkeley) 5/22/95
  * $FreeBSD: src/sys/nfs/nfs_node.c,v 1.36.2.3 2002/01/05 22:25:04 dillon Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_node.c,v 1.19 2005/03/17 17:28:46 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_node.c,v 1.20 2006/03/02 19:08:00 dillon Exp $
  */
 
 
@@ -91,7 +91,7 @@ nfs_nget(struct mount *mntp, nfsfh_t *fhp, int fhsize, struct nfsnode **npp)
        struct vnode *vp;
        struct vnode *nvp;
        int error;
-       int rsflags;
+       int lkflags;
        struct nfsmount *nmp;
 
        /*
@@ -100,9 +100,9 @@ nfs_nget(struct mount *mntp, nfsfh_t *fhp, int fhsize, struct nfsnode **npp)
         */
        nmp = VFSTONFS(mntp);
        if (nmp->nm_flag & NFSMNT_INT)
-               rsflags = PCATCH;
+               lkflags = LK_PCATCH;
        else
-               rsflags = 0;
+               lkflags = 0;
 
 retry:
        nhpp = NFSNOHASH(fnv_32_buf(fhp->fh_bytes, fhsize, FNV1_32_INIT));
@@ -184,7 +184,7 @@ loop:
                np->n_fhp = &np->n_fh;
        bcopy((caddr_t)fhp, (caddr_t)np->n_fhp, fhsize);
        np->n_fhsize = fhsize;
-       lockinit(&np->n_rslock, rsflags, "nfrslk", 0, LK_NOPAUSE);
+       lockinit(&np->n_rslock, "nfrslk", 0, LK_NOPAUSE | lkflags);
 
        /*
         * nvp is locked & refd so effectively so is np.
index e9b7e4a..0612770 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_vnops.c 8.16 (Berkeley) 5/27/95
  * $FreeBSD: src/sys/nfs/nfs_vnops.c,v 1.150.2.5 2001/12/20 19:56:28 dillon Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_vnops.c,v 1.46 2006/02/21 17:52:52 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_vnops.c,v 1.47 2006/03/02 19:08:00 dillon Exp $
  */
 
 
@@ -3093,10 +3093,11 @@ nfs_flush_bp(struct buf *bp, void *data)
                if (info->loops && info->waitfor == MNT_WAIT) {
                        error = BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT);
                        if (error) {
-                               error = BUF_TIMELOCK(bp,
-                                               LK_EXCLUSIVE | LK_SLEEPFAIL,
-                                               "nfsfsync",
-                                               info->slpflag, info->slptimeo);
+                               int lkflags = LK_EXCLUSIVE | LK_SLEEPFAIL;
+                               if (info->slpflag & PCATCH)
+                                       lkflags |= LK_PCATCH;
+                               error = BUF_TIMELOCK(bp, lkflags, "nfsfsync",
+                                                    info->slptimeo);
                        }
                } else {
                        error = BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT);
index 0e1c89a..7d43c8f 100644 (file)
@@ -34,7 +34,7 @@
  *
  *     @(#)ufs_ihash.c 8.7 (Berkeley) 5/17/95
  * $FreeBSD: src/sys/ntfs/ntfs_ihash.c,v 1.7 1999/12/03 20:37:39 semenu Exp $
- * $DragonFly: src/sys/vfs/ntfs/ntfs_ihash.c,v 1.9 2004/04/20 19:59:30 cpressey Exp $
+ * $DragonFly: src/sys/vfs/ntfs/ntfs_ihash.c,v 1.10 2006/03/02 19:08:00 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -67,7 +67,7 @@ struct lock ntfs_hashlock;
 void
 ntfs_nthashinit(void)
 {
-       lockinit(&ntfs_hashlock, 0, "ntfs_nthashlock", 0, 0);
+       lockinit(&ntfs_hashlock, "ntfs_nthashlock", 0, 0);
        ntfs_nthashtbl = HASHINIT(desiredvnodes, M_NTFSNTHASH, M_WAITOK,
            &ntfs_nthash);
        lwkt_token_init(&ntfs_nthash_slock);
index 8507ce4..56482b3 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/ntfs/ntfs_subr.c,v 1.7.2.4 2001/10/12 22:08:49 semenu Exp $
- * $DragonFly: src/sys/vfs/ntfs/ntfs_subr.c,v 1.18 2006/01/22 04:31:22 swildner Exp $
+ * $DragonFly: src/sys/vfs/ntfs/ntfs_subr.c,v 1.19 2006/03/02 19:08:00 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -394,7 +394,7 @@ ntfs_ntlookup(struct ntfsmount *ntmp, ino_t ino, struct ntnode **ipp)
        vref(ip->i_devvp);
 
        /* init lock and lock the newborn ntnode */
-       lockinit(&ip->i_lock, 0, "ntnode", 0, LK_EXCLUSIVE);
+       lockinit(&ip->i_lock, "ntnode", 0, LK_EXCLUSIVE);
        spin_init(&ip->i_interlock);
        ntfs_ntget(ip);
 
@@ -1831,7 +1831,7 @@ void
 ntfs_toupper_init(void)
 {
        ntfs_toupper_tab = (wchar *) NULL;
-       lockinit(&ntfs_toupper_lock, 0, "ntfs_toupper", 0, 0);
+       lockinit(&ntfs_toupper_lock, "ntfs_toupper", 0, 0);
        ntfs_toupper_usecount = 0;
 }
 
index 5e5c716..f9f4da2 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/nwfs/nwfs_node.c,v 1.3.2.8 2001/12/25 01:44:45 dillon Exp $
- * $DragonFly: src/sys/vfs/nwfs/nwfs_node.c,v 1.18 2005/08/16 16:27:41 joerg Exp $
+ * $DragonFly: src/sys/vfs/nwfs/nwfs_node.c,v 1.19 2006/03/02 19:08:00 dillon Exp $
  */
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -76,7 +76,7 @@ void
 nwfs_hash_init(void)
 {
        nwhashtbl = hashinit(desiredvnodes, M_NWFSHASH, &nwnodehash);
-       lockinit(&nwhashlock, 0, "nwfshl", 0, 0);
+       lockinit(&nwhashlock, "nwfshl", 0, 0);
 }
 
 void
@@ -190,7 +190,7 @@ rescan:
        vp->v_data = np;
        np->n_fid = fid;
        np->n_flag |= NNEW;
-       lockinit(&np->n_lock, 0, "nwnode", VLKTIMEOUT, LK_CANRECURSE);
+       lockinit(&np->n_lock, "nwnode", VLKTIMEOUT, LK_CANRECURSE);
        nhpp = NWNOHASH(fid);
        LIST_INSERT_HEAD(nhpp, np, n_hash);
        lockmgr(&nwhashlock, LK_RELEASE, NULL, td);
index c62e7a4..c65ea85 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/fs/smbfs/smbfs_vfsops.c,v 1.2.2.5 2003/01/17 08:20:26 tjr Exp $
- * $DragonFly: src/sys/vfs/smbfs/smbfs_vfsops.c,v 1.23 2005/09/17 07:43:12 dillon Exp $
+ * $DragonFly: src/sys/vfs/smbfs/smbfs_vfsops.c,v 1.24 2006/03/02 19:08:00 dillon Exp $
  */
 #include "opt_netsmb.h"
 #ifndef NETSMB
@@ -175,7 +175,7 @@ smbfs_mount(struct mount *mp, char *path, caddr_t data, struct thread *td)
        smp->sm_hash = hashinit(desiredvnodes, M_SMBFSHASH, &smp->sm_hashlen);
        if (smp->sm_hash == NULL)
                goto bad;
-       lockinit(&smp->sm_hashlock, 0, "smbfsh", 0, 0);
+       lockinit(&smp->sm_hashlock, "smbfsh", 0, 0);
        smp->sm_share = ssp;
        smp->sm_root = NULL;
         smp->sm_args = args;
index c636332..df698ee 100644 (file)
@@ -62,7 +62,7 @@
  * rights to redistribute these changes.
  *
  * $FreeBSD: src/sys/vm/vm_map.c,v 1.187.2.19 2003/05/27 00:47:02 alc Exp $
- * $DragonFly: src/sys/vm/vm_map.c,v 1.40 2006/01/13 20:45:30 swildner Exp $
+ * $DragonFly: src/sys/vm/vm_map.c,v 1.41 2006/03/02 19:08:00 dillon Exp $
  */
 
 /*
@@ -348,7 +348,7 @@ vm_map_init(struct vm_map *map, vm_offset_t min, vm_offset_t max)
        map->first_free = &map->header;
        map->hint = &map->header;
        map->timestamp = 0;
-       lockinit(&map->lock, 0, "thrd_sleep", 0, LK_NOPAUSE);
+       lockinit(&map->lock, "thrd_sleep", 0, LK_NOPAUSE);
 }
 
 /*