Controlling FreeMiNT's real FAT XFS
===================================

last update: 1998-10-06
Author: Frank Naumann <fnaumann@freemint.de>
notes:


I. Introduction
---------------

FreeMiNT 1.15 has a new FAT filesystem. It is integrated
in the kernel.

The NEWFATFS has many advantages:
- very fast
- mostly configurable also on runtime
- supports Microsofts VFAT extension
- supports TOS and DOS partitions of any size
- supports FAT32 partitions;
  partitions larger than 2 GB are no longer a problem
- part of FreeMiNT, available in source for easy support

At the moment the old TOS filesystem is the default
filesystem. This will change in the future.

To activate the new FAT filesystem (NEWFATFS), there is 
a new configuration keyword to use in the configuration 
file (MiNT.CNF).
With a line like "NEWFATFS=A,D,E,F" the NEWFATFS will be
active on A:, D:, E: and F: (valid FAT partition only)

VFAT can be configured at boot time in the configuration file
with "VFAT=<drives>" keyword (same syntax as NEWFATFS).

Write back cache can be activated at boottime with
"WB_ENABLE=<drives>" keyword (same syntax as NEWFATFS).

VFAT and write back cache configuration is only available for
NEWFATFS partitions (and MinixFS 0.70 partitions).


The following paragraphs describe the supported calls
for runtime configuration. Only interesting for programmers.
It exists the tool FSetter from Christian Felsch that
implemented all these configuration in an easy GEM program.
FSetter is part of FreeMiNT 1.15 distribution. Thanks to
Christian Felsch for this.


II. Definition
--------------

Prototype:

long Dcntl (short opcode, const char *path, long arg);

call conventions:
- all arguments are on the stack
- return value is stored in d0
(cdecl call)

return value conventions:
- negative return values are ATARI error codes
- if opcode doesn't exist or is not supported
  EINVFN is returned 

type conventions:

char			8 bit signed
unsigned char	8 bit unsigned
short			16 bit signed integer
unsigned short	16 bit unsigned integer
long			32 bit signed integer
unsigned long	32 bit unsigned integer
llong			64 bit signed integer
ullong		64 bit unsigned integer

with:

typedef struct { long hi; unsigned long low; } llong;
typedef struct { unsigned long hi; unsigned long low; } ullong;


III. Supported opcodes
----------------------

name				opcode	comment
====				======	=======

MX_KER_XFSNAME		0x6d05	like MagiC

Description:

Arg is a pointer to at least 9 characters and the xfs
print a readable name to arg.


VFAT_CNFDFLN		0x5600	like MagiC

Description:

Control the status of the VFAT extension for all drives.
Arg is a bitfield. These default values are only
interesting, if there is a valid FAT filesystem on the
specified drive.


VFAT_CNFLN		0x5601	like MagiC

Description:

Enable/disable the VFAT extension for the specified drive.
You should send a SH_WDRAW message to the shell to see the
difference.

convention: if arg = -1, the return value is the current status.

status:	DISABLE = 0
	ENABLE  = 1


V_CNTR_SLNK		0x5602	new

Description:

Enable/disable support for MagiC style symbolic links.
If you have problems on other platforms or you don't like
links, you can disable this feature with this Dcntl.

convention: if arg = -1, the return value is the current status.

status:	DISABLE = 0
	ENABLE  = 1


V_CNTR_MODE		0x5604	new

Description:

Sets or asks the newname mode for the specified drive.
This opcode is only available for FAT drives. On VFAT drives
are all characters allowed (Unicode) and the short name
truncation always uses the MS-DOS table.

convention: if arg = -1, the return value is the current status.

status:	GEMDOS		0	/* allows all GEMDOS characters:
				 * A..Z0..9!#$%&'()-@^_`{}~"+,;<=>[]| */
	ISO		1	/* allows only ISO d-characters as defined in
				 * ISO/IEC 9293 and ISO 9660: A..Z0..9_ */
	MSDOS		2	/* allows all MS-DOS characters:
				 * A..Z0..9!#$%&'()-@^_`{}~ */


V_CNTR_FAT32		0x560a	new

Description:

Control some of the FAT32 extensions like FAT mirroring
and additional info sector. Only available on FAT32
drives.
Arg must be pointer to the following struct:

struct control_FAT32
{
	short	mode;	/* 0 = fill out; 1 = set values */
	short	mirr;	/* FAT mirroring: 0 = enabled, otherwise active FAT */
	short	fats;	/* number of fats */
	short	info;	/* status of additional info sector */
# define FAT32_info_exist	0x1
# define FAT32_info_active	0x2
};

If (mode == 0) the xfs fills out the struct otherwise it will
set some things.
If (mirr == 0) FAT mirroring is enabled, this means ALL FATs
are updated. If mirr is greater 0 only one FAT is updated and
the value of mirr is the number of the actual FAT.
This value is filled out and reading in the context of mode.
Fats is only an information value. It holds the number of FATs
that are available (normally 2).
Info describes the status of the optional info sector. If bit 2 is
set, the info sector is updated (costs performance).

ATTENTION: the boot sector must be writeable for these operations
           because some values are stored in the bootsector.


FUTIME			0x4603	like MinixFS

Description:

Sets mtime/mdate, atime/adate and ctime/cdate to actual time
if arg is NULL. If arg != NULL arg is interpreted as a pointer
to the following struct:

struct mutimbuf
{
	unsigned short actime, acdate;	/* GEMDOS format */
	unsigned short modtime, moddate;
};

and the timestamps are set to the given values. Works on files
and directories.


FTRUNCATE		0x4604	like MinixFS

Description:

Truncates file to given size. Arg is interpreted as new size.
Useful if you are shrinking files without deletion.


FS_INFO		0xf100	new

Description:

Arg is interpreted as a pointer to the following struct and is filled out
from the xfs.

struct fs_info
{
	char	name [32];	/* name of the xfs (same as MX_KER_XFSNAME but more space) */
	long	version;	/* upper word: major version; lower word: minor version */
	long	type;		/* upper word: major type; lower word: minor type */
	char	type_asc[32];	/* human readable version of type */
};


FS_USAGE		0xf101	new

Description:

Arg is interpreted as a pointer to the following struct and is filled out
from the xfs.

struct fs_usage
{
	ulong	blocksize;	/* 32bit: size in bytes of a block */
	llong	blocks;		/* 64bit: number of blocks */
	llong	free_blocks;	/* 64bit: number of free blocks */
	llong	inodes;		/* 64bit: number of inodes or FS_UNLIMITED */
	llong	free_inodes;	/* 64bit: number of free inodes or FS_UNLIMITED */
# define FS_UNLIMITED	-1
};


V_CNTR_WP		0x5664	new

Description:

Not ready yet.
Only supported by NEWFATFS and MinixFS 0.70 at the moment.


V_CNTR_WB		0x5665	new

Description:

Enable/disable write-back cache for the specified (and only for
this) drive.
Only supported by NEWFATFS and MinixFS 0.70 at the moment.

convention: if arg = -1, the return value is the current status.

status:	DISABLE = 0
	ENABLE  = 1
