Setclientid_confirm code confused states 1 and 3 (numbering from the
IMPLEMENTATION section of rfc3530, section 14.2.33).  Fix this.
State 1 allows the client to change the callback channel on the fly.  We don't
implement this currently, so just turn off the callback channel in this case.
From: Fred Isaman
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
                if (!cmp_creds(&conf->cl_cred, &unconf->cl_cred)) 
                        status = nfserr_clid_inuse;
                else {
-                       expire_client(conf);
-                       clp = unconf;
-                       move_to_confirmed(unconf);
+                       /* XXX: We just turn off callbacks until we can handle
+                         * change request correctly. */
+                       clp = conf;
+                       clp->cl_callback.cb_parsed = 0;
+                       gen_confirm(clp);
+                       expire_client(unconf);
                        status = nfs_ok;
+
                }
                goto out;
        } 
                if (!cmp_creds(&unconf->cl_cred, &rqstp->rq_cred)) {
                        status = nfserr_clid_inuse;
                } else {
-                       status = nfs_ok;
+                       unsigned int hash =
+                               clientstr_hashval(unconf->cl_recdir);
+                       conf = find_confirmed_client_by_str(unconf->cl_recdir,
+                                                                       hash);
+                       if (conf) {
+                               expire_client(conf);
+                       }
                        clp = unconf;
                        move_to_confirmed(unconf);
+                       status = nfs_ok;
                }
                goto out;
        }