From: "Paul E. McKenney" The vmtruncate() function shifts down by PAGE_CACHE_SHIFT, then calls vmtruncate_list(), which deals in terms of PAGE_SHIFT instead. Currently, no harm done, since PAGE_CACHE_SHIFT and PAGE_SHIFT are identical. Some day they might not be, hence this patch. I also took the liberty of modifying a hand-coded "if" that seems to optimize for files that are not mapped to instead use unlikely(). mm/memory.c | 11 +++-------- 1 files changed, 3 insertions(+), 8 deletions(-) diff -puN mm/memory.c~vmtruncate-PAGE_SIZE-fix mm/memory.c --- 25/mm/memory.c~vmtruncate-PAGE_SIZE-fix 2003-05-17 14:09:39.000000000 -0700 +++ 25-akpm/mm/memory.c 2003-05-17 14:09:39.000000000 -0700 @@ -1108,17 +1108,12 @@ int vmtruncate(struct inode * inode, lof if (inode->i_size < offset) goto do_expand; inode->i_size = offset; + pgoff = (offset + PAGE_SIZE - 1) >> PAGE_SHIFT; down(&mapping->i_shared_sem); - if (list_empty(&mapping->i_mmap) && list_empty(&mapping->i_mmap_shared)) - goto out_unlock; - - pgoff = (offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; - if (!list_empty(&mapping->i_mmap)) + if (unlikely(!list_empty(&mapping->i_mmap))) vmtruncate_list(&mapping->i_mmap, pgoff); - if (!list_empty(&mapping->i_mmap_shared)) + if (unlikely(!list_empty(&mapping->i_mmap_shared))) vmtruncate_list(&mapping->i_mmap_shared, pgoff); - -out_unlock: up(&mapping->i_shared_sem); truncate_inode_pages(mapping, offset); goto out_truncate; _