
History of aufs
Junjiro Okajima

# $Id: History,v 1.63 2008/01/28 05:04:02 sfjro Exp $

Note:
- the described dates are all in JST.
- CVS handles UTC as its timezone.
- all these descriptions should be archived in the ML on sourceforge,
  since I always post there and let users know. But sometimes archiving
  failed. this is the main reason to begin writing this file.

----------------------------------------------------------------------

20080128
- bugfix: support for lazy unmount on linux-2.6.18 and later, reported
  by Jorgen P. Tjerno.
- bugfix: a race condition between udba and aufs (unfnished).
- debugging a race condition between udba and aufs.

20080121
- new sample chroot-ed/jail environment useing aufs.
- bugfix: consolidate make targets for parallel build (make -j3),
  reported and tested by Tommy[D] and mike.
- bugfix: ignore an inotify event for the grand parent dir timestamps.
- bugfix: stop a race condition between hardlinks under different parents.
- bugfix: define a dummy macro for linux-2.6.17 and earlier.
- support XFS in linux-2.6.24(-rcN)
  + copyup s[ug]id-ed entry.
- describe a note about hardlinks of FUSE and udba=none.
- describe two contributions for lhash patch.
- begin debugging UDBA race condition.
- refine aufs magic number.

20071217
- bugfix: macro pitfall, block local variable name.
- support XFS in linux-2.6.24(-rcN).
  + retrieve the device number.
  + obtain XFS_SB_MAGIC.
  + test fstype.

20071210
- bugfix: AUFS_LHASH_PATCH depends on AUFS_FAKE_DM = n, reported by
  Russell Harmon and Heinrich Rebehn.
- bugfix: a xino-truncation thread must not wait for other threads.
- add a note about setting 'n.'
- move all the declaration from super.h to branch.h.
- rename struct xino to xino_entry.
- rename au_opt_xino_trunc to au_opt_xino_itrunc.
- preparing new xino files (unfinished).

20071203
- bugfix: a race in revalidating a dentry, reported by Jason Lunz.
- bugfix: specifying noxino at mount time, reported by Jason Lunz.
- bugfix: stop using /tmp/aufsvars.mk (complete fix for last ci).
- bugfix: stop using /tmp/uloopvars.mk.
- introduce truncating xino files (experimental), reported by Jason
  Lunz. it will be removed if nobody is interested.
  + define TMPFS_MAGIC.
  + define blkcnt_t type for linux-2.6.16.
  + new options trunc_xino, notrunc_xino, trunc_xino=<branch path>,
    and itrunc_xino=<branch index>.
  + new functions xino_trunc() and au_test_trunc_xino().
  + new functions xino_do_trunc(), xino_try_trunc() and xino_trunc().
  + new macros AUFS_XINO_TRUNC_INIT and AUFS_XINO_TRUNC_STEP.
- introduce new patches, ubuntu-2.6.22-14.46.patch and
  ubuntu-edgy.patch.
  + extract a patch for ubuntu-edgy.

20071126
- begin supporting linux-2.6.24.
  + introduce CONFIG_AUFS_SEC_PERM_PATCH and a new patch for kernel,
    sec_perm-2.6.24.patch.
  + call vfsub_notify_change() twice when the branch is NFS and
    s[ug]id bit is set to the inode.
  + the type of an argument for export functions are changed to struct
    fid.
  + find_exported_dentry operation is removed.
  + support noexec mount option for a branch.
  + ignore mode when clearing s[ug]id bit.
- introduce a new policy for create, pmfs (parent and then mfs) mode.
- a new sample for ULOOP driver, ulobdev, which supports generic block
  device.
- bugfix: try removing /tmp/aufsvars.mk after becoming useless,
  reported by Russell Harmon (but it cannot be supported fully).
- add a note about 'make -f local.mk kconfig'

20071119
- introduce a new semantics for link(2) and rename(2), and three
  policies to select one among multiple writable branches (completed).
  + implement a new create policy 'mfsrr.'
- bugfix: remove __exit attribute from sysaufs_fin().
- replace 'hidden_' prefix by 'h_.'
- refine to support every version of realtime patch.

20071112
- introduce a new semantics for link(2) and rename(2), and three
  policies to select one among multiple writable branches (testing).
  + support atomic_create in round robin mode.
  + a new function au_wbr() for link(2) and rename(2).
  + a new policy mfs and mfsrr.
  + call ->init and ->fin at setting the option.
  + refine over all.
  + implement copyup policies.
- remove an unused parameter of au_dtime_revert().
- consolidate nameidata for lower branches (uncompleted).
  + a new function au_dup_nd().

20071105
- bugfix: memory leak in an error path of handling FMODE_EXEC.
  + initialize a spinlock in hdentry by new functions
    au_h_dentry_init() and au_h_dentry_init_all().
  + free the unused filp.
  + always copy FMODE_EXEC flag.
  + refine au_find_h_intent().
  + refine using a spinlock in hdentry.
  + open the lower file explicitly when the stored nameidata.intent is
    empty.
- bugfix: support inode which has lower inodes unmatching with dentry.
- introduce a new semantics for link(2) and rename(2), and two
  policies to select one among multiple writable branches (testing).
  + a new semantics for link(2) and rename(2) is enabled by default,
    while it is still testing and the documentation is commented out.
  + refine copy up/down by adding some parameters.
  + revise an error message.
  + new functions au_update_dbrange() and au_update_dbend().
  + add some members for policies.
  + new function au_cpdown_dirs().
  + new functions vfsub_sio_mkdir() and vfsub_sio_rmdir().
  + implement round-robin policy.
- support 'tri-state' of lower d_revalidate().
- enable CONFIG_AUFS_RR_SQUASHFS by default, suggested by Julian
  Andres Klode.
- replace 'hiide_' prefix by 'h_'.

20071030
- bugfix: introduce a new patch deny_write_access.patch and configuration
  CONFIG_AUFS_DENY_WRITE_ACCESS_PATCH, reported and tested by Ulrich
  Holeschak.
  + leave atomic open and let the lower filesystem handle it even if
    FMODE_EXEC was specified, and make it deny write access later.
  + keep the dirty trick to handle FMODE_EXEC in aufs.
  + refine the trick to handle FMODE_EXEC by checking inode and its
    mode, but still it is dirty.
  + call {deny,allow}_write_access() when aufs is linked statically or
    CONFIG_AUFS_DENY_WRITE_ACCESS_PATCH is enabled.
- add a note about exporting aufs via NFS.

20071029
- bugfix(SMP): memory barrier to flush f_mode in case of FMODE_EXEC.
- the modification on 20071026 was my mistake. it was not a bug. refined
  it.
- a new file Tips, some tips for using aufs.
- introduce two policies to select one among multiple writable
  branches (unfinished).
  + new options create_policy and copyup_policy, and handlers for them.
  + new file wbr_policy.c
  + re-write some functions to select a writable branch, and move them
    from branch.c to wbr_policy.c.
  + new function au_cp_dirs() which is a framework to support copy-up
    and copy-down.
  + refine au_cpup_dirs() by au_cp_dirs().
  + remove find_rw_br().
  + consolidate several args of au_wr_dir() into single structure with
    bit fields.
  + new macros AuWbrCreate() and AuWbrCopyup().
- refine flags corresponding to mount options
  + a new structure au_opts_flags.
  + a new function au_opts_flags_def().
  + refine br_perm_str(), udba_str() and coo_str() by
    a new function au_parser_pattern(), and rename them to
    au_optstr_br_perm(), au_optstr_udba() and au_optstr_coo()
    respectively.
  + remove udba_set() and coo_set().
  + replace au_flag_test() by a new macro AuFlag().
  + replace au_flag_clr() by a new macro AuFlagSet().
  + replace au_flag_set() by a new macro AuFlagSet().
  + refine au_flag_test_udba_inotify().
  + rename need_dlgt() to au_need_dlgt().
- minor optimization for new_br_id().
- re-define FMODE_EXEC for backward compatibility.
- rename 'hidden_' prefix to 'h_'.
- use macros in linux/compiler.h. (unfinished)
- Tomas M made a donation. Thank you very much.

20071026
- bugfix: mis-typing dentry and src_dentry. totally wrong.

20071022
- security enhancement or possible bug fix: support FMODE_EXEC and
  {deny,allow}_write_access() for an executable and put_write_access()
  for an open file for writing on a branch. for linux-2.6.17 and later.
- bugfix: replace a direct access to dentry->d_parent by
  dget_parent().
- create patch sub directory and move all patches under it, suggested
  by Julian Andres Klode.
- support GFP_TEMPORARY which will be introduced into mainline kernel
  in the future.
- refine ignoring the internal inotify, completed.
  + stop using the isdir parameter of au_dtime_revert.
  + remove unnecessary variable.
  + stop locking the hidden grand parent dir.
  + remove a lock for the hidden grand parent dir.
  + new inode info lock class parent4.
- replace dget_parent() by a direct access to dentry->d_parent where
  the inode mutex is locked, in order to get better performance.
- support debug printing an empty file object.
- define trivial ilog2 macro to support old kernels.

20071015
- bugfix: at decoding a nfs handle, in the slowest way which will be
  invoked after other two method's failure, aufs generates the path
  for the decode target inode. and there was a bug in generating the
  path. when the inode is decoded by the two preceding methods, you
  will not meet this problem. this bug was reported by Luis Carlos
  Erpen de Bona.
- bugfix: typo in AUFS_PUT_FILP_PATCH, reported by Sandino Flores Moreno.
- testing writable nfs branch,
  + new function au_h_create() replacing au_fake_nd_create() +
    vfsub_create()
- rename some symbols,
  + au_is_nfs()		--> au_test_nfs()
  + au_is_def_rr()	--> au_test_def_rr()
  + do_is_overlap()	--> do_test_overlap()
  + 'hidden_'		--> 'h_'
  + au_is_subdir()	--> au_test_subdir()
  + is_overlap_loopback	--> test_overlap_loopback()
  + is_overlap()	--> test_overlap()
  + au_is_aufs()	--> au_test_aufs()
  + sbr_is_whable()	--> sbr_whable()
  + au_is_debug()	--> au_test_debug()
  + is_au_wkq()		--> au_test_wkq()
  + is_anon()		--> AuTestAnon()
  + au_is_loopback()	--> au_test_loopback()
  + au_is_fuse()	--> au_test_fuse()
  + au_is_unique_ino()	--> au_test_unique_ino()
  + au_is_nfsd()	--> au_test_nfsd()
- add module prefix to some symbols.
- replacing si_flags by several bit fields (draft).

20071008
- bugfix: remove the debug messages for nfsv4, reported by Bertrand D.
- bugfix: remove BUG_ON macro for debug in verifying mount options.
- introduce AUFS_SUPER_MAGIC with temporary value.
- refine ignoring the internal inotify.
  + remove a parameter of cpup_iattr(), cpup_regular(),
    au_copy_file(), cpup_entry(), cpup_single(), sio_cpup_single(),
    cpup_simple(), sio_cpup_simple().
  + remove au_flags_cpup(), struct cpup_args, cpup_init(), cpup_real_dir().
  + introduce struct au_cpup_flags.
- add a module prefix to some symbols.
- minor (cosmetic level) changes.
- rename some symbols,
  + au_init_vdir()	--> au_vdir_init()
  + au_fin_finfo()	--> au_finfo_fin()
  + hidden_open()	--> au_h_open()
  + au_is_mmapped()	--> au_test_mmapped()
  + au_is_plinked()	--> au_test_plinked()
  + test_empty()	--> au_test_empty()
  + au_init_vdir()	--> au_vdir_init()
  + free_vdir()		--> au_vdir_free()
  + is_longer_wh()	--> nhash_test_longer_wh()
  + test_known_wh()	--> nhash_test_known_wh()
  + append_wh()		--> nash_append_wh()
  + init_hinotify()	--> au_hin_init()
  + alloc_hinotify()	--> au_hin_alloc()
  + free_hinotify()	--> au_hin_free()
- rename the prefix 'hidden_' to 'h_' for some symbols.
- call au_hin_free() directly.

20071001
- bugfix: name collision on ia64, reported and patched by Julian
  Andres Klode, Daniel Baumann, Otavio Salvador and dann frazier (I
  replaced si_flags by au_si_flags instead of aufs_si_flags).
- bugfix: when aufs is linked statically, /tmp/aufsvars.mk is
  unnecessary, reported by Tapani Raikkonen.
- support nfsv4 branch with improving nfsv3 branch (still testing)
  + handle nfsv4 in the same way as nfsv3 by lhash.patch.
  + CONFIG_AUFS_FAKE_DM must be disabled when using NFS (both nfsv3
    and v4) as an aufs branch in linux-2.6.19 and later.
  + CONFIG_AUFS_PUT_FILP and CONFIG_AUFS_LHASH_PATCH must be enabled
    when using NFS (both nfsv3 and v4) as an aufs branch in
    linux-2.6.19 and later.
  + gave up calling generic vfs_path_lookup() because aufs has to
    unlock the dir mutex temporary which must be unacceptable. and
    reverting the locking order of br_wh_rwsem in last ci.
  + support atomic open in nfsv4 in looking-up a whiteout.
  + support atomic open in nfsv4 at revalidating dentry by keeping a
    whiteout.
  + use nameidata for the internal file creation with disabling
    CONFIG_AUFS_FAKE_DM, new function fake_nd_create().
  + new macro intent() for wrapping the list in aufs_hdentry.
  + a new simple wrapper named hintent_put().
- move the definition of au_subsys_t from sysaufs.h from aufs.h.
- refine ignoring the internal inotify.
  + merge hin_ignore cache into hinotify.
  + revert a parameter of some vfsub functions.
  + revert the lock for the grand parent dir.
  + remove unnecessary events in aufs_read() and aufs_splice_read().
  + lock inotify_mutex at modifying the mask.
  + new function vfsub_ign_hinode().
  + add a parameter to dtime_restore().
  + a new macro init_hinotify() as a simple wrapper.
  + rename vfsub_init() to vfsub_args_init().
  + new small function itohi().
  + a global variable au_hin_nignore.
  + remove hin_ignore.h introduce in last ci.
- reduce IMustLock() debug macro with centralizing into vfsub
  functions.
- rename au_lkup_args to aufs_ndx.
- rename is_wh() to au_test_wh().
- rename is_diropq() to au_test_diropq().
- support fuse inode attributes in splice(2).

20070924
- bugfix: whiteout list may be obsoleted while aufs was sleeping,
  reported by Torsten Luettgert.
- begin supporting linux-2.6.23, still testing on rc6.
  + support splice(2).
  + introduce aufs_fault().
  + new patches and configurations,
    * splice-2.6.23.patch + AUFS_SPLICE_PATCH
    * put_flip.patch + AUFS_PUT_FILP_PATCH
    * sysfs_get_dentry.patch + AUFS_SYSFS_GET_DENTRY_PATCH
  + generate an auxiliary makefile /tmp/aufsvars.mk
  + remove a parameter from kmem_cache_create().
- begin supporting nfsv4, still testing.
  + support atomic_lookup and atomic_open.
  + refine the definition of AuNoNfsBranch, and move from branch.h to
    aufs.h.
  + lock br_wh_rwsem before h_dir, since aufs has to release the mutex
    for h_dir before vfs_path_lookup() and then lock it again.
  + add an argument to hidden_open() as search-key.
  + prepend prefix 'au_' to lkup_hash(), lkup_one(), do_lookup() and
    sio_lkup_one().
  + introduce au_fake_intent(), au_hin_after_reval() and au_lkup_intent().
  + add some members to struct lkup_args and set prefix 'au_'.
- describe about patches.
- introduce a counter for the internal inotify events to be ignored,
  unfinished and most of them will be removed soon.
  + new header file hin_ignore.h.
  + stop locking the hidden parent dir.

20070917
- bugfix: according to C99 6.10.3, the behaviour is undefined for
  preprocessor directive within a macro argument, reported by Al Boldi
  on linux-fsdevel ML.
- bugfix: replace the preceding single quotation by backquote,
  reported by Tomas M.
- introducing a new patch for openvz, openvz_028stab039.1.patch.
- preparing to support linux-2.6.23 (unfinished)
  + new configuration CONFIG_AUFS_SPLICE_PATCH and
    CONFIG_AUFS_SYSFS_GET_DENTRY_PATCH.
  + generate an auxiliary makefile /tmp/aufsvars.mk
  + begin supporting nfsv4, calling new VFS function vfs_path_lookup().
  + new functions for default nfs export operations.
  + support splice(2), and sendfile operation is dropped.
  + support inode operation truncate_range() and fallocate().
  + the function signature of kmem_cache_create() is changed.
  + warn about CONFIG_AUFS_SYSFS_GET_DENTRY_PATCH and
    CONFIG_AUFS_SPLICE_PATCH at compile time.
  + the parameter of bin_attribute.{read,write}() is changed.
- new configuration CONFIG_AUFS_RR_SQUASHFS.
  + rename au_is_rr() to au_is_def_rr() and make it simple.
  + udf is not set RR by default, suggested by Tomas M.
- remove a configuration CONFIG_AUFS_ISSUBDIR_PATCH which has less
  meaning.
- refine the AUFS_BRANCH_MAX warning message at compile time.

20070910
- a new sample, linux-vserver.txt.

20070903
- bugfix: handling whiteout in dlgt mode.
- bugfix: support umask in dlgt mode.
- uncomment AUFS_DLGT and dlgt option.

20070827
no news is good news.

20070820
- fixing typos, reported by Justin Pryzby.
- refine au_update_fuse_h_inode(), reported by Tomas M.
  + stop creating temporary anonymous dentry.
  + more verbose debug print.

20070813
- bugfix: force unlinking when CONFIG_AUFS_DLGT is enabled.
- bugfix: neg to pos by udba case. it is degrade bug which was born on
  2 July.
- bugfix: an error code of reval_inode().
- refine au_update_fuse_h_inode(),
  + wrapping by vfsub routines.
  + vfsub wrapper for __lookup_hash() and lookup_one_len().
  + remove dlgt in h_d_revalidate().
  + call it from fsync_dir() and aufs_fsync_dir().
  + call it from aufs_flush(), aufs_mmap(), aufs_sendfile() and
    aufs_fsync_nondir().
  + support getattr operation.
  + call it from hidden_readlink()
  + stop calling it from au_copy_file().
  + extract a part of if as a new macro au_is_fuse(), and move it from
    vfsub.c to super.h.
  + call it from call_notify_change()
  + do not support dlgt option.
  + always ignore the error code.
  + call it for the target dentry and its parent from
    do_vfsub_create(), do_vfsub_symlink(), do_vfsub_mknod(),
    do_vfsub_link(), do_vfsub_rename(), do_vfsub_mkdir(),
    do_vfsub_rmdir(), do_vfsub_unlink(), do_vfsub_read_u(),
    do_vfsub_write_u() and do_vfsub_readdir().
  + call it from do_xino_fwrite().
  + do not call it from xib_pindex(), xino_new_ino(), xino_read(),
    xino_create2(), do_xib_restore() and xino_set_xib().

20070806
- new sample, ULOOP driver and a daemon for http.
- describe about EXDEV error of rename(2) dir, reported by Jorgen
  P. Tjerno.
- stop unnecessary getattr for fuse.

20070730
- gave up supporting multiple xino files per a branch, which means the
  limitation of the largest value of inode number remains.
- introduce CONFIG_AUFS_WORKAROUND_FUSE.
- support fuse inode at copyup.
- add a note about user's Makefile, posted by Russell Harmon.
- add Acknowledgements.
- more verbose at deleting a branch.
- warn before processing a large file when CONFIG_AUFS_DEBUG is
  enabled.
- refine calling au_update_fuse_h_inode().
- begin of splice_read(), introducing au_is_loopback().
- stop using ARRAY_SIZE() macro since sparse warns.

20070723
- bugfix: sysrq.h requires errno.h when MagicSysRq is disabled,
  reported by Christian Hoffmann.
- beginning of a temporary workaround for fuse, make lookup-ed inode
  attribute reliable.
- use fs-magic number instead of fs-type string.
- support larger inode number
- there is a limitation of the largest value of inode number which
  will be addressed in the future.

20070716
- bugfix: cpup whiteout which was called #2 in last ci.
- begin supporting linux-2.6.22
  + introduce lhash patch for 2.6.22.
  + no more ksize.patch.
- introduce new branch permission 'rr.'
  + rename au_is_ro() to au_is_rr().
- introduce new (re)mount option, 'verbose' family, currently for
  deleting a branch only.
- support MagicSysRq key for debugging.
- testing CONFIG_AUFS_ROBR.
- testing new mount option for 'refreshing opened file'
  + a generation to branch.
  + typedef for every generation data.
  + stop packing branch id and si generation.
  + return of 'coo' option.
- discard pre-allocated block for xino bitmap.
- add a note about unmounting ore remounting root aufs at shutdown
  time.
- minor optimization for handling udba=inotify.
- rename hi_lock_XXX() to vfsub_i_lock_nested().
- rename hi_unlock() to vfsub_i_unlock().
- print inotify info for inode.
- move lock subclasses from hinode.h to vfsub.h.

20070709
- bugfix: force rewind at re-initializing vdir, reported by Michael
  Towers, Jorgen P. Tjerno and Sandino Flores Moreno.
- bugfix: copyup unlinked file.
  + bug #1, the file may or may not be opened, aufs needs to hold the
    copied-up temporary dentry, reported by Andreas Baetz.
  + bug #2, the file may be opened in multiple times.
  + stop dropping in cpup_regular().
  + revert AuDebugOn() from temporary WARN_ON().
  + move cpup_wh_file() in file.c to cpup.c as generic cpup_wh().
  + print wh_dentry in iinfo.
  + set wh_dentry in iifno.
  + call cpup_wh() when the file was removed.
- bugfix: overflow in multiply, reported by Jorgen P. Tjerno and Alexey
  Bazhin.
- bugfix: possible overflow in multiply.
- si_read/write_lock() supports AuLock_FLUSH which flushes the
  remaining hinotify handler.
- maintain the number of 'nowait' tasks.
- testing where si_read_trylock() should be called.
- testing CONFIG_AUFS_ROBR
- ksize.patch will be unnecessary after linux-2.6.22, kzrealloc() calls
  krealloc().
- extract a part of inode.h as a new file hinode.h.
- support lockdep at removing nfs branch.
- use hi_lock/unlock() for a hidden inodes, instead of i_lock/unlock().
- rename AUFS_[ID]_[RW]LOCK to AuLock_[ID][RW].
- rename i_lock/unlock() to vfsub_i_lock/unlock().
- rename filldir_ino_t to au_filldir_ino_t.
- rename AUFS_{DEBLK,NHASH}_SIZE to AuSize_{DEBLK,NHASH}.
- refine the message string.
- move au_hinotifyq to wkq.h as au_nowait_tasks, new inline functions
  au_nwt_{init,inc,dec,flush}().
- move read/writef_t to super.h.
- rename find_sb_locked() to find_sb_lock().
- extract a part of this file as vserver.patch.
- consolidate arguments of do_diropq() as flags.
- consolidate arguments of au_wkq_run() as flags.
- testing FaunOS.

20070702
- bugfix: use SMP-safe atomic_{inc,dec}_return().
- bugfix: memory barrier after atomic_set().
- bugfix: make lower dir opaque even if it is empty, to keep xino consistency.
- introduce external inode number bitmap.
  + remove backward compatibility atomic_long.
  + rename xino_init() to xino_br().
  + move br_xino_{read,write} to si_x{read,write}.
  + check the unlinked but remaining pseudo-link.
  + leave xino for the remove file/dir, instead clear them in iinfo.
  + maintain inode attributes and xino for the rename-target and the
    lower rename-source.
  + maintain xino for the removed file.
  + new options 'trunc_xib' and 'notrunc_xib'
  + truncate the xino bitmap at deleting a branch by default.
  + show the bitmap file size in sysfs.
  + free the bitmap buffer at unmounting.
- refine hinotify.
  + wait for the completion of 'notified' tasks at revalidating.
  + wait for the completion of 'notified' tasks at lookup.
  + re-construct internal functions.
  + support clearing xino
  + maintain digen recursively when a dir was renamed
  + introduce wait-able 'nowait' task.
  + stop unnecessary write to xino.
  + support for whiteouts.
  + stop unnecessary digen in IN_MOVE_SELF.
  + leave digen for the renamed dir.
  + modify the 'broken ino' msg to reflect the problem correctly.
- describe about the inode number of the directly renamed dir and its
  warning, which was called incorrectly as 'broken ino' msg.
- describe about the compilation on a distribution (or customized)
  kernel.
- I forgot to mention about /etc/default/auplink
- rename 'changable' to 'changeable.'
- warn about aufs specific EXDEV error.
- define rw_{read,write}_trylock().
- rename 'au_xxx_opts()' to 'au_opts_xxx().'
- warn inotify without xino.
- move need_dlgt() from vfsub.h to to super.h.
- temporary support for imod option.
- introduce rt-compat.patch.

20070625
- bugfix: skip non-aufs files at changing the branch permission,
  reported by Igor Karasynskyi.
- bugfix: test isolated inodes too at deleting branch, reported by
  Tomas M.
- bugfix: call iput() for the isolated inode on the deleted branch,
  reported by Tomas M.
- bugfix: detect newly appeared whiteout which exists on a inserted
  branch.
- bugfix: refresh all dentries and inodes when adding/modifying a
  whiteout-able branch, and deleting a branch.
- temporary workaround for the inode number 1 on cramfs.
- note for discontinuous inode numbers.
- refine option handling and some function arguments.
- stop firing inotify when rename_whtmp().
- restore iigen after fired inotify when rename dir.
- set 0 to bindex explicitly when prepending a branch.
- testing cpup, xino, MagicSysRq key.

20070618
- bugfix: declare 'signed char', a portability problem reported by
  Bertrand D.
- bugfix: strict branch index check at the first adding, reported by
  Bertrand D.
- bugfix: unlink a whiteout under a dir who has a sticky bit, reported
  by Igor Karasynskyi.
- warn about overlapped branches when the top-dir is moved.
- remove unnecessary dget_parent(), restoring a part of last ci.
- testing 'imod' mount option.
- add a note about an empty file in cramfs.
- add a note about swapfile.

20070611
- testing dir-lock in open(2).
- describe about the aufs message and errno in the manual, suggested
  by Just Marc.

20070604
- the unionctl script is moved from util/ to sample/, and will not be
  supported any more.
- bugfix: support the moved root branch.
- testing is_subdir() kernel internal function.

20070528
- support unmounting after 'mount --bind', update the internal
  vfsmount pointer when unmounting after linux-2.6.18.
- refine overlap-test at adding a branch.
- refine dentry->d_parent with dget_parent() simply.
- testing linux-vserver, new abstract function do_vfsub_unlink().
- rename DEBUG_ON macro to AuDebugOn.
- add a note about the mode of a directory on the lower branch,
  suggested by Wolfgang Barth
- execute mount(8) in a simple way, it depends on its version.

20070521
- refine the nowait task queuing.
- flush all the scheduled/nowait tasks at umounting and remounting.
- support the enqueue error in workqueue.

20070519
- bugfix: ksize macro without ksize.patch, reported by Wolfgang Barth.

20070514
- begin supporting 2.6.22.
- prohibit umount while nowait work is in the generic workqueue,
  introducing au_mntget/put().
- rename CONFIG_AUFS_AS_BRANCH to CONFIG_AUFS_ROBR.
- rename AUFS_WH_LEN to AUFS_WH_PFX_LEN.
- remove AufsGenOlder/Younger macros.
- rename is_aufsd() to is_au_wkq().
- make si_generation int, restoring the last bugfix.

20070509
- bugfix: stop consuming inode number rapidly.

20070507
- bugfix: fix the obsolete inodes with d_revalidate. the last
  temporary bugfix is completed. but this version of aufs consumes
  inode number rapidly. it will be fixed in a week.
- refine d_revalidate
	+ checking new ii_gen
	+ removing di_reval
	+ new function au_cpup_igen(), to support inode generation
	+ make the modified file by UDBA obsoleted by its name and
	  inode
	+ resetting xino(temporary fix)
	+ make si_gen atomic_t
- forgot to print 'warn_perm' in /proc/mounts.

20070430
- bugfix: re-use inode->i_generation to support the unexpectedly
  survived inodes after remount. test lower inodes in
  hidden_d_revalidate(). simplified postproc() in
  udba=inotify. introduce an internal generation for aufs_iinfo.
  reported by Tomas M.
  it is not finished yet and a hardlink on NFS branch will not work.
- bugfix: at deleting a branch, revalidate the survived dentries after
  shrink dcache.
- bugfix: support the unhashed dentries, but ignore the unreferenced
  dentries.
- bugfix: ii_read/write_unlock in an error path, mainly for NFS
  branch.
- bugfix: revalidating the opened files after remount, introduce a new
  function au_hfput().
- bugfix: maintain the reference of aufs module in case of the no-wait
  task.
- introduce <sysfs>/fs/aufs/<mnt_id>/xino, and sysaufs.h. move some
  declarations from module.h to sysaufs.h. rename del/add_sbilist() to
  sysaufs_del/add(). refine sysaufs.c simply.
- CONFIG_AUFS_EXPORT in statically linked aufs depends upon
  CONFIG_EXPORTFS=y, reported by Sandino Flores Moreno.
- call dget_parent() instead of accessing dentry->d_parent directly.
- convert some inline functions for debugging to macros, in order to
  print the preferable line number in a file.
- rename nfsd_lockdep_off/on() to au_...().
- supports IN_UNMOUNT, if it happens there must must be another bug.
- ignore whiteouted names in revalidating child files.
- rename init_export_op() to au_init_export_op().

20070423
- bugfix: file revalidation after rename(tgt), reported by Just Marc.
- strict inode lock in fsync() before 2.6.17.
- restore rdcache option, which was dropped by mistake.
- print the depth of generic workqueue in sysfs/aufs/stat.
- testing initramfs.
- still testing udba=inotify.
- simplified "uid/gid/perm" message.
- reduce stack space.
- make aufs_cond available even if CONFIG_LKTR is disabled.
- revise au_fin_finfo() and si lock.
- simplified cache function definitions.
- merge both of wait/nowait works into a single enqueue function.
- rename wkq_wait() to au_wkq_wait().
- rename some name hash functions, and two new functions nash_new()
  and nhash_del().
	+ init_nhash()	--> nhash_init()
	+ move_nhash()	--> nhash_move()
	+ free_nhash()	--> nhash_fin()
- move au_is_kthread() to wkq.h, and rename to is_aufsd().
- rename au_init_wkq() to au_wkq_init().
- rename au_fin_wkq() to au_wkq_fin().
- rename au_inotify_exit() to au_inotify_fin().
- rename dbg_dlgt_exit() to dbg_dlgt_fin().

20070416
- bugfix: introduce dcsub.[ch] to handle dentry cache.
- bugfix: use readlink(1) to get cwd, in auplink, mount.aufs and
  unionctl, reported by Torsten Luettgert. Actually, to use readlink
  was suggested by Tomas M last year.
- support initramfs.
- verbose warning message for 'different uid/gid/perm.'
- still testing udba=inotify.
- support GFP flags in au_kzrealloc().
- simplified lock/unlock functions definition by a new macro
  SimpleRWSem...

20070409
- introduce new branch attribute "nolwh."
- refine parsing options at mount/remount time, reported by Sandino
  Flores Moreno.
	+ remove whiteout-base and whplink-dir in noplink and br_mod(),
	  but br_del().
	+ increment sbinfo generation in a new function
	  aufs_remount_fs().
	+ support multiple xino/noxino options in another way.
	+ force "ro" when unknown branch permission is specified.
	+ at mount-time, interpret options in this order.
		* simple flags, except xino/noxino, udba=inotify and dlgt.
		* branches.
		* xino/noxino.
		* udba=inotify.
		* dlgt.
	+ at remount-time,
		* interpret options in the given order left to right,
		  except dlgt which is disabled in interpreting.
		* create whiteout-base and whplink-dir if necessary.
		* dlgt if necessary.
	+ new functions, clean_wh(), clean_plink(), test_linkable(),
	  plink_dir().
- support 64bit environment, reported by Vasily Tarasov.
- introduce a sample for kprobe.
- bugfix: do not traverse the sub-mounts under aufs at refreshing
  cached dirs after remount.
- bugfix: simultaneous read in 'dlgt' mode, reported and fixed by
  Ulrich Holeschak.
- bugfix: LINUX_VERSION_CODE for linux-2.6.16.
- still testing inotify.
- support lockdep in nfsd, still testing.
- minor optimization for dput().
- new test functions br_writable(), br_whable() and br_linkable_wh(),
  replacing au_is_whable().
- do write_lock() in reinit_br_wh().
- refine updating /sys/fs/aufs/stat.
- wkq_nowait() calls schedule_work().

20070402
- bugfix: forgot dput in a error case.
- introduce wkq_nowait().
- refine udba=inotify, still testing.
- extract some functions from sbinfo.c, create a new file plink.c.

20070328
- bugfix: forgot include one header in misc.h

20070327
- bugfix: increment sbinfo generation in cases of br_mod() for sensing
  whiteout, xino/noxino and udba=inotify, too. introducing
  au_is_whable() and sbr_is_whable(). call au_sigen_inc() from
  do_opts(), reported by Jorgen P. Tjerno.
- support sysfs and NFS-exporting, introducing sysaufs.c,
  CONFIG_AUFS_SYSAUFS, export.c, CONFIG_AUFS_EXPORT and a new module
  parameter 'brs.'
- remove AUFS_DEBUG_RWSEM.
- workaround an application bug when 'dlgt' is specified.
  generally, read(2) or write(2) may return the value shorter
  than requested. But many applications don't support it,
  for example bash.
- support file gid when 'dlgt' is set.
- add a note about SMP.
- add a note about lockdep, still testing.
- add a note about performance test.
- convert branch permission bits into an integer.
- add an branch mode alias 'rowh' which is equivalent to 'ro+wh.'
- macro functions are converted to inline function.
- rename some symbols.
- merge hidden_notify_change() into vfsub_notify_change().
- convert the type of aufs_nwkq to short, since linux/kernel/params.c
  prints as '%c' for 'byte'.
- accounting in workqueue, refine the algorithm of choosing the thread.
- refined LHASH_PATCH and DLGT condition for lkup_one() and lkup_hash().
- refine file read/write when 'dlgt' is specified.
- refine DLGT condition for minor optimization.
- stop setting the first branch mode to 'rw' by default, when the mount
  flag is 'ro.'

20070320
- bugfix: broken df(1)/statfs(2), wrong argument for vfs_statfs().

20070319
- bugfix: check the maximum number of branches, reported by Tomas M.
- testing the inode number after the direct rename of a dir.
- testing new mount option 'dlgt.'
- testing lockdep.
- add a new file vfsub.c
- support O_LARGEFILE at copying-up a regular file, and opening a dir.
- change some function signature and a global variable name in order
  to avoid the symbol conflict, one of them was reported by Just Marc.
	add_nlink(), alloc_dinfo(), alloc_whname(), copy_file(),
	cpup_attr_all(), cpup_attr_changable(), cpup_attr_nlink(),
	cpup_attr_timesizes(), dir_roflags, do_open(), file_roflags(),
	fill_de(), fin_finfo(), fin_wkq(), find_brindex(),
	find_dbindex(), flags_cpup(), free_whname(),
	half_refresh_plink(), hi_flags(), iinfo_fin(), iinfo_init(),
	init_finfo(), init_vdir(), init_wkq(), is_plinked(),
	list_plink(), new_br_id(), put_plink(), ready_to_write(),
	refresh_hdentry(), refresh_hinode(), reopen_nondir(),
	reset_hinotify(), reval_and_lock_finfo(), reval_dpath(),
	show_br(), sigen(), sigen_inc(), sub_nlink(),
	test_empty_lower(), test_perm(), unlink_wh_dentry(),
	update_brange(), update_dbstart(), update_digen(), update_figen().

20070312
- gave up handling inode S_PRIVATE flag and supporting LSM generally.
- minor optimization by LOOKUP_DIRECTORY flag.
- testing NFS-exporting.
- still testing lockdep.
- still testing sysfs.
- add samples for LiveCD over NFS.
- add a note suggested by Simon Sasburg.

20070305
- support copyup a 'tail-hole'ed sparse file.
- still testing lockdep.
- still testing sysfs.

20070226
- bugfix: mis-judging the maximum number of branches.
- bugfix: branch index at '--add --before path', reported and fixed by
  Fernando A. P. Gomes.
- refine inotify, a test finished.
- still testing LSM.
- begin testing with lockdep, still testing.
- begin supporting sysfs, still testing.
- refine the maximum number of branches.
- add a caution about AUFS_HINOTIFY and AUFS_DEBUG_RWSEM.
- refine copyup pseudo-link, remove cpup_pseudo_link() function.
- refine copyup pseudo-link, call test_and_cpup_dirs() and
  sio_cpup_simple() instead of cpup_pseudo_link().
- refine copyup pseudo-link, a new function lkup_plink().
- refine new_inode(), call iget_locked() instead of iget() and test
  I_NEW.
- minor optimization, the macro mnt_nfs().
- remove d_iput() operation.
- introduce a new member 'si_mnt' and 'si_sb.'
- change some options for tail(1) and grep(1) in order to support
  busybox, suggested by Tomas M.
- introduce two new files, module.h and vfsub.h.

20070219
- mmap behaviour changed, by removing mmap counter.
- bugfix: after a branch was changed from RO to RW, the hidden opened file
  should be closed once.
- bugfix: when the given mount options are too long, aufs should return an
  error expectedly, reported by Tomas M.
- support directory link count.
- introduce ./Kconfig.in and make target 'kconfig', which will
  generate ./fs/aufs/Kconfig.
- introduce configurable amount of branches. but I am afraid you will
  have to wait for aufs supports sysfs.
- still testing LSM.
- refine hidden inotify, still testing. disable udba=inotify temporary while
  parsing mount options.
- call vfs_read/write() instead of hidden file operation, in order to support
  LSM and notify.
- extract some functions from super.c, and create a new file module.c.

20070212
- begin supporting a readonly no-whiteout aufs branch of another aufs, still
  testing.
- begin supporting exporting aufs via NFS, still testing.
- begin supporting LSM, still testing.
- bugfix unionctl: typo or dropped single quotation.
- bugfix unionctl: support a relative path for --whereis.
- unionctl aborts when the --whereis argument does not exist.

20070205
- bugfix: a test in adding a branch, included in a report from
  Laville Guillaume.
  check the adding branch to be overlapped or not, even if it is a
  mount-point.
- bugfix: unionctl script --whereis option.
  the action should print the branch path, instead of the given argument, even
  it has only one argument.
- begin supporting inode S_PRIVATE flag and CONFIG_SECURITY. still testing.
- remove all the nested function definition, since some compilers (or their
  configuration) issue a warning about that.

20070129
- introduce diropq option.
  the behaviour of mkdir(2) and rename(2) dir case is changed. now they don't
  make '.wh..wh..opq' when it is not necessary. this is the default. if
  you dislike this behaviour and still want to make it always, use
  'diropq=always' mount option. see the manual in detail.
- bugfix: make fsync(2) return success when the file is not opened for writing,
  reported by Martin Walter.
  I am afraid this behaviour may violate some standards. Checking the
  behaviour of ext2, aufs decided to return success.
- rename some functions
	+ lookup_whtmp() to lkup_whtmp().
	+ lock_hdir_lookup_wh() to lock_hdir_lkup_wh().
	+ lookup_wh() to lkup_wh().
- I forgot update AUFS_VERSION on last Monday and I updated it on
  Thursday. Sorry for confusion.

20070122
- introduce a new file History.
- rename wh.[ch] to whout.[ch].
- rename some symbols.
	+ do_cache_alloc()	to aufs_cache_alloc().
	+ do_cache_free()	to aufs_cache_free().
	+ dt_hidden_dentry in struct dtime, to dt_h_dentry.
	+ dtohd()		to h_dptr().
	+ dtohd_index()		to h_dptr_i().
	+ dtopd()		to dtodi().
	+ fi_hidden_vm_ops in struct aufs_finfo, to fi_h_vm_ops.
	+ ftobr_index()		to ftobr().
	+ ftohf()		to h_fptr().
	+ ftohf_index()		to h_fptr_i().
	+ ftopd()		to ftofi().
	+ hidden_dentry in struct rmdir_whtmp_arg, to h_dentry.
	+ hidden_root in struct opt_del, to h_root.
	+ hidden_root in struct opt_mod, to h_root.
	+ itohi()		to h_iptr().
	+ itohi_index()		to h_iptr_i().
	+ itopd()		to itoii().
	+ lookup_dentry()	to lkup_dentry().
	+ lookup_negative()	to lkup_neg().
	+ lookup_one()		to lkup_one().
	+ refresh_dentry()	to refresh_hdentry().
	+ refresh_inode()	to refresh_hinode().
	+ sbt()			to sbtype().
	+ set_dtohd_index()	to set_h_dptr().
	+ set_ftohf_index()	to set_h_fptr().
	+ set_itohi_index()	to set_h_iptr().
	+ sio_lookup_one()	to sio_lkup_one().
	+ stopd()		to stosi().

20070117
- bugfix i_op.c: uninitialized variable in case of CONFIG_AUFS_FAKE_DM
  enabled, reported and fixed by Jason Lunz.

20070115
- support 'security' model, reported and tested by Ulrich Holeschak.
  you need to disable CONFIG_AUFS_FAKE_DM.
- introduce umount.aufs script.
- umount.aufs and mount.aufs scripts calls auplink script when it is needed
  and configured.
- auplink script supports /etc/default/auplink configuration.
- bugfix: a comment in local.mk, reported and fixed by Wilhelm Meier.

20070112
- Jason Lunz sent a patch which creates linux/fs/aufs/Kconfig.

20070108
- disable CONFIG_AUFS_COMPAT by default.
  If you still want to use it, enable it manually. But this configuration will
  be removed in a few weeks.
- a new script named auplink, with an executable aulchown and a mount option
  'clean_plink', are introduced, in order to reproduce all hardlinks on a
  writable branch.
- bugfix: full-fix for pseudo-link which was temporary half-fix in last update.
- bugfix: link instead of copyup for an already pseudo-linked file.
- bugfix: hide the unnecessary 'remount' option before comm(1) in mount.aufs script.

20061222
- I found a bug about pseudo-link. It keeps inodes incorrectly, and users may
  see the deleted inode. The fix will complete next year. Until then,
  pseudo-link feature and 'plink' mount option are disabled and 'noplink' is
  the default mount option. It means the the internal behaviour like
  copy-up will be changed.
- begin supporting linux-2.6.20.
- support 'sillyrename' on NFS branch
- added a sample for diskless machines which uses aufs as root filesystem.
- CONFIG_AUFS_COMPAT will be removed in a few weeks. The code in case of
  CONFIG_AUFS_COMPAT=y remains. In detail,
	+ default branch permission
	+ warning about wrong mount option
	+ /proc/mounts shows 'br:' instead of 'dirs='
	+ .wh.__dir_opaque is replaced by .wh..wh..opq
- bugfix: on NFS branch, after rename(2) to an existed file, the new named
  file may refer to the old inode. this fix is not completed and does not
  support plink option. This is the reason of disabling pseudo-link temporary.
- bugfix: a pipeline in unionctl script uses 'return', but it just
  finishes the pipeline and doesn't exit from the function.

20061218
- discussing with Tomas M, introduced a new action --whereis to unionctl.
- remove the kernel version from the aufs version string.
  some people misunderstands that the kernel version in the aufs version
  string means the supported kernel version. Actually, it is the tested kernel
  version, as it is described in README.
- new mount option, warn_perm and nowarn_perm.
- support the space characters in the paths of mount point and branches.
- support statfs(2) when the first branch is NFS.

20061211
- support linux-2.6.19, including NFS branch. you need lhash.patch.
- in the manual, describe that the white characters, comma, colon in the path
  are not allowed. suggested by Tomas M.
- unionctl script, support CONFIG_AUFS_COMPAT. reported and fixed by Tomas M.
- prepend double wh prefix to tmpname at renaming dir.

20061204
- mis-detecting CONFIG_BLK_DEV_LOOP.
- support the cases without /sbin/mount.aufs
	+ remove si_dupopt.
	+ compare the xino filename.

20061127
- bugfix dir->fsync: it may be called with @file being NULL, especially from
  nfsv4, reported by Klaus Knopper.
- unionctl script supports --list option, requested by Tomas M.

20061120
- pseudo-link: update hidden inode pointers by new function d_iput().
- pseudo-link: stop pseudo-link when the target inode already exists.
- cpup: restore the inode pointers after cpup whiteout failure.
- hinotify: restore the counter after rename_whtmp() failure.

20061113
- bugfix: before 2.6.17, msync(2) calls ->fsync without
  lock. CONFIG_AUFS_DEBUG failed checking the lock, reported by Wesley Chow.
- bugfix: link(2), when the link target inode already exists on the target
  branch, but the target name, aufs_link() failed copyup.
- bugfix: re-setting xino after setting noxino, aufs failed setting.
- force noxino when xino_init() returns an error
- warn only once per 255 times about "too many pseudo links".

20061106
- support linux-2.6.15, limited. dropped features are:
	+ plink and noplink mount option
	+ udba=inotify mount option
	+ NFS branch

20061023
- 'anonymous nobody' kindly sent a patch to SF 'Patches' place. The patch
  is for merging aufs into kernel source tree.
- begin supporting linux-2.6.19-rc2, unfinished, untested and NFS branch
  is not supported.
- gave up supporting read/write to the mmapped file on NFS branch. it
  seems a bug in linux and it can happen on any filesystem. it will be
  fixed in linux-2.6.19 or later.
- new structure aufs_hdentry for hidden dentry.
- bugfix: at restoring the timestamps of the parent dir when mkdir(2) failed.
- bugfix: editing miss after parsing options.

20061016
- introduce new mount option 'udba', support 'udba=inotify' using
  inotify.
- describe about udba in aufs.5.
- remove CONFIG_AUFS_DBA and introduce CONFIG_AUFS_HINOTIFY.
- remove CONFIG_AUFS_NO_KSIZE and introduce CONFIG_AUFS_KSIZE_PATCH.
- bugfix: always cpup atime in aufs_read/write.
- bugfix: support write(2) to mmapped file on NFS branch.
- bugfix for 2.6.17: umount_begin() may not be called in before
  linux-2.6.18 kernel, call it from put_super() too.

20061009
- bugfix: call igrab() before ii_write_unlock() to prevent from destroying
  inode in half_refresh_plink().
- bugfix: support the case of the first branch is not writable.
- testing lookup_whtmp().
- testing dba.
- prepare inotify for hidden inodes.

20061002
- bugfix: discard illegal dentry in case of undefined DBA.
- CONFIG_AUFS_DBA will be removed after introducing 'dba' mount
  option.
- prepare removing inotify.
- add 'do_xino' parameter to set_itohi_index().
- support read(2) to mmapped file on nfs.

20060925
- begin of inotify for hidden inodes.
  CONFIG_AUFS_DBA (Direct Branch Access) requires CONFIG_INOTIFY.
  still testing.
- local macro RwSemMutex for debugging becomes global configuration
  CONFIG_AUFS_DEBUG_RWSEM.
- gave up supporting CONFIG_DEBUG_PROVE_LOCKING.
- read(2) to NFS branch is not supported when the file is mmapped.
- well-behaved opening a file on NFS branch.
- refined memory allocation which size is zero.

20060911
- There might be a bug around kfree() in aufs. CONFIG_DEBUG_SLAB has
  reported slab corruption once. It is not reproducible but I am still
  working on.
- the fstype name is always "aufs" as I have announced.
- minor optimization by GCC's branch prediction or linux's unlikely macro.
- introducing plink/noplink mount option.

20060904
- support pseudo-link. branch and hidden_inode has branch id.
- rename wq.[ch] to wkq.[ch]. remove wq_nowait().
- reduce smp memory block which looks unnecessary.
- two threads (reinit hardlinked wh, and rmdir whtmp) do not use
  workqueue because of memory leak possibility.
- begin of aufs_lookup_one_len() and AUFS_MUST_FOLLOW branch flag.
- remove si_xino_mutex and make si_xino as atomic_long_t.
- give up DEBUG_PROVE_LOCKING.

20060828
- bugfix: some mount(8) requires one more argument, reported by Tomas M.
- bugfix: nopage() accessed incorrect file, reported by Martin Oehler.
- bugfix: recursive kthread call, new macro is_kthread().
- bugfix: to copyup a device file requires CAP_MKNOD in rename().
- bugfix: removing a branch whose path name resembles the former option.
- tried supporting SMP, but I am not confident. I don't have such machine.
- xino write passes superio thread, I am afraid it is slower.
- speed up vdir (minor).

20060823
- bugfix: macros for 'nested lock' should be compiled under
  linux-2.6.18 only, reported by Heinrich Rebehn.

20060821
- introduce a workqueue or a thread pool, replacing superio.
- hardlinked whiteout.
- introduce CONFIG_AUFS_DBA (Direct Branch Access).
- begin supporting linux-2.6.18(-rc4).
- try DEBUG_PROVE_LOCKING introduced by linux-2.6.18(-rc4).

20060814
- introduce nested__func__.patch for 'sparse'.

20060807
- introduce hardlinked whiteouts.
- support multiple writable branches.
- bugfix: del branch and cwd (current working directory).
- implement refresh dirs at remount time.
- bugfix: '#if' -- '#ifdef' in super.c, reported and fixed by Martin Oehler.

20060731
- bugfix: revalidating after del branch.
- bugfix: reset bwh in rename().
- bugfix: update mount point i_version.
- bugfix: remount may pass empty string.
- add EXAMPLES to the manual.
- bugfix: unionctl script supports a relative path, reported by Tomas M.

20060724
- support mmap without page-copy.

20060717
- introduce vdir, virtual or vertical directory, which is a seekable directory.
- introduce mount.aufs script.
- bugfix: symlink and device file in cpup_entry().
- try detecting direct access by its timestamp.

20060703
- bugfix: new revalidate scheme.
- simplified permission check.
- ignore dirwh when the branch is NFS.

2006 Jun
- start CVS on sourceforge.

2006 May
- no activities since I joined the Unionfs team.

2006 Apr
- finish first basic implementation and tests.
- make an application to sourceforge, as the name of aufs.

2006 Feb
- start implementing.

2005 Dec
- start planning and designing personally, the name was junionfs.

2005 Sep
- got to know Unionfs and start trying it.

2005 Aug
- got an idea of a stackable filesystem, supposing the old Transparent
  Filesystem in SunOS.

# Local variables: ;
# mode: text;
# End: ;
