summaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorMatthew Wilcox <matthew@wil.cx>2007-12-06 11:19:57 -0500
committerMatthew Wilcox <willy@linux.intel.com>2007-12-06 17:35:48 -0500
commit0b94e97a25d9b06ef17fca8da23169200bead1e2 (patch)
tree4f7d920d03e9532d93921831efe704a4b645a3b4 /mm
parent2687a3569e40b1302f96698bcd6329aeb0ce3dd2 (diff)
downloadlwn-0b94e97a25d9b06ef17fca8da23169200bead1e2.tar.gz
lwn-0b94e97a25d9b06ef17fca8da23169200bead1e2.zip
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>
Diffstat (limited to 'mm')
-rw-r--r--mm/filemap.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index ac8f690d2885..455119cc7f40 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -982,7 +982,8 @@ page_ok:
page_not_up_to_date:
/* 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? */
if (!page->mapping) {
@@ -1010,7 +1011,8 @@ readpage:
}
if (!PageUptodate(page)) {
- lock_page(page);
+ if (lock_page_killable(page))
+ goto readpage_eio;
if (!PageUptodate(page)) {
if (page->mapping == NULL) {
/*
@@ -1021,15 +1023,16 @@ readpage:
goto find_page;
}
unlock_page(page);
- error = -EIO;
shrink_readahead_size_eio(filp, ra);
- goto readpage_error;
+ goto readpage_eio;
}
unlock_page(page);
}
goto page_ok;
+readpage_eio:
+ error = -EIO;
readpage_error:
/* UHHUH! A synchronous read error occurred. Report it */
desc->error = error;