==== FS_FILEIO ====
**Purpose**
Perform multiple lock, unlock, seek, read, and write I/O.
**Calling Sequence**
int far pascal FS_FILEIO (psffsi, psffsd, pCmdList, cbCmdList, poError,
IOflag)
struct sffsi far * psffsi;
struct sffsd far * psffsd;
char far * pCmdList;
unsigned short cbCmdList;
unsigned short far * poError;
unsigned short IOflag;
**Where**
//psffsi// is a pointer to the file-system-independent portion of an open file instance.
//psffsd// is a pointer to the file-system-dependent portion of an open file instance.
//pCmdList// is a pointer to a command list that contains entries indicating what commands will be performed.
Each individual operation (//CmdLock//, //CmdUnlock//, //CmdSeek//, //CmdIO//) is performed as atomic operations until all are complete or until one fails. //CmdLock// executes a multiple range lock as an atomic operation. //CmdUnlock// executes a multiple range unlock as an atomic operation. Unlike //CmdLock//, //CmdUnlock// cannot fail as long as the parameters to it are correct, and the calling application had done a Lock earlier, so it can be viewed as atomic.
The validity of the user address is not verified (see //FSH_PROBEBUF//).
For //CmdLock//, the command format is:
struct CmdLock {
unsigned short Cmd = 0; /* 0 for lock operations */
unsigned short LockCnt; /* number of locks that follow */
unsigned long TimeOut; /* ms time-out for lock success */
}
which is followed by a series of records of the following format:
struct Lock {
unsigned short Share = 0; /* 0 for exclusive, 1 for read-only */
long Start; /* start of lock region */
long Length; /* length of lock region */
}
If a lock within a //CmdLock// causes a time-out, none of the other locks within the scope of //CmdLock// are in force, because the lock operation is viewed as atomic.
//CmdLock//. //TimeOut// is the count in milliseconds, until the requesting process is to resume execution if the requested locks are not available. If //CmdLock//. //TimeOut// == 0, there will be no wait. If //CmdLock//. //TimeOut// < 0xFFFFFFFF it is the number of milliseconds to wait until the requested locks become available. If //CmdLock//. //TimeOut// == 0xFFFFFFFF then the thread will wait indefinitely until the requested locks become available.
Lock.Share defines the type of access other processes may have to the file-range being locked. If its value == 0, other processes have No-Access to the locked range. If its value == 1, other process have Read-Only access to the locked range.
For //CmdUnlock//, the command format is:
struct CmdUnlock {
unsigned short Cmd = 1; /* 1 for unlock operations */
unsigned short UnlockCnt; /* Number of unlocks that follow */
}
which is followed by a series of records of the following format:
struct UnLock {
long Start; /* start of locked region */
long Length; /* length of locked region */
}
For //CmdSeek//, the command format is:
struct CmdSeek {
unsigned short Cmd = 2; /* 2 for seek operation */
unsigned short Method; /* 0 for absolute */
/* 1 for relative to current */
/* 2 for relative to EOF */
long Position; /* file seek position or delta */
long Actual; /* actual position seeked to */
}
For //CmdIO//, the command format is:
struct CmdIO {
unsigned short Cmd; /* 3 for read, 4 for write */
void far * Buffer; /* pointer to the data buffer */
unsigned short BufferLen; /* number of bytes requested */
unsigned short Actual; /* number of bytes transferred */
}
//cbCmdList// is the length in bytes of the command list.
//poError// is the offset within the command list of the command that caused the error.
This field has a value only when an error occurs.
The validity of the user address has not been verified (see //FSH_PROBEBUF//).
^//IOflag// ^indicates information about the operation on the handle. ^
|//IOflag// == 0x0010 |indicates write-through. |
|//IOflag// == 0x0020 |indicates no-cache. |
**Remarks**
This function provides a simple mechanism for combining the file I/O operations into a single request and providing improved performance, particularly in a networking environment.
File systems that do not have the //FileIO// bit in their attribute field do not see this call: The command list is parsed by the IFS router. The FSD sees only //FS_CHGFILEPTR//, //FS_READ//, //FS_WRITE// calls.
File systems that have the //FileIO// bit in their attribute field see this call in its entirety. The atomicity guarantee applies only to the commands themselves and not to the list as a whole.
Of the information passed in //IOflag//, the write-through bit is a mandatory bit in that any data written to the block device must be put out on the medium before the device driver returns. The no-cache bit, on the other hand, is an advisory bit that says whether the data being transferred is worth caching or not.