]>
Commit | Line | Data |
---|---|---|
763299ca GKH |
1 | From 9523feac272ccad2ad8186ba4fcc89103754de52 Mon Sep 17 00:00:00 2001 |
2 | From: Tuomas Tynkkynen <tuomas@tuxera.com> | |
3 | Date: Wed, 6 Sep 2017 17:59:08 +0300 | |
4 | Subject: net/9p: Switch to wait_event_killable() | |
5 | ||
6 | From: Tuomas Tynkkynen <tuomas@tuxera.com> | |
7 | ||
8 | commit 9523feac272ccad2ad8186ba4fcc89103754de52 upstream. | |
9 | ||
10 | Because userspace gets Very Unhappy when calls like stat() and execve() | |
11 | return -EINTR on 9p filesystem mounts. For instance, when bash is | |
12 | looking in PATH for things to execute and some SIGCHLD interrupts | |
13 | stat(), bash can throw a spurious 'command not found' since it doesn't | |
14 | retry the stat(). | |
15 | ||
16 | In practice, hitting the problem is rare and needs a really | |
17 | slow/bogged down 9p server. | |
18 | ||
19 | Signed-off-by: Tuomas Tynkkynen <tuomas@tuxera.com> | |
20 | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> | |
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
22 | ||
23 | ||
24 | --- | |
25 | net/9p/client.c | 3 +-- | |
26 | net/9p/trans_virtio.c | 13 ++++++------- | |
27 | 2 files changed, 7 insertions(+), 9 deletions(-) | |
28 | ||
29 | --- a/net/9p/client.c | |
30 | +++ b/net/9p/client.c | |
31 | @@ -749,8 +749,7 @@ p9_client_rpc(struct p9_client *c, int8_ | |
32 | } | |
33 | again: | |
34 | /* Wait for the response */ | |
35 | - err = wait_event_interruptible(*req->wq, | |
36 | - req->status >= REQ_STATUS_RCVD); | |
37 | + err = wait_event_killable(*req->wq, req->status >= REQ_STATUS_RCVD); | |
38 | ||
39 | /* | |
40 | * Make sure our req is coherent with regard to updates in other | |
41 | --- a/net/9p/trans_virtio.c | |
42 | +++ b/net/9p/trans_virtio.c | |
43 | @@ -290,8 +290,8 @@ req_retry: | |
44 | if (err == -ENOSPC) { | |
45 | chan->ring_bufs_avail = 0; | |
46 | spin_unlock_irqrestore(&chan->lock, flags); | |
47 | - err = wait_event_interruptible(*chan->vc_wq, | |
48 | - chan->ring_bufs_avail); | |
49 | + err = wait_event_killable(*chan->vc_wq, | |
50 | + chan->ring_bufs_avail); | |
51 | if (err == -ERESTARTSYS) | |
52 | return err; | |
53 | ||
54 | @@ -331,7 +331,7 @@ static int p9_get_mapped_pages(struct vi | |
55 | * Other zc request to finish here | |
56 | */ | |
57 | if (atomic_read(&vp_pinned) >= chan->p9_max_pages) { | |
58 | - err = wait_event_interruptible(vp_wq, | |
59 | + err = wait_event_killable(vp_wq, | |
60 | (atomic_read(&vp_pinned) < chan->p9_max_pages)); | |
61 | if (err == -ERESTARTSYS) | |
62 | return err; | |
63 | @@ -475,8 +475,8 @@ req_retry_pinned: | |
64 | if (err == -ENOSPC) { | |
65 | chan->ring_bufs_avail = 0; | |
66 | spin_unlock_irqrestore(&chan->lock, flags); | |
67 | - err = wait_event_interruptible(*chan->vc_wq, | |
68 | - chan->ring_bufs_avail); | |
69 | + err = wait_event_killable(*chan->vc_wq, | |
70 | + chan->ring_bufs_avail); | |
71 | if (err == -ERESTARTSYS) | |
72 | goto err_out; | |
73 | ||
74 | @@ -493,8 +493,7 @@ req_retry_pinned: | |
75 | virtqueue_kick(chan->vq); | |
76 | spin_unlock_irqrestore(&chan->lock, flags); | |
77 | p9_debug(P9_DEBUG_TRANS, "virtio request kicked\n"); | |
78 | - err = wait_event_interruptible(*req->wq, | |
79 | - req->status >= REQ_STATUS_RCVD); | |
80 | + err = wait_event_killable(*req->wq, req->status >= REQ_STATUS_RCVD); | |
81 | /* | |
82 | * Non kernel buffers are pinned, unpin them | |
83 | */ |