From 93d0310df9437763aa239f38372b62b9d0480de0 Mon Sep 17 00:00:00 2001 From: Michael Vrable Date: Fri, 11 Mar 2011 14:31:26 -0800 Subject: [PATCH 1/1] Optimize overwrites of the last block of a file --- bluesky/file.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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); -- 2.20.1