From: Ted Ts'o <tytso@mit.edu>
To: Jiaying Zhang <jiayingz@google.com>
Cc: linux-ext4@vger.kernel.org
Subject: Re: [PATCH] ext4: use vmtruncate() instead of ext4_truncate() in ext4_setattr()
Date: Sun, 22 May 2011 19:56:26 -0400 [thread overview]
Message-ID: <20110522235625.GC10009@thunk.org> (raw)
In-Reply-To: <20110517225926.8B4A94225B@ruihe.smo.corp.google.com>
Here's a cleaner way of fixing the problem. vmtruncate() is now
deprecated, so I'm using truncate_setsize() instead; in addition, I
avoid calling ext4_truncate() twice in the case where EOFBLOCKS_FL.
Since ext4_truncate() is a very heavyweight function, which requires
manipulating the orphan list and taking i_data_sem, avoiding a double
call of ext4_truncate() is a big win.
- Ted
commit bb5eabd2de1e9dfdeeac822174fba17f2d2a7f2b
Author: Theodore Ts'o <tytso@mit.edu>
Date: Sun May 22 19:45:01 2011 -0400
ext4: use truncate_setsize() unconditionally
In commit c8d46e41 (ext4: Add flag to files with blocks intentionally
past EOF), if the EOFBLOCKS_FL flag is set, we call ext4_truncate()
before calling vmtruncate(). This caused any allocated but unwritten
blocks created by calling fallocate() with the FALLOC_FL_KEEP_SIZE
flag to be dropped. This was done to make to make sure that
EOFBLOCKS_FL would not be cleared while still leaving blocks past
i_size allocated. This was not necessary, since ext4_truncate()
guarantees that blocks past i_size will be dropped, even in the case
where truncate() has increased i_size before calling ext4_truncate().
So fix this by removing the EOFBLOCKS_FL special case treatment in
ext4_setattr(). In addition, use truncate_setsize() followed by a
call to ext4_truncate() instead of using vmtruncate(). This is more
efficient since it skips the call to inode_newsize_ok(), which has
been checked already by inode_change_ok(). This is also in a win in
the case where EOFBLOCKS_FL is set since it avoids calling
ext4_truncate() twice.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index df3fb20..4ca8411 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -5363,8 +5363,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
if (S_ISREG(inode->i_mode) &&
attr->ia_valid & ATTR_SIZE &&
- (attr->ia_size < inode->i_size ||
- (ext4_test_inode_flag(inode, EXT4_INODE_EOFBLOCKS)))) {
+ (attr->ia_size < inode->i_size)) {
handle_t *handle;
handle = ext4_journal_start(inode, 3);
@@ -5398,14 +5397,13 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
goto err_out;
}
}
- /* ext4_truncate will clear the flag */
- if ((ext4_test_inode_flag(inode, EXT4_INODE_EOFBLOCKS)))
- ext4_truncate(inode);
}
if ((attr->ia_valid & ATTR_SIZE) &&
- attr->ia_size != i_size_read(inode))
- rc = vmtruncate(inode, attr->ia_size);
+ attr->ia_size != i_size_read(inode)) {
+ truncate_setsize(inode, attr->ia_size);
+ ext4_truncate(inode);
+ }
if (!rc) {
setattr_copy(inode, attr);
next prev parent reply other threads:[~2011-05-22 23:56 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-17 22:59 [PATCH] ext4: use vmtruncate() instead of ext4_truncate() in ext4_setattr() Jiaying Zhang
2011-05-18 2:46 ` Yongqiang Yang
2011-05-18 2:56 ` Yongqiang Yang
2011-05-18 3:27 ` Yongqiang Yang
2011-05-18 3:19 ` Eric Sandeen
2011-05-18 5:35 ` Andreas Dilger
2011-05-18 20:32 ` Jiaying Zhang
2011-05-18 20:45 ` Andreas Dilger
2011-05-18 20:57 ` Jiaying Zhang
2011-05-18 6:13 ` Dave Chinner
2011-05-18 14:05 ` Eric Sandeen
2011-05-18 20:42 ` Jiaying Zhang
2011-05-18 20:29 ` Jiaying Zhang
[not found] ` <BANLkTi=Yv_q820aHFa2wkCL-PnYNcZdWCQ@mail.gmail.com>
2011-05-18 20:31 ` Eric Sandeen
2011-05-18 20:38 ` Jiaying Zhang
2011-05-22 23:56 ` Ted Ts'o [this message]
2011-05-23 18:30 ` Jiaying Zhang
2011-05-23 19:19 ` [PATCH -v2] ext4: use truncate_setsize() unconditionally Theodore Ts'o
2011-05-23 20:22 ` Jiaying Zhang
2011-05-24 14:30 ` Eric Sandeen
2011-05-24 22:06 ` Jiaying Zhang
2011-05-24 22:31 ` Eric Sandeen
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=20110522235625.GC10009@thunk.org \
--to=tytso@mit.edu \
--cc=jiayingz@google.com \
--cc=linux-ext4@vger.kernel.org \
/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.