X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Ffile.c;h=19363756b17e3fc32ede50a6c4b2f4faa539909a;hb=29f62766c54c3f4a72c05b0ccf79b0867805056f;hp=e0c62555639708a27caf652712235515ddbf740c;hpb=11daa4a2d17850ff5ceb1c30d463d699635cfbc6;p=bluesky.git diff --git a/bluesky/file.c b/bluesky/file.c index e0c6255..1936375 100644 --- a/bluesky/file.c +++ b/bluesky/file.c @@ -100,7 +100,11 @@ void bluesky_file_truncate(BlueSkyInode *inode, uint64_t size) && lastblock_old < BLUESKY_BLOCK_SIZE) { bluesky_block_touch(inode, inode->blocks->len - 1, TRUE); gsize old_size = b->dirty->len; - g_warn_if_fail(lastblock_old != old_size); + if (lastblock_old != old_size) { + fprintf(stderr, + "Warning: last block size = %zd, expected %d\n", + old_size, lastblock_old); + } bluesky_string_resize(b->dirty, BLUESKY_BLOCK_SIZE); memset(&b->dirty->data[old_size], 0, BLUESKY_BLOCK_SIZE - old_size); @@ -159,16 +163,17 @@ void bluesky_file_write(BlueSkyInode *inode, uint64_t offset, if (len == 0) return; - // TODO: Optimization: If we are entirely overwriting a block we don't need - // to fetch it frm storage first. We don't yet handle the case where the - // partial last block of a file is entirely overwritten. while (len > 0) { uint64_t block_num = offset / BLUESKY_BLOCK_SIZE; gint block_offset = offset % BLUESKY_BLOCK_SIZE; gint bytes = MIN(BLUESKY_BLOCK_SIZE - block_offset, len); gboolean preserve = TRUE; - if (block_offset == 0 && bytes == BLUESKY_BLOCK_SIZE) { + gsize block_size = BLUESKY_BLOCK_SIZE; + if (block_num == inode->blocks->len - 1) { + block_size = inode->size - block_num * BLUESKY_BLOCK_SIZE; + } + if (block_offset == 0 && bytes == block_size) { preserve = FALSE; } bluesky_block_touch(inode, block_num, preserve);