lkml.org 
[lkml]   [2015]   [May]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.13.y-ckt 70/90] ocfs2: _really_ sync the right range
    Date
    3.13.11-ckt20 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Al Viro <viro@zeniv.linux.org.uk>

    commit 64b4e2526d1cf6e6a4db6213d6e2b6e6ab59479a upstream.

    "ocfs2 syncs the wrong range" had been broken; prior to it the
    code was doing the wrong thing in case of O_APPEND, all right,
    but _after_ it we were syncing the wrong range in 100% cases.
    *ppos, aka iocb->ki_pos is incremented prior to that point,
    so we are always doing sync on the area _after_ the one we'd
    written to.

    Spotted by Joseph Qi <joseph.qi@huawei.com> back in January;
    unfortunately, I'd missed his mail back then ;-/

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    fs/ocfs2/file.c | 14 ++++++++++----
    1 file changed, 10 insertions(+), 4 deletions(-)

    diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
    index 5850a81..7f47331 100644
    --- a/fs/ocfs2/file.c
    +++ b/fs/ocfs2/file.c
    @@ -2368,10 +2368,14 @@ out_dio:
    /* buffered aio wouldn't have proper lock coverage today */
    BUG_ON(ret == -EIOCBQUEUED && !(file->f_flags & O_DIRECT));

    + if (unlikely(written <= 0))
    + goto no_sync;
    +
    if (((file->f_flags & O_DSYNC) && !direct_io) || IS_SYNC(inode) ||
    ((file->f_flags & O_DIRECT) && !direct_io)) {
    - ret = filemap_fdatawrite_range(file->f_mapping, *ppos,
    - *ppos + count - 1);
    + ret = filemap_fdatawrite_range(file->f_mapping,
    + iocb->ki_pos - written,
    + iocb->ki_pos - 1);
    if (ret < 0)
    written = ret;

    @@ -2384,10 +2388,12 @@ out_dio:
    }

    if (!ret)
    - ret = filemap_fdatawait_range(file->f_mapping, *ppos,
    - *ppos + count - 1);
    + ret = filemap_fdatawait_range(file->f_mapping,
    + iocb->ki_pos - written,
    + iocb->ki_pos - 1);
    }

    +no_sync:
    /*
    * deep in g_f_a_w_n()->ocfs2_direct_IO we pass in a ocfs2_dio_end_io
    * function pointer which is called when o_direct io completes so that
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-05-05 23:41    [W:4.126 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site