nfsd: introduce a generic nfsd4_cb
Add a helper to queue up a callback. CB_NULL has a bit of special casing because it is special in the specification, but all other new callback operations will be able to share code with this and a few more changes to refactor the callback code. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jeff Layton <jlayton@primarydata.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
2faf3b4350
commit
326129d02a
|
@ -49,12 +49,6 @@ static void nfsd4_mark_cb_fault(struct nfs4_client *, int reason);
|
||||||
|
|
||||||
/* Index of predefined Linux callback client operations */
|
/* Index of predefined Linux callback client operations */
|
||||||
|
|
||||||
enum {
|
|
||||||
NFSPROC4_CLNT_CB_NULL = 0,
|
|
||||||
NFSPROC4_CLNT_CB_RECALL,
|
|
||||||
NFSPROC4_CLNT_CB_SEQUENCE,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define to_delegation(cb) \
|
#define to_delegation(cb) \
|
||||||
container_of(cb, struct nfs4_delegation, dl_recall)
|
container_of(cb, struct nfs4_delegation, dl_recall)
|
||||||
|
|
||||||
|
@ -749,24 +743,9 @@ static const struct rpc_call_ops nfsd4_cb_probe_ops = {
|
||||||
|
|
||||||
static struct workqueue_struct *callback_wq;
|
static struct workqueue_struct *callback_wq;
|
||||||
|
|
||||||
static void run_nfsd4_cb(struct nfsd4_callback *cb)
|
|
||||||
{
|
|
||||||
queue_work(callback_wq, &cb->cb_work);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void do_probe_callback(struct nfs4_client *clp)
|
static void do_probe_callback(struct nfs4_client *clp)
|
||||||
{
|
{
|
||||||
struct nfsd4_callback *cb = &clp->cl_cb_null;
|
return nfsd4_cb(&clp->cl_cb_null, clp, NFSPROC4_CLNT_CB_NULL);
|
||||||
|
|
||||||
cb->cb_clp = clp;
|
|
||||||
|
|
||||||
cb->cb_msg.rpc_proc = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_NULL];
|
|
||||||
cb->cb_msg.rpc_argp = NULL;
|
|
||||||
cb->cb_msg.rpc_resp = NULL;
|
|
||||||
|
|
||||||
cb->cb_ops = &nfsd4_cb_probe_ops;
|
|
||||||
|
|
||||||
run_nfsd4_cb(cb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1005,7 +984,7 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb)
|
||||||
}
|
}
|
||||||
/* Yay, the callback channel's back! Restart any callbacks: */
|
/* Yay, the callback channel's back! Restart any callbacks: */
|
||||||
list_for_each_entry(cb, &clp->cl_callbacks, cb_per_client)
|
list_for_each_entry(cb, &clp->cl_callbacks, cb_per_client)
|
||||||
run_nfsd4_cb(cb);
|
queue_work(callback_wq, &cb->cb_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1046,21 +1025,19 @@ nfsd4_run_cb_recall(struct work_struct *w)
|
||||||
nfsd4_run_callback_rpc(cb);
|
nfsd4_run_callback_rpc(cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nfsd4_cb_recall(struct nfs4_delegation *dp)
|
void nfsd4_cb(struct nfsd4_callback *cb, struct nfs4_client *clp,
|
||||||
|
enum nfsd4_cb_op op)
|
||||||
{
|
{
|
||||||
struct nfsd4_callback *cb = &dp->dl_recall;
|
|
||||||
struct nfs4_client *clp = dp->dl_stid.sc_client;
|
|
||||||
|
|
||||||
dp->dl_retries = 1;
|
|
||||||
cb->cb_clp = clp;
|
cb->cb_clp = clp;
|
||||||
cb->cb_msg.rpc_proc = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_RECALL];
|
cb->cb_msg.rpc_proc = &nfs4_cb_procedures[op];
|
||||||
cb->cb_msg.rpc_argp = cb;
|
cb->cb_msg.rpc_argp = cb;
|
||||||
cb->cb_msg.rpc_resp = cb;
|
cb->cb_msg.rpc_resp = cb;
|
||||||
|
if (op == NFSPROC4_CLNT_CB_NULL)
|
||||||
cb->cb_ops = &nfsd4_cb_recall_ops;
|
cb->cb_ops = &nfsd4_cb_probe_ops;
|
||||||
|
else
|
||||||
|
cb->cb_ops = &nfsd4_cb_recall_ops;
|
||||||
INIT_LIST_HEAD(&cb->cb_per_client);
|
INIT_LIST_HEAD(&cb->cb_per_client);
|
||||||
cb->cb_done = true;
|
cb->cb_done = true;
|
||||||
|
|
||||||
run_nfsd4_cb(&dp->dl_recall);
|
queue_work(callback_wq, &cb->cb_work);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3388,7 +3388,9 @@ static void nfsd_break_one_deleg(struct nfs4_delegation *dp)
|
||||||
* it's safe to take a reference.
|
* it's safe to take a reference.
|
||||||
*/
|
*/
|
||||||
atomic_inc(&dp->dl_stid.sc_count);
|
atomic_inc(&dp->dl_stid.sc_count);
|
||||||
nfsd4_cb_recall(dp);
|
dp->dl_retries = 1;
|
||||||
|
nfsd4_cb(&dp->dl_recall, dp->dl_stid.sc_client,
|
||||||
|
NFSPROC4_CLNT_CB_RECALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called from break_lease() with i_lock held. */
|
/* Called from break_lease() with i_lock held. */
|
||||||
|
|
|
@ -517,6 +517,13 @@ static inline struct nfs4_ol_stateid *openlockstateid(struct nfs4_stid *s)
|
||||||
#define RD_STATE 0x00000010
|
#define RD_STATE 0x00000010
|
||||||
#define WR_STATE 0x00000020
|
#define WR_STATE 0x00000020
|
||||||
|
|
||||||
|
enum nfsd4_cb_op {
|
||||||
|
NFSPROC4_CLNT_CB_NULL = 0,
|
||||||
|
NFSPROC4_CLNT_CB_RECALL,
|
||||||
|
NFSPROC4_CLNT_CB_SEQUENCE,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
struct nfsd4_compound_state;
|
struct nfsd4_compound_state;
|
||||||
struct nfsd_net;
|
struct nfsd_net;
|
||||||
|
|
||||||
|
@ -536,7 +543,8 @@ void nfsd4_run_cb_recall(struct work_struct *w);
|
||||||
extern void nfsd4_probe_callback(struct nfs4_client *clp);
|
extern void nfsd4_probe_callback(struct nfs4_client *clp);
|
||||||
extern void nfsd4_probe_callback_sync(struct nfs4_client *clp);
|
extern void nfsd4_probe_callback_sync(struct nfs4_client *clp);
|
||||||
extern void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *);
|
extern void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *);
|
||||||
extern void nfsd4_cb_recall(struct nfs4_delegation *dp);
|
extern void nfsd4_cb(struct nfsd4_callback *cb, struct nfs4_client *clp,
|
||||||
|
enum nfsd4_cb_op op);
|
||||||
extern int nfsd4_create_callback_queue(void);
|
extern int nfsd4_create_callback_queue(void);
|
||||||
extern void nfsd4_destroy_callback_queue(void);
|
extern void nfsd4_destroy_callback_queue(void);
|
||||||
extern void nfsd4_shutdown_callback(struct nfs4_client *);
|
extern void nfsd4_shutdown_callback(struct nfs4_client *);
|
||||||
|
|
Loading…
Reference in New Issue