diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r-- | fs/nfs/nfs4proc.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index f93b9cdb4934..5133bb18830e 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -1458,12 +1458,18 @@ nfs4_opendata_check_deleg(struct nfs4_opendata *data, struct nfs4_state *state) | |||
1458 | if (delegation) | 1458 | if (delegation) |
1459 | delegation_flags = delegation->flags; | 1459 | delegation_flags = delegation->flags; |
1460 | rcu_read_unlock(); | 1460 | rcu_read_unlock(); |
1461 | if (data->o_arg.claim == NFS4_OPEN_CLAIM_DELEGATE_CUR) { | 1461 | switch (data->o_arg.claim) { |
1462 | default: | ||
1463 | break; | ||
1464 | case NFS4_OPEN_CLAIM_DELEGATE_CUR: | ||
1465 | case NFS4_OPEN_CLAIM_DELEG_CUR_FH: | ||
1462 | pr_err_ratelimited("NFS: Broken NFSv4 server %s is " | 1466 | pr_err_ratelimited("NFS: Broken NFSv4 server %s is " |
1463 | "returning a delegation for " | 1467 | "returning a delegation for " |
1464 | "OPEN(CLAIM_DELEGATE_CUR)\n", | 1468 | "OPEN(CLAIM_DELEGATE_CUR)\n", |
1465 | clp->cl_hostname); | 1469 | clp->cl_hostname); |
1466 | } else if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) | 1470 | return; |
1471 | } | ||
1472 | if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) | ||
1467 | nfs_inode_set_delegation(state->inode, | 1473 | nfs_inode_set_delegation(state->inode, |
1468 | data->owner->so_cred, | 1474 | data->owner->so_cred, |
1469 | &data->o_res); | 1475 | &data->o_res); |
@@ -1771,6 +1777,9 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, | |||
1771 | if (IS_ERR(opendata)) | 1777 | if (IS_ERR(opendata)) |
1772 | return PTR_ERR(opendata); | 1778 | return PTR_ERR(opendata); |
1773 | nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid); | 1779 | nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid); |
1780 | write_seqlock(&state->seqlock); | ||
1781 | nfs4_stateid_copy(&state->stateid, &state->open_stateid); | ||
1782 | write_sequnlock(&state->seqlock); | ||
1774 | clear_bit(NFS_DELEGATED_STATE, &state->flags); | 1783 | clear_bit(NFS_DELEGATED_STATE, &state->flags); |
1775 | switch (type & (FMODE_READ|FMODE_WRITE)) { | 1784 | switch (type & (FMODE_READ|FMODE_WRITE)) { |
1776 | case FMODE_READ|FMODE_WRITE: | 1785 | case FMODE_READ|FMODE_WRITE: |
@@ -1863,6 +1872,8 @@ static int _nfs4_proc_open_confirm(struct nfs4_opendata *data) | |||
1863 | data->rpc_done = 0; | 1872 | data->rpc_done = 0; |
1864 | data->rpc_status = 0; | 1873 | data->rpc_status = 0; |
1865 | data->timestamp = jiffies; | 1874 | data->timestamp = jiffies; |
1875 | if (data->is_recover) | ||
1876 | nfs4_set_sequence_privileged(&data->c_arg.seq_args); | ||
1866 | task = rpc_run_task(&task_setup_data); | 1877 | task = rpc_run_task(&task_setup_data); |
1867 | if (IS_ERR(task)) | 1878 | if (IS_ERR(task)) |
1868 | return PTR_ERR(task); | 1879 | return PTR_ERR(task); |