Loading fs/nfs/client.c +30 −22 Original line number Diff line number Diff line Loading @@ -208,53 +208,61 @@ void nfs_put_client(struct nfs_client *clp) } /* * Find a client by address * - caller must hold nfs_client_lock * Find a client by IP address and protocol version * - returns NULL if no such client */ static struct nfs_client *__nfs_find_client(const struct sockaddr_in *addr, int nfsversion, int match_port) struct nfs_client *nfs_find_client(const struct sockaddr_in *addr, int nfsversion) { struct nfs_client *clp; spin_lock(&nfs_client_lock); list_for_each_entry(clp, &nfs_client_list, cl_share_link) { /* Don't match clients that failed to initialise properly */ if (clp->cl_cons_state < 0) if (clp->cl_cons_state != NFS_CS_READY) continue; /* Different NFS versions cannot share the same nfs_client */ if (clp->cl_nfsversion != nfsversion) continue; /* Match only the IP address, not the port number */ if (clp->cl_addr.sin_addr.s_addr != addr->sin_addr.s_addr) continue; if (!match_port || clp->cl_addr.sin_port == addr->sin_port) goto found; } return NULL; found: atomic_inc(&clp->cl_count); spin_unlock(&nfs_client_lock); return clp; } spin_unlock(&nfs_client_lock); return NULL; } /* * Find a client by IP address and protocol version * - returns NULL if no such client * Find an nfs_client on the list that matches the initialisation data * that is supplied. */ struct nfs_client *nfs_find_client(const struct sockaddr_in *addr, int nfsversion) static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *data) { struct nfs_client *clp; spin_lock(&nfs_client_lock); clp = __nfs_find_client(addr, nfsversion, 0); spin_unlock(&nfs_client_lock); if (clp != NULL && clp->cl_cons_state != NFS_CS_READY) { nfs_put_client(clp); clp = NULL; } list_for_each_entry(clp, &nfs_client_list, cl_share_link) { /* Don't match clients that failed to initialise properly */ if (clp->cl_cons_state < 0) continue; /* Different NFS versions cannot share the same nfs_client */ if (clp->cl_nfsversion != data->version) continue; /* Match the full socket address */ if (memcmp(&clp->cl_addr, data->addr, sizeof(clp->cl_addr)) != 0) continue; atomic_inc(&clp->cl_count); return clp; } return NULL; } /* * Look up a client by IP address and protocol version Loading @@ -273,7 +281,7 @@ static struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_in do { spin_lock(&nfs_client_lock); clp = __nfs_find_client(cl_init->addr, cl_init->version, 1); clp = nfs_match_client(cl_init); if (clp) goto found_client; if (new) Loading Loading
fs/nfs/client.c +30 −22 Original line number Diff line number Diff line Loading @@ -208,53 +208,61 @@ void nfs_put_client(struct nfs_client *clp) } /* * Find a client by address * - caller must hold nfs_client_lock * Find a client by IP address and protocol version * - returns NULL if no such client */ static struct nfs_client *__nfs_find_client(const struct sockaddr_in *addr, int nfsversion, int match_port) struct nfs_client *nfs_find_client(const struct sockaddr_in *addr, int nfsversion) { struct nfs_client *clp; spin_lock(&nfs_client_lock); list_for_each_entry(clp, &nfs_client_list, cl_share_link) { /* Don't match clients that failed to initialise properly */ if (clp->cl_cons_state < 0) if (clp->cl_cons_state != NFS_CS_READY) continue; /* Different NFS versions cannot share the same nfs_client */ if (clp->cl_nfsversion != nfsversion) continue; /* Match only the IP address, not the port number */ if (clp->cl_addr.sin_addr.s_addr != addr->sin_addr.s_addr) continue; if (!match_port || clp->cl_addr.sin_port == addr->sin_port) goto found; } return NULL; found: atomic_inc(&clp->cl_count); spin_unlock(&nfs_client_lock); return clp; } spin_unlock(&nfs_client_lock); return NULL; } /* * Find a client by IP address and protocol version * - returns NULL if no such client * Find an nfs_client on the list that matches the initialisation data * that is supplied. */ struct nfs_client *nfs_find_client(const struct sockaddr_in *addr, int nfsversion) static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *data) { struct nfs_client *clp; spin_lock(&nfs_client_lock); clp = __nfs_find_client(addr, nfsversion, 0); spin_unlock(&nfs_client_lock); if (clp != NULL && clp->cl_cons_state != NFS_CS_READY) { nfs_put_client(clp); clp = NULL; } list_for_each_entry(clp, &nfs_client_list, cl_share_link) { /* Don't match clients that failed to initialise properly */ if (clp->cl_cons_state < 0) continue; /* Different NFS versions cannot share the same nfs_client */ if (clp->cl_nfsversion != data->version) continue; /* Match the full socket address */ if (memcmp(&clp->cl_addr, data->addr, sizeof(clp->cl_addr)) != 0) continue; atomic_inc(&clp->cl_count); return clp; } return NULL; } /* * Look up a client by IP address and protocol version Loading @@ -273,7 +281,7 @@ static struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_in do { spin_lock(&nfs_client_lock); clp = __nfs_find_client(cl_init->addr, cl_init->version, 1); clp = nfs_match_client(cl_init); if (clp) goto found_client; if (new) Loading