UPSTREAM: gfs2: Add wrapper for iomap_file_buffered_write
commit 2eb7509a05443048fb4df60b782de3f03c6c298b upstream
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>
Signed-off-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit b88b998579)
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I144fa4b02e35bb8a1c9ac1f1f0ed149c5cdf91b6
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
6603584106
commit
3b46c843f2
@@ -877,6 +877,20 @@ out_uninit:
|
|||||||
return written ? written : ret;
|
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
|
* gfs2_file_write_iter - Perform a write to a file
|
||||||
* @iocb: The io context
|
* @iocb: The io context
|
||||||
@@ -928,9 +942,7 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
|
|||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
iocb->ki_flags |= IOCB_DSYNC;
|
iocb->ki_flags |= IOCB_DSYNC;
|
||||||
current->backing_dev_info = inode_to_bdi(inode);
|
buffered = gfs2_file_buffered_write(iocb, from);
|
||||||
buffered = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops);
|
|
||||||
current->backing_dev_info = NULL;
|
|
||||||
if (unlikely(buffered <= 0)) {
|
if (unlikely(buffered <= 0)) {
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = buffered;
|
ret = buffered;
|
||||||
@@ -944,7 +956,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
|
* the direct I/O range as we don't know if the buffered pages
|
||||||
* made it to disk.
|
* made it to disk.
|
||||||
*/
|
*/
|
||||||
iocb->ki_pos += buffered;
|
|
||||||
ret2 = generic_write_sync(iocb, buffered);
|
ret2 = generic_write_sync(iocb, buffered);
|
||||||
invalidate_mapping_pages(mapping,
|
invalidate_mapping_pages(mapping,
|
||||||
(iocb->ki_pos - buffered) >> PAGE_SHIFT,
|
(iocb->ki_pos - buffered) >> PAGE_SHIFT,
|
||||||
@@ -952,14 +963,10 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
|
|||||||
if (!ret || ret2 > 0)
|
if (!ret || ret2 > 0)
|
||||||
ret += ret2;
|
ret += ret2;
|
||||||
} else {
|
} else {
|
||||||
current->backing_dev_info = inode_to_bdi(inode);
|
ret = gfs2_file_buffered_write(iocb, from);
|
||||||
ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops);
|
if (likely(ret > 0))
|
||||||
current->backing_dev_info = NULL;
|
|
||||||
if (likely(ret > 0)) {
|
|
||||||
iocb->ki_pos += ret;
|
|
||||||
ret = generic_write_sync(iocb, ret);
|
ret = generic_write_sync(iocb, ret);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
inode_unlock(inode);
|
inode_unlock(inode);
|
||||||
|
|||||||
Reference in New Issue
Block a user