xfs
[Top] [All Lists]

[PATCH 4/4] xfs: Protect xfs_file_aio_write() with sb_start_write - sb_e

To: linux-fsdevel@xxxxxxxxxxxxxxx
Subject: [PATCH 4/4] xfs: Protect xfs_file_aio_write() with sb_start_write - sb_end_write
From: Jan Kara <jack@xxxxxxx>
Date: Thu, 12 Jan 2012 02:20:53 +0100
Cc: LKML <linux-kernel@xxxxxxxxxxxxxxx>, linux-ext4@xxxxxxxxxxxxxxx, xfs@xxxxxxxxxxx, Eric Sandeen <sandeen@xxxxxxxxxxx>, Dave Chinner <dchinner@xxxxxxxxxx>, Surbhi Palande <csurbhi@xxxxxxxxx>, Kamal Mostafa <kamal@xxxxxxxxxxxxx>, Christoph Hellwig <hch@xxxxxxxxxxxxx>, Jan Kara <jack@xxxxxxx>, Ben Myers <bpm@xxxxxxx>, Alex Elder <elder@xxxxxxxxxx>
In-reply-to: <1326331253-6497-1-git-send-email-jack@xxxxxxx>
References: <1326331253-6497-1-git-send-email-jack@xxxxxxx>
Replace racy xfs_wait_for_freeze() check with reliable sb_start_write()
- sb_end_write() locking. Due to lock ranking dictated by the page fault
code we have to call sb_start_write() after we acquire ilock.

CC: Ben Myers <bpm@xxxxxxx>
CC: Alex Elder <elder@xxxxxxxxxx>
Signed-off-by: Jan Kara <jack@xxxxxxx>
---
 fs/xfs/xfs_file.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 753ed9b..c5f879b 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -862,9 +862,11 @@ xfs_file_dio_aio_write(
                *iolock = XFS_IOLOCK_SHARED;
        }
 
+       sb_start_write(inode->i_sb);
        trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0);
        ret = generic_file_direct_write(iocb, iovp,
                        &nr_segs, pos, &iocb->ki_pos, count, ocount);
+       sb_end_write(inode->i_sb);
 
        /* No fallback to buffered IO on errors for XFS. */
        ASSERT(ret < 0 || ret == count);
@@ -899,6 +901,7 @@ xfs_file_buffered_aio_write(
        /* We can write back this queue in page reclaim */
        current->backing_dev_info = mapping->backing_dev_info;
 
+       sb_start_write(inode->i_sb);
 write_retry:
        trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, 0);
        ret = generic_file_buffered_write(iocb, iovp, nr_segs,
@@ -914,6 +917,7 @@ write_retry:
                enospc = 1;
                goto write_retry;
        }
+       sb_end_write(inode->i_sb);
        current->backing_dev_info = NULL;
        return ret;
 }
@@ -945,8 +949,6 @@ xfs_file_aio_write(
        if (ocount == 0)
                return 0;
 
-       xfs_wait_for_freeze(ip->i_mount, SB_FREEZE_WRITE);
-
        if (XFS_FORCED_SHUTDOWN(ip->i_mount))
                return -EIO;
 
-- 
1.7.1

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