Commit 2eb7509a authored by Andreas Gruenbacher's avatar Andreas Gruenbacher
Browse files

gfs2: Add wrapper for iomap_file_buffered_write



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: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent cdd591fc
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -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,14 +962,10 @@ 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:
	inode_unlock(inode);