Merge branch 'master' into for_paulus
[linux-drm-fsl-dcu.git] / drivers / s390 / char / tape_class.c
index b3569c82bb16a2f7716147ca307ea1449b60db70..2e0d29730b67590639f8e0dba84b48ae90ebd5b5 100644 (file)
@@ -36,7 +36,7 @@ static struct class *tape_class;
 struct tape_class_device *register_tape_dev(
        struct device *         device,
        dev_t                   dev,
-       struct file_operations *fops,
+       const struct file_operations *fops,
        char *                  device_name,
        char *                  mode_name)
 {
@@ -44,11 +44,10 @@ struct tape_class_device *register_tape_dev(
        int             rc;
        char *          s;
 
-       tcd = kmalloc(sizeof(struct tape_class_device), GFP_KERNEL);
+       tcd = kzalloc(sizeof(struct tape_class_device), GFP_KERNEL);
        if (!tcd)
                return ERR_PTR(-ENOMEM);
 
-       memset(tcd, 0, sizeof(struct tape_class_device));
        strncpy(tcd->device_name, device_name, TAPECLASS_NAME_LEN);
        for (s = strchr(tcd->device_name, '/'); s; s = strchr(s, '/'))
                *s = '!';
@@ -77,14 +76,22 @@ struct tape_class_device *register_tape_dev(
                                device,
                                "%s", tcd->device_name
                        );
-       sysfs_create_link(
+       rc = IS_ERR(tcd->class_device) ? PTR_ERR(tcd->class_device) : 0;
+       if (rc)
+               goto fail_with_cdev;
+       rc = sysfs_create_link(
                &device->kobj,
                &tcd->class_device->kobj,
                tcd->mode_name
        );
+       if (rc)
+               goto fail_with_class_device;
 
        return tcd;
 
+fail_with_class_device:
+       class_device_destroy(tape_class, tcd->char_device->dev);
+
 fail_with_cdev:
        cdev_del(tcd->char_device);