From: Michael Vrable Date: Fri, 11 Mar 2011 22:31:26 +0000 (-0800) Subject: Optimize overwrites of the last block of a file X-Git-Url: http://git.vrable.net/?p=bluesky.git;a=commitdiff_plain;h=93d0310df9437763aa239f38372b62b9d0480de0 Optimize overwrites of the last block of a file --- 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);