btrfs: fix race between quota disable and quota assign ioctls
[platform/kernel/linux-rpi.git] / drivers / ata / libata-transport.c
index 34bb460..60f22e1 100644 (file)
@@ -196,7 +196,7 @@ static struct {
        { XFER_PIO_0,                   "XFER_PIO_0" },
        { XFER_PIO_SLOW,                "XFER_PIO_SLOW" }
 };
-ata_bitfield_name_match(xfer,ata_xfer_names)
+ata_bitfield_name_search(xfer, ata_xfer_names)
 
 /*
  * ATA Port attributes
@@ -301,7 +301,9 @@ int ata_tport_add(struct device *parent,
        pm_runtime_enable(dev);
        pm_runtime_forbid(dev);
 
-       transport_add_device(dev);
+       error = transport_add_device(dev);
+       if (error)
+               goto tport_transport_add_err;
        transport_configure_device(dev);
 
        error = ata_tlink_add(&ap->link);
@@ -312,12 +314,12 @@ int ata_tport_add(struct device *parent,
 
  tport_link_err:
        transport_remove_device(dev);
+ tport_transport_add_err:
        device_del(dev);
 
  tport_err:
        transport_destroy_device(dev);
        put_device(dev);
-       ata_host_put(ap->host);
        return error;
 }
 
@@ -426,7 +428,9 @@ int ata_tlink_add(struct ata_link *link)
                goto tlink_err;
        }
 
-       transport_add_device(dev);
+       error = transport_add_device(dev);
+       if (error)
+               goto tlink_transport_err;
        transport_configure_device(dev);
 
        ata_for_each_dev(ata_dev, link, ALL) {
@@ -441,6 +445,7 @@ int ata_tlink_add(struct ata_link *link)
                ata_tdev_delete(ata_dev);
        }
        transport_remove_device(dev);
+  tlink_transport_err:
        device_del(dev);
   tlink_err:
        transport_destroy_device(dev);
@@ -678,7 +683,13 @@ static int ata_tdev_add(struct ata_device *ata_dev)
                return error;
        }
 
-       transport_add_device(dev);
+       error = transport_add_device(dev);
+       if (error) {
+               device_del(dev);
+               ata_tdev_free(ata_dev);
+               return error;
+       }
+
        transport_configure_device(dev);
        return 0;
 }