Author: hselasky
Date: Mon Oct  6 06:07:02 2014
New Revision: 272593
URL: https://svnweb.freebsd.org/changeset/base/272593

Log:
  MFC r272480:
  When we fail to get a USB reference we should just return, because
  there are no more references held.

Modified:
  stable/9/sys/dev/usb/usb_dev.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/dev/   (props changed)

Modified: stable/9/sys/dev/usb/usb_dev.c
==============================================================================
--- stable/9/sys/dev/usb/usb_dev.c      Mon Oct  6 06:05:43 2014        
(r272592)
+++ stable/9/sys/dev/usb/usb_dev.c      Mon Oct  6 06:07:02 2014        
(r272593)
@@ -295,6 +295,10 @@ error:
        }
        mtx_unlock(&usb_ref_lock);
        DPRINTFN(2, "fail\n");
+
+       /* clear all refs */
+       memset(crd, 0, sizeof(*crd));
+
        return (USB_ERR_INVAL);
 }
 
@@ -1090,8 +1094,8 @@ usb_ioctl(struct cdev *dev, u_long cmd, 
                goto done;
 
        if (usb_usb_ref_device(cpd, &refs)) {
-               err = ENXIO;
-               goto done;
+               /* we lost the reference */
+               return (ENXIO);
        }
 
        err = (f->methods->f_ioctl_post) (f, cmd, addr, fflags);
@@ -1114,9 +1118,8 @@ usb_ioctl(struct cdev *dev, u_long cmd, 
 
                while (usb_ref_device(cpd, &refs, 1 /* need uref */)) {
                        if (usb_ref_device(cpd, &refs, 0)) {
-                               /* device no longer exits */
-                               err = ENXIO;
-                               goto done;
+                               /* device no longer exists */
+                               return (ENXIO);
                        }
                        usb_unref_device(cpd, &refs);
                        usb_pause_mtx(NULL, hz / 128);
@@ -1408,9 +1411,9 @@ usb_read(struct cdev *dev, struct uio *u
                return (err);
 
        err = usb_ref_device(cpd, &refs, 0 /* no uref */ );
-       if (err) {
+       if (err)
                return (ENXIO);
-       }
+
        fflags = cpd->fflags;
 
        f = refs.rxfifo;
@@ -1534,9 +1537,9 @@ usb_write(struct cdev *dev, struct uio *
                return (err);
 
        err = usb_ref_device(cpd, &refs, 0 /* no uref */ );
-       if (err) {
+       if (err)
                return (ENXIO);
-       }
+
        fflags = cpd->fflags;
 
        f = refs.txfifo;
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to