diff options
Diffstat (limited to 'include/linux/sunrpc/sched.h')
| -rw-r--r-- | include/linux/sunrpc/sched.h | 48 | 
1 files changed, 37 insertions, 11 deletions
| diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index 4d77e90d0b30..8b25629accd8 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h | |||
| @@ -27,6 +27,7 @@ struct rpc_message { | |||
| 27 | struct rpc_cred * rpc_cred; /* Credentials */ | 27 | struct rpc_cred * rpc_cred; /* Credentials */ | 
| 28 | }; | 28 | }; | 
| 29 | 29 | ||
| 30 | struct rpc_call_ops; | ||
| 30 | struct rpc_wait_queue; | 31 | struct rpc_wait_queue; | 
| 31 | struct rpc_wait { | 32 | struct rpc_wait { | 
| 32 | struct list_head list; /* wait queue links */ | 33 | struct list_head list; /* wait queue links */ | 
| @@ -41,6 +42,7 @@ struct rpc_task { | |||
| 41 | #ifdef RPC_DEBUG | 42 | #ifdef RPC_DEBUG | 
| 42 | unsigned long tk_magic; /* 0xf00baa */ | 43 | unsigned long tk_magic; /* 0xf00baa */ | 
| 43 | #endif | 44 | #endif | 
| 45 | atomic_t tk_count; /* Reference count */ | ||
| 44 | struct list_head tk_task; /* global list of tasks */ | 46 | struct list_head tk_task; /* global list of tasks */ | 
| 45 | struct rpc_clnt * tk_client; /* RPC client */ | 47 | struct rpc_clnt * tk_client; /* RPC client */ | 
| 46 | struct rpc_rqst * tk_rqstp; /* RPC request */ | 48 | struct rpc_rqst * tk_rqstp; /* RPC request */ | 
| @@ -50,8 +52,6 @@ struct rpc_task { | |||
| 50 | * RPC call state | 52 | * RPC call state | 
| 51 | */ | 53 | */ | 
| 52 | struct rpc_message tk_msg; /* RPC call info */ | 54 | struct rpc_message tk_msg; /* RPC call info */ | 
| 53 | __u32 * tk_buffer; /* XDR buffer */ | ||
| 54 | size_t tk_bufsize; | ||
| 55 | __u8 tk_garb_retry; | 55 | __u8 tk_garb_retry; | 
| 56 | __u8 tk_cred_retry; | 56 | __u8 tk_cred_retry; | 
| 57 | 57 | ||
| @@ -61,13 +61,12 @@ struct rpc_task { | |||
| 61 | * timeout_fn to be executed by timer bottom half | 61 | * timeout_fn to be executed by timer bottom half | 
| 62 | * callback to be executed after waking up | 62 | * callback to be executed after waking up | 
| 63 | * action next procedure for async tasks | 63 | * action next procedure for async tasks | 
| 64 | * exit exit async task and report to caller | 64 | * tk_ops caller callbacks | 
| 65 | */ | 65 | */ | 
| 66 | void (*tk_timeout_fn)(struct rpc_task *); | 66 | void (*tk_timeout_fn)(struct rpc_task *); | 
| 67 | void (*tk_callback)(struct rpc_task *); | 67 | void (*tk_callback)(struct rpc_task *); | 
| 68 | void (*tk_action)(struct rpc_task *); | 68 | void (*tk_action)(struct rpc_task *); | 
| 69 | void (*tk_exit)(struct rpc_task *); | 69 | const struct rpc_call_ops *tk_ops; | 
| 70 | void (*tk_release)(struct rpc_task *); | ||
| 71 | void * tk_calldata; | 70 | void * tk_calldata; | 
| 72 | 71 | ||
| 73 | /* | 72 | /* | 
| @@ -78,7 +77,6 @@ struct rpc_task { | |||
| 78 | struct timer_list tk_timer; /* kernel timer */ | 77 | struct timer_list tk_timer; /* kernel timer */ | 
| 79 | unsigned long tk_timeout; /* timeout for rpc_sleep() */ | 78 | unsigned long tk_timeout; /* timeout for rpc_sleep() */ | 
| 80 | unsigned short tk_flags; /* misc flags */ | 79 | unsigned short tk_flags; /* misc flags */ | 
| 81 | unsigned char tk_active : 1;/* Task has been activated */ | ||
| 82 | unsigned char tk_priority : 2;/* Task priority */ | 80 | unsigned char tk_priority : 2;/* Task priority */ | 
| 83 | unsigned long tk_runstate; /* Task run status */ | 81 | unsigned long tk_runstate; /* Task run status */ | 
| 84 | struct workqueue_struct *tk_workqueue; /* Normally rpciod, but could | 82 | struct workqueue_struct *tk_workqueue; /* Normally rpciod, but could | 
| @@ -111,6 +109,13 @@ struct rpc_task { | |||
| 111 | 109 | ||
| 112 | typedef void (*rpc_action)(struct rpc_task *); | 110 | typedef void (*rpc_action)(struct rpc_task *); | 
| 113 | 111 | ||
| 112 | struct rpc_call_ops { | ||
| 113 | void (*rpc_call_prepare)(struct rpc_task *, void *); | ||
| 114 | void (*rpc_call_done)(struct rpc_task *, void *); | ||
| 115 | void (*rpc_release)(void *); | ||
| 116 | }; | ||
| 117 | |||
| 118 | |||
| 114 | /* | 119 | /* | 
| 115 | * RPC task flags | 120 | * RPC task flags | 
| 116 | */ | 121 | */ | 
| @@ -129,7 +134,6 @@ typedef void (*rpc_action)(struct rpc_task *); | |||
| 129 | #define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER) | 134 | #define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER) | 
| 130 | #define RPC_DO_ROOTOVERRIDE(t) ((t)->tk_flags & RPC_TASK_ROOTCREDS) | 135 | #define RPC_DO_ROOTOVERRIDE(t) ((t)->tk_flags & RPC_TASK_ROOTCREDS) | 
| 131 | #define RPC_ASSASSINATED(t) ((t)->tk_flags & RPC_TASK_KILLED) | 136 | #define RPC_ASSASSINATED(t) ((t)->tk_flags & RPC_TASK_KILLED) | 
| 132 | #define RPC_IS_ACTIVATED(t) ((t)->tk_active) | ||
| 133 | #define RPC_DO_CALLBACK(t) ((t)->tk_callback != NULL) | 137 | #define RPC_DO_CALLBACK(t) ((t)->tk_callback != NULL) | 
| 134 | #define RPC_IS_SOFT(t) ((t)->tk_flags & RPC_TASK_SOFT) | 138 | #define RPC_IS_SOFT(t) ((t)->tk_flags & RPC_TASK_SOFT) | 
| 135 | #define RPC_TASK_UNINTERRUPTIBLE(t) ((t)->tk_flags & RPC_TASK_NOINTR) | 139 | #define RPC_TASK_UNINTERRUPTIBLE(t) ((t)->tk_flags & RPC_TASK_NOINTR) | 
| @@ -138,6 +142,7 @@ typedef void (*rpc_action)(struct rpc_task *); | |||
| 138 | #define RPC_TASK_QUEUED 1 | 142 | #define RPC_TASK_QUEUED 1 | 
| 139 | #define RPC_TASK_WAKEUP 2 | 143 | #define RPC_TASK_WAKEUP 2 | 
| 140 | #define RPC_TASK_HAS_TIMER 3 | 144 | #define RPC_TASK_HAS_TIMER 3 | 
| 145 | #define RPC_TASK_ACTIVE 4 | ||
| 141 | 146 | ||
| 142 | #define RPC_IS_RUNNING(t) (test_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)) | 147 | #define RPC_IS_RUNNING(t) (test_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)) | 
| 143 | #define rpc_set_running(t) (set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)) | 148 | #define rpc_set_running(t) (set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)) | 
| @@ -168,6 +173,15 @@ typedef void (*rpc_action)(struct rpc_task *); | |||
| 168 | smp_mb__after_clear_bit(); \ | 173 | smp_mb__after_clear_bit(); \ | 
| 169 | } while (0) | 174 | } while (0) | 
| 170 | 175 | ||
| 176 | #define RPC_IS_ACTIVATED(t) (test_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate)) | ||
| 177 | #define rpc_set_active(t) (set_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate)) | ||
| 178 | #define rpc_clear_active(t) \ | ||
| 179 | do { \ | ||
| 180 | smp_mb__before_clear_bit(); \ | ||
| 181 | clear_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate); \ | ||
| 182 | smp_mb__after_clear_bit(); \ | ||
| 183 | } while(0) | ||
| 184 | |||
| 171 | /* | 185 | /* | 
| 172 | * Task priorities. | 186 | * Task priorities. | 
| 173 | * Note: if you change these, you must also change | 187 | * Note: if you change these, you must also change | 
| @@ -228,11 +242,16 @@ struct rpc_wait_queue { | |||
| 228 | /* | 242 | /* | 
| 229 | * Function prototypes | 243 | * Function prototypes | 
| 230 | */ | 244 | */ | 
| 231 | struct rpc_task *rpc_new_task(struct rpc_clnt *, rpc_action, int flags); | 245 | struct rpc_task *rpc_new_task(struct rpc_clnt *, int flags, | 
| 246 | const struct rpc_call_ops *ops, void *data); | ||
| 247 | struct rpc_task *rpc_run_task(struct rpc_clnt *clnt, int flags, | ||
| 248 | const struct rpc_call_ops *ops, void *data); | ||
| 232 | struct rpc_task *rpc_new_child(struct rpc_clnt *, struct rpc_task *parent); | 249 | struct rpc_task *rpc_new_child(struct rpc_clnt *, struct rpc_task *parent); | 
| 233 | void rpc_init_task(struct rpc_task *, struct rpc_clnt *, | 250 | void rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt, | 
| 234 | rpc_action exitfunc, int flags); | 251 | int flags, const struct rpc_call_ops *ops, | 
| 252 | void *data); | ||
| 235 | void rpc_release_task(struct rpc_task *); | 253 | void rpc_release_task(struct rpc_task *); | 
| 254 | void rpc_exit_task(struct rpc_task *); | ||
| 236 | void rpc_killall_tasks(struct rpc_clnt *); | 255 | void rpc_killall_tasks(struct rpc_clnt *); | 
| 237 | int rpc_execute(struct rpc_task *); | 256 | int rpc_execute(struct rpc_task *); | 
| 238 | void rpc_run_child(struct rpc_task *parent, struct rpc_task *child, | 257 | void rpc_run_child(struct rpc_task *parent, struct rpc_task *child, | 
| @@ -247,9 +266,11 @@ struct rpc_task *rpc_wake_up_next(struct rpc_wait_queue *); | |||
| 247 | void rpc_wake_up_status(struct rpc_wait_queue *, int); | 266 | void rpc_wake_up_status(struct rpc_wait_queue *, int); | 
| 248 | void rpc_delay(struct rpc_task *, unsigned long); | 267 | void rpc_delay(struct rpc_task *, unsigned long); | 
| 249 | void * rpc_malloc(struct rpc_task *, size_t); | 268 | void * rpc_malloc(struct rpc_task *, size_t); | 
| 269 | void rpc_free(struct rpc_task *); | ||
| 250 | int rpciod_up(void); | 270 | int rpciod_up(void); | 
| 251 | void rpciod_down(void); | 271 | void rpciod_down(void); | 
| 252 | void rpciod_wake_up(void); | 272 | void rpciod_wake_up(void); | 
| 273 | int __rpc_wait_for_completion_task(struct rpc_task *task, int (*)(void *)); | ||
| 253 | #ifdef RPC_DEBUG | 274 | #ifdef RPC_DEBUG | 
| 254 | void rpc_show_tasks(void); | 275 | void rpc_show_tasks(void); | 
| 255 | #endif | 276 | #endif | 
| @@ -259,7 +280,12 @@ void rpc_destroy_mempool(void); | |||
| 259 | static inline void rpc_exit(struct rpc_task *task, int status) | 280 | static inline void rpc_exit(struct rpc_task *task, int status) | 
| 260 | { | 281 | { | 
| 261 | task->tk_status = status; | 282 | task->tk_status = status; | 
| 262 | task->tk_action = NULL; | 283 | task->tk_action = rpc_exit_task; | 
| 284 | } | ||
| 285 | |||
| 286 | static inline int rpc_wait_for_completion_task(struct rpc_task *task) | ||
| 287 | { | ||
| 288 | return __rpc_wait_for_completion_task(task, NULL); | ||
| 263 | } | 289 | } | 
| 264 | 290 | ||
| 265 | #ifdef RPC_DEBUG | 291 | #ifdef RPC_DEBUG | 
