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:
parent
2687a3569e
commit
0b94e97a25
1 changed files with 7 additions and 4 deletions
11
mm/filemap.c
11
mm/filemap.c
|
@ -982,7 +982,8 @@ void do_generic_mapping_read(struct address_space *mapping,
|
|||
|
||||
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 @@ void do_generic_mapping_read(struct address_space *mapping,
|
|||
}
|
||||
|
||||
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 @@ void do_generic_mapping_read(struct address_space *mapping,
|
|||
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;
|
||||
|
|
Loading…
Reference in a new issue