All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mingming <cmm@us.ibm.com>
To: tytso@mit.edu
Cc: ext4 development <linux-ext4@vger.kernel.org>,
	Curt Wohlgemuth <curtw@google.com>
Subject: [PATCH 1/4 v2] Direct IO return value fix for holes/fallocate
Date: Thu, 08 Oct 2009 18:13:16 -0700	[thread overview]
Message-ID: <1255050796.4931.190.camel@mingming-laptop> (raw)

ext4: Direct IO return value fix for holes/fallocate

When direct IO complete, ext4 will convert unwritten extents to written,
for
writes over preallocated space, or holes.

ext4_direct_IO should returns the number of bytes read/write on success.
However there is a bug that cause ext4_direct_IO returns the number of
bytes converted to written extents, which is 0 on success. This bug
causes
direct IO falls back to buffered IO even on sucessful rewrites or
preallocated space. 

Signed-off-by: Mingming Cao <cmm@us.ibm.com>
---
 fs/ext4/extents.c |    1 +
 fs/ext4/inode.c   |    8 ++++++--
 2 files changed, 7 insertions(+), 2 deletions(-)

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
@@ -3500,6 +3500,7 @@ retry:
  *
  * This function is called from the direct IO end io call back
  * function, to convert the fallocated extents after IO is completed.
+ * Returns 0 on success.
  */
 int ext4_convert_unwritten_extents(struct inode *inode, loff_t offset,
 				    loff_t len)
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,13 +3693,17 @@ 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){
+			int err;
 			/*
 			 * for non AIO case, since the IO is already
 			 * completed, we could do the convertion right here
 			 */
-			ret = ext4_convert_unwritten_extents(inode,
+			err = ext4_convert_unwritten_extents(inode,
 								offset, ret);
+			if (err < 0)
+				ret = err;
+		}
 		return ret;
 	}
 



             reply	other threads:[~2009-10-09  1:14 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-09  1:13 Mingming [this message]
2009-11-04  2:09 ` [PATCH 1/4 v2] Direct IO return value fix for holes/fallocate 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=1255050796.4931.190.camel@mingming-laptop \
    --to=cmm@us.ibm.com \
    --cc=curtw@google.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 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.