session: simplify slot table error handling

due to the slot table's use of CRITICAL_SECTION and CONDITION_VARIABLE, the slot table no longer returns errors for following functions:
nfs41_session_bump_seq()
nfs41_session_free_slot()
nfs41_session_get_slot()
nfs41_session_sequence()

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
This commit is contained in:
Casey Bodley 2012-05-10 14:04:23 -04:00 committed by Olga Kornievskaia
parent 94fc1d946c
commit 1905abd027
6 changed files with 48 additions and 132 deletions

View file

@ -120,9 +120,7 @@ static int lookup_rpc(
compound_init(&compound, argops, resops, "lookup");
compound_add_op(&compound, OP_SEQUENCE, &args->sequence, &res->sequence);
status = nfs41_session_sequence(&args->sequence, session, 0);
if (status)
goto out;
nfs41_session_sequence(&args->sequence, session, 0);
if (dir == &res->root) {
compound_add_op(&compound, OP_PUTROOTFH, NULL, &res->putfh);

View file

@ -1301,9 +1301,7 @@ static int rpc_array_putfh(
compound_init(&compound, argops, resops, "array_putfh");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
for (i = 0; i < count; i++){
compound_add_op(&compound, OP_PUTFH, &putfh_args[i], &putfh_res[i]);

View file

@ -345,22 +345,22 @@ int nfs41_session_set_lease(
void nfs41_session_free(
IN nfs41_session *session);
int nfs41_session_bump_seq(
void nfs41_session_bump_seq(
IN nfs41_session *session,
IN uint32_t slotid);
int nfs41_session_free_slot(
void nfs41_session_free_slot(
IN nfs41_session *session,
IN uint32_t slotid);
int nfs41_session_get_slot(
void nfs41_session_get_slot(
IN nfs41_session *session,
OUT uint32_t *slot,
OUT uint32_t *seq,
OUT uint32_t *highest);
struct __nfs41_sequence_args;
int nfs41_session_sequence(
void nfs41_session_sequence(
struct __nfs41_sequence_args *args,
nfs41_session *session,
bool_t cachethis);

View file

@ -159,10 +159,10 @@ retry:
(nfs41_sequence_res *)compound->res.resarray[0].res;
if (seq->sr_status == NFS4_OK) {
// returned slotid must be the same we sent
status = NFS4ERR_IO;
if (seq->sr_resok4.sr_slotid != args->sa_slotid) {
eprintf("[session] sr_slotid=%d != sa_slotid=%d\n",
seq->sr_resok4.sr_slotid, args->sa_slotid);
status = NFS4ERR_IO;
goto out_free_slot;
}
// returned sessionid must be the same we sent
@ -173,14 +173,13 @@ retry:
seq->sr_resok4.sr_sessionid, NFS4_SESSIONID_SIZE);
print_hexbuf(1, (unsigned char *)"sa_sessionid",
args->sa_sessionid, NFS4_SESSIONID_SIZE);
status = NFS4ERR_IO;
goto out_free_slot;
}
if (seq->sr_resok4.sr_status_flags)
print_sr_status_flags(1, seq->sr_resok4.sr_status_flags);
status = nfs41_session_bump_seq(session, args->sa_slotid);
if (status)
goto out_free_slot;
nfs41_session_bump_seq(session, args->sa_slotid);
/* check sequence status flags for state revocation */
if (try_recovery && seq->sr_resok4.sr_status_flags)
@ -444,11 +443,8 @@ out:
return status;
do_retry:
if (compound->res.resarray[0].op == OP_SEQUENCE) {
status = nfs41_session_get_slot(session, &args->sa_slotid,
if (compound->res.resarray[0].op == OP_SEQUENCE)
nfs41_session_get_slot(session, &args->sa_slotid,
&args->sa_sequenceid, &args->sa_highest_slotid);
if (status)
goto out;
}
goto retry;
}

View file

@ -279,9 +279,7 @@ enum nfsstat4 nfs41_reclaim_complete(
compound_init(&compound, argops, resops, "reclaim_complete");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_RECLAIM_COMPLETE, NULL, &reclaim_res);
@ -434,9 +432,7 @@ int nfs41_open(
compound_init(&compound, argops, resops, "open");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 1);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 1);
if (current_fh_is_dir) {
/* CURRENT_FH: directory */
@ -563,9 +559,7 @@ int nfs41_create(
compound_init(&compound, argops, resops, "create");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 1);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 1);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = parent;
@ -655,9 +649,7 @@ int nfs41_close(
compound_init(&compound, argops, resops, "close");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 1);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 1);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -723,9 +715,7 @@ int nfs41_write(
stateid->stateid.seqid == 0 ? "ds write" : "write");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -806,9 +796,7 @@ int nfs41_read(
stateid->stateid.seqid == 0 ? "ds read" : "read");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -870,9 +858,7 @@ int nfs41_commit(
do_getattr ? "commit" : "ds commit");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 1);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 1);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -940,9 +926,7 @@ int nfs41_lock(
compound_init(&compound, argops, resops, "lock");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -1000,9 +984,7 @@ int nfs41_unlock(
compound_init(&compound, argops, resops, "unlock");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -1048,9 +1030,7 @@ int nfs41_readdir(
compound_init(&compound, argops, resops, "readdir");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -1100,9 +1080,7 @@ int nfs41_getattr(
compound_init(&compound, argops, resops, "getattr");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
if (file) {
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
@ -1158,9 +1136,7 @@ int nfs41_superblock_getattr(
compound_init(&compound, argops, resops, "getfsattr");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -1227,9 +1203,7 @@ int nfs41_remove(
compound_init(&compound, argops, resops, "remove");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 1);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 1);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = parent;
@ -1301,9 +1275,7 @@ int nfs41_rename(
compound_init(&compound, argops, resops, "rename");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 1);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 1);
compound_add_op(&compound, OP_PUTFH, &src_putfh_args, &src_putfh_res);
src_putfh_args.file = src_dir;
@ -1399,9 +1371,7 @@ int nfs41_setattr(
compound_init(&compound, argops, resops, "setattr");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -1467,9 +1437,7 @@ int nfs41_link(
compound_init(&compound, argops, resops, "link");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 1);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 1);
/* PUTFH(src) */
compound_add_op(&compound, OP_PUTFH, &putfh_args[0], &putfh_res[0]);
@ -1560,9 +1528,7 @@ int nfs41_readlink(
compound_init(&compound, argops, resops, "readlink");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -1606,9 +1572,7 @@ int nfs41_access(
compound_init(&compound, argops, resops, "access");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -1645,9 +1609,7 @@ int nfs41_send_sequence(
compound_init(&compound, argops, resops, "sequence");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
status = compound_encode_send_decode(session, &compound, TRUE);
if (status)
@ -1681,9 +1643,7 @@ enum nfsstat4 nfs41_want_delegation(
compound_init(&compound, argops, resops, "want_delegation");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -1717,9 +1677,7 @@ int nfs41_delegpurge(
compound_init(&compound, argops, resops, "delegpurge");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_DELEGPURGE, NULL, &dp_res);
@ -1752,9 +1710,7 @@ int nfs41_delegreturn(
compound_init(&compound, argops, resops, "delegreturn");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -1802,9 +1758,7 @@ enum nfsstat4 nfs41_fs_locations(
compound_init(&compound, argops, resops, "fs_locations");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = parent;
@ -1848,9 +1802,7 @@ int nfs41_secinfo(
compound_init(&compound, argops, resops, "secinfo");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
if (file == NULL)
compound_add_op(&compound, OP_PUTROOTFH, NULL, &putfh_res);
@ -1892,9 +1844,7 @@ int nfs41_secinfo_noname(
compound_init(&compound, argops, resops, "secinfo_no_name");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
if (file == NULL)
compound_add_op(&compound, OP_PUTROOTFH, NULL, &putfh_res);
@ -1933,9 +1883,7 @@ enum nfsstat4 nfs41_free_stateid(
compound_init(&compound, argops, resops, "free_stateid");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_FREE_STATEID, &freestateid_args, &freestateid_res);
freestateid_args.stateid = stateid;
@ -1967,9 +1915,7 @@ enum nfsstat4 nfs41_test_stateid(
compound_init(&compound, argops, resops, "test_stateid");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_TEST_STATEID, &teststateid_args, &teststateid_res);
teststateid_args.stateids = stateid_array;
@ -2012,9 +1958,7 @@ enum nfsstat4 pnfs_rpc_layoutget(
compound_init(&compound, argops, resops, "layoutget");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -2081,9 +2025,7 @@ enum nfsstat4 pnfs_rpc_layoutcommit(
compound_init(&compound, argops, resops, "layoutcommit");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -2140,9 +2082,7 @@ enum nfsstat4 pnfs_rpc_layoutreturn(
compound_init(&compound, argops, resops, "layoutreturn");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;
@ -2183,9 +2123,7 @@ enum nfsstat4 pnfs_rpc_getdeviceinfo(
compound_init(&compound, argops, resops, "get_deviceinfo");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_GETDEVICEINFO,
&getdeviceinfo_args, &getdeviceinfo_res);
@ -2225,9 +2163,7 @@ enum nfsstat4 nfs41_rpc_openattr(
compound_init(&compound, argops, resops, "openattr");
compound_add_op(&compound, OP_SEQUENCE, &sequence_args, &sequence_res);
status = nfs41_session_sequence(&sequence_args, session, 0);
if (status)
goto out;
nfs41_session_sequence(&sequence_args, session, 0);
compound_add_op(&compound, OP_PUTFH, &putfh_args, &putfh_res);
putfh_args.file = file;

View file

@ -54,12 +54,11 @@ static void init_slot_table(nfs41_slot_table *table)
LeaveCriticalSection(&table->lock);
}
int nfs41_session_bump_seq(
void nfs41_session_bump_seq(
IN nfs41_session *session,
IN uint32_t slotid)
{
nfs41_slot_table *table = &session->table;
int status = NO_ERROR;
AcquireSRWLockShared(&session->client->session_lock);
EnterCriticalSection(&table->lock);
@ -69,15 +68,13 @@ int nfs41_session_bump_seq(
LeaveCriticalSection(&table->lock);
ReleaseSRWLockShared(&session->client->session_lock);
return status;
}
int nfs41_session_free_slot(
void nfs41_session_free_slot(
IN nfs41_session *session,
IN uint32_t slotid)
{
nfs41_slot_table *table = &session->table;
int status = NO_ERROR;
AcquireSRWLockShared(&session->client->session_lock);
EnterCriticalSection(&table->lock);
@ -101,10 +98,9 @@ int nfs41_session_free_slot(
LeaveCriticalSection(&table->lock);
ReleaseSRWLockShared(&session->client->session_lock);
return status;
}
int nfs41_session_get_slot(
void nfs41_session_get_slot(
IN nfs41_session *session,
OUT uint32_t *slot,
OUT uint32_t *seqid,
@ -112,7 +108,6 @@ int nfs41_session_get_slot(
{
nfs41_slot_table *table = &session->table;
uint32_t i;
int status = NO_ERROR;
AcquireSRWLockShared(&session->client->session_lock);
EnterCriticalSection(&table->lock);
@ -140,24 +135,17 @@ int nfs41_session_get_slot(
dprintf(2, "session %p: using slot#=%d with seq#=%d highest=%d\n",
session, *slot, *seqid, *highest);
return status;
}
int nfs41_session_sequence(
void nfs41_session_sequence(
nfs41_sequence_args *args,
nfs41_session *session,
bool_t cachethis)
{
uint32_t status = NO_ERROR;
status = nfs41_session_get_slot(session, &args->sa_slotid,
nfs41_session_get_slot(session, &args->sa_slotid,
&args->sa_sequenceid, &args->sa_highest_slotid);
if (status)
goto out;
args->sa_sessionid = session->session_id;
args->sa_cachethis = cachethis;
out:
return status;
}