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: Matthew Wilcox <willy@linux.intel.com>
This commit is contained in:
Matthew Wilcox 2007-12-06 11:19:57 -05:00 committed by Matthew Wilcox
parent 2687a3569e
commit 0b94e97a25

View file

@ -982,7 +982,8 @@ page_ok:
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 @@ readpage:
} }
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 @@ readpage:
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;