projects
/
bluesky.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
31e56a5
)
Tweaks to code that handles read-modify-write on data blocks
author
Michael Vrable
<mvrable@cs.ucsd.edu>
Fri, 11 Mar 2011 04:58:10 +0000
(20:58 -0800)
committer
Michael Vrable
<mvrable@cs.ucsd.edu>
Fri, 11 Mar 2011 04:58:10 +0000
(20:58 -0800)
bluesky/file.c
patch
|
blob
|
history
diff --git
a/bluesky/file.c
b/bluesky/file.c
index
f10814a
..
e0c6255
100644
(file)
--- a/
bluesky/file.c
+++ b/
bluesky/file.c
@@
-77,6
+77,15
@@
void bluesky_file_truncate(BlueSkyInode *inode, uint64_t size)
uint64_t blocks = (size + BLUESKY_BLOCK_SIZE - 1) / BLUESKY_BLOCK_SIZE;
uint64_t blocks = (size + BLUESKY_BLOCK_SIZE - 1) / BLUESKY_BLOCK_SIZE;
+ /* Calculate number of bytes in the last block of the file */
+ int lastblock_old, lastblock_new;
+ lastblock_old = inode->size % BLUESKY_BLOCK_SIZE;
+ if (lastblock_old == 0 && inode->size > 0)
+ lastblock_old = BLUESKY_BLOCK_SIZE;
+ lastblock_new = size % BLUESKY_BLOCK_SIZE;
+ if (lastblock_new == 0 && size > 0)
+ lastblock_new = BLUESKY_BLOCK_SIZE;
+
if (blocks > inode->blocks->len) {
/* Need to add new blocks to the end of a file. New block structures
* are automatically zeroed, which initializes them to be pointers to
if (blocks > inode->blocks->len) {
/* Need to add new blocks to the end of a file. New block structures
* are automatically zeroed, which initializes them to be pointers to
@@
-88,10
+97,10
@@
void bluesky_file_truncate(BlueSkyInode *inode, uint64_t size)
inode->blocks->len - 1);
if (b->type != BLUESKY_BLOCK_ZERO
inode->blocks->len - 1);
if (b->type != BLUESKY_BLOCK_ZERO
- && (b->type == BLUESKY_BLOCK_REF
- || b->dirty->len < BLUESKY_BLOCK_SIZE)) {
+ && lastblock_old < BLUESKY_BLOCK_SIZE) {
bluesky_block_touch(inode, inode->blocks->len - 1, TRUE);
gsize old_size = b->dirty->len;
bluesky_block_touch(inode, inode->blocks->len - 1, TRUE);
gsize old_size = b->dirty->len;
+ g_warn_if_fail(lastblock_old != old_size);
bluesky_string_resize(b->dirty, BLUESKY_BLOCK_SIZE);
memset(&b->dirty->data[old_size], 0,
BLUESKY_BLOCK_SIZE - old_size);
bluesky_string_resize(b->dirty, BLUESKY_BLOCK_SIZE);
memset(&b->dirty->data[old_size], 0,
BLUESKY_BLOCK_SIZE - old_size);
@@
-117,7
+126,13
@@
void bluesky_file_truncate(BlueSkyInode *inode, uint64_t size)
BlueSkyBlock *b = &g_array_index(inode->blocks, BlueSkyBlock,
blocks - 1);
BlueSkyBlock *b = &g_array_index(inode->blocks, BlueSkyBlock,
blocks - 1);
- if (b->type != BLUESKY_BLOCK_ZERO) {
+ gboolean need_resize = TRUE;
+ if (b->type == BLUESKY_BLOCK_ZERO)
+ need_resize = FALSE;
+ else if (size < inode->size && lastblock_new == BLUESKY_BLOCK_SIZE)
+ need_resize = FALSE;
+
+ if (need_resize) {
bluesky_block_touch(inode, blocks - 1, TRUE);
gsize old_size = b->dirty->len;
gsize new_size = size - (blocks - 1) * BLUESKY_BLOCK_SIZE;
bluesky_block_touch(inode, blocks - 1, TRUE);
gsize old_size = b->dirty->len;
gsize new_size = size - (blocks - 1) * BLUESKY_BLOCK_SIZE;