[Top] [All Lists]

[PATCH] xfs: Fix wrong return value of xfs_file_aio_write

To: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Subject: [PATCH] xfs: Fix wrong return value of xfs_file_aio_write
From: Markus Trippelsdorf <markus@xxxxxxxxxxxxxxx>
Date: Sun, 24 Jul 2011 14:03:30 +0200
Cc: Josef Bacik <josef@xxxxxxxxxx>, linux-fsdevel@xxxxxxxxxxxxxxx, viro@xxxxxxxxxxxxxxxxxx, jack@xxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, Dave Chinner <david@xxxxxxxxxxxxx>, xfs@xxxxxxxxxxx
Dkim-signature: v=1; a=rsa-sha256; c=simple; d=mail.ud10.udmedia.de; h= date:from:to:cc:subject:message-id:references:mime-version: content-type:in-reply-to; q=dns/txt; s=beta; bh=b+pJNKtkqv0XdKrd hEBCOMsaV4KLfoogdcomEScVhLY=; b=sG4FtYaQFqIt36cF63f5U7TbKIHJMWMR KtDDI4TI0wQ31P8UihQaEh9LDxFhq33iJ2OE/ipI0hEi+BKAWJTWL+LNJLpL1WOj 0z4m21c2YMv6CPWsF0ShwoKycLfVdJ50cB6+Zh6p6QlQer/y8y++piEUdx6zDuBs E6FmUZx6f7A=
In-reply-to: <20110724115826.GB1626@xxxxxxxxxxxxxx>
References: <1309370716-12235-1-git-send-email-josef@xxxxxxxxxx> <20110723180942.GA1616@xxxxxxxxxxxxxx> <4E2B2E88.8080006@xxxxxxxxxx> <20110723203824.GB1652@xxxxxxxxxxxxxx> <20110723220212.GA1648@xxxxxxxxxxxxxx> <20110724111625.GA12658@xxxxxxxxxxxxx> <20110724115420.GA1626@xxxxxxxxxxxxxx> <20110724115826.GB1626@xxxxxxxxxxxxxx>
The fsync prototype change commit 02c24a82187d accidentally overwrote
the ssize_t return value of xfs_file_aio_write with 0 for SYNC type
writes. Fix this by checking if an error occured when calling
xfs_file_fsync and only change the return value in this case.
In addition xfs_file_fsync actually returns a normal negative error, so
fix this, too.

Signed-off-by: Markus Trippelsdorf <markus@xxxxxxxxxxxxxxx>
Reviewed-by: Christoph Hellwig <hch@xxxxxx>
Tested-by: Christoph Hellwig <hch@xxxxxx>
 fs/xfs/linux-2.6/xfs_file.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c
index cca00f4..825390e 100644
--- a/fs/xfs/linux-2.6/xfs_file.c
+++ b/fs/xfs/linux-2.6/xfs_file.c
@@ -881,11 +881,14 @@ xfs_file_aio_write(
        /* Handle various SYNC-type writes */
        if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) {
                loff_t end = pos + ret - 1;
+               int error;
                xfs_rw_iunlock(ip, iolock);
-               ret = -xfs_file_fsync(file, pos, end,
+               error = xfs_file_fsync(file, pos, end,
                                      (file->f_flags & __O_SYNC) ? 0 : 1);
                xfs_rw_ilock(ip, iolock);
+               if (error)
+                       ret = error;

<Prev in Thread] Current Thread [Next in Thread>