+ return true;
+}
+
+/**
+ * Initialize and mount disk described by
+ * \a disk.
+ * \return false on errors, true otherwise.
+ */
+bool battfs_init(struct BattFsSuper *disk)
+{
+ pgoff_t filelen_table[BATTFS_MAX_FILES];
+
+ /* Sanity check */
+ ASSERT(disk->open);
+
+ /* Init disk device */
+ if (!disk->open(disk))
+ {
+ TRACEMSG("open error\n");
+ return false;
+ }
+
+ /* Disk open must set all of these */
+ ASSERT(disk->read);
+ ASSERT(disk->write);
+ ASSERT(disk->erase);
+ ASSERT(disk->close);
+ ASSERT(disk->page_size);
+ ASSERT(disk->page_count);
+ ASSERT(disk->page_count < PAGE_UNSET_SENTINEL - 1);
+ ASSERT(disk->page_array);
+
+ memset(filelen_table, 0, BATTFS_MAX_FILES * sizeof(pgoff_t));
+
+ disk->free_bytes = 0;
+ disk->disk_size = (disk_size_t)(disk->page_size - BATTFS_HEADER_LEN) * disk->page_count;
+
+ /* Count pages per file */
+ if (!countDiskFilePages(disk, filelen_table))
+ {
+ TRACEMSG("error counting file pages\n");
+ return false;
+ }
+
+ /* Once here, we have filelen_table filled with file lengths */
+
+ /* Fill page array with sentinel */
+ for (pgcnt_t page = 0; page < disk->page_count; page++)
+ disk->page_array[page] = PAGE_UNSET_SENTINEL;
+
+ /* Fill page allocation array using filelen_table */
+ if (!fillPageArray(disk, filelen_table))
+ {
+ TRACEMSG("error filling page array\n");
+ return false;
+ }