diff options
-rw-r--r-- | fs/nfs/nfs4_fs.h | 1 | ||||
-rw-r--r-- | fs/nfs/nfs4proc.c | 2 | ||||
-rw-r--r-- | fs/nfs/nfs4state.c | 22 | ||||
-rw-r--r-- | fs/nfs/nfs4xdr.c | 4 | ||||
-rw-r--r-- | include/linux/nfs4.h | 2 | ||||
-rw-r--r-- | include/linux/nfs_xdr.h | 1 |
6 files changed, 30 insertions, 2 deletions
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 0d25a82451d9..9a866368896a 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h | |||
@@ -270,6 +270,7 @@ extern void nfs4_state_set_mode_locked(struct nfs4_state *, fmode_t); | |||
270 | extern void nfs4_schedule_state_recovery(struct nfs_client *); | 270 | extern void nfs4_schedule_state_recovery(struct nfs_client *); |
271 | extern void nfs4_schedule_state_manager(struct nfs_client *); | 271 | extern void nfs4_schedule_state_manager(struct nfs_client *); |
272 | extern int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state); | 272 | extern int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state); |
273 | extern void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags); | ||
273 | extern void nfs4_put_lock_state(struct nfs4_lock_state *lsp); | 274 | extern void nfs4_put_lock_state(struct nfs4_lock_state *lsp); |
274 | extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl); | 275 | extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl); |
275 | extern void nfs4_copy_stateid(nfs4_stateid *, struct nfs4_state *, fl_owner_t); | 276 | extern void nfs4_copy_stateid(nfs4_stateid *, struct nfs4_state *, fl_owner_t); |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index d897b9e34f12..71993f122214 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -405,6 +405,8 @@ static void nfs41_sequence_done(struct nfs_client *clp, | |||
405 | if (time_before(clp->cl_last_renewal, timestamp)) | 405 | if (time_before(clp->cl_last_renewal, timestamp)) |
406 | clp->cl_last_renewal = timestamp; | 406 | clp->cl_last_renewal = timestamp; |
407 | spin_unlock(&clp->cl_lock); | 407 | spin_unlock(&clp->cl_lock); |
408 | /* Check sequence flags */ | ||
409 | nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags); | ||
408 | return; | 410 | return; |
409 | } | 411 | } |
410 | out: | 412 | out: |
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 46c69e2248e3..a86f3acf3212 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
@@ -1173,6 +1173,28 @@ static int nfs4_reclaim_lease(struct nfs_client *clp) | |||
1173 | } | 1173 | } |
1174 | 1174 | ||
1175 | #ifdef CONFIG_NFS_V4_1 | 1175 | #ifdef CONFIG_NFS_V4_1 |
1176 | void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags) | ||
1177 | { | ||
1178 | if (!flags) | ||
1179 | return; | ||
1180 | else if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED) { | ||
1181 | set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); | ||
1182 | nfs4_state_start_reclaim_reboot(clp); | ||
1183 | nfs4_schedule_state_recovery(clp); | ||
1184 | } else if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED | | ||
1185 | SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED | | ||
1186 | SEQ4_STATUS_ADMIN_STATE_REVOKED | | ||
1187 | SEQ4_STATUS_RECALLABLE_STATE_REVOKED | | ||
1188 | SEQ4_STATUS_LEASE_MOVED)) { | ||
1189 | set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); | ||
1190 | nfs4_state_start_reclaim_nograce(clp); | ||
1191 | nfs4_schedule_state_recovery(clp); | ||
1192 | } else if (flags & (SEQ4_STATUS_CB_PATH_DOWN | | ||
1193 | SEQ4_STATUS_BACKCHANNEL_FAULT | | ||
1194 | SEQ4_STATUS_CB_PATH_DOWN_SESSION)) | ||
1195 | nfs_expire_all_delegations(clp); | ||
1196 | } | ||
1197 | |||
1176 | static void nfs4_session_recovery_handle_error(struct nfs_client *clp, int err) | 1198 | static void nfs4_session_recovery_handle_error(struct nfs_client *clp, int err) |
1177 | { | 1199 | { |
1178 | switch (err) { | 1200 | switch (err) { |
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 4ddd04a1113e..f740472370aa 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
@@ -4614,8 +4614,8 @@ static int decode_sequence(struct xdr_stream *xdr, | |||
4614 | dummy = be32_to_cpup(p++); | 4614 | dummy = be32_to_cpup(p++); |
4615 | /* target highest slot id - currently not processed */ | 4615 | /* target highest slot id - currently not processed */ |
4616 | dummy = be32_to_cpup(p++); | 4616 | dummy = be32_to_cpup(p++); |
4617 | /* result flags - currently not processed */ | 4617 | /* result flags */ |
4618 | dummy = be32_to_cpup(p); | 4618 | res->sr_status_flags = be32_to_cpup(p); |
4619 | status = 0; | 4619 | status = 0; |
4620 | out_err: | 4620 | out_err: |
4621 | res->sr_status = status; | 4621 | res->sr_status = status; |
diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index c4c060208109..89404bfb72b6 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h | |||
@@ -128,6 +128,8 @@ | |||
128 | #define SEQ4_STATUS_RECALLABLE_STATE_REVOKED 0x00000040 | 128 | #define SEQ4_STATUS_RECALLABLE_STATE_REVOKED 0x00000040 |
129 | #define SEQ4_STATUS_LEASE_MOVED 0x00000080 | 129 | #define SEQ4_STATUS_LEASE_MOVED 0x00000080 |
130 | #define SEQ4_STATUS_RESTART_RECLAIM_NEEDED 0x00000100 | 130 | #define SEQ4_STATUS_RESTART_RECLAIM_NEEDED 0x00000100 |
131 | #define SEQ4_STATUS_CB_PATH_DOWN_SESSION 0x00000200 | ||
132 | #define SEQ4_STATUS_BACKCHANNEL_FAULT 0x00000400 | ||
131 | 133 | ||
132 | #define NFS4_MAX_UINT64 (~(u64)0) | 134 | #define NFS4_MAX_UINT64 (~(u64)0) |
133 | 135 | ||
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 8c880372536e..ea32db30c289 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
@@ -172,6 +172,7 @@ struct nfs4_sequence_res { | |||
172 | u8 sr_slotid; /* slot used to send request */ | 172 | u8 sr_slotid; /* slot used to send request */ |
173 | int sr_status; /* sequence operation status */ | 173 | int sr_status; /* sequence operation status */ |
174 | unsigned long sr_renewal_time; | 174 | unsigned long sr_renewal_time; |
175 | u32 sr_status_flags; | ||
175 | }; | 176 | }; |
176 | 177 | ||
177 | struct nfs4_get_lease_time_args { | 178 | struct nfs4_get_lease_time_args { |