Commit 47e1ec70 authored by Artem Bityutskiy's avatar Artem Bityutskiy

UBI: move and rename attach_by_scanning

Rename the 'attach_by_scanning()' function to 'ubi_attach()' and move it to
scan.c. Richard will plug his fastmap stuff there.
Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
parent 41e0cd9d
...@@ -550,10 +550,10 @@ static void uif_close(struct ubi_device *ubi) ...@@ -550,10 +550,10 @@ static void uif_close(struct ubi_device *ubi)
} }
/** /**
* free_internal_volumes - free internal volumes. * ubi_free_internal_volumes - free internal volumes.
* @ubi: UBI device description object * @ubi: UBI device description object
*/ */
static void free_internal_volumes(struct ubi_device *ubi) void ubi_free_internal_volumes(struct ubi_device *ubi)
{ {
int i; int i;
...@@ -564,59 +564,6 @@ static void free_internal_volumes(struct ubi_device *ubi) ...@@ -564,59 +564,6 @@ static void free_internal_volumes(struct ubi_device *ubi)
} }
} }
/**
* attach_by_scanning - attach an MTD device using scanning method.
* @ubi: UBI device descriptor
*
* This function returns zero in case of success and a negative error code in
* case of failure.
*
* Note, currently this is the only method to attach UBI devices. Hopefully in
* the future we'll have more scalable attaching methods and avoid full media
* scanning. But even in this case scanning will be needed as a fall-back
* attaching method if there are some on-flash table corruptions.
*/
static int attach_by_scanning(struct ubi_device *ubi)
{
int err;
struct ubi_attach_info *ai;
ai = ubi_scan(ubi);
if (IS_ERR(ai))
return PTR_ERR(ai);
ubi->bad_peb_count = ai->bad_peb_count;
ubi->good_peb_count = ubi->peb_count - ubi->bad_peb_count;
ubi->corr_peb_count = ai->corr_peb_count;
ubi->max_ec = ai->max_ec;
ubi->mean_ec = ai->mean_ec;
ubi_msg("max. sequence number: %llu", ai->max_sqnum);
err = ubi_read_volume_table(ubi, ai);
if (err)
goto out_ai;
err = ubi_wl_init(ubi, ai);
if (err)
goto out_vtbl;
err = ubi_eba_init(ubi, ai);
if (err)
goto out_wl;
ubi_destroy_ai(ai);
return 0;
out_wl:
ubi_wl_close(ubi);
out_vtbl:
free_internal_volumes(ubi);
vfree(ubi->vtbl);
out_ai:
ubi_destroy_ai(ai);
return err;
}
/** /**
* io_init - initialize I/O sub-system for a given UBI device. * io_init - initialize I/O sub-system for a given UBI device.
* @ubi: UBI device description object * @ubi: UBI device description object
...@@ -949,9 +896,9 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset) ...@@ -949,9 +896,9 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
if (err) if (err)
goto out_free; goto out_free;
err = attach_by_scanning(ubi); err = ubi_attach(ubi);
if (err) { if (err) {
ubi_err("failed to attach by scanning, error %d", err); ubi_err("failed to attach mtd%d, error %d", mtd->index, err);
goto out_debugging; goto out_debugging;
} }
...@@ -1016,7 +963,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset) ...@@ -1016,7 +963,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)
uif_close(ubi); uif_close(ubi);
out_detach: out_detach:
ubi_wl_close(ubi); ubi_wl_close(ubi);
free_internal_volumes(ubi); ubi_free_internal_volumes(ubi);
vfree(ubi->vtbl); vfree(ubi->vtbl);
out_debugging: out_debugging:
ubi_debugging_exit_dev(ubi); ubi_debugging_exit_dev(ubi);
...@@ -1088,7 +1035,7 @@ int ubi_detach_mtd_dev(int ubi_num, int anyway) ...@@ -1088,7 +1035,7 @@ int ubi_detach_mtd_dev(int ubi_num, int anyway)
ubi_debugfs_exit_dev(ubi); ubi_debugfs_exit_dev(ubi);
uif_close(ubi); uif_close(ubi);
ubi_wl_close(ubi); ubi_wl_close(ubi);
free_internal_volumes(ubi); ubi_free_internal_volumes(ubi);
vfree(ubi->vtbl); vfree(ubi->vtbl);
put_mtd_device(ubi->mtd); put_mtd_device(ubi->mtd);
ubi_debugging_exit_dev(ubi); ubi_debugging_exit_dev(ubi);
......
...@@ -1107,14 +1107,14 @@ static int late_analysis(struct ubi_device *ubi, struct ubi_attach_info *ai) ...@@ -1107,14 +1107,14 @@ static int late_analysis(struct ubi_device *ubi, struct ubi_attach_info *ai)
} }
/** /**
* ubi_scan - scan an MTD device. * scan_all - scan entire MTD device.
* @ubi: UBI device description object * @ubi: UBI device description object
* *
* This function does full scanning of an MTD device and returns complete * This function does full scanning of an MTD device and returns complete
* information about it in form of a "struct ubi_attach_info" object. In case * information about it in form of a "struct ubi_attach_info" object. In case
* of failure, an error code is returned. * of failure, an error code is returned.
*/ */
struct ubi_attach_info *ubi_scan(struct ubi_device *ubi) static struct ubi_attach_info *scan_all(struct ubi_device *ubi)
{ {
int err, pnum; int err, pnum;
struct rb_node *rb1, *rb2; struct rb_node *rb1, *rb2;
...@@ -1207,6 +1207,54 @@ struct ubi_attach_info *ubi_scan(struct ubi_device *ubi) ...@@ -1207,6 +1207,54 @@ struct ubi_attach_info *ubi_scan(struct ubi_device *ubi)
return ERR_PTR(err); return ERR_PTR(err);
} }
/**
* ubi_attach - attach an MTD device.
* @ubi: UBI device descriptor
*
* This function returns zero in case of success and a negative error code in
* case of failure.
*/
int ubi_attach(struct ubi_device *ubi)
{
int err;
struct ubi_attach_info *ai;
ai = scan_all(ubi);
if (IS_ERR(ai))
return PTR_ERR(ai);
ubi->bad_peb_count = ai->bad_peb_count;
ubi->good_peb_count = ubi->peb_count - ubi->bad_peb_count;
ubi->corr_peb_count = ai->corr_peb_count;
ubi->max_ec = ai->max_ec;
ubi->mean_ec = ai->mean_ec;
ubi_msg("max. sequence number: %llu", ai->max_sqnum);
err = ubi_read_volume_table(ubi, ai);
if (err)
goto out_ai;
err = ubi_wl_init(ubi, ai);
if (err)
goto out_vtbl;
err = ubi_eba_init(ubi, ai);
if (err)
goto out_wl;
ubi_destroy_ai(ai);
return 0;
out_wl:
ubi_wl_close(ubi);
out_vtbl:
ubi_free_internal_volumes(ubi);
vfree(ubi->vtbl);
out_ai:
ubi_destroy_ai(ai);
return err;
}
/** /**
* destroy_av - free volume attaching information. * destroy_av - free volume attaching information.
* @av: volume attaching information * @av: volume attaching information
......
...@@ -164,7 +164,7 @@ struct ubi_ainf_volume *ubi_find_av(const struct ubi_attach_info *ai, ...@@ -164,7 +164,7 @@ struct ubi_ainf_volume *ubi_find_av(const struct ubi_attach_info *ai,
void ubi_remove_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av); void ubi_remove_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av);
struct ubi_ainf_peb *ubi_early_get_peb(struct ubi_device *ubi, struct ubi_ainf_peb *ubi_early_get_peb(struct ubi_device *ubi,
struct ubi_attach_info *ai); struct ubi_attach_info *ai);
struct ubi_attach_info *ubi_scan(struct ubi_device *ubi); int ubi_attach(struct ubi_device *ubi);
void ubi_destroy_ai(struct ubi_attach_info *ai); void ubi_destroy_ai(struct ubi_attach_info *ai);
#endif /* !__UBI_SCAN_H__ */ #endif /* !__UBI_SCAN_H__ */
...@@ -569,6 +569,7 @@ int ubi_volume_notify(struct ubi_device *ubi, struct ubi_volume *vol, ...@@ -569,6 +569,7 @@ int ubi_volume_notify(struct ubi_device *ubi, struct ubi_volume *vol,
int ubi_notify_all(struct ubi_device *ubi, int ntype, int ubi_notify_all(struct ubi_device *ubi, int ntype,
struct notifier_block *nb); struct notifier_block *nb);
int ubi_enumerate_volumes(struct notifier_block *nb); int ubi_enumerate_volumes(struct notifier_block *nb);
void ubi_free_internal_volumes(struct ubi_device *ubi);
/* kapi.c */ /* kapi.c */
void ubi_do_get_device_info(struct ubi_device *ubi, struct ubi_device_info *di); void ubi_do_get_device_info(struct ubi_device *ubi, struct ubi_device_info *di);
......
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