diff options
| -rw-r--r-- | fs/nfs/nfs4proc.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index dca174ce8309..bdd880bddba4 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -2109,6 +2109,28 @@ static int nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *sta | |||
| 2109 | return ret; | 2109 | return ret; |
| 2110 | } | 2110 | } |
| 2111 | 2111 | ||
| 2112 | static void nfs_finish_clear_delegation_stateid(struct nfs4_state *state) | ||
| 2113 | { | ||
| 2114 | nfs_remove_bad_delegation(state->inode); | ||
| 2115 | write_seqlock(&state->seqlock); | ||
| 2116 | nfs4_stateid_copy(&state->stateid, &state->open_stateid); | ||
| 2117 | write_sequnlock(&state->seqlock); | ||
| 2118 | clear_bit(NFS_DELEGATED_STATE, &state->flags); | ||
| 2119 | } | ||
| 2120 | |||
| 2121 | static void nfs40_clear_delegation_stateid(struct nfs4_state *state) | ||
| 2122 | { | ||
| 2123 | if (rcu_access_pointer(NFS_I(state->inode)->delegation) != NULL) | ||
| 2124 | nfs_finish_clear_delegation_stateid(state); | ||
| 2125 | } | ||
| 2126 | |||
| 2127 | static int nfs40_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state) | ||
| 2128 | { | ||
| 2129 | /* NFSv4.0 doesn't allow for delegation recovery on open expire */ | ||
| 2130 | nfs40_clear_delegation_stateid(state); | ||
| 2131 | return nfs4_open_expired(sp, state); | ||
| 2132 | } | ||
| 2133 | |||
| 2112 | #if defined(CONFIG_NFS_V4_1) | 2134 | #if defined(CONFIG_NFS_V4_1) |
| 2113 | static void nfs41_clear_delegation_stateid(struct nfs4_state *state) | 2135 | static void nfs41_clear_delegation_stateid(struct nfs4_state *state) |
| 2114 | { | 2136 | { |
| @@ -8330,7 +8352,7 @@ static const struct nfs4_state_recovery_ops nfs41_reboot_recovery_ops = { | |||
| 8330 | static const struct nfs4_state_recovery_ops nfs40_nograce_recovery_ops = { | 8352 | static const struct nfs4_state_recovery_ops nfs40_nograce_recovery_ops = { |
| 8331 | .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE, | 8353 | .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE, |
| 8332 | .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE, | 8354 | .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE, |
| 8333 | .recover_open = nfs4_open_expired, | 8355 | .recover_open = nfs40_open_expired, |
| 8334 | .recover_lock = nfs4_lock_expired, | 8356 | .recover_lock = nfs4_lock_expired, |
| 8335 | .establish_clid = nfs4_init_clientid, | 8357 | .establish_clid = nfs4_init_clientid, |
| 8336 | }; | 8358 | }; |
