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:
parent
81051ddce1
commit
229ec94c5c
2 changed files with 31 additions and 15 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue