calldata->arg.lr_args = NULL;
                        calldata->res.lr_res = NULL;
                        break;
+               case -NFS4ERR_OLD_STATEID:
+                       if (nfs4_refresh_layout_stateid(&calldata->arg.lr_args->stateid,
+                                               calldata->inode)) {
+                               calldata->res.lr_ret = 0;
+                               rpc_restart_call_prepare(task);
+                               return;
+                       }
+                       /* Fallthrough */
                case -NFS4ERR_ADMIN_REVOKED:
                case -NFS4ERR_DELEG_REVOKED:
                case -NFS4ERR_EXPIRED:
                case -NFS4ERR_BAD_STATEID:
-               case -NFS4ERR_OLD_STATEID:
                case -NFS4ERR_UNKNOWN_LAYOUTTYPE:
                case -NFS4ERR_WRONG_CRED:
                        calldata->arg.lr_args = NULL;
                        data->args.lr_args = NULL;
                        data->res.lr_res = NULL;
                        break;
+               case -NFS4ERR_OLD_STATEID:
+                       if (nfs4_refresh_layout_stateid(&data->args.lr_args->stateid,
+                                               data->inode)) {
+                               data->res.lr_ret = 0;
+                               rpc_restart_call_prepare(task);
+                               return;
+                       }
+                       /* Fallthrough */
                case -NFS4ERR_ADMIN_REVOKED:
                case -NFS4ERR_DELEG_REVOKED:
                case -NFS4ERR_EXPIRED:
                case -NFS4ERR_BAD_STATEID:
-               case -NFS4ERR_OLD_STATEID:
                case -NFS4ERR_UNKNOWN_LAYOUTTYPE:
                case -NFS4ERR_WRONG_CRED:
                        data->args.lr_args = NULL;
 
                pnfs_lseg_dec_and_remove_zero(lseg, free_me);
 }
 
+/*
+ * Update the seqid of a layout stateid
+ */
+bool nfs4_refresh_layout_stateid(nfs4_stateid *dst, struct inode *inode)
+{
+       struct pnfs_layout_hdr *lo;
+       bool ret = false;
+
+       spin_lock(&inode->i_lock);
+       lo = NFS_I(inode)->layout;
+       if (lo && nfs4_stateid_match_other(dst, &lo->plh_stateid)) {
+               dst->seqid = lo->plh_stateid.seqid;
+               ret = true;
+       }
+       spin_unlock(&inode->i_lock);
+       return ret;
+}
+
 /*
  * Mark a pnfs_layout_hdr and all associated layout segments as invalid
  *
 
                bool is_recall);
 int pnfs_destroy_layouts_byclid(struct nfs_client *clp,
                bool is_recall);
+bool nfs4_refresh_layout_stateid(nfs4_stateid *dst, struct inode *inode);
 void pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo);
 void pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo,
                             const nfs4_stateid *new,
 {
 }
 
+static inline bool nfs4_refresh_layout_stateid(nfs4_stateid *dst,
+               struct inode *inode)
+{
+       return false;
+}
 #endif /* CONFIG_NFS_V4_1 */
 
 #if IS_ENABLED(CONFIG_NFS_V4_2)