]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/memstick/core/memstick.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[karo-tx-linux.git] / drivers / memstick / core / memstick.c
index c00fe8253c517970bca643dcd68bb63e7f4d2e98..e9a3eab7b0cf407a0a9fa77cba37b96d2151bc34 100644 (file)
@@ -465,6 +465,7 @@ static void memstick_check(struct work_struct *work)
                if (!host->card) {
                        host->card = card;
                        if (device_register(&card->dev)) {
+                               put_device(&card->dev);
                                kfree(host->card);
                                host->card = NULL;
                        }
@@ -510,14 +511,18 @@ int memstick_add_host(struct memstick_host *host)
 {
        int rc;
 
-       if (!idr_pre_get(&memstick_host_idr, GFP_KERNEL))
-               return -ENOMEM;
+       while (1) {
+               if (!idr_pre_get(&memstick_host_idr, GFP_KERNEL))
+                       return -ENOMEM;
 
-       spin_lock(&memstick_host_lock);
-       rc = idr_get_new(&memstick_host_idr, host, &host->id);
-       spin_unlock(&memstick_host_lock);
-       if (rc)
-               return rc;
+               spin_lock(&memstick_host_lock);
+               rc = idr_get_new(&memstick_host_idr, host, &host->id);
+               spin_unlock(&memstick_host_lock);
+               if (!rc)
+                       break;
+               else if (rc != -EAGAIN)
+                       return rc;
+       }
 
        dev_set_name(&host->dev, "memstick%u", host->id);