]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/nfs/nfs4client.c
mtd: bcm47xxsflash: use platform_(set|get)_drvdata
[karo-tx-linux.git] / fs / nfs / nfs4client.c
index 074ac7131459ebc378ef3a1cf50244ff758f2a88..5ae9d64ea08bc80c97c7c4c5b71ee73ef1a6ba8b 100644 (file)
@@ -464,6 +464,11 @@ static bool nfs4_match_client_owner_id(const struct nfs_client *clp1,
        return strcmp(clp1->cl_owner_id, clp2->cl_owner_id) == 0;
 }
 
+static bool nfs4_same_verifier(nfs4_verifier *v1, nfs4_verifier *v2)
+{
+       return memcmp(v1->data, v2->data, sizeof(v1->data)) == 0;
+}
+
 /**
  * nfs40_walk_client_list - Find server that recognizes a client ID
  *
@@ -521,7 +526,21 @@ int nfs40_walk_client_list(struct nfs_client *new,
 
                if (!nfs4_match_client_owner_id(pos, new))
                        continue;
-
+               /*
+                * We just sent a new SETCLIENTID, which should have
+                * caused the server to return a new cl_confirm.  So if
+                * cl_confirm is the same, then this is a different
+                * server that just returned the same cl_confirm by
+                * coincidence:
+                */
+               if ((new != pos) && nfs4_same_verifier(&pos->cl_confirm,
+                                                      &new->cl_confirm))
+                       continue;
+               /*
+                * But if the cl_confirm's are different, then the only
+                * way that a SETCLIENTID_CONFIRM to pos can succeed is
+                * if new and pos point to the same server:
+                */
                atomic_inc(&pos->cl_count);
                spin_unlock(&nn->nfs_client_lock);
 
@@ -534,6 +553,7 @@ int nfs40_walk_client_list(struct nfs_client *new,
                        break;
                case 0:
                        nfs4_swap_callback_idents(pos, new);
+                       pos->cl_confirm = new->cl_confirm;
 
                        prev = NULL;
                        *result = pos;
@@ -881,7 +901,6 @@ static int nfs4_set_client(struct nfs_server *server,
                const struct sockaddr *addr,
                const size_t addrlen,
                const char *ip_addr,
-               rpc_authflavor_t authflavour,
                int proto, const struct rpc_timeout *timeparms,
                u32 minorversion, struct net *net)
 {
@@ -907,7 +926,7 @@ static int nfs4_set_client(struct nfs_server *server,
                set_bit(NFS_CS_MIGRATION, &cl_init.init_flags);
 
        /* Allocate or find a client reference we can use */
-       clp = nfs_get_client(&cl_init, authflavour);
+       clp = nfs_get_client(&cl_init);
        if (IS_ERR(clp)) {
                error = PTR_ERR(clp);
                goto error;
@@ -948,7 +967,7 @@ error:
 struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,
                const struct sockaddr *ds_addr, int ds_addrlen,
                int ds_proto, unsigned int ds_timeo, unsigned int ds_retrans,
-               u32 minor_version, rpc_authflavor_t au_flavor)
+               u32 minor_version)
 {
        struct rpc_timeout ds_timeout;
        struct nfs_client *mds_clp = mds_srv->nfs_client;
@@ -979,7 +998,7 @@ struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,
         * (section 13.1 RFC 5661).
         */
        nfs_init_timeout_values(&ds_timeout, ds_proto, ds_timeo, ds_retrans);
-       clp = nfs_get_client(&cl_init, au_flavor);
+       clp = nfs_get_client(&cl_init);
 
        dprintk("<-- %s %p\n", __func__, clp);
        return clp;
@@ -1103,7 +1122,6 @@ static int nfs4_init_server(struct nfs_server *server,
                        (const struct sockaddr *)&data->nfs_server.address,
                        data->nfs_server.addrlen,
                        data->client_address,
-                       data->selected_flavor,
                        data->nfs_server.protocol,
                        &timeparms,
                        data->minorversion,
@@ -1200,7 +1218,6 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data,
                                data->addr,
                                data->addrlen,
                                parent_client->cl_ipaddr,
-                               data->authflavor,
                                rpc_protocol(parent_server->client),
                                parent_server->client->cl_timeout,
                                parent_client->cl_mvops->minor_version,
@@ -1311,7 +1328,6 @@ int nfs4_update_server(struct nfs_server *server, const char *hostname,
 
        nfs_server_remove_lists(server);
        error = nfs4_set_client(server, hostname, sap, salen, buf,
-                               clp->cl_rpcclient->cl_auth->au_flavor,
                                clp->cl_proto, clnt->cl_timeout,
                                clp->cl_minorversion, net);
        nfs_put_client(clp);