S437: End-of-volume error, bad DCB or DEB
An S437 abend means end-of-volume processing failed because the control blocks it was given weren't valid. 437-08 means the DCB pointer was wrong when the program issued FEOV, and 437-0C means the data set's DEB wasn't in the DEB table. Message IEC025I gives the return code.
Other names for this code
Also written as 437, S437-08, S437-0C, abend 437, system abend 437, 437-0C, IEC025I 437.
What it means
FEOV (force end of volume) is an assembler macro. It tells the system to stop using the current volume of a sequential data set and move to the next one, as if the end of the volume had been reached. The system then runs its normal end-of-volume (EOV) routine. To do that it needs a valid DCB for an open data set, and the data extent block (DEB) that OPEN built for that DCB.
End-of-volume processing also runs without FEOV, whenever a GET, PUT, READ or WRITE reaches the end of a volume, and it needs the same control blocks then. If either check fails, the system issues message IEC025I and ends the step with system completion code 437.
437-08means the DCB pointer wasn't valid when FEOV was issued.437-0Cmeans the DEB wasn't in the DEB table. IBM doesn't tie this one to FEOV, so it can come from any end-of-volume. The system keeps a table of the DEBs that belong to open data sets. A DEB that isn't in it doesn't belong to an open data set the system knows about.
Both point to a program problem rather than a problem with the data or the volume. IBM treats S437 as a probable user error. You're most likely to meet it in assembler code, or in a product that drives its own tape or volume switching.
Common causes
- The program passed the wrong address on FEOV, such as the address of a work area, a copy of the DCB, or a register that no longer held the DCB address (437-08).
- The DCB's pointer to its DEB no longer points to a DEB the system knows, for example because the DCB was overwritten or reused after another OPEN and CLOSE (437-0C).
- A storage overlay damaged the DCB before FEOV or the next read or write reached end of volume.
- A vendor product issued FEOV under conditions it didn't expect, and maintenance for it fixes the problem.
How to find the problem
- Find IEC025I in the job log. It has the form
IEC025I 437-rc,. Note the return code and the DD name.mod, jobname, stepname, ddname, dev, volser, dsname - In the dump, find the address the program passed to FEOV and check that it points to the DCB for that DD, and that the DCB is still open.
- Read through the program for paths that CLOSE the DCB and can still reach FEOV, or that reuse the register holding the DCB address.
- If a product issued the FEOV, search its support site for the abend and keep the dump for the vendor.
How to fix it
- Pass the address of the real, open DCB to FEOV.
- Make sure FEOV, and any read or write, can only be reached while the data set is open.
- Find and fix any storage overlay that changes the DCB.
- If the abend comes from a product, apply its maintenance or open a problem with the vendor.
What it looks like
IEC025I 437-0C,IGC0003A,PAYRUN01,STEP060,TAPEOUT,0B41,PR4417,PROD.PAYROLL.ARCHIVE IEA995I SYMPTOM DUMP OUTPUT SYSTEM COMPLETION CODE=437 REASON CODE=0000000C IEF450I PAYRUN01 STEP060 - ABEND=S437 U0000 REASON=0000000C
IBM documentation
IBM z/OS: 437. Use the documentation for your installed release.
Related codes
Questions
What is FEOV?
FEOV is the force end-of-volume macro. A program issues it to stop using the current volume and continue on the next one without closing the data set.
Can bad data cause S437?
Not usually. It's raised when the control blocks for the data set aren't valid, which points to the program or a storage overlay rather than the contents of the file.