+ zero_bytes = MIN((kfile_off_t)disk->data_size, fd->seek_pos - fd->size);
+ /* Get the new page needed */
+ if (!getNewPage(disk, (fdb->start - disk->page_array) + fdb->max_off + 1, fdb->inode, fdb->max_off + 1, &curr_hdr))
+ {
+ fdb->errors |= BATTFS_DISK_GETNEWPAGE_ERR;
+ return total_write;
+ }
+
+ /* Update size and free space left */
+ fd->size += zero_bytes;
+ disk->free_bytes -= zero_bytes;
+
+ curr_hdr.fill = zero_bytes;
+ setBufferHdr(disk, &curr_hdr);
+
+ fdb->max_off++;
+ }
+ }
+ }
+ else if (!getBufferHdr(disk, &curr_hdr))
+ {
+ fdb->errors |= BATTFS_DISK_BUFFERRD_ERR;
+ return total_write;
+ }
+
+ while (size)
+ {
+ pg_offset = fd->seek_pos / disk->data_size;
+ addr_offset = fd->seek_pos % disk->data_size;
+ wr_len = MIN(size, (size_t)(disk->data_size - addr_offset));
+
+ /* Handle write outside EOF */
+ if (pg_offset > fdb->max_off)
+ {
+ LOG_INFO("New page needed, pg_offset %d, pos %d\n", pg_offset, (int)((fdb->start - disk->page_array) + pg_offset));
+ if (!getNewPage(disk, (fdb->start - disk->page_array) + pg_offset, fdb->inode, pg_offset, &curr_hdr))
+ {
+ fdb->errors |= BATTFS_DISK_GETNEWPAGE_ERR;
+ return total_write;
+ }
+
+ fdb->max_off = pg_offset;
+ }
+ /* Handle cache load of a new page*/
+ else if (fdb->start[pg_offset] != disk->curr_page)
+ {
+ if (SPACE_OVER(disk))
+ {
+ LOG_ERR("No disk space available!\n");
+ fdb->errors |= BATTFS_DISK_SPACEOVER_ERR;
+ return total_write;
+ }
+ LOG_INFO("Re-writing page %d to %d\n", fdb->start[pg_offset], disk->page_array[disk->free_page_start]);
+ if (!loadPage(disk, fdb->start[pg_offset], &curr_hdr))
+ {
+ fdb->errors |= BATTFS_DISK_LOADPAGE_ERR;