* [PATCH] Btrfs: truncate pages from clone ioctl target range
@ 2011-08-09 19:00 Sage Weil
2011-08-09 20:12 ` David Sterba
0 siblings, 1 reply; 3+ messages in thread
From: Sage Weil @ 2011-08-09 19:00 UTC (permalink / raw)
To: linux-btrfs; +Cc: Sage Weil
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(-)
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;
--
1.7.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] Btrfs: truncate pages from clone ioctl target range
2011-08-09 19:00 [PATCH] Btrfs: truncate pages from clone ioctl target range Sage Weil
@ 2011-08-09 20:12 ` David Sterba
0 siblings, 0 replies; 3+ messages in thread
From: David Sterba @ 2011-08-09 20:12 UTC (permalink / raw)
To: Sage Weil; +Cc: linux-btrfs
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;
> --
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH] Btrfs: truncate pages from clone ioctl target range
@ 2011-08-10 18:04 Sage Weil
0 siblings, 0 replies; 3+ messages in thread
From: Sage Weil @ 2011-08-10 18:04 UTC (permalink / raw)
To: linux-btrfs; +Cc: Sage Weil
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
used to still see it (until remount). If the page was partially updated
we used to get a mix of old and new data.
Signed-off-by: Sage Weil <sage@newdream.net>
---
v1->v2: use ALIGN macro
fs/btrfs/ioctl.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 514c0eb..5acb8e1 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,
+ ALIGN(off + len, PAGE_CACHE_SIZE) - 1);
+
/* clone data */
key.objectid = btrfs_ino(src);
key.type = BTRFS_EXTENT_DATA_KEY;
--
1.7.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-08-10 18:04 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-09 19:00 [PATCH] Btrfs: truncate pages from clone ioctl target range Sage Weil
2011-08-09 20:12 ` David Sterba
-- strict thread matches above, loose matches on Subject: below --
2011-08-10 18:04 Sage Weil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).