
History of aufs
Junjiro Okajima

# $Id: History,v 1.36 2007/08/06 00:38:27 sfjro Exp $

Note:
- the described date 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.

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

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 deleteing 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 address 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: ;
