From: Eiichi Tsukata <devel@etsukata.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH v1 4/4] overlayfs: fix race between llseek SEEK_END and write
Date: Wed, 21 Nov 2018 11:44:00 +0900 [thread overview]
Message-ID: <20181121024400.4346-5-devel@etsukata.com> (raw)
In-Reply-To: <20181121024400.4346-1-devel@etsukata.com>
Implement individual lock for SEEK_END for overlayfs which directly calls
generic_file_llseek_size().
Signed-off-by: Eiichi Tsukata <devel@etsukata.com>
---
fs/overlayfs/file.c | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c
index 84dd957efa24..57bc6538eea8 100644
--- a/fs/overlayfs/file.c
+++ b/fs/overlayfs/file.c
@@ -146,10 +146,27 @@ static int ovl_release(struct inode *inode, struct file *file)
static loff_t ovl_llseek(struct file *file, loff_t offset, int whence)
{
struct inode *realinode = ovl_inode_real(file_inode(file));
+ loff_t ret;
- return generic_file_llseek_size(file, offset, whence,
- realinode->i_sb->s_maxbytes,
- i_size_read(realinode));
+ switch (whence) {
+ default:
+ return generic_file_llseek_size(file, offset, whence,
+ realinode->i_sb->s_maxbytes,
+ i_size_read(realinode));
+ case SEEK_END:
+ case SEEK_DATA:
+ case SEEK_HOLE:
+ /*
+ * protects against inode size race with write so that llseek
+ * doesn't see inode size being updated in individual fs write
+ */
+ inode_lock(realinode);
+ ret = generic_file_llseek_size(file, offset, whence,
+ realinode->i_sb->s_maxbytes,
+ i_size_read(realinode));
+ inode_unlock(realinode);
+ return ret;
+ }
}
static void ovl_file_accessed(struct file *file)
--
2.19.1
WARNING: multiple messages have this Message-ID (diff)
From: Eiichi Tsukata <devel@etsukata.com>
To: andi@firstfloor.org, Chris Mason <clm@fb.com>,
Josef Bacik <josef@toxicpanda.com>,
David Sterba <dsterba@suse.com>, "Theodore Ts'o" <tytso@mit.edu>,
Andreas Dilger <adilger.kernel@dilger.ca>,
Jaegeuk Kim <jaegeuk@kernel.org>, Chao Yu <yuchao0@huawei.com>,
Miklos Szeredi <miklos@szeredi.hu>,
Bob Peterson <rpeterso@redhat.com>,
Andreas Gruenbacher <agruenba@redhat.com>,
Alexander Viro <viro@zeniv.linux.org.uk>,
linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net,
linux-fsdevel@vger.kernel.org, cluster-devel@redhat.com,
linux-unionfs@vger.kernel.org
Cc: Eiichi Tsukata <devel@etsukata.com>
Subject: [PATCH v1 4/4] overlayfs: fix race between llseek SEEK_END and write
Date: Wed, 21 Nov 2018 11:44:00 +0900 [thread overview]
Message-ID: <20181121024400.4346-5-devel@etsukata.com> (raw)
In-Reply-To: <20181121024400.4346-1-devel@etsukata.com>
Implement individual lock for SEEK_END for overlayfs which directly calls
generic_file_llseek_size().
Signed-off-by: Eiichi Tsukata <devel@etsukata.com>
---
fs/overlayfs/file.c | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c
index 84dd957efa24..57bc6538eea8 100644
--- a/fs/overlayfs/file.c
+++ b/fs/overlayfs/file.c
@@ -146,10 +146,27 @@ static int ovl_release(struct inode *inode, struct file *file)
static loff_t ovl_llseek(struct file *file, loff_t offset, int whence)
{
struct inode *realinode = ovl_inode_real(file_inode(file));
+ loff_t ret;
- return generic_file_llseek_size(file, offset, whence,
- realinode->i_sb->s_maxbytes,
- i_size_read(realinode));
+ switch (whence) {
+ default:
+ return generic_file_llseek_size(file, offset, whence,
+ realinode->i_sb->s_maxbytes,
+ i_size_read(realinode));
+ case SEEK_END:
+ case SEEK_DATA:
+ case SEEK_HOLE:
+ /*
+ * protects against inode size race with write so that llseek
+ * doesn't see inode size being updated in individual fs write
+ */
+ inode_lock(realinode);
+ ret = generic_file_llseek_size(file, offset, whence,
+ realinode->i_sb->s_maxbytes,
+ i_size_read(realinode));
+ inode_unlock(realinode);
+ return ret;
+ }
}
static void ovl_file_accessed(struct file *file)
--
2.19.1
next prev parent reply other threads:[~2018-11-21 2:44 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-21 2:43 [Cluster-devel] [PATCH v1 0/4] fs: fix race between llseek SEEK_END and write Eiichi Tsukata
2018-11-21 2:43 ` Eiichi Tsukata
2018-11-21 2:43 ` [Cluster-devel] [PATCH v1 1/4] vfs: " Eiichi Tsukata
2018-11-21 2:43 ` Eiichi Tsukata
2018-11-21 2:43 ` [Cluster-devel] [PATCH v1 2/4] ext4: " Eiichi Tsukata
2018-11-21 2:43 ` Eiichi Tsukata
2018-11-21 2:43 ` [Cluster-devel] [PATCH v1 3/4] f2fs: " Eiichi Tsukata
2018-11-21 2:43 ` Eiichi Tsukata
2018-11-21 9:23 ` [Cluster-devel] " Christoph Hellwig
2018-11-21 9:23 ` Christoph Hellwig
2018-11-22 5:42 ` [Cluster-devel] " Eiichi Tsukata
2018-11-22 5:42 ` Eiichi Tsukata
2018-11-21 2:44 ` Eiichi Tsukata [this message]
2018-11-21 2:44 ` [PATCH v1 4/4] overlayfs: " Eiichi Tsukata
2018-11-21 4:54 ` [Cluster-devel] [PATCH v1 0/4] fs: " Al Viro
2018-11-21 4:54 ` Al Viro
2018-11-22 5:40 ` [Cluster-devel] " Eiichi Tsukata
2018-11-22 5:40 ` Eiichi Tsukata
2018-11-22 7:06 ` [Cluster-devel] " Al Viro
2018-11-22 7:06 ` Al Viro
2018-11-26 2:54 ` [Cluster-devel] " Eiichi Tsukata
2018-11-26 2:54 ` Eiichi Tsukata
2018-11-26 2:54 ` Eiichi Tsukata
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=20181121024400.4346-5-devel@etsukata.com \
--to=devel@etsukata.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.