Commit 98063ca7 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] Fix for latent bug in vmtruncate()

From: "Paul E. McKenney" <paulmck@us.ibm.com>

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().
parent e432a562
...@@ -1108,17 +1108,12 @@ int vmtruncate(struct inode * inode, loff_t offset) ...@@ -1108,17 +1108,12 @@ int vmtruncate(struct inode * inode, loff_t offset)
if (inode->i_size < offset) if (inode->i_size < offset)
goto do_expand; goto do_expand;
inode->i_size = offset; inode->i_size = offset;
pgoff = (offset + PAGE_SIZE - 1) >> PAGE_SHIFT;
down(&mapping->i_shared_sem); down(&mapping->i_shared_sem);
if (list_empty(&mapping->i_mmap) && list_empty(&mapping->i_mmap_shared)) if (unlikely(!list_empty(&mapping->i_mmap)))
goto out_unlock;
pgoff = (offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
if (!list_empty(&mapping->i_mmap))
vmtruncate_list(&mapping->i_mmap, pgoff); 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); vmtruncate_list(&mapping->i_mmap_shared, pgoff);
out_unlock:
up(&mapping->i_shared_sem); up(&mapping->i_shared_sem);
truncate_inode_pages(mapping, offset); truncate_inode_pages(mapping, offset);
goto out_truncate; goto out_truncate;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment