err = blktap_device_pause(tap);
if (!err) {
device_remove_file(dev, &dev_attr_pause);
- device_create_file(dev, &dev_attr_resume);
+ err = device_create_file(dev, &dev_attr_resume);
}
out:
err = blktap_device_resume(tap);
if (!err) {
device_remove_file(dev, &dev_attr_resume);
- device_create_file(dev, &dev_attr_pause);
+ err = device_create_file(dev, &dev_attr_pause);
}
out:
{
struct blktap_ring *ring;
struct device *dev;
+ int err;
if (!class)
return -ENODEV;
if (IS_ERR(dev))
return PTR_ERR(dev);
- ring->dev = dev;
+ ring->dev = dev;
dev_set_drvdata(dev, tap);
mutex_init(&ring->sysfs_mutex);
atomic_set(&ring->sysfs_refcnt, 0);
- device_create_file(dev, &dev_attr_name);
- device_create_file(dev, &dev_attr_remove);
- device_create_file(dev, &dev_attr_pause);
- device_create_file(dev, &dev_attr_debug);
+ err = device_create_file(dev, &dev_attr_name);
+ if (err)
+ goto out;
+ err = device_create_file(dev, &dev_attr_remove);
+ if (err)
+ goto out_unregister_name;
+ err = device_create_file(dev, &dev_attr_pause);
+ if (err)
+ goto out_unregister_remove;
+ err = device_create_file(dev, &dev_attr_debug);
+ if (err)
+ goto out_unregister_pause;
return 0;
+
+out_unregister_pause:
+ device_remove_file(dev, &dev_attr_pause);
+out_unregister_remove:
+ device_remove_file(dev, &dev_attr_remove);
+out_unregister_name:
+ device_remove_file(dev, &dev_attr_name);
+out:
+ return err;
}
int
!atomic_read(&tap->ring.sysfs_refcnt)))
return -EAGAIN;
- /* XXX: is it safe to remove the class from a sysfs attribute? */
- device_remove_file(dev, &dev_attr_name);
- device_remove_file(dev, &dev_attr_remove);
- device_remove_file(dev, &dev_attr_pause);
- device_remove_file(dev, &dev_attr_resume);
- device_remove_file(dev, &dev_attr_debug);
- device_destroy(class, ring->devno);
+ device_schedule_callback(dev, device_unregister);
clear_bit(BLKTAP_SYSFS, &tap->dev_inuse);
blktap_sysfs_init(void)
{
struct class *cls;
+ int err;
if (class)
return -EEXIST;
if (IS_ERR(cls))
return PTR_ERR(cls);
- class_create_file(cls, &class_attr_verbosity);
- class_create_file(cls, &class_attr_devices);
+ err = class_create_file(cls, &class_attr_verbosity);
+ if (err)
+ goto out_unregister;
+ err = class_create_file(cls, &class_attr_devices);
+ if (err)
+ goto out_unregister;
class = cls;
return 0;
+out_unregister:
+ class_destroy(cls);
+ return err;
}