From: Steve French Date: Wed, 22 Aug 2007 22:12:07 +0000 (+0000) Subject: [CIFS] cifs truncate missing a fix for private map COW race X-Git-Tag: v2.6.24-rc1~138^2~50 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=8064ab4da104900505f33535d230ce0da5d18341;p=linux-2.6-omap-h63xx.git [CIFS] cifs truncate missing a fix for private map COW race 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 --- diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index dd4167762a8..97ccc513730 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c @@ -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: