/** * Reads the specified area from disk and loads its contents into the RAM * representation. * * @param area_idx The index of the area to read. * * @return 0 on success; nonzero on failure. */ static int nffs_restore_area_contents(int area_idx) { struct nffs_disk_object disk_object; struct nffs_area *area; int rc; area = nffs_areas + area_idx; area->na_cur = sizeof (struct nffs_disk_area); while (1) { rc = nffs_restore_disk_object(area_idx, area->na_cur, &disk_object); switch (rc) { case 0: /* Valid object; restore it into the RAM representation. */ nffs_restore_object(&disk_object); area->na_cur += nffs_restore_disk_object_size(&disk_object); break; case FS_ECORRUPT: /* Invalid object; keep scanning for a valid magic number. */ area->na_cur++; break; case FS_EEMPTY: case FS_ERANGE: /* End of disk encountered; area fully restored. */ return 0; default: return rc; } } }
/** * Reads the specified area from disk and loads its contents into the RAM * representation. * * @param area_idx The index of the area to read. * * @return 0 on success; nonzero on failure. */ static int nffs_restore_area_contents(int area_idx) { struct nffs_disk_object disk_object; struct nffs_area *area; int rc; area = nffs_areas + area_idx; area->na_cur = sizeof (struct nffs_disk_area); while (1) { rc = nffs_restore_disk_object(area_idx, area->na_cur, &disk_object); switch (rc) { case 0: /* Valid object; restore it into the RAM representation. */ rc = nffs_restore_object(&disk_object); /* * If the restore fails the CRC check, the object length field * can't be trusted so just start looking for the next valid * object in the flash area. * XXX Deal with file system corruption */ if (rc == FS_ECORRUPT) { area->na_cur++; } else { STATS_INC(nffs_stats, nffs_object_count); /* restored objects */ area->na_cur += nffs_restore_disk_object_size(&disk_object); } break; case FS_ECORRUPT: /* * Invalid object; keep scanning for a valid object ID and CRC * Can nffs_restore_disk_object return FS_ECORRUPT? XXX */ area->na_cur++; break; case FS_EEMPTY: case FS_EOFFSET: /* End of disk encountered; area fully restored. */ return 0; default: return rc; } } }