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

Commit e253d98f authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'work.read_write' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull nowait read support from Al Viro:
 "Support IOCB_NOWAIT for buffered reads and block devices"

* 'work.read_write' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  block_dev: support RFW_NOWAIT on block device nodes
  fs: support RWF_NOWAIT for buffered reads
  fs: support IOCB_NOWAIT in generic_file_buffered_read
  fs: pass iocb to do_generic_file_read
parents 0f0d1272 c35fc7a5
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -1606,12 +1606,6 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
		goto out_put_req;
	}

	if ((req->common.ki_flags & IOCB_NOWAIT) &&
			!(req->common.ki_flags & IOCB_DIRECT)) {
		ret = -EOPNOTSUPP;
		goto out_put_req;
	}

	ret = put_user(KIOCB_KEY, &user_iocb->aio_key);
	if (unlikely(ret)) {
		pr_debug("EFAULT: aio_key\n");
+5 −0
Original line number Diff line number Diff line
@@ -1740,6 +1740,8 @@ static int blkdev_open(struct inode * inode, struct file * filp)
	 */
	filp->f_flags |= O_LARGEFILE;

	filp->f_mode |= FMODE_NOWAIT;

	if (filp->f_flags & O_NDELAY)
		filp->f_mode |= FMODE_NDELAY;
	if (filp->f_flags & O_EXCL)
@@ -1892,6 +1894,9 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
	if (iocb->ki_pos >= size)
		return -ENOSPC;

	if ((iocb->ki_flags & (IOCB_NOWAIT | IOCB_DIRECT)) == IOCB_NOWAIT)
		return -EOPNOTSUPP;

	iov_iter_truncate(from, size - iocb->ki_pos);

	blk_start_plug(&plug);
+5 −1
Original line number Diff line number Diff line
@@ -1886,6 +1886,10 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
	loff_t oldsize;
	int clean_page = 0;

	if (!(iocb->ki_flags & IOCB_DIRECT) &&
	    (iocb->ki_flags & IOCB_NOWAIT))
		return -EOPNOTSUPP;

	if (!inode_trylock(inode)) {
		if (iocb->ki_flags & IOCB_NOWAIT)
			return -EAGAIN;
@@ -3112,7 +3116,7 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int whence)

static int btrfs_file_open(struct inode *inode, struct file *filp)
{
	filp->f_mode |= FMODE_AIO_NOWAIT;
	filp->f_mode |= FMODE_NOWAIT;
	return generic_file_open(inode, filp);
}

+3 −3
Original line number Diff line number Diff line
@@ -223,6 +223,8 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
	if (IS_DAX(inode))
		return ext4_dax_write_iter(iocb, from);
#endif
	if (!o_direct && (iocb->ki_flags & IOCB_NOWAIT))
		return -EOPNOTSUPP;

	if (!inode_trylock(inode)) {
		if (iocb->ki_flags & IOCB_NOWAIT)
@@ -431,9 +433,7 @@ static int ext4_file_open(struct inode * inode, struct file * filp)
			return ret;
	}

	/* Set the flags to support nowait AIO */
	filp->f_mode |= FMODE_AIO_NOWAIT;

	filp->f_mode |= FMODE_NOWAIT;
	return dquot_file_open(inode, filp);
}

+9 −2
Original line number Diff line number Diff line
@@ -259,7 +259,11 @@ xfs_file_buffered_aio_read(

	trace_xfs_file_buffered_read(ip, iov_iter_count(to), iocb->ki_pos);

	if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) {
		if (iocb->ki_flags & IOCB_NOWAIT)
			return -EAGAIN;
		xfs_ilock(ip, XFS_IOLOCK_SHARED);
	}
	ret = generic_file_read_iter(iocb, to);
	xfs_iunlock(ip, XFS_IOLOCK_SHARED);

@@ -636,6 +640,9 @@ xfs_file_buffered_aio_write(
	int			enospc = 0;
	int			iolock;

	if (iocb->ki_flags & IOCB_NOWAIT)
		return -EOPNOTSUPP;

write_retry:
	iolock = XFS_IOLOCK_EXCL;
	xfs_ilock(ip, iolock);
@@ -912,7 +919,7 @@ xfs_file_open(
		return -EFBIG;
	if (XFS_FORCED_SHUTDOWN(XFS_M(inode->i_sb)))
		return -EIO;
	file->f_mode |= FMODE_AIO_NOWAIT;
	file->f_mode |= FMODE_NOWAIT;
	return 0;
}

Loading