From: Lukas Czerner <lczerner@redhat.com>
To: linux-fsdevel@vger.kernel.org
Cc: Lukas Czerner <lczerner@redhat.com>,
ceph-devel@vger.kernel.org, linux-ext4@vger.kernel.org,
xfs@oss.sgi.com
Subject: [PATCH 3/4] fs: Remove i_size check from do_fallocate
Date: Fri, 11 Apr 2014 20:57:44 +0200 [thread overview]
Message-ID: <1397242665-2183-3-git-send-email-lczerner@redhat.com> (raw)
In-Reply-To: <1397242665-2183-1-git-send-email-lczerner@redhat.com>
Currently in do_fallocate in collapse range case we're checking whether
offset + len is not bigger than i_size. However there is nothing which
would prevent i_size from changing so the check is pointless. It should
be done in the file system itself and the file system needs to make sure
that i_size is not going to change.
As it is now we can easily crash kernel by having two processes doing
truncate and fallocate collapse range at the same time. This can be
reproduced on ext4 and it is theoretically possible on xfs even though I
was not able to trigger it with this simple test.
This commit removes the check from do_fallocate and adds it to the file
system.
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
---
fs/ext4/extents.c | 11 +++++++++--
fs/open.c | 8 --------
fs/xfs/xfs_file.c | 10 +++++++++-
3 files changed, 18 insertions(+), 11 deletions(-)
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 0177150..ff823b7 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -5364,8 +5364,6 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
loff_t new_size;
int ret;
- BUG_ON(offset + len > i_size_read(inode));
-
/* Collapse range works only on fs block size aligned offsets. */
if (offset & (EXT4_BLOCK_SIZE(sb) - 1) ||
len & (EXT4_BLOCK_SIZE(sb) - 1))
@@ -5387,6 +5385,15 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
/* Take mutex lock */
mutex_lock(&inode->i_mutex);
+ /*
+ * There is no need to overlap collapse range with EOF, in which case
+ * it is effectively a truncate operation
+ */
+ if (offset + len >= i_size_read(inode)) {
+ ret = -EINVAL;
+ goto out_mutex;
+ }
+
if (IS_SWAPFILE(inode)) {
ret = -ETXTBSY;
goto out_mutex;
diff --git a/fs/open.c b/fs/open.c
index 7882ff5..14af6be 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -287,14 +287,6 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0))
return -EFBIG;
- /*
- * There is no need to overlap collapse range with EOF, in which case
- * it is effectively a truncate operation
- */
- if ((mode & FALLOC_FL_COLLAPSE_RANGE) &&
- (offset + len >= i_size_read(inode)))
- return -EINVAL;
-
if (!file->f_op->fallocate)
return -EOPNOTSUPP;
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 003c005..4ba0ae9 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -840,7 +840,15 @@ xfs_file_fallocate(
goto out_unlock;
}
- ASSERT(offset + len < i_size_read(inode));
+ /*
+ * There is no need to overlap collapse range with EOF,
+ * in which case it is effectively a truncate operation
+ */
+ if (offset + len >= i_size_read(inode)) {
+ error = -EINVAL;
+ goto out_unlock;
+ }
+
new_size = i_size_read(inode) - len;
error = xfs_collapse_file_space(ip, offset, len);
--
1.8.3.1
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2014-04-11 18:57 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-11 18:57 [PATCH 1/4] ext4: Remove unnecessary check for APPEND and IMMUTABLE Lukas Czerner
2014-04-11 18:57 ` [PATCH 2/4] fs: Prevent doing FALLOC_FL_ZERO_RANGE on append only file Lukas Czerner
2014-04-12 13:49 ` Theodore Ts'o
2014-04-12 15:19 ` Christoph Hellwig
2014-04-15 13:09 ` Lukáš Czerner
2014-04-15 21:36 ` Dave Chinner
2014-04-11 18:57 ` Lukas Czerner [this message]
2014-04-12 13:59 ` [PATCH 3/4] fs: Remove i_size check from do_fallocate Theodore Ts'o
2014-04-13 23:39 ` Dave Chinner
2014-04-12 15:21 ` Christoph Hellwig
2014-04-15 13:10 ` Lukáš Czerner
2014-04-15 15:36 ` Theodore Ts'o
2014-04-15 16:09 ` Lukáš Czerner
2014-04-15 19:40 ` Theodore Ts'o
2014-04-15 19:57 ` Lukáš Czerner
2014-04-11 18:57 ` [PATCH 4/4] fs: Disallow all fallocate operation on active swapfile Lukas Czerner
2014-04-12 14:06 ` Theodore Ts'o
2014-04-12 15:22 ` Christoph Hellwig
2014-04-15 13:19 ` Lukáš Czerner
2014-04-12 13:48 ` [PATCH 1/4] ext4: Remove unnecessary check for APPEND and IMMUTABLE Theodore Ts'o
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=1397242665-2183-3-git-send-email-lczerner@redhat.com \
--to=lczerner@redhat.com \
--cc=ceph-devel@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=xfs@oss.sgi.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).