X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Ffile.c;fp=bluesky%2Ffile.c;h=19363756b17e3fc32ede50a6c4b2f4faa539909a;hb=93d0310df9437763aa239f38372b62b9d0480de0;hp=72467f388144860979b78f0cd4633ff031cef66f;hpb=d249434185ca2b1cc1a5621c2ac06d65129f5ddd;p=bluesky.git diff --git a/bluesky/file.c b/bluesky/file.c index 72467f3..1936375 100644 --- a/bluesky/file.c +++ b/bluesky/file.c @@ -163,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);