]> err.no Git - linux-2.6/commitdiff
[CIFS] cifs truncate missing a fix for private map COW race
authorSteve French <sfrench@us.ibm.com>
Wed, 22 Aug 2007 22:12:07 +0000 (22:12 +0000)
committerSteve French <sfrench@us.ibm.com>
Wed, 22 Aug 2007 22:12:07 +0000 (22:12 +0000)
vmtruncate had added the same fix to handle the case of private pages
being Copy on writed while truncate_inode_pages is going on

Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/inode.c

index dd4167762a8edaf847913027a9265e3c293144ac..97ccc513730f7deed66387cc0a94db6cd96dae8c 100644 (file)
@@ -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: