/** * uif_init - initialize user interfaces for an UBI device. * @ubi: UBI device description object * @ref: set to %1 on exit in case of failure if a reference to @ubi->dev was * taken, otherwise set to %0 * * This function initializes various user interfaces for an UBI device. If the * initialization fails at an early stage, this function frees all the * resources it allocated, returns an error, and @ref is set to %0. However, * if the initialization fails after the UBI device was registered in the * driver core subsystem, this function takes a reference to @ubi->dev, because * otherwise the release function ('dev_release()') would free whole @ubi * object. The @ref argument is set to %1 in this case. The caller has to put * this reference. * * This function returns zero in case of success and a negative error code in * case of failure. */ static int uif_init(struct ubi_device *ubi, int *ref) { int i, err; *ref = 0; sprintf(ubi->ubi_name, UBI_NAME_STR "%d", ubi->ubi_num); err = ubi_cdev_add(ubi); if (err) { ubi_err("cannot add character device"); goto out_unreg; } for (i = 0; i < ubi->vtbl_slots; i++) if (ubi->volumes[i]) { err = ubi_add_volume(ubi, ubi->volumes[i]); if (err) { ubi_err("cannot add volume %d", i); goto out_volumes; } } return 0; out_volumes: kill_volumes(ubi); devfs_remove(&ubi->cdev); out_unreg: ubi_err("cannot initialize UBI %s, error %d", ubi->ubi_name, err); return err; }
/** * uif_init - initialize user interfaces for an UBI device. * @ubi: UBI device description object * @ref: set to %1 on exit in case of failure if a reference to @ubi->dev was * taken, otherwise set to %0 * * This function initializes various user interfaces for an UBI device. If the * initialization fails at an early stage, this function frees all the * resources it allocated, returns an error, and @ref is set to %0. However, * if the initialization fails after the UBI device was registered in the * driver core subsystem, this function takes a reference to @ubi->dev, because * otherwise the release function ('dev_release()') would free whole @ubi * object. The @ref argument is set to %1 in this case. The caller has to put * this reference. * * This function returns zero in case of success and a negative error code in * case of failure. */ static int uif_init(struct ubi_device *ubi, int *ref) { int i, err; *ref = 0; sprintf(ubi->ubi_name, UBI_NAME_STR "%d", ubi->ubi_num); sprintf(ubi->dev.name, "ubi"); ubi->dev.id = DEVICE_ID_DYNAMIC; ubi->dev.parent = &ubi->mtd->class_dev; err = register_device(&ubi->dev); if (err) goto out_unreg; err = ubi_cdev_add(ubi); if (err) { ubi_err("cannot add character device"); goto out_dev; } for (i = 0; i < ubi->vtbl_slots; i++) if (ubi->volumes[i]) { err = ubi_add_volume(ubi, ubi->volumes[i]); if (err) { ubi_err("cannot add volume %d", i); goto out_volumes; } } return 0; out_volumes: kill_volumes(ubi); devfs_remove(&ubi->cdev); out_dev: unregister_device(&ubi->dev); out_unreg: ubi_err("cannot initialize UBI %s, error %d", ubi->ubi_name, err); return err; }