diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2013-04-01 15:40:44 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2013-04-05 17:03:54 -0400 |
commit | be76b5b68d15861d50ccd1d3e66dac3cb19963dd (patch) | |
tree | 98542103fbaa9b6319f41f865df50612a696d186 /fs/nfs | |
parent | 4a706fa09fd59b9c73b2a933953d27f3e18619c1 (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.c | 96 |
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 | ||
1382 | static int _nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid) | 1382 | int 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 " | |
1397 | int 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); | ||
1445 | out: | ||
1446 | return err; | 1432 | return err; |
1447 | } | 1433 | } |
1448 | 1434 | ||