diff options
Diffstat (limited to 'fs/nfsd/nfs4callback.c')
-rw-r--r-- | fs/nfsd/nfs4callback.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index 2c73cae9899d..e0be57b0f79b 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c | |||
@@ -337,7 +337,7 @@ static void encode_cb_recall4args(struct xdr_stream *xdr, | |||
337 | p = xdr_reserve_space(xdr, 4); | 337 | p = xdr_reserve_space(xdr, 4); |
338 | *p++ = xdr_zero; /* truncate */ | 338 | *p++ = xdr_zero; /* truncate */ |
339 | 339 | ||
340 | encode_nfs_fh4(xdr, &dp->dl_fh); | 340 | encode_nfs_fh4(xdr, &dp->dl_stid.sc_file->fi_fhandle); |
341 | 341 | ||
342 | hdr->nops++; | 342 | hdr->nops++; |
343 | } | 343 | } |
@@ -678,7 +678,7 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c | |||
678 | (clp->cl_cred.cr_flavor >= RPC_AUTH_GSS_KRB5)) | 678 | (clp->cl_cred.cr_flavor >= RPC_AUTH_GSS_KRB5)) |
679 | return -EINVAL; | 679 | return -EINVAL; |
680 | args.client_name = clp->cl_cred.cr_principal; | 680 | args.client_name = clp->cl_cred.cr_principal; |
681 | args.prognumber = conn->cb_prog, | 681 | args.prognumber = conn->cb_prog; |
682 | args.protocol = XPRT_TRANSPORT_TCP; | 682 | args.protocol = XPRT_TRANSPORT_TCP; |
683 | args.authflavor = clp->cl_cred.cr_flavor; | 683 | args.authflavor = clp->cl_cred.cr_flavor; |
684 | clp->cl_cb_ident = conn->cb_ident; | 684 | clp->cl_cb_ident = conn->cb_ident; |
@@ -689,7 +689,8 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c | |||
689 | clp->cl_cb_session = ses; | 689 | clp->cl_cb_session = ses; |
690 | args.bc_xprt = conn->cb_xprt; | 690 | args.bc_xprt = conn->cb_xprt; |
691 | args.prognumber = clp->cl_cb_session->se_cb_prog; | 691 | args.prognumber = clp->cl_cb_session->se_cb_prog; |
692 | args.protocol = XPRT_TRANSPORT_BC_TCP; | 692 | args.protocol = conn->cb_xprt->xpt_class->xcl_ident | |
693 | XPRT_TRANSPORT_BC; | ||
693 | args.authflavor = ses->se_cb_sec.flavor; | 694 | args.authflavor = ses->se_cb_sec.flavor; |
694 | } | 695 | } |
695 | /* Create RPC client */ | 696 | /* Create RPC client */ |
@@ -904,7 +905,7 @@ static void nfsd4_cb_recall_release(void *calldata) | |||
904 | spin_lock(&clp->cl_lock); | 905 | spin_lock(&clp->cl_lock); |
905 | list_del(&cb->cb_per_client); | 906 | list_del(&cb->cb_per_client); |
906 | spin_unlock(&clp->cl_lock); | 907 | spin_unlock(&clp->cl_lock); |
907 | nfs4_put_delegation(dp); | 908 | nfs4_put_stid(&dp->dl_stid); |
908 | } | 909 | } |
909 | } | 910 | } |
910 | 911 | ||
@@ -933,7 +934,7 @@ void nfsd4_shutdown_callback(struct nfs4_client *clp) | |||
933 | set_bit(NFSD4_CLIENT_CB_KILL, &clp->cl_flags); | 934 | set_bit(NFSD4_CLIENT_CB_KILL, &clp->cl_flags); |
934 | /* | 935 | /* |
935 | * Note this won't actually result in a null callback; | 936 | * Note this won't actually result in a null callback; |
936 | * instead, nfsd4_do_callback_rpc() will detect the killed | 937 | * instead, nfsd4_run_cb_null() will detect the killed |
937 | * client, destroy the rpc client, and stop: | 938 | * client, destroy the rpc client, and stop: |
938 | */ | 939 | */ |
939 | do_probe_callback(clp); | 940 | do_probe_callback(clp); |
@@ -1011,9 +1012,9 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb) | |||
1011 | run_nfsd4_cb(cb); | 1012 | run_nfsd4_cb(cb); |
1012 | } | 1013 | } |
1013 | 1014 | ||
1014 | static void nfsd4_do_callback_rpc(struct work_struct *w) | 1015 | static void |
1016 | nfsd4_run_callback_rpc(struct nfsd4_callback *cb) | ||
1015 | { | 1017 | { |
1016 | struct nfsd4_callback *cb = container_of(w, struct nfsd4_callback, cb_work); | ||
1017 | struct nfs4_client *clp = cb->cb_clp; | 1018 | struct nfs4_client *clp = cb->cb_clp; |
1018 | struct rpc_clnt *clnt; | 1019 | struct rpc_clnt *clnt; |
1019 | 1020 | ||
@@ -1031,9 +1032,22 @@ static void nfsd4_do_callback_rpc(struct work_struct *w) | |||
1031 | cb->cb_ops, cb); | 1032 | cb->cb_ops, cb); |
1032 | } | 1033 | } |
1033 | 1034 | ||
1034 | void nfsd4_init_callback(struct nfsd4_callback *cb) | 1035 | void |
1036 | nfsd4_run_cb_null(struct work_struct *w) | ||
1035 | { | 1037 | { |
1036 | INIT_WORK(&cb->cb_work, nfsd4_do_callback_rpc); | 1038 | struct nfsd4_callback *cb = container_of(w, struct nfsd4_callback, |
1039 | cb_work); | ||
1040 | nfsd4_run_callback_rpc(cb); | ||
1041 | } | ||
1042 | |||
1043 | void | ||
1044 | nfsd4_run_cb_recall(struct work_struct *w) | ||
1045 | { | ||
1046 | struct nfsd4_callback *cb = container_of(w, struct nfsd4_callback, | ||
1047 | cb_work); | ||
1048 | |||
1049 | nfsd4_prepare_cb_recall(cb->cb_op); | ||
1050 | nfsd4_run_callback_rpc(cb); | ||
1037 | } | 1051 | } |
1038 | 1052 | ||
1039 | void nfsd4_cb_recall(struct nfs4_delegation *dp) | 1053 | void nfsd4_cb_recall(struct nfs4_delegation *dp) |