xfs
[Top] [All Lists]

Re: [PATCH v2] xfs: Fix wrong return value of xfs_file_aio_write

To: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Subject: Re: [PATCH v2] xfs: Fix wrong return value of xfs_file_aio_write
From: Markus Trippelsdorf <markus@xxxxxxxxxxxxxxx>
Date: Sun, 24 Jul 2011 13:58:26 +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=uaFPWxZXelWEMYe9 zVguuBXpKyM0jVTBSz8JFonzlwo=; b=UgMYeQVnHkChfWoWE/XgsjkmTHJu/Af8 mgPKw6Wha+MASFBJRab0jaH8wOHr3fgI6n84cN3mOkSZ5jjFvGjAaOH0cWoouOJM xzdBLqA2gpCxs3spWEUCWue0y+XvcwG1Im8mmozlKO8/wW1SYYOyTb10DWQBqXQ4 /qBIqYCCfV0=
In-reply-to: <20110724115420.GA1626@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>
(This time with with a proper signoff.)


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>
---
 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;
        }
 
 out_unlock:
-- 
Markus

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