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

View file

@ -111,10 +111,20 @@ static int server_create(
StringCchCopyA(server->owner, NFS4_OPAQUE_LIMIT, info->owner);
InitializeSRWLock(&server->addrs.lock);
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:
*server_out = server;
return status;
out_free:
free(server);
server = NULL;
goto out;
}
static void server_free(