FSH_DOVOLIO
Purpose
This function performs I/O to the specified volume.
Calling Sequence
int far pascal FSH_DOVOLIO(operation, fAllowed, hVPB, pData, pcSec, iSec) unsigned short operation; unsigned short fAllowed; unsigned short hVPB; char far * pData; unsigned short far * pcSec; unsigned long iSec;
Where
operation | is the bit mask indicating read/read-bypass/write/write-bypass, and verify- after-write/write-through and no-cache operation to be performed. |
---|---|
Bit 0x0001 off | indicates read. |
Bit 0x0001 on | indicates write. |
Bit 0x0002 off | indicates no cache bypass. |
Bit 0x0002 on | indicates cache bypass. |
Bit 0x0004 off | indicates no verify-after-write operation. |
Bit 0x0004 on | indicates verify-after-write operation. |
Bit 0x0008 off | indicates errors signaled to the hard error daemon. |
Bit 0x0008 on | indicates hard errors will be returned directly. |
Bit 0x0010 off | indicates I/O is not write-through. |
Bit 0x0010 on | indicates I/O is write-through. |
Bit 0x0020 off | indicates data for this I/O should probably be cached. |
Bit 0x0020 on | indicates data for this I/O should probably not be cached. |
All other bits are reserved and must be zero. |
The difference between the cache bypass and the no cache bits is in the type of request packet that the device driver will see. With cache bypass, it will get a packet with command code 24, 25, or 26. With no cache, it will get the extended packets for command codes 4, 8, or 9. The advantage of the latter is that the write-through bit can also be sent to the device driver in the same packet, improving the functionality at the level of the device driver.
fAllowed | is a bit mask indicating allowed actions: |
---|---|
Bit 0x0001 on | indicates FAIL allowed |
Bit 0x0002 on | indicates ABORT allowed |
Bit 0x0004 on | indicates RETRY allowed |
Bit 0x0008 on | indicates IGNORE allowed |
Bit 0x0010 on | indicates ACKNOWLEDGE only allowed |
If this bit is set, none of the other bits may be set. |
All other bits are reserved and must be set to zero.
hVPB is the volume handle for the source of I/O.
pData is the long address of the user transfer area.
pcSec is the pointer to the number of sectors to be transferred.
On return, this is the number of sectors successfully transferred.
iSec is the sector number of the first sector of the transfer.
Returns
If no error is detected, a zero error code is returned. If an error is detected, one of the following error codes is returned:
- ERROR_PROTECTION_VIOLATION – indicates the supplied address/length is invalid.
- ERROR_UNCERTAIN_MEDIA – indicates the device driver can no longer reliably tell if the media has been changed.
This occurs only within the context of an FS_MOUNT call.
- ERROR_TRANSFER_TOO_LONG – indicates the transfer is too long for the device.
- Device-driver/device-manager errors listed /DDERR/
Remarks
This function formats a device driver request packet for the requested I/O, locks the data transfer region, calls the device driver, and reports any errors to the hard error daemon before returning to the FSD. Any retries indicated by the hard error daemon or actions indicated by DosError are done within the call to FSH_DOVOLIO.
FSH_DOVOLIO may be used at all times within the FSD. When called within the scope of a FS_MOUNT call, it applies to the volume in the drive without regard to which volume it may be. However, since volume recognition is not complete until the FSD returns to the FS_MOUNT call, the FSD must be careful when an ERROR_UNCERTAIN_MEDIA is returned. This indicates the media has gone uncertain while we are trying to identify the media in the drive. This may indicate the volume that the FSD was trying to recognize was removed. In that case, the FSD must release any resources attached to the hVPB passed in the FS_MOUNT call and return ERROR_UNCERTAIN_MEDIA to the FS_MOUNT call. This will direct the volume tracking logic to restart the mount process.
OS/2 will validate the user transfer area for proper access and size and will lock the segment.
Verify-after-write specified on a read is ignored.
On 80386 processors, FSH_DOVOLIO will take care of memory contiguity requirements of device drivers. It is advisable, therefore, that FSDs use FSH_DOVOLIO instead of calling device drivers directly. This will improve performance of FSDs running on 80386 processors.
FSH_DOVOLIO may block.
Note: OS/2 does not validate input parameters. An FSD, therefore, should call FSH_PROBEBUF where appropriate.