uas: Properly set interface to altsetting 0 on probe failure
authorHans de Goede <hdegoede@redhat.com>
Thu, 17 Oct 2013 17:00:45 +0000 (19:00 +0200)
committerSarah Sharp <sarah.a.sharp@linux.intel.com>
Tue, 4 Mar 2014 23:38:07 +0000 (15:38 -0800)
- Rename labels to properly reflect this
- Don't skip free-ing the streams when scsi_init_shared_tag_map fails

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
drivers/usb/storage/uas.c

index 059ce62de4b09108ec0020c668a009dfdb3c8cb2..ec1b22d295019f22bb24d6d9d18289452fee3033 100644 (file)
@@ -993,8 +993,8 @@ static void uas_free_streams(struct uas_dev_info *devinfo)
  */
 static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
-       int result;
-       struct Scsi_Host *shost;
+       int result = -ENOMEM;
+       struct Scsi_Host *shost = NULL;
        struct uas_dev_info *devinfo;
        struct usb_device *udev = interface_to_usbdev(intf);
 
@@ -1003,12 +1003,11 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
 
        devinfo = kmalloc(sizeof(struct uas_dev_info), GFP_KERNEL);
        if (!devinfo)
-               return -ENOMEM;
+               goto set_alt0;
 
-       result = -ENOMEM;
        shost = scsi_host_alloc(&uas_host_template, sizeof(void *));
        if (!shost)
-               goto free;
+               goto set_alt0;
 
        shost->max_cmd_len = 16 + 252;
        shost->max_id = 1;
@@ -1030,11 +1029,11 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
 
        result = scsi_init_shared_tag_map(shost, devinfo->qdepth - 3);
        if (result)
-               goto free;
+               goto free_streams;
 
        result = scsi_add_host(shost, &intf->dev);
        if (result)
-               goto deconfig_eps;
+               goto free_streams;
 
        shost->hostdata[0] = (unsigned long)devinfo;
 
@@ -1042,9 +1041,10 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
        usb_set_intfdata(intf, shost);
        return result;
 
-deconfig_eps:
+free_streams:
        uas_free_streams(devinfo);
- free:
+set_alt0:
+       usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0);
        kfree(devinfo);
        if (shost)
                scsi_host_put(shost);