Skip to content

Commit

Permalink
fs: Make write(2) interruptible by a fatal signal
Browse files Browse the repository at this point in the history
Currently write(2) to a file is not interruptible by any signal.
Sometimes this is desirable, e.g. when you want to quickly kill a
process hogging your disk. Also, with commit 499d05e ("mm: Make
task in balance_dirty_pages() killable"), it's necessary to abort the
current write accordingly to avoid it quickly dirtying lots more pages
at unthrottled rate.

This patch makes write interruptible by SIGKILL. We do not allow write
to be interruptible by any other signal because that has larger
potential of screwing some badly written applications.

Reported-by: Kazuya Mio <k-mio@sx.jp.nec.com>
Tested-by: Kazuya Mio <k-mio@sx.jp.nec.com>
Acked-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
  • Loading branch information
Jan Kara authored and Wu Fengguang committed Dec 2, 2011
1 parent 786228a commit a50527b
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions mm/filemap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2407,7 +2407,6 @@ static ssize_t generic_perform_write(struct file *file,
iov_iter_count(i));

again:

/*
* Bring in the user page that we will copy from _first_.
* Otherwise there's a nasty deadlock on copying from the
Expand Down Expand Up @@ -2463,7 +2462,10 @@ static ssize_t generic_perform_write(struct file *file,
written += copied;

balance_dirty_pages_ratelimited(mapping);

if (fatal_signal_pending(current)) {
status = -EINTR;
break;
}
} while (iov_iter_count(i));

return written ? written : status;
Expand Down

0 comments on commit a50527b

Please sign in to comment.