From: Liu Bo <bo.liu@linux.alibaba.com>
To: linux-fsdevel@vger.kernel.org
Cc: Miklos Szeredi <mszeredi@redhat.com>
Subject: [PATCH] fuse: do not write whole page while page straddles i_size
Date: Thu, 18 Apr 2019 04:04:40 +0800 [thread overview]
Message-ID: <20190417200441.90291-1-bo.liu@linux.alibaba.com> (raw)
From: Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
If page straddles i_size and we write the whole page, the fuse
user-space filesystem may extend file size, it will confuse users.
Before this patch:
xfs_io -t -f \
-c "truncate 5120" \
-c "pwrite -S 0x58 0 5120" \
-c "mmap -rw 0 5120" \
-c "mwrite -S 0x59 2048 3072" \
-c "close" \
testfile
testfile's length will be 8192 bytes, with this patch, testfile's
length will be 5120 bytes.
Signed-off-by: Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
Signed-off-by: Liu Bo <bo.liu@linux.alibaba.com>
---
fs/fuse/file.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 06096b60f1df..44e76b00e985 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1863,6 +1863,8 @@ static int fuse_writepages_fill(struct page *page,
struct page *tmp_page;
bool is_writeback;
int err;
+ loff_t size;
+ unsigned int len;
if (!data->ff) {
err = -EIO;
@@ -1940,7 +1942,12 @@ static int fuse_writepages_fill(struct page *page,
copy_highpage(tmp_page, page);
req->pages[req->num_pages] = tmp_page;
req->page_descs[req->num_pages].offset = 0;
- req->page_descs[req->num_pages].length = PAGE_SIZE;
+ size = i_size_read(inode);
+ if (page->index == size >> PAGE_SHIFT)
+ len = size & ~PAGE_MASK;
+ else
+ len = PAGE_SIZE;
+ req->page_descs[req->num_pages].length = len;
inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP);
--
2.20.1.2.gb21ebb6
next reply other threads:[~2019-04-17 20:04 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-17 20:04 Liu Bo [this message]
2019-04-18 11:19 ` [PATCH] fuse: do not write whole page while page straddles i_size Miklos Szeredi
2019-04-18 20:30 ` Liu Bo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190417200441.90291-1-bo.liu@linux.alibaba.com \
--to=bo.liu@linux.alibaba.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=mszeredi@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).