diff options
Diffstat (limited to 'fs/nfsd/nfs4state.c')
-rw-r--r-- | fs/nfsd/nfs4state.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 67a038dc0d0e..997343c23043 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -887,10 +887,14 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confi | |||
887 | if (!cmp_creds(&conf->cl_cred, &unconf->cl_cred)) | 887 | if (!cmp_creds(&conf->cl_cred, &unconf->cl_cred)) |
888 | status = nfserr_clid_inuse; | 888 | status = nfserr_clid_inuse; |
889 | else { | 889 | else { |
890 | expire_client(conf); | 890 | /* XXX: We just turn off callbacks until we can handle |
891 | clp = unconf; | 891 | * change request correctly. */ |
892 | move_to_confirmed(unconf); | 892 | clp = conf; |
893 | clp->cl_callback.cb_parsed = 0; | ||
894 | gen_confirm(clp); | ||
895 | expire_client(unconf); | ||
893 | status = nfs_ok; | 896 | status = nfs_ok; |
897 | |||
894 | } | 898 | } |
895 | goto out; | 899 | goto out; |
896 | } | 900 | } |
@@ -920,9 +924,16 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confi | |||
920 | if (!cmp_creds(&unconf->cl_cred, &rqstp->rq_cred)) { | 924 | if (!cmp_creds(&unconf->cl_cred, &rqstp->rq_cred)) { |
921 | status = nfserr_clid_inuse; | 925 | status = nfserr_clid_inuse; |
922 | } else { | 926 | } else { |
923 | status = nfs_ok; | 927 | unsigned int hash = |
928 | clientstr_hashval(unconf->cl_recdir); | ||
929 | conf = find_confirmed_client_by_str(unconf->cl_recdir, | ||
930 | hash); | ||
931 | if (conf) { | ||
932 | expire_client(conf); | ||
933 | } | ||
924 | clp = unconf; | 934 | clp = unconf; |
925 | move_to_confirmed(unconf); | 935 | move_to_confirmed(unconf); |
936 | status = nfs_ok; | ||
926 | } | 937 | } |
927 | goto out; | 938 | goto out; |
928 | } | 939 | } |