- uint64_t blocks = (size + BLUESKY_BLOCK_SIZE - 1) / 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
- * zero blocks so we don't need to do any more work. */
- g_array_set_size(inode->blocks, blocks);
- } else if (blocks < inode->blocks->len) {
- /* Delete blocks from a file. Must reclaim memory. */
- for (guint i = inode->blocks->len; i < blocks; i++) {
- BlueSkyBlock *b = &g_array_index(inode->blocks, BlueSkyBlock, i);
- g_free(b->ref);
- bluesky_string_unref(b->data);
- }
- g_array_set_size(inode->blocks, blocks);
- }
-
- /* If the file size is being decreased, ensure that any trailing data in
- * the last block is zeroed. */
- if (size < inode->size) {
- BlueSkyBlock *b = &g_array_index(inode->blocks, BlueSkyBlock,
- blocks - 1);
- if (b->type != BLUESKY_BLOCK_ZERO) {
- bluesky_block_touch(inode, blocks - 1);
- int end_offset = size % BLUESKY_BLOCK_SIZE;
- if (end_offset > 0) {
- memset(&b->data->data[end_offset], 0,
- BLUESKY_BLOCK_SIZE - end_offset);
- }
- }
- }
-
- inode->size = size;
- bluesky_inode_update_ctime(inode, 1);
-}