aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2013-04-01 15:40:44 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2013-04-05 17:03:54 -0400
commitbe76b5b68d15861d50ccd1d3e66dac3cb19963dd (patch)
tree98542103fbaa9b6319f41f865df50612a696d186 /fs/nfs
parent4a706fa09fd59b9c73b2a933953d27f3e18619c1 (diff)
NFSv4: Clean up nfs4_open_delegation_recall
Make it symmetric with nfs4_lock_delegation_recall Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/nfs4proc.c96
1 files changed, 41 insertions, 55 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 5f2010e0926e..57b5fb778f16 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -1379,70 +1379,56 @@ static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *sta
1379 return ret; 1379 return ret;
1380} 1380}
1381 1381
1382static int _nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid) 1382int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid)
1383{ 1383{
1384 struct nfs_server *server = NFS_SERVER(state->inode);
1384 struct nfs4_opendata *opendata; 1385 struct nfs4_opendata *opendata;
1385 int ret; 1386 int err;
1386 1387
1387 opendata = nfs4_open_recoverdata_alloc(ctx, state, 1388 opendata = nfs4_open_recoverdata_alloc(ctx, state,
1388 NFS4_OPEN_CLAIM_DELEG_CUR_FH); 1389 NFS4_OPEN_CLAIM_DELEG_CUR_FH);
1389 if (IS_ERR(opendata)) 1390 if (IS_ERR(opendata))
1390 return PTR_ERR(opendata); 1391 return PTR_ERR(opendata);
1391 nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid); 1392 nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid);
1392 ret = nfs4_open_recover(opendata, state); 1393 err = nfs4_open_recover(opendata, state);
1393 nfs4_opendata_put(opendata); 1394 nfs4_opendata_put(opendata);
1394 return ret; 1395 switch (err) {
1395} 1396 default:
1396 1397 printk(KERN_ERR "NFS: %s: unhandled error "
1397int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid) 1398 "%d.\n", __func__, err);
1398{ 1399 case 0:
1399 struct nfs4_exception exception = { }; 1400 case -ENOENT:
1400 struct nfs_server *server = NFS_SERVER(state->inode); 1401 case -ESTALE:
1401 int err; 1402 break;
1402 do { 1403 case -NFS4ERR_BADSESSION:
1403 err = _nfs4_open_delegation_recall(ctx, state, stateid); 1404 case -NFS4ERR_BADSLOT:
1404 switch (err) { 1405 case -NFS4ERR_BAD_HIGH_SLOT:
1405 case 0: 1406 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1406 case -ENOENT: 1407 case -NFS4ERR_DEADSESSION:
1407 case -ESTALE: 1408 set_bit(NFS_DELEGATED_STATE, &state->flags);
1408 goto out; 1409 nfs4_schedule_session_recovery(server->nfs_client->cl_session, err);
1409 case -NFS4ERR_BADSESSION: 1410 return -EAGAIN;
1410 case -NFS4ERR_BADSLOT: 1411 case -NFS4ERR_STALE_CLIENTID:
1411 case -NFS4ERR_BAD_HIGH_SLOT: 1412 case -NFS4ERR_STALE_STATEID:
1412 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: 1413 set_bit(NFS_DELEGATED_STATE, &state->flags);
1413 case -NFS4ERR_DEADSESSION: 1414 case -NFS4ERR_EXPIRED:
1414 set_bit(NFS_DELEGATED_STATE, &state->flags); 1415 /* Don't recall a delegation if it was lost */
1415 nfs4_schedule_session_recovery(server->nfs_client->cl_session, err); 1416 nfs4_schedule_lease_recovery(server->nfs_client);
1416 err = -EAGAIN; 1417 return -EAGAIN;
1417 goto out; 1418 case -NFS4ERR_DELEG_REVOKED:
1418 case -NFS4ERR_STALE_CLIENTID: 1419 case -NFS4ERR_ADMIN_REVOKED:
1419 case -NFS4ERR_STALE_STATEID: 1420 case -NFS4ERR_BAD_STATEID:
1420 set_bit(NFS_DELEGATED_STATE, &state->flags); 1421 nfs_inode_find_state_and_recover(state->inode,
1421 case -NFS4ERR_EXPIRED: 1422 stateid);
1422 /* Don't recall a delegation if it was lost */ 1423 nfs4_schedule_stateid_recovery(server, state);
1423 nfs4_schedule_lease_recovery(server->nfs_client); 1424 case -ENOMEM:
1424 err = -EAGAIN; 1425 return 0;
1425 goto out; 1426 case -NFS4ERR_DELAY:
1426 case -NFS4ERR_DELEG_REVOKED: 1427 case -NFS4ERR_GRACE:
1427 case -NFS4ERR_ADMIN_REVOKED: 1428 set_bit(NFS_DELEGATED_STATE, &state->flags);
1428 case -NFS4ERR_BAD_STATEID: 1429 ssleep(1);
1429 nfs_inode_find_state_and_recover(state->inode, 1430 return -EAGAIN;
1430 stateid); 1431 }
1431 nfs4_schedule_stateid_recovery(server, state);
1432 case -ENOMEM:
1433 err = 0;
1434 goto out;
1435 case -NFS4ERR_DELAY:
1436 case -NFS4ERR_GRACE:
1437 set_bit(NFS_DELEGATED_STATE, &state->flags);
1438 ssleep(1);
1439 err = -EAGAIN;
1440 goto out;
1441 }
1442 set_bit(NFS_DELEGATED_STATE, &state->flags);
1443 err = nfs4_handle_exception(server, err, &exception);
1444 } while (exception.retry);
1445out:
1446 return err; 1432 return err;
1447} 1433}
1448 1434