mm: tidy vmtruncate_range and related functions
authorHugh Dickins <hughd@google.com>
Tue, 26 Jul 2011 00:12:24 +0000 (17:12 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 26 Jul 2011 03:57:10 +0000 (20:57 -0700)
Use consistent variable names in truncate_pagecache(), truncate_setsize(),
vmtruncate() and vmtruncate_range().

unmap_mapping_range() and vmtruncate_range() have mismatched interfaces:
don't change either, but make the vmtruncates more precise about what they
expect unmap_mapping_range() to do.

vmtruncate_range() is currently called only with page-aligned start and
end+1: can handle unaligned start, but unaligned end+1 would hit BUG_ON in
truncate_inode_pages_range() (lacks partial clearing of the end page).

Signed-off-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/truncate.c

index 003c6c685fc8f293071776d47e7697bbe2cd1d58..c924764e2ce51bd7d38bcba70594224e749de660 100644 (file)
@@ -531,8 +531,8 @@ EXPORT_SYMBOL_GPL(invalidate_inode_pages2);
 /**
  * truncate_pagecache - unmap and remove pagecache that has been truncated
  * @inode: inode
- * @old: old file offset
- * @new: new file offset
+ * @oldsize: old file size
+ * @newsize: new file size
  *
  * inode's new i_size must already be written before truncate_pagecache
  * is called.
@@ -544,9 +544,10 @@ EXPORT_SYMBOL_GPL(invalidate_inode_pages2);
  * situations such as writepage being called for a page that has already
  * had its underlying blocks deallocated.
  */
-void truncate_pagecache(struct inode *inode, loff_t old, loff_t new)
+void truncate_pagecache(struct inode *inode, loff_t oldsize, loff_t newsize)
 {
        struct address_space *mapping = inode->i_mapping;
+       loff_t holebegin = round_up(newsize, PAGE_SIZE);
 
        /*
         * unmap_mapping_range is called twice, first simply for
@@ -557,9 +558,9 @@ void truncate_pagecache(struct inode *inode, loff_t old, loff_t new)
         * truncate_inode_pages finishes, hence the second
         * unmap_mapping_range call must be made for correctness.
         */
-       unmap_mapping_range(mapping, new + PAGE_SIZE - 1, 0, 1);
-       truncate_inode_pages(mapping, new);
-       unmap_mapping_range(mapping, new + PAGE_SIZE - 1, 0, 1);
+       unmap_mapping_range(mapping, holebegin, 0, 1);
+       truncate_inode_pages(mapping, newsize);
+       unmap_mapping_range(mapping, holebegin, 0, 1);
 }
 EXPORT_SYMBOL(truncate_pagecache);
 
@@ -589,29 +590,31 @@ EXPORT_SYMBOL(truncate_setsize);
 /**
  * vmtruncate - unmap mappings "freed" by truncate() syscall
  * @inode: inode of the file used
- * @offset: file offset to start truncating
+ * @newsize: file offset to start truncating
  *
  * This function is deprecated and truncate_setsize or truncate_pagecache
  * should be used instead, together with filesystem specific block truncation.
  */
-int vmtruncate(struct inode *inode, loff_t offset)
+int vmtruncate(struct inode *inode, loff_t newsize)
 {
        int error;
 
-       error = inode_newsize_ok(inode, offset);
+       error = inode_newsize_ok(inode, newsize);
        if (error)
                return error;
 
-       truncate_setsize(inode, offset);
+       truncate_setsize(inode, newsize);
        if (inode->i_op->truncate)
                inode->i_op->truncate(inode);
        return 0;
 }
 EXPORT_SYMBOL(vmtruncate);
 
-int vmtruncate_range(struct inode *inode, loff_t offset, loff_t end)
+int vmtruncate_range(struct inode *inode, loff_t lstart, loff_t lend)
 {
        struct address_space *mapping = inode->i_mapping;
+       loff_t holebegin = round_up(lstart, PAGE_SIZE);
+       loff_t holelen = 1 + lend - holebegin;
 
        /*
         * If the underlying filesystem is not going to provide
@@ -623,10 +626,10 @@ int vmtruncate_range(struct inode *inode, loff_t offset, loff_t end)
 
        mutex_lock(&inode->i_mutex);
        inode_dio_wait(inode);
-       unmap_mapping_range(mapping, offset, (end - offset), 1);
-       inode->i_op->truncate_range(inode, offset, end);
+       unmap_mapping_range(mapping, holebegin, holelen, 1);
+       inode->i_op->truncate_range(inode, lstart, lend);
        /* unmap again to remove racily COWed private pages */
-       unmap_mapping_range(mapping, offset, (end - offset), 1);
+       unmap_mapping_range(mapping, holebegin, holelen, 1);
        mutex_unlock(&inode->i_mutex);
 
        return 0;