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

Commit c4f895cb authored by Jens Axboe's avatar Jens Axboe
Browse files

[PATCH] splice: cleanup the SPLICE_F_NONBLOCK handling



- generic_file_splice_read() more readable and correct
- Don't bail on page allocation with NONBLOCK set, just don't allow
  direct blocking on IO (eg lock_page).

Signed-off-by: default avatarJens Axboe <axboe@suse.de>
parent 91ad66ef
Loading
Loading
Loading
Loading
+16 −14
Original line number Diff line number Diff line
@@ -278,14 +278,6 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
		 */
		page = find_get_page(mapping, index);
		if (!page) {
			/*
			 * If in nonblock mode then dont block on
			 * readpage (we've kicked readahead so there
			 * will be asynchronous progress):
			 */
			if (flags & SPLICE_F_NONBLOCK)
				break;

			/*
			 * page didn't exist, allocate one
			 */
@@ -307,6 +299,13 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
		 * If the page isn't uptodate, we may need to start io on it
		 */
		if (!PageUptodate(page)) {
			/*
			 * If in nonblock mode then dont block on waiting
			 * for an in-flight io page
			 */
			if (flags & SPLICE_F_NONBLOCK)
				break;

			lock_page(page);

			/*
@@ -400,17 +399,20 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos,
	while (len) {
		ret = __generic_file_splice_read(in, ppos, pipe, len, flags);

		if (ret <= 0)
		if (ret < 0)
			break;
		else if (!ret) {
			if (spliced)
				break;
			if (flags & SPLICE_F_NONBLOCK) {
				ret = -EAGAIN;
				break;
			}
		}

		*ppos += ret;
		len -= ret;
		spliced += ret;

		if (!(flags & SPLICE_F_NONBLOCK))
			continue;
		ret = -EAGAIN;
		break;
	}

	if (spliced)