diff options
Diffstat (limited to 'ext2fs/truncate.c')
-rw-r--r-- | ext2fs/truncate.c | 17 |
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); |