return true;
}
-bool batts_fsck(struct BattFsSuper *disk)
+/**
+ * Check the filesystem.
+ * \return true if ok, false on errors.
+ */
+bool battfs_fsck(struct BattFsSuper *disk)
{
+ #define FSCHECK(cond) do { if(!(cond)) { LOG_ERR("\"" #cond "\"\n"); return false; } } while (0)
+
+ FSCHECK(disk->free_page_start <= disk->page_count);
+ FSCHECK(disk->data_size < disk->page_size);
+ FSCHECK(disk->free_bytes <= disk->disk_size);
+
+ disk_size_t free_bytes = 0;
+ BattFsPageHeader hdr, prev_hdr;
+ inode_t files = 0;
+ pgcnt_t page_used = 0;
+
+ bool start = true;
+
+ for (pgcnt_t page = 0; page < disk->page_count; page++)
+ {
+ FSCHECK(readHdr(disk, disk->page_array[page], &hdr));
+ free_bytes += disk->data_size;
+
+ if (page < disk->free_page_start)
+ {
+ FSCHECK(computeFcs(&hdr) == hdr.fcs);
+ page_used++;
+ free_bytes -= hdr.fill;
+ if (hdr.inode != prev_hdr.inode || start)
+ {
+ if (LIKELY(!start))
+ FSCHECK(hdr.inode > prev_hdr.inode);
+ else
+ start = false;
+ FSCHECK(hdr.pgoff == 0);
+ files++;
+ }
+ else
+ {
+ FSCHECK(hdr.fill != 0);
+ FSCHECK(prev_hdr.fill == disk->data_size);
+ FSCHECK(hdr.pgoff == prev_hdr.pgoff + 1);
+ }
+ prev_hdr = hdr;
+ }
+ }
+
+ FSCHECK(page_used == disk->free_page_start);
+ FSCHECK(free_bytes == disk->free_bytes);
+
+ return true;
}
/**
static bool getNewPage(struct BattFsSuper *disk, pgcnt_t new_pos, inode_t inode, pgoff_t pgoff, BattFsPageHeader *new_hdr)
{
- if (disk->free_page_start >= disk->page_count)
+ if (SPACE_OVER(disk))
{
#warning TODO space over!
- LOG_INFO("No disk space available\n");
+ LOG_ERR("No disk space available!\n");
return false;
}
flushBuffer(disk);
/* Handle cache load of a new page*/
else if (fdb->start[pg_offset] != fdb->disk->curr_page)
{
+ if (SPACE_OVER(fdb->disk))
+ {
+ LOG_ERR("No disk space available!\n");
+ return total_write;
+ }
LOG_INFO("Re-writing page %d to %d\n", fdb->start[pg_offset], fdb->disk->page_array[fdb->disk->free_page_start]);
if (!loadPage(fdb->disk, fdb->start[pg_offset], &curr_hdr))
{
curr_hdr.seq++;
}
-
//LOG_INFO("writing to buffer for page %d, offset %d, size %d\n", fdb->disk->curr_page, addr_offset, wr_len);
if (fdb->disk->bufferWrite(fdb->disk, addr_offset, buf, wr_len) != wr_len)
{