Commit 8064ab4d authored by Steve French's avatar Steve French
Browse files

[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: default avatarSteve French <sfrench@us.ibm.com>
parent cb00e99c
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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: