summaryrefslogtreecommitdiff
path: root/ext2fs/truncate.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext2fs/truncate.c')
-rw-r--r--ext2fs/truncate.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/ext2fs/truncate.c b/ext2fs/truncate.c
index 077225b0..ab9c78fa 100644
--- a/ext2fs/truncate.c
+++ b/ext2fs/truncate.c
@@ -124,7 +124,7 @@ trunc_indirect (struct node *node, block_t end,
{
unsigned index;
int modified = 0, all_freed = 1;
- block_t *ind_bh = (block_t *)bptr (*p);
+ block_t *ind_bh = (block_t *)disk_cache_block_ref (*p);
unsigned first = end < offset ? 0 : end - offset;
for (index = first; index < addr_per_block; index++)
@@ -139,11 +139,18 @@ trunc_indirect (struct node *node, block_t end,
if (first == 0 && all_freed)
{
- pager_flush_some (diskfs_disk_pager, boffs (*p), block_size, 1);
+ if (block_size >= vm_page_size)
+ pager_flush_some (diskfs_disk_pager,
+ ((bptr_index (ind_bh) << log2_block_size)
+ / vm_page_size),
+ block_size / vm_page_size, 1);
free_block_run_free_ptr (fbr, p);
+ disk_cache_block_deref (ind_bh);
}
else if (modified)
record_indir_poke (node, ind_bh);
+ else
+ disk_cache_block_deref (ind_bh);
}
}
@@ -241,8 +248,10 @@ force_delayed_copies (struct node *node, off_t length)
/* XXX should cope with errors from diskfs_get_filemap */
poke_pages (obj, round_page (length), round_page (node->allocsize));
mach_port_deallocate (mach_task_self (), obj);
- pager_flush_some (pager, round_page(length),
- node->allocsize - length, 1);
+ pager_flush_some (pager, round_page(length) / vm_page_size,
+ round_page (node->allocsize -
+ round_page (length)) / vm_page_size,
+ 1);
}
ports_port_deref (pager);