UBI: simplify error handling

If we fail halfway through sysfs file creation, we may just call
sysfs remove function and it will delete all the files we created.
For non-existing files it will also be OK - the remove functions
just return -ENOENT.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
Artem Bityutskiy 2007-12-17 15:48:49 +02:00
parent 35ad5fb76c
commit db6e5770ef
1 changed files with 12 additions and 40 deletions

View File

@ -159,64 +159,36 @@ static int ubi_sysfs_init(struct ubi_device *ubi)
sprintf(&ubi->dev.bus_id[0], UBI_NAME_STR"%d", ubi->ubi_num);
err = device_register(&ubi->dev);
if (err)
goto out;
return err;
err = device_create_file(&ubi->dev, &dev_eraseblock_size);
if (err)
goto out_unregister;
return err;
err = device_create_file(&ubi->dev, &dev_avail_eraseblocks);
if (err)
goto out_eraseblock_size;
return err;
err = device_create_file(&ubi->dev, &dev_total_eraseblocks);
if (err)
goto out_avail_eraseblocks;
return err;
err = device_create_file(&ubi->dev, &dev_volumes_count);
if (err)
goto out_total_eraseblocks;
return err;
err = device_create_file(&ubi->dev, &dev_max_ec);
if (err)
goto out_volumes_count;
return err;
err = device_create_file(&ubi->dev, &dev_reserved_for_bad);
if (err)
goto out_volumes_max_ec;
return err;
err = device_create_file(&ubi->dev, &dev_bad_peb_count);
if (err)
goto out_reserved_for_bad;
return err;
err = device_create_file(&ubi->dev, &dev_max_vol_count);
if (err)
goto out_bad_peb_count;
return err;
err = device_create_file(&ubi->dev, &dev_min_io_size);
if (err)
goto out_max_vol_count;
return err;
err = device_create_file(&ubi->dev, &dev_bgt_enabled);
if (err)
goto out_min_io_size;
return 0;
out_min_io_size:
device_remove_file(&ubi->dev, &dev_min_io_size);
out_max_vol_count:
device_remove_file(&ubi->dev, &dev_max_vol_count);
out_bad_peb_count:
device_remove_file(&ubi->dev, &dev_bad_peb_count);
out_reserved_for_bad:
device_remove_file(&ubi->dev, &dev_reserved_for_bad);
out_volumes_max_ec:
device_remove_file(&ubi->dev, &dev_max_ec);
out_volumes_count:
device_remove_file(&ubi->dev, &dev_volumes_count);
out_total_eraseblocks:
device_remove_file(&ubi->dev, &dev_total_eraseblocks);
out_avail_eraseblocks:
device_remove_file(&ubi->dev, &dev_avail_eraseblocks);
out_eraseblock_size:
device_remove_file(&ubi->dev, &dev_eraseblock_size);
out_unregister:
device_unregister(&ubi->dev);
out:
ubi_err("failed to initialize sysfs for %s, error %d",
ubi->ubi_name, err);
return err;
}
@ -296,7 +268,7 @@ static int uif_init(struct ubi_device *ubi)
err = ubi_sysfs_init(ubi);
if (err)
goto out_cdev;
goto out_sysfs;
for (i = 0; i < ubi->vtbl_slots; i++)
if (ubi->volumes[i]) {
@ -311,8 +283,8 @@ static int uif_init(struct ubi_device *ubi)
out_volumes:
kill_volumes(ubi);
out_sysfs:
ubi_sysfs_close(ubi);
out_cdev:
cdev_del(&ubi->cdev);
out_unreg:
unregister_chrdev_region(ubi->cdev.dev, ubi->vtbl_slots + 1);