diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
| -rw-r--r-- | fs/nfs/nfs4proc.c | 131 |
1 files changed, 92 insertions, 39 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 78936a8f40a..0a07e353a96 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -256,12 +256,13 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, | |||
| 256 | case -NFS4ERR_OPENMODE: | 256 | case -NFS4ERR_OPENMODE: |
| 257 | if (state == NULL) | 257 | if (state == NULL) |
| 258 | break; | 258 | break; |
| 259 | nfs4_state_mark_reclaim_nograce(clp, state); | 259 | nfs4_schedule_stateid_recovery(server, state); |
| 260 | goto do_state_recovery; | 260 | goto wait_on_recovery; |
| 261 | case -NFS4ERR_STALE_STATEID: | 261 | case -NFS4ERR_STALE_STATEID: |
| 262 | case -NFS4ERR_STALE_CLIENTID: | 262 | case -NFS4ERR_STALE_CLIENTID: |
| 263 | case -NFS4ERR_EXPIRED: | 263 | case -NFS4ERR_EXPIRED: |
| 264 | goto do_state_recovery; | 264 | nfs4_schedule_lease_recovery(clp); |
| 265 | goto wait_on_recovery; | ||
| 265 | #if defined(CONFIG_NFS_V4_1) | 266 | #if defined(CONFIG_NFS_V4_1) |
| 266 | case -NFS4ERR_BADSESSION: | 267 | case -NFS4ERR_BADSESSION: |
| 267 | case -NFS4ERR_BADSLOT: | 268 | case -NFS4ERR_BADSLOT: |
| @@ -272,7 +273,7 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, | |||
| 272 | case -NFS4ERR_SEQ_MISORDERED: | 273 | case -NFS4ERR_SEQ_MISORDERED: |
| 273 | dprintk("%s ERROR: %d Reset session\n", __func__, | 274 | dprintk("%s ERROR: %d Reset session\n", __func__, |
| 274 | errorcode); | 275 | errorcode); |
| 275 | nfs4_schedule_state_recovery(clp); | 276 | nfs4_schedule_session_recovery(clp->cl_session); |
| 276 | exception->retry = 1; | 277 | exception->retry = 1; |
| 277 | break; | 278 | break; |
| 278 | #endif /* defined(CONFIG_NFS_V4_1) */ | 279 | #endif /* defined(CONFIG_NFS_V4_1) */ |
| @@ -295,8 +296,7 @@ static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, | |||
| 295 | } | 296 | } |
| 296 | /* We failed to handle the error */ | 297 | /* We failed to handle the error */ |
| 297 | return nfs4_map_errors(ret); | 298 | return nfs4_map_errors(ret); |
| 298 | do_state_recovery: | 299 | wait_on_recovery: |
| 299 | nfs4_schedule_state_recovery(clp); | ||
| 300 | ret = nfs4_wait_clnt_recover(clp); | 300 | ret = nfs4_wait_clnt_recover(clp); |
| 301 | if (ret == 0) | 301 | if (ret == 0) |
| 302 | exception->retry = 1; | 302 | exception->retry = 1; |
| @@ -435,8 +435,8 @@ static int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res * | |||
| 435 | clp = res->sr_session->clp; | 435 | clp = res->sr_session->clp; |
| 436 | do_renew_lease(clp, timestamp); | 436 | do_renew_lease(clp, timestamp); |
| 437 | /* Check sequence flags */ | 437 | /* Check sequence flags */ |
| 438 | if (atomic_read(&clp->cl_count) > 1) | 438 | if (res->sr_status_flags != 0) |
| 439 | nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags); | 439 | nfs4_schedule_lease_recovery(clp); |
| 440 | break; | 440 | break; |
| 441 | case -NFS4ERR_DELAY: | 441 | case -NFS4ERR_DELAY: |
| 442 | /* The server detected a resend of the RPC call and | 442 | /* The server detected a resend of the RPC call and |
| @@ -1255,14 +1255,13 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state | |||
| 1255 | case -NFS4ERR_BAD_HIGH_SLOT: | 1255 | case -NFS4ERR_BAD_HIGH_SLOT: |
| 1256 | case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: | 1256 | case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: |
| 1257 | case -NFS4ERR_DEADSESSION: | 1257 | case -NFS4ERR_DEADSESSION: |
| 1258 | nfs4_schedule_state_recovery( | 1258 | nfs4_schedule_session_recovery(server->nfs_client->cl_session); |
| 1259 | server->nfs_client); | ||
| 1260 | goto out; | 1259 | goto out; |
| 1261 | case -NFS4ERR_STALE_CLIENTID: | 1260 | case -NFS4ERR_STALE_CLIENTID: |
| 1262 | case -NFS4ERR_STALE_STATEID: | 1261 | case -NFS4ERR_STALE_STATEID: |
| 1263 | case -NFS4ERR_EXPIRED: | 1262 | case -NFS4ERR_EXPIRED: |
| 1264 | /* Don't recall a delegation if it was lost */ | 1263 | /* Don't recall a delegation if it was lost */ |
| 1265 | nfs4_schedule_state_recovery(server->nfs_client); | 1264 | nfs4_schedule_lease_recovery(server->nfs_client); |
| 1266 | goto out; | 1265 | goto out; |
| 1267 | case -ERESTARTSYS: | 1266 | case -ERESTARTSYS: |
| 1268 | /* | 1267 | /* |
| @@ -1271,7 +1270,7 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state | |||
| 1271 | */ | 1270 | */ |
| 1272 | case -NFS4ERR_ADMIN_REVOKED: | 1271 | case -NFS4ERR_ADMIN_REVOKED: |
| 1273 | case -NFS4ERR_BAD_STATEID: | 1272 | case -NFS4ERR_BAD_STATEID: |
| 1274 | nfs4_state_mark_reclaim_nograce(server->nfs_client, state); | 1273 | nfs4_schedule_stateid_recovery(server, state); |
| 1275 | case -EKEYEXPIRED: | 1274 | case -EKEYEXPIRED: |
| 1276 | /* | 1275 | /* |
| 1277 | * User RPCSEC_GSS context has expired. | 1276 | * User RPCSEC_GSS context has expired. |
| @@ -1587,7 +1586,7 @@ static int nfs4_recover_expired_lease(struct nfs_server *server) | |||
| 1587 | if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) && | 1586 | if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) && |
| 1588 | !test_bit(NFS4CLNT_CHECK_LEASE,&clp->cl_state)) | 1587 | !test_bit(NFS4CLNT_CHECK_LEASE,&clp->cl_state)) |
| 1589 | break; | 1588 | break; |
| 1590 | nfs4_schedule_state_recovery(clp); | 1589 | nfs4_schedule_state_manager(clp); |
| 1591 | ret = -EIO; | 1590 | ret = -EIO; |
| 1592 | } | 1591 | } |
| 1593 | return ret; | 1592 | return ret; |
| @@ -3178,7 +3177,7 @@ static void nfs4_renew_done(struct rpc_task *task, void *calldata) | |||
| 3178 | if (task->tk_status < 0) { | 3177 | if (task->tk_status < 0) { |
| 3179 | /* Unless we're shutting down, schedule state recovery! */ | 3178 | /* Unless we're shutting down, schedule state recovery! */ |
| 3180 | if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) != 0) | 3179 | if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) != 0) |
| 3181 | nfs4_schedule_state_recovery(clp); | 3180 | nfs4_schedule_lease_recovery(clp); |
| 3182 | return; | 3181 | return; |
| 3183 | } | 3182 | } |
| 3184 | do_renew_lease(clp, timestamp); | 3183 | do_renew_lease(clp, timestamp); |
| @@ -3252,6 +3251,35 @@ static void buf_to_pages(const void *buf, size_t buflen, | |||
| 3252 | } | 3251 | } |
| 3253 | } | 3252 | } |
| 3254 | 3253 | ||
| 3254 | static int buf_to_pages_noslab(const void *buf, size_t buflen, | ||
| 3255 | struct page **pages, unsigned int *pgbase) | ||
| 3256 | { | ||
| 3257 | struct page *newpage, **spages; | ||
| 3258 | int rc = 0; | ||
| 3259 | size_t len; | ||
| 3260 | spages = pages; | ||
| 3261 | |||
| 3262 | do { | ||
| 3263 | len = min_t(size_t, PAGE_CACHE_SIZE, buflen); | ||
| 3264 | newpage = alloc_page(GFP_KERNEL); | ||
| 3265 | |||
| 3266 | if (newpage == NULL) | ||
| 3267 | goto unwind; | ||
| 3268 | memcpy(page_address(newpage), buf, len); | ||
| 3269 | buf += len; | ||
| 3270 | buflen -= len; | ||
| 3271 | *pages++ = newpage; | ||
| 3272 | rc++; | ||
| 3273 | } while (buflen != 0); | ||
| 3274 | |||
| 3275 | return rc; | ||
| 3276 | |||
| 3277 | unwind: | ||
| 3278 | for(; rc > 0; rc--) | ||
| 3279 | __free_page(spages[rc-1]); | ||
| 3280 | return -ENOMEM; | ||
| 3281 | } | ||
| 3282 | |||
| 3255 | struct nfs4_cached_acl { | 3283 | struct nfs4_cached_acl { |
| 3256 | int cached; | 3284 | int cached; |
| 3257 | size_t len; | 3285 | size_t len; |
| @@ -3420,13 +3448,23 @@ static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t bufl | |||
| 3420 | .rpc_argp = &arg, | 3448 | .rpc_argp = &arg, |
| 3421 | .rpc_resp = &res, | 3449 | .rpc_resp = &res, |
| 3422 | }; | 3450 | }; |
| 3423 | int ret; | 3451 | int ret, i; |
| 3424 | 3452 | ||
| 3425 | if (!nfs4_server_supports_acls(server)) | 3453 | if (!nfs4_server_supports_acls(server)) |
| 3426 | return -EOPNOTSUPP; | 3454 | return -EOPNOTSUPP; |
| 3455 | i = buf_to_pages_noslab(buf, buflen, arg.acl_pages, &arg.acl_pgbase); | ||
| 3456 | if (i < 0) | ||
| 3457 | return i; | ||
| 3427 | nfs_inode_return_delegation(inode); | 3458 | nfs_inode_return_delegation(inode); |
| 3428 | buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase); | ||
| 3429 | ret = nfs4_call_sync(server, &msg, &arg, &res, 1); | 3459 | ret = nfs4_call_sync(server, &msg, &arg, &res, 1); |
| 3460 | |||
| 3461 | /* | ||
| 3462 | * Free each page after tx, so the only ref left is | ||
| 3463 | * held by the network stack | ||
| 3464 | */ | ||
| 3465 | for (; i > 0; i--) | ||
| 3466 | put_page(pages[i-1]); | ||
| 3467 | |||
| 3430 | /* | 3468 | /* |
| 3431 | * Acl update can result in inode attribute update. | 3469 | * Acl update can result in inode attribute update. |
| 3432 | * so mark the attribute cache invalid. | 3470 | * so mark the attribute cache invalid. |
| @@ -3464,12 +3502,13 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, | |||
| 3464 | case -NFS4ERR_OPENMODE: | 3502 | case -NFS4ERR_OPENMODE: |
| 3465 | if (state == NULL) | 3503 | if (state == NULL) |
| 3466 | break; | 3504 | break; |
| 3467 | nfs4_state_mark_reclaim_nograce(clp, state); | 3505 | nfs4_schedule_stateid_recovery(server, state); |
| 3468 | goto do_state_recovery; | 3506 | goto wait_on_recovery; |
| 3469 | case -NFS4ERR_STALE_STATEID: | 3507 | case -NFS4ERR_STALE_STATEID: |
| 3470 | case -NFS4ERR_STALE_CLIENTID: | 3508 | case -NFS4ERR_STALE_CLIENTID: |
| 3471 | case -NFS4ERR_EXPIRED: | 3509 | case -NFS4ERR_EXPIRED: |
| 3472 | goto do_state_recovery; | 3510 | nfs4_schedule_lease_recovery(clp); |
| 3511 | goto wait_on_recovery; | ||
| 3473 | #if defined(CONFIG_NFS_V4_1) | 3512 | #if defined(CONFIG_NFS_V4_1) |
| 3474 | case -NFS4ERR_BADSESSION: | 3513 | case -NFS4ERR_BADSESSION: |
| 3475 | case -NFS4ERR_BADSLOT: | 3514 | case -NFS4ERR_BADSLOT: |
| @@ -3480,7 +3519,7 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, | |||
| 3480 | case -NFS4ERR_SEQ_MISORDERED: | 3519 | case -NFS4ERR_SEQ_MISORDERED: |
| 3481 | dprintk("%s ERROR %d, Reset session\n", __func__, | 3520 | dprintk("%s ERROR %d, Reset session\n", __func__, |
| 3482 | task->tk_status); | 3521 | task->tk_status); |
| 3483 | nfs4_schedule_state_recovery(clp); | 3522 | nfs4_schedule_session_recovery(clp->cl_session); |
| 3484 | task->tk_status = 0; | 3523 | task->tk_status = 0; |
| 3485 | return -EAGAIN; | 3524 | return -EAGAIN; |
| 3486 | #endif /* CONFIG_NFS_V4_1 */ | 3525 | #endif /* CONFIG_NFS_V4_1 */ |
| @@ -3497,9 +3536,8 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, | |||
| 3497 | } | 3536 | } |
| 3498 | task->tk_status = nfs4_map_errors(task->tk_status); | 3537 | task->tk_status = nfs4_map_errors(task->tk_status); |
| 3499 | return 0; | 3538 | return 0; |
| 3500 | do_state_recovery: | 3539 | wait_on_recovery: |
| 3501 | rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL); | 3540 | rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL); |
| 3502 | nfs4_schedule_state_recovery(clp); | ||
| 3503 | if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0) | 3541 | if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0) |
| 3504 | rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task); | 3542 | rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task); |
| 3505 | task->tk_status = 0; | 3543 | task->tk_status = 0; |
| @@ -4110,7 +4148,7 @@ static void nfs4_lock_release(void *calldata) | |||
| 4110 | task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp, | 4148 | task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp, |
| 4111 | data->arg.lock_seqid); | 4149 | data->arg.lock_seqid); |
| 4112 | if (!IS_ERR(task)) | 4150 | if (!IS_ERR(task)) |
| 4113 | rpc_put_task(task); | 4151 | rpc_put_task_async(task); |
| 4114 | dprintk("%s: cancelling lock!\n", __func__); | 4152 | dprintk("%s: cancelling lock!\n", __func__); |
| 4115 | } else | 4153 | } else |
| 4116 | nfs_free_seqid(data->arg.lock_seqid); | 4154 | nfs_free_seqid(data->arg.lock_seqid); |
| @@ -4134,23 +4172,18 @@ static const struct rpc_call_ops nfs4_recover_lock_ops = { | |||
| 4134 | 4172 | ||
| 4135 | static void nfs4_handle_setlk_error(struct nfs_server *server, struct nfs4_lock_state *lsp, int new_lock_owner, int error) | 4173 | static void nfs4_handle_setlk_error(struct nfs_server *server, struct nfs4_lock_state *lsp, int new_lock_owner, int error) |
| 4136 | { | 4174 | { |
| 4137 | struct nfs_client *clp = server->nfs_client; | ||
| 4138 | struct nfs4_state *state = lsp->ls_state; | ||
| 4139 | |||
| 4140 | switch (error) { | 4175 | switch (error) { |
| 4141 | case -NFS4ERR_ADMIN_REVOKED: | 4176 | case -NFS4ERR_ADMIN_REVOKED: |
| 4142 | case -NFS4ERR_BAD_STATEID: | 4177 | case -NFS4ERR_BAD_STATEID: |
| 4143 | case -NFS4ERR_EXPIRED: | 4178 | lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED; |
| 4144 | if (new_lock_owner != 0 || | 4179 | if (new_lock_owner != 0 || |
| 4145 | (lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0) | 4180 | (lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0) |
| 4146 | nfs4_state_mark_reclaim_nograce(clp, state); | 4181 | nfs4_schedule_stateid_recovery(server, lsp->ls_state); |
| 4147 | lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED; | ||
| 4148 | break; | 4182 | break; |
| 4149 | case -NFS4ERR_STALE_STATEID: | 4183 | case -NFS4ERR_STALE_STATEID: |
| 4150 | if (new_lock_owner != 0 || | ||
| 4151 | (lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0) | ||
| 4152 | nfs4_state_mark_reclaim_reboot(clp, state); | ||
| 4153 | lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED; | 4184 | lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED; |
| 4185 | case -NFS4ERR_EXPIRED: | ||
| 4186 | nfs4_schedule_lease_recovery(server->nfs_client); | ||
| 4154 | }; | 4187 | }; |
| 4155 | } | 4188 | } |
| 4156 | 4189 | ||
| @@ -4366,12 +4399,14 @@ int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl) | |||
| 4366 | case -NFS4ERR_EXPIRED: | 4399 | case -NFS4ERR_EXPIRED: |
| 4367 | case -NFS4ERR_STALE_CLIENTID: | 4400 | case -NFS4ERR_STALE_CLIENTID: |
| 4368 | case -NFS4ERR_STALE_STATEID: | 4401 | case -NFS4ERR_STALE_STATEID: |
| 4402 | nfs4_schedule_lease_recovery(server->nfs_client); | ||
| 4403 | goto out; | ||
| 4369 | case -NFS4ERR_BADSESSION: | 4404 | case -NFS4ERR_BADSESSION: |
| 4370 | case -NFS4ERR_BADSLOT: | 4405 | case -NFS4ERR_BADSLOT: |
| 4371 | case -NFS4ERR_BAD_HIGH_SLOT: | 4406 | case -NFS4ERR_BAD_HIGH_SLOT: |
| 4372 | case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: | 4407 | case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: |
| 4373 | case -NFS4ERR_DEADSESSION: | 4408 | case -NFS4ERR_DEADSESSION: |
| 4374 | nfs4_schedule_state_recovery(server->nfs_client); | 4409 | nfs4_schedule_session_recovery(server->nfs_client->cl_session); |
| 4375 | goto out; | 4410 | goto out; |
| 4376 | case -ERESTARTSYS: | 4411 | case -ERESTARTSYS: |
| 4377 | /* | 4412 | /* |
| @@ -4381,7 +4416,7 @@ int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl) | |||
| 4381 | case -NFS4ERR_ADMIN_REVOKED: | 4416 | case -NFS4ERR_ADMIN_REVOKED: |
| 4382 | case -NFS4ERR_BAD_STATEID: | 4417 | case -NFS4ERR_BAD_STATEID: |
| 4383 | case -NFS4ERR_OPENMODE: | 4418 | case -NFS4ERR_OPENMODE: |
| 4384 | nfs4_state_mark_reclaim_nograce(server->nfs_client, state); | 4419 | nfs4_schedule_stateid_recovery(server, state); |
| 4385 | err = 0; | 4420 | err = 0; |
| 4386 | goto out; | 4421 | goto out; |
| 4387 | case -EKEYEXPIRED: | 4422 | case -EKEYEXPIRED: |
| @@ -4988,10 +5023,20 @@ int nfs4_proc_create_session(struct nfs_client *clp) | |||
| 4988 | int status; | 5023 | int status; |
| 4989 | unsigned *ptr; | 5024 | unsigned *ptr; |
| 4990 | struct nfs4_session *session = clp->cl_session; | 5025 | struct nfs4_session *session = clp->cl_session; |
| 5026 | long timeout = 0; | ||
| 5027 | int err; | ||
| 4991 | 5028 | ||
| 4992 | dprintk("--> %s clp=%p session=%p\n", __func__, clp, session); | 5029 | dprintk("--> %s clp=%p session=%p\n", __func__, clp, session); |
| 4993 | 5030 | ||
| 4994 | status = _nfs4_proc_create_session(clp); | 5031 | do { |
| 5032 | status = _nfs4_proc_create_session(clp); | ||
| 5033 | if (status == -NFS4ERR_DELAY) { | ||
| 5034 | err = nfs4_delay(clp->cl_rpcclient, &timeout); | ||
| 5035 | if (err) | ||
| 5036 | status = err; | ||
| 5037 | } | ||
| 5038 | } while (status == -NFS4ERR_DELAY); | ||
| 5039 | |||
| 4995 | if (status) | 5040 | if (status) |
| 4996 | goto out; | 5041 | goto out; |
| 4997 | 5042 | ||
| @@ -5100,7 +5145,7 @@ static int nfs41_sequence_handle_errors(struct rpc_task *task, struct nfs_client | |||
| 5100 | rpc_delay(task, NFS4_POLL_RETRY_MAX); | 5145 | rpc_delay(task, NFS4_POLL_RETRY_MAX); |
| 5101 | return -EAGAIN; | 5146 | return -EAGAIN; |
| 5102 | default: | 5147 | default: |
| 5103 | nfs4_schedule_state_recovery(clp); | 5148 | nfs4_schedule_lease_recovery(clp); |
| 5104 | } | 5149 | } |
| 5105 | return 0; | 5150 | return 0; |
| 5106 | } | 5151 | } |
| @@ -5187,7 +5232,7 @@ static int nfs41_proc_async_sequence(struct nfs_client *clp, struct rpc_cred *cr | |||
| 5187 | if (IS_ERR(task)) | 5232 | if (IS_ERR(task)) |
| 5188 | ret = PTR_ERR(task); | 5233 | ret = PTR_ERR(task); |
| 5189 | else | 5234 | else |
| 5190 | rpc_put_task(task); | 5235 | rpc_put_task_async(task); |
| 5191 | dprintk("<-- %s status=%d\n", __func__, ret); | 5236 | dprintk("<-- %s status=%d\n", __func__, ret); |
| 5192 | return ret; | 5237 | return ret; |
| 5193 | } | 5238 | } |
| @@ -5203,8 +5248,13 @@ static int nfs4_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred) | |||
| 5203 | goto out; | 5248 | goto out; |
| 5204 | } | 5249 | } |
| 5205 | ret = rpc_wait_for_completion_task(task); | 5250 | ret = rpc_wait_for_completion_task(task); |
| 5206 | if (!ret) | 5251 | if (!ret) { |
| 5252 | struct nfs4_sequence_res *res = task->tk_msg.rpc_resp; | ||
| 5253 | |||
| 5254 | if (task->tk_status == 0) | ||
| 5255 | nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags); | ||
| 5207 | ret = task->tk_status; | 5256 | ret = task->tk_status; |
| 5257 | } | ||
| 5208 | rpc_put_task(task); | 5258 | rpc_put_task(task); |
| 5209 | out: | 5259 | out: |
| 5210 | dprintk("<-- %s status=%d\n", __func__, ret); | 5260 | dprintk("<-- %s status=%d\n", __func__, ret); |
| @@ -5241,7 +5291,7 @@ static int nfs41_reclaim_complete_handle_errors(struct rpc_task *task, struct nf | |||
| 5241 | rpc_delay(task, NFS4_POLL_RETRY_MAX); | 5291 | rpc_delay(task, NFS4_POLL_RETRY_MAX); |
| 5242 | return -EAGAIN; | 5292 | return -EAGAIN; |
| 5243 | default: | 5293 | default: |
| 5244 | nfs4_schedule_state_recovery(clp); | 5294 | nfs4_schedule_lease_recovery(clp); |
| 5245 | } | 5295 | } |
| 5246 | return 0; | 5296 | return 0; |
| 5247 | } | 5297 | } |
| @@ -5309,6 +5359,9 @@ static int nfs41_proc_reclaim_complete(struct nfs_client *clp) | |||
| 5309 | status = PTR_ERR(task); | 5359 | status = PTR_ERR(task); |
| 5310 | goto out; | 5360 | goto out; |
| 5311 | } | 5361 | } |
| 5362 | status = nfs4_wait_for_completion_rpc_task(task); | ||
| 5363 | if (status == 0) | ||
| 5364 | status = task->tk_status; | ||
| 5312 | rpc_put_task(task); | 5365 | rpc_put_task(task); |
| 5313 | return 0; | 5366 | return 0; |
| 5314 | out: | 5367 | out: |
