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

Commit 0b94e97a authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Matthew Wilcox
Browse files

Use lock_page_killable



Replacing lock_page with lock_page_killable in do_generic_mapping_read()
allows us to kill `cat' of a file on an NFS-mounted filesystem

Signed-off-by: default avatarMatthew Wilcox <willy@linux.intel.com>
parent 2687a356
Loading
Loading
Loading
Loading
+7 −4
Original line number Original line Diff line number Diff line
@@ -982,7 +982,8 @@ void do_generic_mapping_read(struct address_space *mapping,


page_not_up_to_date:
page_not_up_to_date:
		/* Get exclusive access to the page ... */
		/* Get exclusive access to the page ... */
		lock_page(page);
		if (lock_page_killable(page))
			goto readpage_eio;


		/* Did it get truncated before we got the lock? */
		/* Did it get truncated before we got the lock? */
		if (!page->mapping) {
		if (!page->mapping) {
@@ -1010,7 +1011,8 @@ void do_generic_mapping_read(struct address_space *mapping,
		}
		}


		if (!PageUptodate(page)) {
		if (!PageUptodate(page)) {
			lock_page(page);
			if (lock_page_killable(page))
				goto readpage_eio;
			if (!PageUptodate(page)) {
			if (!PageUptodate(page)) {
				if (page->mapping == NULL) {
				if (page->mapping == NULL) {
					/*
					/*
@@ -1021,15 +1023,16 @@ void do_generic_mapping_read(struct address_space *mapping,
					goto find_page;
					goto find_page;
				}
				}
				unlock_page(page);
				unlock_page(page);
				error = -EIO;
				shrink_readahead_size_eio(filp, ra);
				shrink_readahead_size_eio(filp, ra);
				goto readpage_error;
				goto readpage_eio;
			}
			}
			unlock_page(page);
			unlock_page(page);
		}
		}


		goto page_ok;
		goto page_ok;


readpage_eio:
		error = -EIO;
readpage_error:
readpage_error:
		/* UHHUH! A synchronous read error occurred. Report it */
		/* UHHUH! A synchronous read error occurred. Report it */
		desc->error = error;
		desc->error = error;