Author: kib
Date: Fri Aug 14 11:17:34 2009
New Revision: 196209
URL: http://svn.freebsd.org/changeset/base/196209

Log:
  MFC r196205:
  In nfs_upgrade_vnlock(), assert that the vnode is locked.
  When downgrading, pass LK_RETRY to the vn_lock(), since otherwise
  vn_lock() unlocks the doomed vnode, causing extra unlock.
  
  Approved by:  re (rwatson)

Modified:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/ata/   (props changed)
  stable/8/sys/dev/ata/ata-usb.c   (props changed)
  stable/8/sys/dev/cxgb/   (props changed)
  stable/8/sys/dev/sound/usb/uaudio.c   (props changed)
  stable/8/sys/dev/sound/usb/uaudio.h   (props changed)
  stable/8/sys/dev/sound/usb/uaudio_pcm.c   (props changed)
  stable/8/sys/dev/sound/usb/uaudioreg.h   (props changed)
  stable/8/sys/dev/usb/controller/at91dci.c   (props changed)
  stable/8/sys/dev/usb/controller/at91dci.h   (props changed)
  stable/8/sys/dev/usb/controller/at91dci_atmelarm.c   (props changed)
  stable/8/sys/dev/usb/controller/atmegadci.c   (props changed)
  stable/8/sys/dev/usb/controller/atmegadci.h   (props changed)
  stable/8/sys/dev/usb/controller/atmegadci_atmelarm.c   (props changed)
  stable/8/sys/dev/usb/controller/ehci.c   (props changed)
  stable/8/sys/dev/usb/controller/ehci.h   (props changed)
  stable/8/sys/dev/usb/controller/ehci_ixp4xx.c   (props changed)
  stable/8/sys/dev/usb/controller/ehci_mbus.c   (props changed)
  stable/8/sys/dev/usb/controller/ehci_pci.c   (props changed)
  stable/8/sys/dev/usb/controller/musb_otg.c   (props changed)
  stable/8/sys/dev/usb/controller/musb_otg.h   (props changed)
  stable/8/sys/dev/usb/controller/musb_otg_atmelarm.c   (props changed)
  stable/8/sys/dev/usb/controller/ohci.c   (props changed)
  stable/8/sys/dev/usb/controller/ohci.h   (props changed)
  stable/8/sys/dev/usb/controller/ohci_atmelarm.c   (props changed)
  stable/8/sys/dev/usb/controller/ohci_pci.c   (props changed)
  stable/8/sys/dev/usb/controller/uhci.c   (props changed)
  stable/8/sys/dev/usb/controller/uhci.h   (props changed)
  stable/8/sys/dev/usb/controller/uhci_pci.c   (props changed)
  stable/8/sys/dev/usb/controller/usb_controller.c   (props changed)
  stable/8/sys/dev/usb/controller/uss820dci.c   (props changed)
  stable/8/sys/dev/usb/controller/uss820dci.h   (props changed)
  stable/8/sys/dev/usb/controller/uss820dci_atmelarm.c   (props changed)
  stable/8/sys/dev/usb/input/uhid.c   (props changed)
  stable/8/sys/dev/usb/input/ukbd.c   (props changed)
  stable/8/sys/dev/usb/input/ums.c   (props changed)
  stable/8/sys/dev/usb/input/usb_rdesc.h   (props changed)
  stable/8/sys/dev/usb/misc/udbp.c   (props changed)
  stable/8/sys/dev/usb/misc/udbp.h   (props changed)
  stable/8/sys/dev/usb/misc/ufm.c   (props changed)
  stable/8/sys/dev/usb/net/if_aue.c   (props changed)
  stable/8/sys/dev/usb/net/if_auereg.h   (props changed)
  stable/8/sys/dev/usb/net/if_axe.c   (props changed)
  stable/8/sys/dev/usb/net/if_axereg.h   (props changed)
  stable/8/sys/dev/usb/net/if_cdce.c   (props changed)
  stable/8/sys/dev/usb/net/if_cdcereg.h   (props changed)
  stable/8/sys/dev/usb/net/if_cue.c   (props changed)
  stable/8/sys/dev/usb/net/if_cuereg.h   (props changed)
  stable/8/sys/dev/usb/net/if_kue.c   (props changed)
  stable/8/sys/dev/usb/net/if_kuefw.h   (props changed)
  stable/8/sys/dev/usb/net/if_kuereg.h   (props changed)
  stable/8/sys/dev/usb/net/if_rue.c   (props changed)
  stable/8/sys/dev/usb/net/if_ruereg.h   (props changed)
  stable/8/sys/dev/usb/net/if_udav.c   (props changed)
  stable/8/sys/dev/usb/net/if_udavreg.h   (props changed)
  stable/8/sys/dev/usb/net/usb_ethernet.c   (props changed)
  stable/8/sys/dev/usb/net/usb_ethernet.h   (props changed)
  stable/8/sys/dev/usb/quirk/usb_quirk.c   (props changed)
  stable/8/sys/dev/usb/quirk/usb_quirk.h   (props changed)
  stable/8/sys/dev/usb/serial/u3g.c   (props changed)
  stable/8/sys/dev/usb/serial/uark.c   (props changed)
  stable/8/sys/dev/usb/serial/ubsa.c   (props changed)
  stable/8/sys/dev/usb/serial/ubser.c   (props changed)
  stable/8/sys/dev/usb/serial/uchcom.c   (props changed)
  stable/8/sys/dev/usb/serial/ucycom.c   (props changed)
  stable/8/sys/dev/usb/serial/ufoma.c   (props changed)
  stable/8/sys/dev/usb/serial/uftdi.c   (props changed)
  stable/8/sys/dev/usb/serial/uftdi_reg.h   (props changed)
  stable/8/sys/dev/usb/serial/ugensa.c   (props changed)
  stable/8/sys/dev/usb/serial/uipaq.c   (props changed)
  stable/8/sys/dev/usb/serial/ulpt.c   (props changed)
  stable/8/sys/dev/usb/serial/umct.c   (props changed)
  stable/8/sys/dev/usb/serial/umodem.c   (props changed)
  stable/8/sys/dev/usb/serial/umoscom.c   (props changed)
  stable/8/sys/dev/usb/serial/uplcom.c   (props changed)
  stable/8/sys/dev/usb/serial/usb_serial.c   (props changed)
  stable/8/sys/dev/usb/serial/usb_serial.h   (props changed)
  stable/8/sys/dev/usb/serial/uslcom.c   (props changed)
  stable/8/sys/dev/usb/serial/uvisor.c   (props changed)
  stable/8/sys/dev/usb/serial/uvscom.c   (props changed)
  stable/8/sys/dev/usb/storage/rio500_usb.h   (props changed)
  stable/8/sys/dev/usb/storage/umass.c   (props changed)
  stable/8/sys/dev/usb/storage/urio.c   (props changed)
  stable/8/sys/dev/usb/storage/ustorage_fs.c   (props changed)
  stable/8/sys/dev/usb/template/usb_template.c   (props changed)
  stable/8/sys/dev/usb/template/usb_template.h   (props changed)
  stable/8/sys/dev/usb/template/usb_template_cdce.c   (props changed)
  stable/8/sys/dev/usb/template/usb_template_msc.c   (props changed)
  stable/8/sys/dev/usb/template/usb_template_mtp.c   (props changed)
  stable/8/sys/dev/usb/ufm_ioctl.h   (props changed)
  stable/8/sys/dev/usb/usb.h   (props changed)
  stable/8/sys/dev/usb/usb_bus.h   (props changed)
  stable/8/sys/dev/usb/usb_busdma.c   (props changed)
  stable/8/sys/dev/usb/usb_busdma.h   (props changed)
  stable/8/sys/dev/usb/usb_cdc.h   (props changed)
  stable/8/sys/dev/usb/usb_compat_linux.c   (props changed)
  stable/8/sys/dev/usb/usb_compat_linux.h   (props changed)
  stable/8/sys/dev/usb/usb_controller.h   (props changed)
  stable/8/sys/dev/usb/usb_core.c   (props changed)
  stable/8/sys/dev/usb/usb_core.h   (props changed)
  stable/8/sys/dev/usb/usb_debug.c   (props changed)
  stable/8/sys/dev/usb/usb_debug.h   (props changed)
  stable/8/sys/dev/usb/usb_dev.c   (props changed)
  stable/8/sys/dev/usb/usb_dev.h   (props changed)
  stable/8/sys/dev/usb/usb_device.c   (props changed)
  stable/8/sys/dev/usb/usb_device.h   (props changed)
  stable/8/sys/dev/usb/usb_dynamic.c   (props changed)
  stable/8/sys/dev/usb/usb_dynamic.h   (props changed)
  stable/8/sys/dev/usb/usb_endian.h   (props changed)
  stable/8/sys/dev/usb/usb_error.c   (props changed)
  stable/8/sys/dev/usb/usb_generic.c   (props changed)
  stable/8/sys/dev/usb/usb_generic.h   (props changed)
  stable/8/sys/dev/usb/usb_handle_request.c   (props changed)
  stable/8/sys/dev/usb/usb_hid.c   (props changed)
  stable/8/sys/dev/usb/usb_hub.c   (props changed)
  stable/8/sys/dev/usb/usb_hub.h   (props changed)
  stable/8/sys/dev/usb/usb_if.m   (props changed)
  stable/8/sys/dev/usb/usb_ioctl.h   (props changed)
  stable/8/sys/dev/usb/usb_lookup.c   (props changed)
  stable/8/sys/dev/usb/usb_mbuf.c   (props changed)
  stable/8/sys/dev/usb/usb_mbuf.h   (props changed)
  stable/8/sys/dev/usb/usb_msctest.c   (props changed)
  stable/8/sys/dev/usb/usb_msctest.h   (props changed)
  stable/8/sys/dev/usb/usb_parse.c   (props changed)
  stable/8/sys/dev/usb/usb_pci.h   (props changed)
  stable/8/sys/dev/usb/usb_process.c   (props changed)
  stable/8/sys/dev/usb/usb_process.h   (props changed)
  stable/8/sys/dev/usb/usb_request.c   (props changed)
  stable/8/sys/dev/usb/usb_request.h   (props changed)
  stable/8/sys/dev/usb/usb_transfer.c   (props changed)
  stable/8/sys/dev/usb/usb_transfer.h   (props changed)
  stable/8/sys/dev/usb/usb_util.c   (props changed)
  stable/8/sys/dev/usb/usb_util.h   (props changed)
  stable/8/sys/dev/usb/usbdevs   (props changed)
  stable/8/sys/dev/usb/usbhid.h   (props changed)
  stable/8/sys/dev/usb/wlan/if_rum.c   (props changed)
  stable/8/sys/dev/usb/wlan/if_rumfw.h   (props changed)
  stable/8/sys/dev/usb/wlan/if_rumreg.h   (props changed)
  stable/8/sys/dev/usb/wlan/if_rumvar.h   (props changed)
  stable/8/sys/dev/usb/wlan/if_ural.c   (props changed)
  stable/8/sys/dev/usb/wlan/if_uralreg.h   (props changed)
  stable/8/sys/dev/usb/wlan/if_uralvar.h   (props changed)
  stable/8/sys/dev/usb/wlan/if_zyd.c   (props changed)
  stable/8/sys/dev/usb/wlan/if_zydfw.h   (props changed)
  stable/8/sys/dev/usb/wlan/if_zydreg.h   (props changed)
  stable/8/sys/dev/xen/netfront/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)
  stable/8/sys/modules/dtrace/dtnfsclient/   (props changed)
  stable/8/sys/modules/ip6_mroute_mod/   (props changed)
  stable/8/sys/modules/ipmi/ipmi_linux/   (props changed)
  stable/8/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c   (props changed)
  stable/8/sys/netgraph/bluetooth/drivers/ubt/ng_ubt_var.h   (props changed)
  stable/8/sys/netgraph/bluetooth/drivers/ubtbcmfw/ubtbcmfw.c   (props changed)
  stable/8/sys/netinet/ipfw/ip_dummynet.c   (props changed)
  stable/8/sys/netinet/ipfw/ip_fw2.c   (props changed)
  stable/8/sys/netinet/ipfw/ip_fw_nat.c   (props changed)
  stable/8/sys/netinet/ipfw/ip_fw_pfil.c   (props changed)
  stable/8/sys/netipx/spx_reass.c   (props changed)
  stable/8/sys/nfsclient/nfs_subs.c
  stable/8/sys/xen/evtchn.h   (props changed)
  stable/8/sys/xen/hypervisor.h   (props changed)
  stable/8/sys/xen/xen_intr.h   (props changed)

Modified: stable/8/sys/nfsclient/nfs_subs.c
==============================================================================
--- stable/8/sys/nfsclient/nfs_subs.c   Fri Aug 14 11:13:06 2009        
(r196208)
+++ stable/8/sys/nfsclient/nfs_subs.c   Fri Aug 14 11:17:34 2009        
(r196209)
@@ -409,28 +409,25 @@ int
 nfs_upgrade_vnlock(struct vnode *vp)
 {
        int old_lock;
-       
-       if ((old_lock = VOP_ISLOCKED(vp)) != LK_EXCLUSIVE) {
-               if (old_lock == LK_SHARED) {
-                       /* Upgrade to exclusive lock, this might block */
-                       vn_lock(vp, LK_UPGRADE | LK_RETRY);
-               } else {
-                       vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
-               }
+
+       ASSERT_VOP_LOCKED(vp, "nfs_upgrade_vnlock");
+       old_lock = VOP_ISLOCKED(vp);
+       if (old_lock != LK_EXCLUSIVE) {
+               KASSERT(old_lock == LK_SHARED,
+                   ("nfs_upgrade_vnlock: wrong old_lock %d", old_lock));
+               /* Upgrade to exclusive lock, this might block */
+               vn_lock(vp, LK_UPGRADE | LK_RETRY);
        }
-       return old_lock;
+       return (old_lock);
 }
 
 void
 nfs_downgrade_vnlock(struct vnode *vp, int old_lock)
 {
        if (old_lock != LK_EXCLUSIVE) {
-               if (old_lock == LK_SHARED) {
-                       /* Downgrade from exclusive lock, this might block */
-                       vn_lock(vp, LK_DOWNGRADE);
-               } else {
-                       VOP_UNLOCK(vp, 0);
-               }
+               KASSERT(old_lock == LK_SHARED, ("wrong old_lock %d", old_lock));
+               /* Downgrade from exclusive lock. */
+               vn_lock(vp, LK_DOWNGRADE | LK_RETRY);
        }
 }
 
_______________________________________________
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