Commit 5e59393e authored by Jeff Garzik's avatar Jeff Garzik Committed by Linus Torvalds

[PATCH] ipmi: handle sysfs errors

Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
Acked-by: default avatarCorey Minyard <cminyard@acm.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 41bfcfd9
...@@ -1928,13 +1928,8 @@ static ssize_t guid_show(struct device *dev, struct device_attribute *attr, ...@@ -1928,13 +1928,8 @@ static ssize_t guid_show(struct device *dev, struct device_attribute *attr,
(long long) bmc->guid[8]); (long long) bmc->guid[8]);
} }
static void static void remove_files(struct bmc_device *bmc)
cleanup_bmc_device(struct kref *ref)
{ {
struct bmc_device *bmc;
bmc = container_of(ref, struct bmc_device, refcount);
device_remove_file(&bmc->dev->dev, device_remove_file(&bmc->dev->dev,
&bmc->device_id_attr); &bmc->device_id_attr);
device_remove_file(&bmc->dev->dev, device_remove_file(&bmc->dev->dev,
...@@ -1951,12 +1946,23 @@ cleanup_bmc_device(struct kref *ref) ...@@ -1951,12 +1946,23 @@ cleanup_bmc_device(struct kref *ref)
&bmc->manufacturer_id_attr); &bmc->manufacturer_id_attr);
device_remove_file(&bmc->dev->dev, device_remove_file(&bmc->dev->dev,
&bmc->product_id_attr); &bmc->product_id_attr);
if (bmc->id.aux_firmware_revision_set) if (bmc->id.aux_firmware_revision_set)
device_remove_file(&bmc->dev->dev, device_remove_file(&bmc->dev->dev,
&bmc->aux_firmware_rev_attr); &bmc->aux_firmware_rev_attr);
if (bmc->guid_set) if (bmc->guid_set)
device_remove_file(&bmc->dev->dev, device_remove_file(&bmc->dev->dev,
&bmc->guid_attr); &bmc->guid_attr);
}
static void
cleanup_bmc_device(struct kref *ref)
{
struct bmc_device *bmc;
bmc = container_of(ref, struct bmc_device, refcount);
remove_files(bmc);
platform_device_unregister(bmc->dev); platform_device_unregister(bmc->dev);
kfree(bmc); kfree(bmc);
} }
...@@ -1977,6 +1983,79 @@ static void ipmi_bmc_unregister(ipmi_smi_t intf) ...@@ -1977,6 +1983,79 @@ static void ipmi_bmc_unregister(ipmi_smi_t intf)
mutex_unlock(&ipmidriver_mutex); mutex_unlock(&ipmidriver_mutex);
} }
static int create_files(struct bmc_device *bmc)
{
int err;
err = device_create_file(&bmc->dev->dev,
&bmc->device_id_attr);
if (err) goto out;
err = device_create_file(&bmc->dev->dev,
&bmc->provides_dev_sdrs_attr);
if (err) goto out_devid;
err = device_create_file(&bmc->dev->dev,
&bmc->revision_attr);
if (err) goto out_sdrs;
err = device_create_file(&bmc->dev->dev,
&bmc->firmware_rev_attr);
if (err) goto out_rev;
err = device_create_file(&bmc->dev->dev,
&bmc->version_attr);
if (err) goto out_firm;
err = device_create_file(&bmc->dev->dev,
&bmc->add_dev_support_attr);
if (err) goto out_version;
err = device_create_file(&bmc->dev->dev,
&bmc->manufacturer_id_attr);
if (err) goto out_add_dev;
err = device_create_file(&bmc->dev->dev,
&bmc->product_id_attr);
if (err) goto out_manu;
if (bmc->id.aux_firmware_revision_set) {
err = device_create_file(&bmc->dev->dev,
&bmc->aux_firmware_rev_attr);
if (err) goto out_prod_id;
}
if (bmc->guid_set) {
err = device_create_file(&bmc->dev->dev,
&bmc->guid_attr);
if (err) goto out_aux_firm;
}
return 0;
out_aux_firm:
if (bmc->id.aux_firmware_revision_set)
device_remove_file(&bmc->dev->dev,
&bmc->aux_firmware_rev_attr);
out_prod_id:
device_remove_file(&bmc->dev->dev,
&bmc->product_id_attr);
out_manu:
device_remove_file(&bmc->dev->dev,
&bmc->manufacturer_id_attr);
out_add_dev:
device_remove_file(&bmc->dev->dev,
&bmc->add_dev_support_attr);
out_version:
device_remove_file(&bmc->dev->dev,
&bmc->version_attr);
out_firm:
device_remove_file(&bmc->dev->dev,
&bmc->firmware_rev_attr);
out_rev:
device_remove_file(&bmc->dev->dev,
&bmc->revision_attr);
out_sdrs:
device_remove_file(&bmc->dev->dev,
&bmc->provides_dev_sdrs_attr);
out_devid:
device_remove_file(&bmc->dev->dev,
&bmc->device_id_attr);
out:
return err;
}
static int ipmi_bmc_register(ipmi_smi_t intf) static int ipmi_bmc_register(ipmi_smi_t intf)
{ {
int rv; int rv;
...@@ -2051,7 +2130,6 @@ static int ipmi_bmc_register(ipmi_smi_t intf) ...@@ -2051,7 +2130,6 @@ static int ipmi_bmc_register(ipmi_smi_t intf)
bmc->provides_dev_sdrs_attr.attr.mode = S_IRUGO; bmc->provides_dev_sdrs_attr.attr.mode = S_IRUGO;
bmc->provides_dev_sdrs_attr.show = provides_dev_sdrs_show; bmc->provides_dev_sdrs_attr.show = provides_dev_sdrs_show;
bmc->revision_attr.attr.name = "revision"; bmc->revision_attr.attr.name = "revision";
bmc->revision_attr.attr.owner = THIS_MODULE; bmc->revision_attr.attr.owner = THIS_MODULE;
bmc->revision_attr.attr.mode = S_IRUGO; bmc->revision_attr.attr.mode = S_IRUGO;
...@@ -2093,28 +2171,14 @@ static int ipmi_bmc_register(ipmi_smi_t intf) ...@@ -2093,28 +2171,14 @@ static int ipmi_bmc_register(ipmi_smi_t intf)
bmc->aux_firmware_rev_attr.attr.mode = S_IRUGO; bmc->aux_firmware_rev_attr.attr.mode = S_IRUGO;
bmc->aux_firmware_rev_attr.show = aux_firmware_rev_show; bmc->aux_firmware_rev_attr.show = aux_firmware_rev_show;
device_create_file(&bmc->dev->dev, rv = create_files(bmc);
&bmc->device_id_attr); if (rv) {
device_create_file(&bmc->dev->dev, mutex_lock(&ipmidriver_mutex);
&bmc->provides_dev_sdrs_attr); platform_device_unregister(bmc->dev);
device_create_file(&bmc->dev->dev, mutex_unlock(&ipmidriver_mutex);
&bmc->revision_attr);
device_create_file(&bmc->dev->dev, return rv;
&bmc->firmware_rev_attr); }
device_create_file(&bmc->dev->dev,
&bmc->version_attr);
device_create_file(&bmc->dev->dev,
&bmc->add_dev_support_attr);
device_create_file(&bmc->dev->dev,
&bmc->manufacturer_id_attr);
device_create_file(&bmc->dev->dev,
&bmc->product_id_attr);
if (bmc->id.aux_firmware_revision_set)
device_create_file(&bmc->dev->dev,
&bmc->aux_firmware_rev_attr);
if (bmc->guid_set)
device_create_file(&bmc->dev->dev,
&bmc->guid_attr);
printk(KERN_INFO printk(KERN_INFO
"ipmi: Found new BMC (man_id: 0x%6.6x, " "ipmi: Found new BMC (man_id: 0x%6.6x, "
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment