From e819ffcdac7ec36ed1fd1163ee64cec711761846 Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Tue, 5 Feb 2013 17:22:27 -0700 Subject: [PATCH] --- yaml --- r: 354435 b: refs/heads/master c: db7dabf707f1eb3c4288ca8bedd4b2aa6701ca7b h: refs/heads/master i: 354433: c0ab119ae8e85822c19d9855e60ddd472a73ae0c 354431: ff25604957831662f29fe3b3dfcbd36573a751df v: v3 --- [refs] | 2 +- .../drivers/staging/comedi/drivers/vmk80xx.c | 39 ++++++++++++------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/[refs] b/[refs] index b564fe63273e..112f671ef227 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1cc8f8854c86b77637b1300b22e553028c6f2668 +refs/heads/master: db7dabf707f1eb3c4288ca8bedd4b2aa6701ca7b diff --git a/trunk/drivers/staging/comedi/drivers/vmk80xx.c b/trunk/drivers/staging/comedi/drivers/vmk80xx.c index ec9ff0d2a4c0..e82319b28992 100644 --- a/trunk/drivers/staging/comedi/drivers/vmk80xx.c +++ b/trunk/drivers/staging/comedi/drivers/vmk80xx.c @@ -1323,8 +1323,6 @@ static void vmk80xx_detach(struct comedi_device *dev) dev->private = NULL; - devpriv->attached = 0; - devpriv->probed = 0; usb_set_intfdata(devpriv->intf, NULL); usb_kill_anchored_urbs(&devpriv->rx_anchor); @@ -1334,6 +1332,14 @@ static void vmk80xx_detach(struct comedi_device *dev) kfree(devpriv->usb_tx_buf); up(&devpriv->limit_sem); + + /* + * Since 'devpriv' points to an element of the static vmb array + * we can't kfree it. Instead memset it to all '0' so subsequent + * usb probes don't find any garbage in it. + */ + memset(devpriv, 0x00, sizeof(*devpriv)); + mutex_unlock(&glb_mutex); } @@ -1359,25 +1365,19 @@ static int vmk80xx_usb_probe(struct usb_interface *intf, break; if (i == VMK80XX_MAX_BOARDS) { - mutex_unlock(&glb_mutex); - return -EMFILE; + ret = -EMFILE; + goto fail; } devpriv = &vmb[i]; - memset(devpriv, 0x00, sizeof(*devpriv)); - ret = vmk80xx_find_usb_endpoints(devpriv, intf); - if (ret) { - mutex_unlock(&glb_mutex); - return ret; - } + if (ret) + goto error; ret = vmk80xx_alloc_usb_buffers(devpriv); - if (ret) { - mutex_unlock(&glb_mutex); - return ret; - } + if (ret) + goto error; devpriv->usb = interface_to_usbdev(intf); devpriv->intf = intf; @@ -1416,6 +1416,17 @@ static int vmk80xx_usb_probe(struct usb_interface *intf, comedi_usb_auto_config(intf, &vmk80xx_driver); return 0; + +error: + /* + * Since 'devpriv' points to an element of the static vmb array + * we can't kfree it. Instead memset it to all '0' so subsequent + * usb probes don't find any garbage in it. + */ + memset(devpriv, 0x00, sizeof(*devpriv)); +fail: + mutex_unlock(&glb_mutex); + return ret; } static const struct usb_device_id vmk80xx_usb_id_table[] = {