+ LOG_INFO("New page needed, pg_offset %d, pos %d\n", pg_offset, (int)((fdb->start - disk->page_array) + pg_offset));
+
+ new_page = allocateNewPage(disk, (fdb->start - disk->page_array) + pg_offset, fdb->inode);
+ if (new_page == NO_SPACE)
+ {
+ fdb->errors |= BATTFS_DISK_SPACEOVER_ERR;
+ return total_write;
+ }
+
+ curr_hdr.inode = fdb->inode;
+ curr_hdr.pgoff = pg_offset;
+ curr_hdr.fill = 0;
+ curr_hdr.seq = 0;
+ fdb->max_off = pg_offset;
+ }
+ else
+ {
+ if (!readHdr(disk, fdb->start[pg_offset], &curr_hdr))
+ {
+ fdb->errors |= BATTFS_DISK_READ_ERR;
+ return total_write;
+ }
+
+ /* Renew page only if is not in cache. */
+ if (kblock_buffered(disk->dev)
+ && ((fdb->start[fdb->max_off] != kblock_cachedBlock(disk->dev)) || !kblock_cacheDirty(disk->dev)))
+ {
+ new_page = renewPage(disk, fdb->start[pg_offset]);
+ if (new_page == NO_SPACE)
+ {
+ fdb->errors |= BATTFS_DISK_SPACEOVER_ERR;
+ return total_write;
+ }
+
+ LOG_INFO("Re-writing page %d to %d\n", fdb->start[pg_offset], new_page);
+ if (kblock_copy(disk->dev, fdb->start[pg_offset], new_page) != 0)
+ {
+ fdb->errors |= BATTFS_DISK_WRITE_ERR;
+ return total_write;
+ }
+ fdb->start[pg_offset] = new_page;
+ }
+ else
+ {
+ LOG_INFO("Using cached block %d\n", fdb->start[pg_offset]);
+ new_page = fdb->start[pg_offset];
+ }
+
+ curr_hdr.seq++;
+ }
+ //LOG_INFO("writing to buffer for page %d, offset %d, size %d\n", disk->curr_page, addr_offset, wr_len);
+ if (kblock_write(disk->dev, new_page, buf, addr_offset, wr_len) != wr_len)
+ {
+ fdb->errors |= BATTFS_DISK_WRITE_ERR;
+ return total_write;