aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/freezer.h
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2011-10-19 15:30:40 -0400
committerJeff Layton <jlayton@redhat.com>2011-10-19 15:30:40 -0400
commitf06ac72e929115f2772c29727152ba0832d641e4 (patch)
treec214d17cd28fcbc8c6929ca69f38d1439975cf75 /include/linux/freezer.h
parentfef33df88bef6810cc3c4e6edf55c741a8fd68e3 (diff)
cifs, freezer: add wait_event_freezekillable and have cifs use it
CIFS currently uses wait_event_killable to put tasks to sleep while they await replies from the server. That function though does not allow the freezer to run. In many cases, the network interface may be going down anyway, in which case the reply will never come. The client then ends up blocking the computer from suspending. Fix this by adding a new wait_event_freezable variant -- wait_event_freezekillable. The idea is to combine the behavior of wait_event_killable and wait_event_freezable -- put the task to sleep and only allow it to be awoken by fatal signals, but also allow the freezer to do its job. Signed-off-by: Jeff Layton <jlayton@redhat.com>
Diffstat (limited to 'include/linux/freezer.h')
-rw-r--r--include/linux/freezer.h19
1 files changed, 17 insertions, 2 deletions
diff --git a/include/linux/freezer.h b/include/linux/freezer.h
index 1effc8b56b4..3672f731f03 100644
--- a/include/linux/freezer.h
+++ b/include/linux/freezer.h
@@ -134,10 +134,25 @@ static inline void set_freezable_with_signal(void)
134} 134}
135 135
136/* 136/*
137 * Freezer-friendly wrappers around wait_event_interruptible() and 137 * Freezer-friendly wrappers around wait_event_interruptible(),
138 * wait_event_interruptible_timeout(), originally defined in <linux/wait.h> 138 * wait_event_killable() and wait_event_interruptible_timeout(), originally
139 * defined in <linux/wait.h>
139 */ 140 */
140 141
142#define wait_event_freezekillable(wq, condition) \
143({ \
144 int __retval; \
145 do { \
146 __retval = wait_event_killable(wq, \
147 (condition) || freezing(current)); \
148 if (__retval && !freezing(current)) \
149 break; \
150 else if (!(condition)) \
151 __retval = -ERESTARTSYS; \
152 } while (try_to_freeze()); \
153 __retval; \
154})
155
141#define wait_event_freezable(wq, condition) \ 156#define wait_event_freezable(wq, condition) \
142({ \ 157({ \
143 int __retval; \ 158 int __retval; \