SUNRPC: Further cleanups
[linux-2.6-block.git] / include / linux / sunrpc / sched.h
index 4d77e90d0b30f8fe65c63763a44c35e5cf4d8019..ac1326fc3e1aab631c4a2c8b4d984326097c2ef0 100644 (file)
@@ -27,6 +27,7 @@ struct rpc_message {
        struct rpc_cred *       rpc_cred;       /* Credentials */
 };
 
+struct rpc_call_ops;
 struct rpc_wait_queue;
 struct rpc_wait {
        struct list_head        list;           /* wait queue links */
@@ -61,13 +62,12 @@ struct rpc_task {
         * timeout_fn   to be executed by timer bottom half
         * callback     to be executed after waking up
         * action       next procedure for async tasks
-        * exit         exit async task and report to caller
+        * tk_ops       caller callbacks
         */
        void                    (*tk_timeout_fn)(struct rpc_task *);
        void                    (*tk_callback)(struct rpc_task *);
        void                    (*tk_action)(struct rpc_task *);
-       void                    (*tk_exit)(struct rpc_task *);
-       void                    (*tk_release)(struct rpc_task *);
+       const struct rpc_call_ops *tk_ops;
        void *                  tk_calldata;
 
        /*
@@ -111,6 +111,13 @@ struct rpc_task {
 
 typedef void                   (*rpc_action)(struct rpc_task *);
 
+struct rpc_call_ops {
+       void (*rpc_call_prepare)(struct rpc_task *, void *);
+       void (*rpc_call_done)(struct rpc_task *, void *);
+       void (*rpc_release)(void *);
+};
+
+
 /*
  * RPC task flags
  */
@@ -228,11 +235,14 @@ struct rpc_wait_queue {
 /*
  * Function prototypes
  */
-struct rpc_task *rpc_new_task(struct rpc_clnt *, rpc_action, int flags);
+struct rpc_task *rpc_new_task(struct rpc_clnt *, int flags,
+                               const struct rpc_call_ops *ops, void *data);
 struct rpc_task *rpc_new_child(struct rpc_clnt *, struct rpc_task *parent);
-void           rpc_init_task(struct rpc_task *, struct rpc_clnt *,
-                                       rpc_action exitfunc, int flags);
+void           rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt,
+                               int flags, const struct rpc_call_ops *ops,
+                               void *data);
 void           rpc_release_task(struct rpc_task *);
+void           rpc_exit_task(struct rpc_task *);
 void           rpc_killall_tasks(struct rpc_clnt *);
 int            rpc_execute(struct rpc_task *);
 void           rpc_run_child(struct rpc_task *parent, struct rpc_task *child,
@@ -259,7 +269,7 @@ void                rpc_destroy_mempool(void);
 static inline void rpc_exit(struct rpc_task *task, int status)
 {
        task->tk_status = status;
-       task->tk_action = NULL;
+       task->tk_action = rpc_exit_task;
 }
 
 #ifdef RPC_DEBUG