2009/7/29 Christian Masloch <c...@bttr-software.de>:
>> Which aspects of SFT changed and how? Are there potential
>> performance issues because we no longer can cache certain
>> data in extra fields of fnodes?
>
> It seems to me that the fnode (as defined in fnode.h) doesn't save any
> information that isn't contained in the SFT, except the new file dates and
> times (in the directory entry) which are accessed with a filename instead
> of a SFT; so they're not required in the SFT. Note that the directory
> entry's cluster and index into cluster (as found in the fnode) can be
> computed with some shifting from the entry's sector and index into sector
> (as found in the SFT) when the sector size, cluster size and the sector of
> the first cluster is available (all found in a valid DPB or EDPB).

Before I eliminated the far fnodes I made them compatible with SFTs.
There are no performance issues; the directory entry now needs to be
read, updated and written for a file close, instead of just copied
from the fnode, but since the sector needs to be read anyway it
doesn't change performance.

An fnode now is defined like this:
struct f_node {
  UWORD f_flags;                /* file flags                   */

  dmatch *f_dmp;                /* this file's dir match        */
  struct dirent f_dir;          /* this file's dir entry image  */

  ULONG f_dirsector;            /* the sector containing dir entry*/
  UBYTE f_diridx;               /* offset/32 of dir entry in sec*/
  /* when dir is not root         */
  struct dpb FAR *f_dpb;        /* the block device for file    */

  ULONG f_offset;               /* byte offset for next op      */
  CLUSTER f_cluster_offset;     /* relative cluster number within file */
  CLUSTER f_cluster;            /* the cluster we are at        */
  UBYTE f_sft_idx;              /* corresponding SFT index      */
};

Some fields moved to f_dmp -- there two directory match structures in
the SDA (even documented in RBIL), one for every fnode. I have some
patches to move the f_dir directory entries to the RBIL SDA locations
too but I'll wait with those until after release. Once dos_close() and
rwblock() (for read and write) use SFT entries directly, it's actually
more appropriate to call an fnode a dirnode, since it only pertains to
directory operations.
Right now however, directory and file operations share map_cluster()
which takes an fnode pointer, so it's not a trivial change.
Originally, files and directories seem to have used the same
read/write code but directories are too special in DOS so they were
split.

>>> * Fixed Int21/AX=4409 for drives from device drivers.
>>
>> What was wrong?
>
> I'm interested too.

ioctl.c had:
CharReqHdr.r_unit = dpbp->dpb_subunit;
(changed from dpbp->dpb_unit in
r1115 | perditionc | 2005-02-24 15:35:48 -0500 (Thu, 24 Feb 2005) | 2 lines

from Eric (similar already in dev), set driver request field with
subunit number)
but after that it was used in:

        case 0x09:
        {
          struct cds FAR *cdsp = get_cds(CharReqHdr.r_unit);

so you also now got the CDS from the subunit. That's ok for built-in
devices but not for loaded devices.
I changed the get_cds call to use BL.

Bart

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Freedos-kernel mailing list
Freedos-kernel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freedos-kernel

Reply via email to