|
@@ -1377,8 +1377,17 @@ static int cifs_vmtruncate(struct inode *inode, loff_t offset)
|
|
|
}
|
|
|
i_size_write(inode, offset);
|
|
|
spin_unlock(&inode->i_lock);
|
|
|
+ /*
|
|
|
+ * unmap_mapping_range is called twice, first simply for efficiency
|
|
|
+ * so that truncate_inode_pages does fewer single-page unmaps. However
|
|
|
+ * after this first call, and before truncate_inode_pages finishes,
|
|
|
+ * it is possible for private pages to be COWed, which remain after
|
|
|
+ * truncate_inode_pages finishes, hence the second unmap_mapping_range
|
|
|
+ * call must be made for correctness.
|
|
|
+ */
|
|
|
unmap_mapping_range(mapping, offset + PAGE_SIZE - 1, 0, 1);
|
|
|
truncate_inode_pages(mapping, offset);
|
|
|
+ unmap_mapping_range(mapping, offset + PAGE_SIZE - 1, 0, 1);
|
|
|
goto out_truncate;
|
|
|
|
|
|
do_expand:
|