lkml.org 
[lkml]   [2021]   [Nov]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v9 06/17] gfs2: Add wrapper for iomap_file_buffered_write
    Date
    Add a wrapper around iomap_file_buffered_write.  We'll add code for when
    the operation needs to be retried here later.

    Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
    ---
    fs/gfs2/file.c | 27 +++++++++++++++++----------
    1 file changed, 17 insertions(+), 10 deletions(-)

    diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
    index c559827cb6f9..da742b470f23 100644
    --- a/fs/gfs2/file.c
    +++ b/fs/gfs2/file.c
    @@ -876,6 +876,20 @@ static ssize_t gfs2_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
    return written ? written : ret;
    }

    +static ssize_t gfs2_file_buffered_write(struct kiocb *iocb, struct iov_iter *from)
    +{
    + struct file *file = iocb->ki_filp;
    + struct inode *inode = file_inode(file);
    + ssize_t ret;
    +
    + current->backing_dev_info = inode_to_bdi(inode);
    + ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops);
    + current->backing_dev_info = NULL;
    + if (ret > 0)
    + iocb->ki_pos += ret;
    + return ret;
    +}
    +
    /**
    * gfs2_file_write_iter - Perform a write to a file
    * @iocb: The io context
    @@ -927,9 +941,7 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
    goto out_unlock;

    iocb->ki_flags |= IOCB_DSYNC;
    - current->backing_dev_info = inode_to_bdi(inode);
    - buffered = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops);
    - current->backing_dev_info = NULL;
    + buffered = gfs2_file_buffered_write(iocb, from);
    if (unlikely(buffered <= 0)) {
    if (!ret)
    ret = buffered;
    @@ -943,7 +955,6 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
    * the direct I/O range as we don't know if the buffered pages
    * made it to disk.
    */
    - iocb->ki_pos += buffered;
    ret2 = generic_write_sync(iocb, buffered);
    invalidate_mapping_pages(mapping,
    (iocb->ki_pos - buffered) >> PAGE_SHIFT,
    @@ -951,13 +962,9 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
    if (!ret || ret2 > 0)
    ret += ret2;
    } else {
    - current->backing_dev_info = inode_to_bdi(inode);
    - ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops);
    - current->backing_dev_info = NULL;
    - if (likely(ret > 0)) {
    - iocb->ki_pos += ret;
    + ret = gfs2_file_buffered_write(iocb, from);
    + if (likely(ret > 0))
    ret = generic_write_sync(iocb, ret);
    - }
    }

    out_unlock:
    --
    2.31.1
    \
     
     \ /
      Last update: 2021-11-02 13:31    [W:3.914 / U:0.544 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site