*** Notes specific to fistgen 0.1.2pre:

FreeBSD 5.x templates:

- minor fixes to FreeBSD-5 templates to work for 5.1 and 5.2.

- new templates for FreeBSD-5.3-RELEASE.

New fist declaration "license" which takes a string.  This declaration MUST
be defined to ensure that users of fistgen, especially on Linux, are aware
of what license they picked for their output file system; this may affect
whether the new file system module will be able to use all of the GPL kernel
symbols or not.

*** Notes specific to fistgen 0.1.1:

Bugs fixed in the Linux 2.6 templates:

- handle Fedora Core 2 kernels, which have changed some kernel APIs, as well
  as vanilla 2.6 kernels (esp. since 2.6.7 changed an internal kernel API)

- compile wrapfs.h cleanly with gcc-3.3, which doesn't like
  (const struct foo*)(something) = something_else.

Bug fixes in the Linux 2.4 and 2.6 templates:

- doit.sh script was exiting before running setky (cryptfs)


*** Notes specific to fistgen 0.1:

Linux 2.6 templates!  Tested with base0fs, base1fs, base2fs, base3fs (aka
wrapfs), and cryptfs.  (SCA/Gzipfs and Attach-mode mounts not yet supported
in 2.6.)

Renamed all aux.c files to fist_aux.c to avoid conflicts with MS-DOS file
systems.

Malloc_DEBUG support for tracking memory leaks.  See explanation and use in
script match-malloc.pl.

Bugs fixed in Linux 2.4 templates:

- copy i_blocks correctly when mounted on top of ext2.

- wrapfs_commit_write() now behaves correctly for HIGHMEM systems
  (kmap/kunmap needed)

- for attach mode mounts the default maximum file size is taken from the
  root file system (and can be overridden using the maxbytes= mount time
  option).  This allows attach-mode file systems to support files larger
  than 2GB.

- fix refcnt leak on vfsmnt

- wrapfs_lock() needs struct flock's ->file set.  Work if called by
  posix_test_lock().

- readdir bug fix when exporting over NFS

- show dir= and debug= options in /proc/mounts

- move kmalloc outside spinlock

- bzero wrapfs_sb_info struct to avoid oops when lookup(hidden_root) fails

- don't generate attach code unless needed.

- ASSERT that hidden_file isn't NULL in various places where it shouldn't be

- up() the semaphore only if needed in wrapfs_commit_write

- kmalloc whole struct wrapfs_file_info, not just pointer, in wrapfs_open

- in wrapfs_lookup and wrapfs_symlink, don't use unsigned int for
  encoded_namelen, or we could never return an -ERRNO.

- in truncate, replace the hacky fake_file code with one that actually
  dentry_open's the real hidden_file.

- fail to sync files when mounted over NFS: correctly convert append-only mode
  writes to read-write in wrapfs_open.


*** Notes specific to fistgen 0.0.7:

Major new features and changes:

- FreeBSD-5: A totally new port of stackable templates for FreeBSD 5.0.
  Verified with base0fs, wrapfs, and cryptfs using a large compile build,
  fsx, and our own home-brewed tools.

- FreeBSD-4.x: rewritten the ports of stackable templates for FreeBSD 4.x.
  Verified on 4.[5678].  Tested with base0fs, wrapfs, and cryptfs using a
  large compile build, fsx, and our own home-brewed tools.

- Linux-2.4 templates:
	* stacking on extended attribute methods
	* MAJOR OVERHAUL AND FIXES of SCA CODE (gzipfs, uuencodefs, copyfs)

Minor new features and changes:

- Remove duplicate template directories from source tree.  Change fistgen so
  it first looks for an OS-specific template directory and then a more
  general directory.  For example, if uname is "FreeBSD-4.8-RELEASE", then
  fistgen will search for templates in "templates/FreeBSD-4.8-RELEASE"
  first.  If not found there, it'll search in "templates/FreeBSD-4" next.
  This way we can have a default template dir for multiple releases, for
  which the template sources really haven't changed, and we can avoid
  including duplicate sources in the distribution.

- Linux-2.4 templates:
	minor changes to support Linux on IA-64

Bug fixes:

- cryptfs: validate file name length in cryptfs (in case it's mounted on an
  existing, unencrypted set of files

- fistgen:
	* turn off maintainer-mode in configure
	* support old and newer flex-2.5.31
	* ensure fistgen compiles with latest gcc (multi-line strings etc.)

- Linux-2.2 templates:
	* symbol conflict cleanup
	* ioctls correctly return error codes
	* stat(2) reports correct no. of disk blocks
	* update atime/mtime properly
	* check return value from kmalloc

- Linux-2.4 templates:
	* check if file's private data is NULL before deref'ing it
	* validate file name length returned by {en,de}code_filename
	* attach-mode locking bugs fixed
	* hidden inode reference count leaks fixed
	* truncate down/up now purging truncated pages
	* and more

*** Notes specific to fistgen 0.0.6.1:

Minor Linux bug fixes:

	Use current->fsuid not ->uid
	in ->write, check if lower ->write exists, not ->read
	properly support exporting NODEV file systems (using fsid=N)
	Check for kmalloc failures.

*** Notes specific to fistgen 0.0.6:

Significant new features:

- New "attach-mode" mntstyle supported.  Similar to how CFS (Matt Blaze)
  creates per-user attached nodes to a mounted directory.  This is a delayed
  binding mount that non-superusers can affect right below the mount point.
  See templates/Linux-2.4/README.attach for details.  Turn code for this
  using "mntstyle attach" in your .fist file.

- FiST-Lite (Linux 2.4): data page copying (encode/decode_block) are no
  longer needed.  This halves the amount of memory that non-data-filtering
  file systems use.  It speeds things up, especially on systems under memory
  pressure.  This is now turned on when you don't specify "filter data" in
  your .fist file.

- new templates for FreeBSD 4.5 and 4.6 (written from scratch).  Pass all
  sorts of benchmarks and tests, including fsx.

Minor features:

- {en,de}code_block functions are now passed the page number (so you can,
  for example, compute an IV based on pagenum and inode-num).

- new global .fist feature: dynamic_inode_numbers on (off by default).  Will
  generate dynamic inode numbers for the stackable file systems, instead of
  inheriting the one from the lower file systems.  With
  dynamic_inode_numbers on, the stackable file system will traverse any
  number of mounted file systems below.  With "off", the stackable file
  system will refuse to descend into a second mounted file system below, to
  avoid inode number conflicts.  Note that with "on," inums are volatile so
  don't use them in a scenario that needs persistent inums (e.g., NFS).

- Fistgen supports $0.inum to get the inode number of a file system object.

Bugs fixed:

- sparse files properly supported in Linux 2.2/2.4, including creation of
  holes using lseek+write or truncate().  fist file systems now pass
  fsx-linux.

- Linux 2.4: properly initialize special inodes such as devices

- security fixes for zlib (gzipfs)

- provide (autoconf) replacements for basename/dirname as needed


*** Notes specific to fistgen 0.0.5.3:

Linux fixes:

- more module versioning problems fixed

- the default debug level is now 0, and it can be changed though a mount
  option (debug=%d) or a module parameter (fist_debug_var=%d)

- the poll method now returns sane defaults if the underlying fs doesn't
  support poll() [was breaking rpm, patch from Marc Boucher]

- the cryptfs ioctls() now returns 0 on success

- llseek() fix for SCA filesystems [patch from David Chow]

*** Notes specific to fistgen 0.0.5.2:

Fistgen now supports two new declarations:

(1) encoding_blocksize N;

    It takes a single integer between 1 and 4096 (1 being the default).
    This defines the smallest "chunking" size of the encoding algorithm used
    by a file system which defines "filter data".  1 is used by wrapfs,
    rot13fs, and the stream ciphers (cryptfs), but 8 must be set for vanilla
    Blowfish, a 64-bit (8 byte) block cipher.  If this value is set
    incorrectly, data corruption could occur. This new keyword was added
    because it is knowledge that can only be given by the developer of a
    fist-based file system.  Now that this number is available to fist code,
    the templates can do two things: (1) avoid corruption when the chunking
    size in greater than one, and (2) optimize copying data between upper
    and lower layers to the smallest amount needed instead of an entire
    page of data.  To developers, this keyword translates into a #define
    FIST_ENCODING_BLOCKSIZE statement in a fist-generated header file that
    gets included in all template sources.

    WARNING: encoding_blocksize > 1 is not yet supported!

(2) encoding_type (none|stream|block);

    This defines the encoding type for file systems that modify file data.

    - "none" means that no change is made in the data between the lower and
       upper layers (essentially wrapfs).

    - "stream" means that you're using a stream encoding algorithm such as a
      stream cipher (e.g. RC4, Blowfish in CFB64 mode). A chaining block
      cipher would also define encoding_type as "stream" and set the
      appropriate encoding_blocksize value.

    - "block" means that you're using a block encoding algorithm such as the
      Blowfish block cipher. You may also want to set encoding_blocksize to
      the proper size (say, 8 bytes). In this mode, each block is
      independent from any other block; see above for "stream" if you are
      using a chaining block cipher.

Linux fixes only:

- filesystem holes don't work with cryptfs: encode them as zero-filled pages
  and write them out. Fixes one corruption case when compiling code on
  cryptfs.

- clear out the end of an incomplete page. Fixes another corruption case
  when compiling code on cryptfs.

- 2.4.12 and recent 2.4-ac kernels verified to work correctly.

*** Notes specific to fistgen 0.0.5.1:

Linux fixes only:

- template Makefile uses correct TOPINC and allows for override through
  custom fistdev.mk file

- support kgcc (Red Hat) and gcc272 (Debian), using new kwhich script

- return ENOTTY if unknown ioctl is used (was returning 0).  Fixes visible
  errors such as "tar -z" failing.

- don't interpose if the hidden dentry is negative.  Fixes symlink stacking
  on top of NFSv2.

- support MODVERSIONS kernels

- support 64-bit non-SCA file systems in 2.4 templates.  Untested.

- do not allow chdir() into non-directories to succeed

*** Notes specific to fistgen 0.0.5:

Changes to Linux only:

- 2.4.x KERNELS NO LONGER NEED ANY KERNEL PATCHES TO SUPPORT FiST STACKING!
  (Verified on 2.4.10 and several others, but not all 2.4 kernels)

- port to Linux 2.2.19 and 2.4.10.  Some support for Red Hat 2.4 kernels.

- a new licensing for Linux templates that follows the Bison licensing model
  (see COPYING file)

- change default module debugging (if DEBUG is on) to highest level.  This
  way, we can see early debug messages before the ioctl code that can run to
  turn them off.  The ioctl can turn debugging off right after the mount, at
  which point about 30-40 lines of debugging code will have already
  printed.

- Linux bug fixes in 2.2 and 2.4:

	running binaries greater than 1 page inside 2.2 segfaults
	s_maxbytes set correctly, which some 2.4 kernels needed
	"cat DIR" shouldn't be allowed (now returns EISDIR)
	char/block devices correctly seen inside stacked f/s
	getting ESTALE when stacking on top of NFS
	check for possible corruption of cryptfs files (useful esp. if you
		mount cryptfs on top of a non-crypted directory)
	SCA file systems work in 2.4.x (gzipfs, uuencodefs, copyfs)
	fixed the fist-2.2.19 patch (was a 2.2.18 in disguise)
	OOPS in trying to deref a dentry w/o private data in ->d_delete

*** Notes specific to fistgen 0.0.4.1:

- cryptfs ioctl fixes

*** Notes specific to fistgen 0.0.3:

- bug fixes for all templates

*** Notes specific to fistgen 0.0.2:

- better README files
- patches for linux-2.2.15
- fixed patch for linux-2.2.14
- templates for FreeBSD-5.0 (untested)
- assorted bug fixes

*** Notes specific to fistgen 0.0.1:

- first public (limited) alpha release

- can build a few simple file systems from FiST descriptions for
	Linux 2.2 and 2.3
	Solaris 2.6 and 2.7
	FreeBSD 3.3

- the Linux-2.3 templates support Size Changing Algorithms (SCA).  We
  include a few sample file systems:

(1) gzipfs (compression using the Deflate algorithm)
(2) uuencodefs (uuencode the file)
(3) copyfs (just copy the data verbatim, useful for evaluating the
    performance of the SCA code)
