+ /*
+ * Handle writing when seek pos if far over EOF,
+ * We need to allocate the missing pages first.
+ */
+ pgoff_t missing_pages = fd->seek_pos / (fdb->disk->page_size - BATTFS_HEADER_LEN) - fdb->max_off;
+
+ LOG_INFO("missing pages: %d\n", missing_pages);
+ if (!loadPage(fdb->disk, fdb->start[fdb->max_off], &curr_hdr))
+ {
+ #warning TODO set error?
+ return total_write;
+ }
+
+ uint8_t dummy = 0xff;
+ /* Add missing pages to reach current seek_pos */
+ while (missing_pages--)
+ {
+ /* Update size and free space left */
+ fd->size += (fdb->disk->page_size - BATTFS_HEADER_LEN) - curr_hdr.fill;
+ fdb->disk->free_bytes -= (fdb->disk->page_size - BATTFS_HEADER_LEN) - curr_hdr.fill;
+
+ /* Fill empty space with 0xFF */
+ for (addr_offset = curr_hdr.fill; addr_offset < (fdb->disk->page_size - BATTFS_HEADER_LEN); addr_offset++)
+ {
+ if (fdb->disk->bufferWrite(fdb->disk, addr_offset, &dummy, 1) != 1)
+ {
+ #warning TODO set error?
+ }
+ }
+ curr_hdr.fill = (fdb->disk->page_size - BATTFS_HEADER_LEN);
+ setBufferHdr(fdb->disk, &curr_hdr);
+
+ /* Get the new page needed */
+ if (!getNewPage(fdb->disk, (fdb->start - fdb->disk->page_array) + fdb->max_off + 1, fdb->inode, fdb->max_off + 1, &curr_hdr))
+ return total_write;
+
+ fdb->max_off++;
+ }
+ /* Fix sizes for the last new page (could be only partially full) */
+ curr_hdr.fill = fd->seek_pos % (fdb->disk->page_size - BATTFS_HEADER_LEN);
+ setBufferHdr(fdb->disk, &curr_hdr);
+ fd->size += curr_hdr.fill;
+ fdb->disk->free_bytes -= curr_hdr.fill;
+ }
+ else if (!getBufferHdr(fdb->disk, &curr_hdr))
+ return total_write;