[PATCH 2/4] fs/splice: allow to ignore signal in __splice_from_pipe

Ming Lei
2023-02-10T15:33:51Z

__splice_from_pipe() is used for splice data from pipe, and the actor
could be simply grabbing pages, so if the caller can confirm this
actor won't block, it isn't necessary to return -ERESTARTSYS.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
fs/splice.c | 4 ++--
include/linux/splice.h | 1 +
2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/fs/splice.c b/fs/splice.c
index c4770e1644cc..a8dc46db1045 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -471,7 +471,7 @@ static int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_des
* Check for signal early to make process killable when there are
* always buffers available
*/
- if (signal_pending(current))
+ if (signal_pending(current) && !sd->ignore_sig)
return -ERESTARTSYS;

repeat:
@@ -485,7 +485,7 @@ static int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_des
if (sd->flags & SPLICE_F_NONBLOCK)
return -EAGAIN;

- if (signal_pending(current))
+ if (signal_pending(current) && !sd->ignore_sig)
return -ERESTARTSYS;

if (sd->need_wakeup) {
diff --git a/include/linux/splice.h b/include/linux/splice.h
index 98c471fd918d..89e0a0f8b471 100644
--- a/include/linux/splice.h
+++ b/include/linux/splice.h
@@ -64,6 +64,7 @@ struct splice_desc {
loff_t *opos; /* sendfile: output position */
size_t num_spliced; /* number of bytes already spliced */
bool need_wakeup; /* need to wake up writer */
+ bool ignore_sig;
};

struct partial_page {
--
2.31.1