From: Curt Wohlgemuth <curtw@google.com>
To: Mingming <cmm@us.ibm.com>
Cc: tytso@mit.edu, ext4 development <linux-ext4@vger.kernel.org>
Subject: Re: [PATCH 2/4 v2] avoid perform unwritten convertion for direct IO over non fallocated space
Date: Tue, 20 Oct 2009 08:03:56 -0700 [thread overview]
Message-ID: <6601abe90910200803n1c499ba0w825c59c2f747dce8@mail.gmail.com> (raw)
In-Reply-To: <1255050810.4931.191.camel@mingming-laptop>
Hi Mingming:
On Thu, Oct 8, 2009 at 6:13 PM, Mingming <cmm@us.ibm.com> wrote:
> ext4: avoid perform unwritten convertion for direct IO over non fallocated space
>
> When direct IO complete, without this patch, it always check and convert
> the range covered by the completed IO to be written. This is unnecessary
> if the range doesn't has any preallocated area or holes. This patch add
> a state flag to alart direct IO code to only run the convertion when
> there is unwritten extents being covered in this IO.
>
> Signed-off-by: Mingming Cao <cmm@us.ibm.com>
> ---
> fs/ext4/ext4.h | 1 +
> fs/ext4/extents.c | 22 +++++++++++++++++-----
> fs/ext4/inode.c | 4 +++-
> 3 files changed, 21 insertions(+), 6 deletions(-)
>
> Index: linux-2.6.31-rc4/fs/ext4/ext4.h
> ===================================================================
> --- linux-2.6.31-rc4.orig/fs/ext4/ext4.h
> +++ linux-2.6.31-rc4/fs/ext4/ext4.h
> @@ -299,6 +299,7 @@ static inline __u32 ext4_mask_flags(umod
> #define EXT4_STATE_XATTR 0x00000004 /* has in-inode xattrs */
> #define EXT4_STATE_NO_EXPAND 0x00000008 /* No space for expansion */
> #define EXT4_STATE_DA_ALLOC_CLOSE 0x00000010 /* Alloc DA blks on close */
> +#define EXT4_STATE_DIO_UNWRITTEN 0x00000020 /* need convert on dio done*/
You'll need to change this value, since EXT4_STATE_EXT_MIGRATE has
already been assigned 0x20.
Thanks,
Curt
>
> /* Used to pass group descriptor data when online resize is done */
> struct ext4_new_group_input {
> Index: linux-2.6.31-rc4/fs/ext4/extents.c
> ===================================================================
> --- linux-2.6.31-rc4.orig/fs/ext4/extents.c
> +++ linux-2.6.31-rc4/fs/ext4/extents.c
> @@ -3029,12 +3029,18 @@ ext4_ext_handle_uninitialized_extents(ha
> ret = ext4_split_unwritten_extents(handle,
> inode, path, iblock,
> max_blocks, flags);
> - /* flag the io_end struct that we need convert when IO done */
> + /*
> + * Flag the inode(non aio case) or end_io struct (aio case)
> + * that this IO needs to convertion to written when IO is
> + * completed
> + */
> if (io)
> io->flag = DIO_AIO_UNWRITTEN;
> + else
> + EXT4_I(inode)->i_state |= EXT4_STATE_DIO_UNWRITTEN;
> goto out;
> }
> - /* DIO end_io complete, convert the filled extent to written */
> + /* async DIO end_io complete, convert the filled extent to written */
> if (flags == EXT4_GET_BLOCKS_DIO_CONVERT_EXT) {
> ret = ext4_convert_unwritten_extents_dio(handle, inode,
> path);
> @@ -3276,10 +3282,16 @@ int ext4_ext_get_blocks(handle_t *handle
> * To avoid unecessary convertion for every aio dio rewrite
> * to the mid of file, here we flag the IO that is really
> * need the convertion.
> - *
> + * For non asycn direct IO case, flag the inode state
> + * that we need to perform convertion when IO is done.
> */
> - if (io && flags == EXT4_GET_BLOCKS_DIO_CREATE_EXT)
> - io->flag = DIO_AIO_UNWRITTEN;
> + if (flags == EXT4_GET_BLOCKS_DIO_CREATE_EXT) {
> + if (io)
> + io->flag = DIO_AIO_UNWRITTEN;
> + else
> + EXT4_I(inode)->i_state |=
> + EXT4_STATE_DIO_UNWRITTEN;;
> + }
> }
> err = ext4_ext_insert_extent(handle, inode, path, &newex, flags);
> if (err) {
> Index: linux-2.6.31-rc4/fs/ext4/inode.c
> ===================================================================
> --- linux-2.6.31-rc4.orig/fs/ext4/inode.c
> +++ linux-2.6.31-rc4/fs/ext4/inode.c
> @@ -3693,7 +3693,8 @@ static ssize_t ext4_ext_direct_IO(int rw
> if (ret != -EIOCBQUEUED && ret <= 0 && iocb->private) {
> ext4_free_io_end(iocb->private);
> iocb->private = NULL;
> - } else if (ret > 0){
> + } else if (ret > 0 && EXT4_I(inode)->i_state &
> + EXT4_STATE_DIO_UNWRITTEN){
> int err;
> /*
> * for non AIO case, since the IO is already
> @@ -3703,6 +3704,7 @@ static ssize_t ext4_ext_direct_IO(int rw
> offset, ret);
> if (err < 0)
> ret = err;
> + EXT4_I(inode)->i_state &= ~EXT4_STATE_DIO_UNWRITTEN;
> }
> return ret;
> }
>
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2009-10-20 15:03 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-09 1:13 [PATCH 2/4 v2] avoid perform unwritten convertion for direct IO over non fallocated space Mingming
2009-10-20 15:03 ` Curt Wohlgemuth [this message]
2009-10-21 22:48 ` Mingming
2009-11-04 2:10 ` Theodore Tso
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=6601abe90910200803n1c499ba0w825c59c2f747dce8@mail.gmail.com \
--to=curtw@google.com \
--cc=cmm@us.ibm.com \
--cc=linux-ext4@vger.kernel.org \
--cc=tytso@mit.edu \
/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).