Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2592217 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Al Viro
Browse files

fs: simplify the generic_write_sync prototype



The kiocb already has the new position, so use that.  The only interesting
case is AIO, where we currently don't bother updating ki_pos.  We're about
to free the kiocb after we're done, so we might as well update it to make
everyone's life simpler.

While we're at it also return the bytes written argument passed in if
we were successful so that the boilerplate error switch code in the
callers can go away.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent dde0c2e7
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -1660,12 +1660,8 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)

	blk_start_plug(&plug);
	ret = __generic_file_write_iter(iocb, from);
	if (ret > 0) {
		ssize_t err;
		err = generic_write_sync(iocb, iocb->ki_pos - ret, ret);
		if (err < 0)
			ret = err;
	}
	if (ret > 0)
		ret = generic_write_sync(iocb, ret);
	blk_finish_plug(&plug);
	return ret;
}
+2 −5
Original line number Diff line number Diff line
@@ -1851,11 +1851,8 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
	spin_lock(&BTRFS_I(inode)->lock);
	BTRFS_I(inode)->last_sub_trans = root->log_transid;
	spin_unlock(&BTRFS_I(inode)->lock);
	if (num_written > 0) {
		err = generic_write_sync(iocb, pos, num_written);
		if (err < 0)
			num_written = err;
	}
	if (num_written > 0)
		num_written = generic_write_sync(iocb, num_written);

	if (sync)
		atomic_dec(&BTRFS_I(inode)->sync_writers);
+2 −5
Original line number Diff line number Diff line
@@ -2687,11 +2687,8 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from)
out:
	inode_unlock(inode);

	if (rc > 0) {
		ssize_t err = generic_write_sync(iocb, iocb->ki_pos - rc, rc);
		if (err < 0)
			rc = err;
	}
	if (rc > 0)
		rc = generic_write_sync(iocb, rc);
	up_read(&cinode->lock_sem);
	return rc;
}
+9 −8
Original line number Diff line number Diff line
@@ -256,6 +256,7 @@ static ssize_t dio_complete(struct dio *dio, ssize_t ret, bool is_async)
	if (dio->end_io) {
		int err;

		// XXX: ki_pos??
		err = dio->end_io(dio->iocb, offset, ret, dio->private);
		if (err)
			ret = err;
@@ -265,15 +266,15 @@ static ssize_t dio_complete(struct dio *dio, ssize_t ret, bool is_async)
		inode_dio_end(dio->inode);

	if (is_async) {
		if (dio->rw & WRITE) {
			int err;

			err = generic_write_sync(dio->iocb, offset,
						 transferred);
			if (err < 0 && ret > 0)
				ret = err;
		}
		/*
		 * generic_write_sync expects ki_pos to have been updated
		 * already, but the submission path only does this for
		 * synchronous I/O.
		 */
		dio->iocb->ki_pos += transferred;

		if (dio->rw & WRITE)
			ret = generic_write_sync(dio->iocb,  transferred);
		dio->iocb->ki_complete(dio->iocb, ret, 0);
	}

+2 −7
Original line number Diff line number Diff line
@@ -169,13 +169,8 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
	ret = __generic_file_write_iter(iocb, from);
	inode_unlock(inode);

	if (ret > 0) {
		ssize_t err;

		err = generic_write_sync(iocb, iocb->ki_pos - ret, ret);
		if (err < 0)
			ret = err;
	}
	if (ret > 0)
		ret = generic_write_sync(iocb, ret);
	if (o_direct)
		blk_finish_plug(&plug);

Loading