From: Vivek Goyal <vgoyal@redhat.com>
To: linux-unionfs@vger.kernel.org, Miklos Szeredi <miklos@szeredi.hu>
Cc: Amir Goldstein <amir73il@gmail.com>,
virtio-fs-list <virtio-fs@redhat.com>
Subject: [PATCH] overlayfs: Pass O_TRUNC flag to underlying filesystem
Date: Tue, 21 Apr 2020 14:41:07 -0400 [thread overview]
Message-ID: <20200421184107.GC28740@redhat.com> (raw)
As of now during open(), we don't pass bunch of flags to underlying
filesystem. O_TRUNC is one of these. Normally this is not a problem as VFS
calls ->setattr() with zero size and underlying filesystem sets file size
to 0.
But when overlayfs is running on top of virtiofs, it has an optimization
where it does not send setattr request to server if dectects that
truncation is part of open(O_TRUNC). It assumes that server already zeroed
file size as part of open(O_TRUNC).
fuse_do_setattr() {
if (attr->ia_valid & ATTR_OPEN) {
/*
* No need to send request to userspace, since actual
* truncation has already been done by OPEN. But still
* need to truncate page cache.
*/
}
}
IOW, fuse expects O_TRUNC to be passed to it as part of open flags.
But currently overlayfs does not pass O_TRUNC to underlying filesystem
hence fuse/virtiofs breaks. Setup overlayfs on top of virtiofs and
following does not zero the file size of a file is either upper only
or has already been copied up.
fd = open(foo.txt, O_TRUNC | O_WRONLY);
Fix it by passing O_TRUNC to underlying filesystem.
I found this problem while running unionmount-testsuite. It fails.
***
*** ./run --ov --samefs --ts=0 open-trunc
***
TEST open-trunc.py:10: Open O_TRUNC|O_RDONLY
./run --open-file /mnt/virtiofs/mnt/a/foo100 -r -t -R
./run --open-file /mnt/virtiofs/mnt/a/foo100 -r -t -R
TEST open-trunc.py:18: Open O_TRUNC|O_WRONLY
./run --open-file /mnt/virtiofs/mnt/a/foo101 -w -t -W q
./run --open-file /mnt/virtiofs/mnt/a/foo101 -r -R q
./run --open-file /mnt/virtiofs/mnt/a/foo101 -w -t -W p
./run --open-file /mnt/virtiofs/mnt/a/foo101 -r -R p
TEST open-trunc.py:28: Open O_TRUNC|O_APPEND|O_WRONLY
./run --open-file /mnt/virtiofs/mnt/a/foo102 -a -t -W q
./run --open-file /mnt/virtiofs/mnt/a/foo102 -r -R q
./run --open-file /mnt/virtiofs/mnt/a/foo102 -a -t -W p
./run --open-file /mnt/virtiofs/mnt/a/foo102 -r -R p
/mnt/virtiofs/mnt/a/foo102: File size wrong (got 2, want 1)
After this patch, unionmount-testsuite passes with overlayfs on top of
virtiofs.
Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
---
fs/overlayfs/file.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: redhat-linux/fs/overlayfs/file.c
===================================================================
--- redhat-linux.orig/fs/overlayfs/file.c 2020-04-21 13:33:40.777125594 -0400
+++ redhat-linux/fs/overlayfs/file.c 2020-04-21 13:53:30.317125594 -0400
@@ -134,7 +134,7 @@ static int ovl_open(struct inode *inode,
return err;
/* No longer need these flags, so don't pass them on to underlying fs */
- file->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
+ file->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY);
realfile = ovl_open_realfile(file, ovl_inode_realdata(inode));
if (IS_ERR(realfile))
WARNING: multiple messages have this Message-ID (diff)
From: Vivek Goyal <vgoyal@redhat.com>
To: linux-unionfs@vger.kernel.org, Miklos Szeredi <miklos@szeredi.hu>
Cc: virtio-fs-list <virtio-fs@redhat.com>,
Amir Goldstein <amir73il@gmail.com>
Subject: [Virtio-fs] [PATCH] overlayfs: Pass O_TRUNC flag to underlying filesystem
Date: Tue, 21 Apr 2020 14:41:07 -0400 [thread overview]
Message-ID: <20200421184107.GC28740@redhat.com> (raw)
As of now during open(), we don't pass bunch of flags to underlying
filesystem. O_TRUNC is one of these. Normally this is not a problem as VFS
calls ->setattr() with zero size and underlying filesystem sets file size
to 0.
But when overlayfs is running on top of virtiofs, it has an optimization
where it does not send setattr request to server if dectects that
truncation is part of open(O_TRUNC). It assumes that server already zeroed
file size as part of open(O_TRUNC).
fuse_do_setattr() {
if (attr->ia_valid & ATTR_OPEN) {
/*
* No need to send request to userspace, since actual
* truncation has already been done by OPEN. But still
* need to truncate page cache.
*/
}
}
IOW, fuse expects O_TRUNC to be passed to it as part of open flags.
But currently overlayfs does not pass O_TRUNC to underlying filesystem
hence fuse/virtiofs breaks. Setup overlayfs on top of virtiofs and
following does not zero the file size of a file is either upper only
or has already been copied up.
fd = open(foo.txt, O_TRUNC | O_WRONLY);
Fix it by passing O_TRUNC to underlying filesystem.
I found this problem while running unionmount-testsuite. It fails.
***
*** ./run --ov --samefs --ts=0 open-trunc
***
TEST open-trunc.py:10: Open O_TRUNC|O_RDONLY
./run --open-file /mnt/virtiofs/mnt/a/foo100 -r -t -R
./run --open-file /mnt/virtiofs/mnt/a/foo100 -r -t -R
TEST open-trunc.py:18: Open O_TRUNC|O_WRONLY
./run --open-file /mnt/virtiofs/mnt/a/foo101 -w -t -W q
./run --open-file /mnt/virtiofs/mnt/a/foo101 -r -R q
./run --open-file /mnt/virtiofs/mnt/a/foo101 -w -t -W p
./run --open-file /mnt/virtiofs/mnt/a/foo101 -r -R p
TEST open-trunc.py:28: Open O_TRUNC|O_APPEND|O_WRONLY
./run --open-file /mnt/virtiofs/mnt/a/foo102 -a -t -W q
./run --open-file /mnt/virtiofs/mnt/a/foo102 -r -R q
./run --open-file /mnt/virtiofs/mnt/a/foo102 -a -t -W p
./run --open-file /mnt/virtiofs/mnt/a/foo102 -r -R p
/mnt/virtiofs/mnt/a/foo102: File size wrong (got 2, want 1)
After this patch, unionmount-testsuite passes with overlayfs on top of
virtiofs.
Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
---
fs/overlayfs/file.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: redhat-linux/fs/overlayfs/file.c
===================================================================
--- redhat-linux.orig/fs/overlayfs/file.c 2020-04-21 13:33:40.777125594 -0400
+++ redhat-linux/fs/overlayfs/file.c 2020-04-21 13:53:30.317125594 -0400
@@ -134,7 +134,7 @@ static int ovl_open(struct inode *inode,
return err;
/* No longer need these flags, so don't pass them on to underlying fs */
- file->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
+ file->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY);
realfile = ovl_open_realfile(file, ovl_inode_realdata(inode));
if (IS_ERR(realfile))
next reply other threads:[~2020-04-21 18:41 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-21 18:41 Vivek Goyal [this message]
2020-04-21 18:41 ` [Virtio-fs] [PATCH] overlayfs: Pass O_TRUNC flag to underlying filesystem Vivek Goyal
2020-04-21 18:59 ` Miklos Szeredi
2020-04-21 18:59 ` [Virtio-fs] " Miklos Szeredi
2020-04-21 19:31 ` Vivek Goyal
2020-04-21 19:31 ` [Virtio-fs] " Vivek Goyal
2020-04-21 21:04 ` Vivek Goyal
2020-04-21 21:04 ` [Virtio-fs] " Vivek Goyal
2020-04-22 8:31 ` Miklos Szeredi
2020-04-22 8:31 ` [Virtio-fs] " Miklos Szeredi
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=20200421184107.GC28740@redhat.com \
--to=vgoyal@redhat.com \
--cc=amir73il@gmail.com \
--cc=linux-unionfs@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=virtio-fs@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.