propagate errors from nfs41_name_cache_create()

server_create() was ignoring the return value of nfs41_name_cache_create(), but it needs to be propagated all the way back through nfs41_server_find_or_create() to nfs41_client_create() and nfs41_client_renew()

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
This commit is contained in:
Casey Bodley 2011-01-06 16:05:13 -05:00
parent 81051ddce1
commit 229ec94c5c
2 changed files with 31 additions and 15 deletions

View file

@ -70,7 +70,7 @@ out_err_layouts:
goto out; goto out;
} }
static void update_server( static int update_server(
IN nfs41_client *client, IN nfs41_client *client,
IN const char *server_scope, IN const char *server_scope,
IN const server_owner4 *owner) IN const server_owner4 *owner)
@ -81,25 +81,28 @@ static void update_server(
/* find a server matching the owner.major_id and scope */ /* find a server matching the owner.major_id and scope */
status = nfs41_server_find_or_create(owner->so_major_id, status = nfs41_server_find_or_create(owner->so_major_id,
server_scope, nfs41_rpc_netaddr(client->rpc), &server); server_scope, nfs41_rpc_netaddr(client->rpc), &server);
if (status)
goto out;
if (status == NO_ERROR) {
/* if the server is the same, we now have an extra reference. if /* if the server is the same, we now have an extra reference. if
* the servers are different, we still need to deref the old server. * the servers are different, we still need to deref the old server.
* so both cases can be treated the same */ * so both cases can be treated the same */
if (client->server) if (client->server)
nfs41_server_deref(client->server); nfs41_server_deref(client->server);
client->server = server; client->server = server;
} out:
return status;
} }
static void update_exchangeid_res( static int update_exchangeid_res(
IN nfs41_client *client, IN nfs41_client *client,
IN const nfs41_exchange_id_res *exchangeid) IN const nfs41_exchange_id_res *exchangeid)
{ {
update_server(client, exchangeid->server_scope, &exchangeid->server_owner);
client->clnt_id = exchangeid->clientid; client->clnt_id = exchangeid->clientid;
client->seq_id = exchangeid->sequenceid; client->seq_id = exchangeid->sequenceid;
client->roles = exchangeid->flags & EXCHGID4_FLAG_MASK_PNFS; client->roles = exchangeid->flags & EXCHGID4_FLAG_MASK_PNFS;
return update_server(client, exchangeid->server_scope,
&exchangeid->server_owner);
} }
int nfs41_client_create( int nfs41_client_create(
@ -121,7 +124,10 @@ int nfs41_client_create(
memcpy(&client->owner, owner, sizeof(client_owner4)); memcpy(&client->owner, owner, sizeof(client_owner4));
client->rpc = rpc; client->rpc = rpc;
client->is_data = is_data; client->is_data = is_data;
update_exchangeid_res(client, exchangeid);
status = update_exchangeid_res(client, exchangeid);
if (status)
goto out_err_client;
list_init(&client->state.opens); list_init(&client->state.opens);
InitializeCriticalSection(&client->state.lock); InitializeCriticalSection(&client->state.lock);
@ -192,7 +198,7 @@ int nfs41_client_renew(
dprint_roles(2, exchangeid.flags); dprint_roles(2, exchangeid.flags);
AcquireSRWLockExclusive(&client->exid_lock); AcquireSRWLockExclusive(&client->exid_lock);
update_exchangeid_res(client, &exchangeid); status = update_exchangeid_res(client, &exchangeid);
ReleaseSRWLockExclusive(&client->exid_lock); ReleaseSRWLockExclusive(&client->exid_lock);
out: out:
return status; return status;

View file

@ -111,10 +111,20 @@ static int server_create(
StringCchCopyA(server->owner, NFS4_OPAQUE_LIMIT, info->owner); StringCchCopyA(server->owner, NFS4_OPAQUE_LIMIT, info->owner);
InitializeSRWLock(&server->addrs.lock); InitializeSRWLock(&server->addrs.lock);
nfs41_superblock_list_init(&server->superblocks); nfs41_superblock_list_init(&server->superblocks);
nfs41_name_cache_create(&server->name_cache);
*server_out = server; status = nfs41_name_cache_create(&server->name_cache);
if (status) {
eprintf("nfs41_name_cache_create() failed with %d\n", status);
goto out_free;
}
out: out:
*server_out = server;
return status; return status;
out_free:
free(server);
server = NULL;
goto out;
} }
static void server_free( static void server_free(