diff mbox

Btrfs: truncate pages from clone ioctl target range

Message ID 1312916441-23662-1-git-send-email-sage@newdream.net (mailing list archive)
State New, archived
Headers show

Commit Message

Sage Weil Aug. 9, 2011, 7 p.m. UTC
We need to truncate page cache pages for the clone ioctl target range or
else we'll confuse ourselves to no end.  If the old data was cached, we'll
still see it (until remount).  If it was dirty we'll get a mix of old and
new data if the page(s) are partially updated.

Signed-off-by: Sage Weil <sage@newdream.net>
---
 fs/btrfs/ioctl.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

Comments

David Sterba Aug. 9, 2011, 8:12 p.m. UTC | #1
just a readability issue:

On Tue, Aug 09, 2011 at 12:00:41PM -0700, Sage Weil wrote:
> --- a/fs/btrfs/ioctl.c
> +++ b/fs/btrfs/ioctl.c
> @@ -2243,6 +2243,10 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
>  		btrfs_wait_ordered_range(src, off, len);
>  	}
>  
> +	/* truncate page cache pages from target inode range */
> +	truncate_inode_pages_range(&inode->i_data, off,
> +			      ((off+len+PAGE_CACHE_SIZE-1)&PAGE_CACHE_MASK)-1);

                               ALIGN(off + len, PAGE_CACHE_SIZE) - 1)

I'll give it some testing too :) thanks for catching this!

david

> +
>  	/* clone data */
>  	key.objectid = btrfs_ino(src);
>  	key.type = BTRFS_EXTENT_DATA_KEY;
> -- 
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index a3c4751..cac9491 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -2243,6 +2243,10 @@  static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
 		btrfs_wait_ordered_range(src, off, len);
 	}
 
+	/* truncate page cache pages from target inode range */
+	truncate_inode_pages_range(&inode->i_data, off,
+			      ((off+len+PAGE_CACHE_SIZE-1)&PAGE_CACHE_MASK)-1);
+
 	/* clone data */
 	key.objectid = btrfs_ino(src);
 	key.type = BTRFS_EXTENT_DATA_KEY;