[PATCH] PNP: handle sysfs errors
Jeff Garzik [Thu, 7 Dec 2006 04:35:33 +0000 (20:35 -0800)]
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Cc: Adam Belay <ambx1@neo.rr.com>
Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

drivers/pnp/card.c
drivers/pnp/interface.c

index 227600c..91c047a 100644 (file)
@@ -164,9 +164,17 @@ static DEVICE_ATTR(card_id,S_IRUGO,pnp_show_card_ids,NULL);
 
 static int pnp_interface_attach_card(struct pnp_card *card)
 {
-       device_create_file(&card->dev,&dev_attr_name);
-       device_create_file(&card->dev,&dev_attr_card_id);
+       int rc = device_create_file(&card->dev,&dev_attr_name);
+       if (rc) return rc;
+
+       rc = device_create_file(&card->dev,&dev_attr_card_id);
+       if (rc) goto err_name;
+
        return 0;
+
+err_name:
+       device_remove_file(&card->dev,&dev_attr_name);
+       return rc;
 }
 
 /**
@@ -306,16 +314,20 @@ found:
        down_write(&dev->dev.bus->subsys.rwsem);
        dev->card_link = clink;
        dev->dev.driver = &drv->link.driver;
-       if (pnp_bus_type.probe(&dev->dev)) {
-               dev->dev.driver = NULL;
-               dev->card_link = NULL;
-               up_write(&dev->dev.bus->subsys.rwsem);
-               return NULL;
-       }
-       device_bind_driver(&dev->dev);
+       if (pnp_bus_type.probe(&dev->dev))
+               goto err_out;
+       if (device_bind_driver(&dev->dev))
+               goto err_out;
+
        up_write(&dev->dev.bus->subsys.rwsem);
 
        return dev;
+
+err_out:
+       dev->dev.driver = NULL;
+       dev->card_link = NULL;
+       up_write(&dev->dev.bus->subsys.rwsem);
+       return NULL;
 }
 
 /**
index 9d8b415..ac9fcd4 100644 (file)
@@ -461,8 +461,19 @@ static DEVICE_ATTR(id,S_IRUGO,pnp_show_current_ids,NULL);
 
 int pnp_interface_attach_device(struct pnp_dev *dev)
 {
-       device_create_file(&dev->dev,&dev_attr_options);
-       device_create_file(&dev->dev,&dev_attr_resources);
-       device_create_file(&dev->dev,&dev_attr_id);
+       int rc = device_create_file(&dev->dev,&dev_attr_options);
+       if (rc) goto err;
+       rc = device_create_file(&dev->dev,&dev_attr_resources);
+       if (rc) goto err_opt;
+       rc = device_create_file(&dev->dev,&dev_attr_id);
+       if (rc) goto err_res;
+
        return 0;
+
+err_res:
+       device_remove_file(&dev->dev,&dev_attr_resources);
+err_opt:
+       device_remove_file(&dev->dev,&dev_attr_options);
+err:
+       return rc;
 }