ToDo/Notes:
	- Find and fix bugs.
	- The only places in the kernel where a file is resized are
	  ntfs_file_write*() and ntfs_truncate() for both of which i_mutex is
	  held.  Just have to be careful in read-/writepage and other helpers
	  not running under i_mutex that we play nice.  Also need to be careful
	  with initialized_size extension in ntfs_file_write*() and writepage.
	  UPDATE: The only things that need to be checked are the compressed
	  write and the other attribute resize/write cases like index
	  attributes, etc.  For now none of these are implemented so are safe.
	- Implement filling in of holes in aops.c::ntfs_writepage() and its
	  helpers.
	- Implement mft.c::sync_mft_mirror_umount().  We currently will just
	  leave the volume dirty on umount if the final iput(vol->mft_ino)
	  causes a write of any mirrored mft records due to the mft mirror
	  inode having been discarded already.  Whether this can actually ever
	  happen is unclear however so it is worth waiting until someone hits
	  the problem.

2.1.29 - Fix a deadlock at mount time.

	- During mount the VFS holds s_umount lock on the superblock.  So when
	  we try to empty the journal $LogFile contents by calling
	  ntfs_attr_set() when the machine does not have much memory and the
	  journal is large ntfs_attr_set() results in the VM trying to balance
	  dirty pages which in turn tries to that the s_umount lock and thus we
	  get a deadlock.  The solution is to not use ntfs_attr_set() and
	  instead do the zeroing by hand at the block level rather than page
	  cache level.
	- Fix sparse warnings.

2.1.28 - Fix a deadlock.

	- Fix deadlock in fs/ntfs/inode.c::ntfs_put_inode().  Thanks to Sergey
	  Vlasov for the report and detailed analysis of the deadlock.  The fix
	  involved getting rid of ntfs_put_inode() altogether and hence NTFS no
	  longer has a ->put_inode super operation.

2.1.27 - Various bug fixes and cleanups.

	- Fix two compiler warnings on Alpha.  Thanks to Andrew Morton for
	  reporting them.
	- Fix an (innocent) off-by-one error in the runlist code.
	- Fix a buggette in an "should be impossible" case handling where we
	  continued the attribute lookup loop instead of aborting it.
	- Use buffer_migrate_page() for the ->migratepage function of all ntfs
	  address space operations.
	- Fix comparison of $MFT and $MFTMirr to not bail out when there are
	  unused, invalid mft records which are the same in both $MFT and
	  $MFTMirr.
	- Add support for sparse files which have a compression unit of 0.
	- Remove all the make_bad_inode() calls.  This should only be called
	  from read inode and new inode code paths.
	- Limit name length in fs/ntfs/unistr.c::ntfs_nlstoucs() to maximum
	  allowed by NTFS, i.e. 255 Unicode characters, not including the
	  terminating NULL (which is not stored on disk).
	- Improve comments on file attribute flags in fs/ntfs/layout.h.
	- Fix a bug in fs/ntfs/inode.c::ntfs_read_locked_index_inode() where we
	  forgot to update a temporary variable so loading index inodes which
	  have an index allocation attribute failed.
	- Add a missing call to flush_dcache_mft_record_page() in
	  fs/ntfs/inode.c::ntfs_write_inode().
	- Handle the recently introduced -ENAMETOOLONG return value from
	  fs/ntfs/unistr.c::ntfs_nlstoucs() in fs/ntfs/namei.c::ntfs_lookup().
	- Semaphore to mutex conversion.  (Ingo Molnar)

2.1.26 - Minor bug fixes and updates.

	- Fix a potential overflow in file.c where a cast to s64 was missing in
	  a left shift of a page index.
	- The struct inode has had its i_sem semaphore changed to a mutex named
	  i_mutex.
	- We have struct kmem_cache now so use it instead of the typedef
	  kmem_cache_t.  (Pekka Enberg)
	- Implement support for sector sizes above 512 bytes (up to the maximum
	  supported by NTFS which is 4096 bytes).
	- Do more detailed reporting of why we cannot mount read-write by
	  special casing the VOLUME_MODIFIED_BY_CHKDSK flag.
	- Miscellaneous updates to layout.h.
	- Cope with attribute list attribute having invalid flags.  Windows
	  copes with this and even chkdsk does not detect or fix this so we
	  have to cope with it, too.  Thanks to Pawel Kot for reporting the
	  problem.

2.1.25 - (Almost) fully implement write(2) and truncate(2).

	- Change ntfs_map_runlist_nolock(), ntfs_attr_find_vcn_nolock() and
	  {__,}ntfs_cluster_free() to also take an optional attribute search
	  context as argument.  This allows calling these functions with the
	  mft record mapped.  Update all callers.
	- Fix potential deadlock in ntfs_mft_data_extend_allocation_nolock()
	  error handling by passing in the active search context when calling
	  ntfs_cluster_free().
	- Change ntfs_cluster_alloc() to take an extra boolean parameter
	  specifying whether the cluster are being allocated to extend an
	  attribute or to fill a hole.
	- Change ntfs_attr_make_non_resident() to call ntfs_cluster_alloc()
	  with @is_extension set to TRUE and remove the runlist terminator
	  fixup code as this is now done by ntfs_cluster_alloc().
	- Change ntfs_attr_make_non_resident to take the attribute value size
	  as an extra parameter.  This is needed since we need to know the size
	  before we can map the mft record and our callers always know it.  The
	  reason we cannot simply read the size from the vfs inode i_size is
	  that this is not necessarily uptodate.  This happens when
	  ntfs_attr_make_non_resident() is called in the ->truncate call path.
	- Fix ntfs_attr_make_non_resident() to update the vfs inode i_blocks
	  which is zero for a resident attribute but should no longer be zero
	  once the attribute is non-resident as it then has real clusters
	  allocated.
	- Add fs/ntfs/attrib.[hc]::ntfs_attr_extend_allocation(), a function to
	  extend the allocation of an attributes.  Optionally, the data size,
	  but not the initialized size can be extended, too.
	- Implement fs/ntfs/inode.[hc]::ntfs_truncate().  It only supports
	  uncompressed and unencrypted files and it never creates sparse files
	  at least for the moment (making a file sparse requires us to modify
	  its directory entries and we do not support directory operations at
	  the moment).  Also, support for highly fragmented files, i.e. ones
	  whose data attribute is split across multiple extents, is severly
	  limited.  When such a case is encountered, EOPNOTSUPP is returned.
	- Enable ATTR_SIZE attribute changes in ntfs_setattr().  This completes
	  the initial implementation of file truncation.  Now both open(2)ing
	  a file with the O_TRUNC flag and the {,f}truncate(2) system calls
	  will resize a file appropriately.  The limitations are that only
	  uncompressed and unencrypted files are supported.  Also, there is
	  only very limited support for highly fragmented files (the ones whose
	  $DATA attribute is split into multiple attribute extents).
	- In attrib.c::ntfs_attr_set() call balance_dirty_pages_ratelimited()
	  and cond_resched() in the main loop as we could be dirtying a lot of
	  pages and this ensures we play nice with the VM and the system as a
	  whole.
	- Implement file operations ->write, ->aio_write, ->writev for regular
	  files.  This replaces the old use of generic_file_write(), et al and
	  the address space operations ->prepare_write and ->commit_write.
	  This means that both sparse and non-sparse (unencrypted and
	  uncompressed) files can now be extended using the normal write(2)
	  code path.  There are two limitations at present and these are that
	  we never create sparse files and that we only have limited support
	  for highly fragmented files, i.e. ones whose data attribute is split
	  across multiple extents.   When such a case is encountered,
	  EOPNOTSUPP is returned.
	- $EA attributes can be both resident and non-resident.
	- Use %z for size_t to fix compilation warnings.  (Andrew Morton)
	- Fix compilation warnings with gcc-4.0.2 on SUSE 10.0.
	- Document extended attribute ($EA) NEED_EA flag.  (Based on libntfs
	  patch by Yura Pakhuchiy.)

2.1.24 - Lots of bug fixes and support more clean journal states.

	- Support journals ($LogFile) which have been modified by chkdsk.  This
	  means users can boot into Windows after we marked the volume dirty.
	  The Windows boot will run chkdsk and then reboot.  The user can then
	  immediately boot into Linux rather than having to do a full Windows
	  boot first before rebooting into Linux and we will recognize such a
	  journal and empty it as it is clean by definition.  Note, this only
	  works if chkdsk left the journal in an obviously clean state.
	- Support journals ($LogFile) with only one restart page as well as
	  journals with two different restart pages.  We sanity check both and
	  either use the only sane one or the more recent one of the two in the
	  case that both are valid.
	- Add fs/ntfs/malloc.h::ntfs_malloc_nofs_nofail() which is analogous to
	  ntfs_malloc_nofs() but it performs allocations with __GFP_NOFAIL and
	  hence cannot fail.
	- Use ntfs_malloc_nofs_nofail() in the two critical regions in
	  fs/ntfs/runlist.c::ntfs_runlists_merge().  This means we no longer
	  need to panic() if the allocation fails as it now cannot fail.
	- Fix two nasty runlist merging bugs that had gone unnoticed so far.
	  Thanks to Stefano Picerno for the bug report.
	- Remove two bogus BUG_ON()s from fs/ntfs/mft.c.
	- Fix handling of valid but empty mapping pairs array in
	  fs/ntfs/runlist.c::ntfs_mapping_pairs_decompress().
	- Report unrepresentable inodes during ntfs_readdir() as KERN_WARNING
	  messages and include the inode number.  Thanks to Yura Pakhuchiy for
	  pointing this out.
	- Change ntfs_rl_truncate_nolock() to throw away the runlist if the new
	  length is zero.
	- Add runlist.[hc]::ntfs_rl_punch_nolock() which punches a caller
	  specified hole into a runlist.
	- Fix a bug in fs/ntfs/index.c::ntfs_index_lookup().  When the returned
	  index entry is in the index root, we forgot to set the @ir pointer in
	  the index context.  Thanks to Yura Pakhuchiy for finding this bug.
	- Remove bogus setting of PageError in ntfs_read_compressed_block().
	- Add fs/ntfs/attrib.[hc]::ntfs_resident_attr_value_resize().
	- Fix a bug in ntfs_map_runlist_nolock() where we forgot to protect
	  access to the allocated size in the ntfs inode with the size lock.
	- Fix ntfs_attr_vcn_to_lcn_nolock() and ntfs_attr_find_vcn_nolock() to
	  return LCN_ENOENT when there is no runlist and the allocated size is
	  zero.
	- Fix load_attribute_list() to handle the case of a NULL runlist.
	- Fix handling of sparse attributes in ntfs_attr_make_non_resident().
	- Add BUG() checks to ntfs_attr_make_non_resident() and ntfs_attr_set()
	  to ensure that these functions are never called for compressed or
	  encrypted attributes.
	- Fix cluster (de)allocators to work when the runlist is NULL and more
	  importantly to take a locked runlist rather than them locking it
	  which leads to lock reversal.
	- Truncate {a,c,m}time to the ntfs supported time granularity when
	  updating the times in the inode in ntfs_setattr().
	- Fixup handling of sparse, compressed, and encrypted attributes in
	  fs/ntfs/inode.c::ntfs_read_locked_{,attr_,index_}inode(),
	  fs/ntfs/aops.c::ntfs_{read,write}page().
	- Make ntfs_write_block() not instantiate sparse blocks if they contain
	  only zeroes.
	- Optimize fs/ntfs/aops.c::ntfs_write_block() by extending the page
	  lock protection over the buffer submission for i/o which allows the
	  removal of the get_bh()/put_bh() pairs for each buffer.
	- Fix fs/ntfs/aops.c::ntfs_{read,write}_block() to handle the case
	  where a concurrent truncate has truncated the runlist under our feet.
	- Fix page_has_buffers()/page_buffers() handling in fs/ntfs/aops.c.
	- In fs/ntfs/aops.c::ntfs_end_buffer_async_read(), use a bit spin lock
	  in the first buffer head instead of a driver global spin lock to
	  improve scalability.
	- Minor fix to error handling and error message display in
	  fs/ntfs/aops.c::ntfs_prepare_nonresident_write().
	- Change the mount options {u,f,d}mask to always parse the number as
	  an octal number to conform to how chmod(1) works, too.  Thanks to
	  Giuseppe Bilotta and Horst von Brand for pointing out the errors of
	  my ways.
	- Fix various bugs in the runlist merging code.  (Based on libntfs
	  changes by Richard Russon.)
	- Fix sparse warnings that have crept in over time.
	- Change ntfs_cluster_free() to require a write locked runlist on entry
	  since we otherwise get into a lock reversal deadlock if a read locked
	  runlist is passed in. In the process also change it to take an ntfs
	  inode instead of a vfs inode as parameter.
	- Fix the definition of the CHKD ntfs record magic.  It had an off by
	  two error causing it to be CHKB instead of CHKD.
	- Fix a stupid bug in __ntfs_bitmap_set_bits_in_run() which caused the
	  count to become negative and hence we had a wild memset() scribbling
	  all over the system's ram.

2.1.23 - Implement extension of resident files and make writing safe as well as
	 many bug fixes, cleanups, and enhancements...

	- Add printk rate limiting for ntfs_warning() and ntfs_error() when
	  compiled without debug.  This avoids a possible denial of service
	  attack.  Thanks to Carl-Daniel Hailfinger from SuSE for pointing this
	  out.
	- Fix compilation warnings on ia64.  (Randy Dunlap)
	- Use i_size_{read,write}() instead of reading i_size by hand and cache
	  the value where apropriate.
	- Add size_lock to the ntfs_inode structure.  This is an rw spinlock
	  and it locks against access to the inode sizes.  Note, ->size_lock
	  is also accessed from irq context so you must use the _irqsave and
	  _irqrestore lock and unlock functions, respectively.  Protect all
	  accesses to allocated_size, initialized_size, and compressed_size.
	- Minor optimization to fs/ntfs/super.c::ntfs_statfs() and its helpers.
	- Implement extension of resident files in the regular file write code
	  paths (fs/ntfs/aops.c::ntfs_{prepare,commit}_write()).  At present
	  this only works until the data attribute becomes too big for the mft
	  record after which we abort the write returning -EOPNOTSUPP from
	  ntfs_prepare_write().
	- Add disable_sparse mount option together with a per volume sparse
	  enable bit which is set appropriately and a per inode sparse disable
	  bit which is preset on some system file inodes as appropriate.
	- Enforce that sparse support is disabled on NTFS volumes pre 3.0.
	- Fix a bug in fs/ntfs/runlist.c::ntfs_mapping_pairs_decompress() in
	  the creation of the unmapped runlist element for the base attribute
	  extent.
	- Split ntfs_map_runlist() into ntfs_map_runlist() and a non-locking
	  helper ntfs_map_runlist_nolock() which is used by ntfs_map_runlist().
	  This allows us to map runlist fragments with the runlist lock already
	  held without having to drop and reacquire it around the call.  Adapt
	  all callers.
	- Change ntfs_find_vcn() to ntfs_find_vcn_nolock() which takes a locked
	  runlist.  This allows us to find runlist elements with the runlist
	  lock already held without having to drop and reacquire it around the
	  call.  Adapt all callers.
	- Change time to u64 in time.h::ntfs2utc() as it otherwise generates a
	  warning in the do_div() call on sparc32.  Thanks to Meelis Roos for
	  the report and analysis of the warning.
	- Fix a nasty runlist merge bug when merging two holes.
	- Set the ntfs_inode->allocated_size to the real allocated size in the
	  mft record for resident attributes (fs/ntfs/inode.c).
	- Small readability cleanup to use "a" instead of "ctx->attr"
	  everywhere (fs/ntfs/inode.c).
	- Make fs/ntfs/namei.c::ntfs_get_{parent,dentry} static and move the
	  definition of ntfs_export_ops from fs/ntfs/super.c to namei.c.  Also,
	  declare ntfs_export_ops in fs/ntfs/ntfs.h.
	- Correct sparse file handling.  The compressed values need to be
	  checked and set in the ntfs inode as done for compressed files and
	  the compressed size needs to be used for vfs inode->i_blocks instead
	  of the allocated size, again, as done for compressed files.
	- Add AT_EA in addition to AT_DATA to whitelist for being allowed to be
	  non-resident in fs/ntfs/attrib.c::ntfs_attr_can_be_non_resident().
	- Add fs/ntfs/attrib.c::ntfs_attr_vcn_to_lcn_nolock() used by the new
	  write code.
	- Fix bug in fs/ntfs/attrib.c::ntfs_find_vcn_nolock() where after
	  dropping the read lock and taking the write lock we were not checking
	  whether someone else did not already do the work we wanted to do.
	- Rename fs/ntfs/attrib.c::ntfs_find_vcn_nolock() to
	  ntfs_attr_find_vcn_nolock() and update all callers.
	- Add fs/ntfs/attrib.[hc]::ntfs_attr_make_non_resident().
	- Fix sign of various error return values to be negative in
	  fs/ntfs/lcnalloc.c.
	- Modify ->readpage and ->writepage (fs/ntfs/aops.c) so they detect and
	  handle the case where an attribute is converted from resident to
	  non-resident by a concurrent file write.
	- Remove checks for NULL before calling kfree() since kfree() does the
	  checking itself.  (Jesper Juhl)
	- Some utilities modify the boot sector but do not update the checksum.
	  Thus, relax the checking in fs/ntfs/super.c::is_boot_sector_ntfs() to
	  only emit a warning when the checksum is incorrect rather than
	  refusing the mount.  Thanks to Bernd Casimir for pointing this
	  problem out.
	- Update attribute definition handling.
	- Add NTFS_MAX_CLUSTER_SIZE and NTFS_MAX_PAGES_PER_CLUSTER constants.
	- Use NTFS_MAX_CLUSTER_SIZE in super.c instead of hard coding 0x10000.
	- Use MAX_BUF_PER_PAGE instead of variable sized array allocation for
	  better code generation and one less sparse warning in fs/ntfs/aops.c.
	- Remove spurious void pointer casts from fs/ntfs/.  (Pekka Enberg)
	- Use C99 style structure initialization after memory allocation where
	  possible (fs/ntfs/{attrib.c,index.c,super.c}).  Thanks to Al Viro and
	  Pekka Enberg.
	- Stamp the transaction log ($UsnJrnl), aka user space journal, if it
	  is active on the volume and we are mounting read-write or remounting
	  from read-only to read-write.
	- Fix a bug in address space operations error recovery code paths where
	  if the runlist was not mapped at all and a mapping error occured we
	  would leave the runlist locked on exit to the function so that the
	  next access to the same file would try to take the lock and deadlock.
	- Detect the case when Windows has been suspended to disk on the volume
	  to be mounted and if this is the case do not allow (re)mounting
	  read-write.  This is done by parsing hiberfil.sys if present.
	- Fix several occurences of a bug where we would perform 'var & ~const'
	  with a 64-bit variable and a int, i.e. 32-bit, constant.  This causes
	  the higher order 32-bits of the 64-bit variable to be zeroed.  To fix
	  this cast the 'const' to the same 64-bit type as 'var'.
	- Change the runlist terminator of the newly allocated cluster(s) to
	  LCN_ENOENT in ntfs_attr_make_non_resident().  Otherwise the runlist
	  code gets confused.
	- Add an extra parameter @last_vcn to ntfs_get_size_for_mapping_pairs()
	  and ntfs_mapping_pairs_build() to allow the runlist encoding to be
	  partial which is desirable when filling holes in sparse attributes.
	  Update all callers.
	- Change ntfs_map_runlist_nolock() to only decompress the mapping pairs
	  if the requested vcn is inside it.  Otherwise we get into problems
	  when we try to map an out of bounds vcn because we then try to map
	  the already mapped runlist fragment which causes
	  ntfs_mapping_pairs_decompress() to fail and return error.  Update
	  ntfs_attr_find_vcn_nolock() accordingly.
	- Fix a nasty deadlock that appeared in recent kernels.
	  The situation: VFS inode X on a mounted ntfs volume is dirty.  For
	  same inode X, the ntfs_inode is dirty and thus corresponding on-disk
	  inode, i.e. mft record, which is in a dirty PAGE_CACHE_PAGE belonging
	  to the table of inodes, i.e. $MFT, inode 0.
	  What happens:
	  Process 1: sys_sync()/umount()/whatever...  calls
	  __sync_single_inode() for $MFT -> do_writepages() -> write_page for
	  the dirty page containing the on-disk inode X, the page is now locked
	  -> ntfs_write_mst_block() which clears PageUptodate() on the page to
	  prevent anyone else getting hold of it whilst it does the write out.
	  This is necessary as the on-disk inode needs "fixups" applied before
	  the write to disk which are removed again after the write and
	  PageUptodate is then set again.  It then analyses the page looking
	  for dirty on-disk inodes and when it finds one it calls
	  ntfs_may_write_mft_record() to see if it is safe to write this
	  on-disk inode.  This then calls ilookup5() to check if the
	  corresponding VFS inode is in icache().  This in turn calls ifind()
	  which waits on the inode lock via wait_on_inode whilst holding the
	  global inode_lock.
	  Process 2: pdflush results in a call to __sync_single_inode for the
	  same VFS inode X on the ntfs volume.  This locks the inode (I_LOCK)
	  then calls write-inode -> ntfs_write_inode -> map_mft_record() ->
	  read_cache_page() for the page (in page cache of table of inodes
	  $MFT, inode 0) containing the on-disk inode.  This page has
	  PageUptodate() clear because of Process 1 (see above) so
	  read_cache_page() blocks when it tries to take the page lock for the
	  page so it can call ntfs_read_page().
	  Thus Process 1 is holding the page lock on the page containing the
	  on-disk inode X and it is waiting on the inode X to be unlocked in
	  ifind() so it can write the page out and then unlock the page.
	  And Process 2 is holding the inode lock on inode X and is waiting for
	  the page to be unlocked so it can call ntfs_readpage() or discover
	  that Process 1 set PageUptodate() again and use the page.
	  Thus we have a deadlock due to ifind() waiting on the inode lock.
	  The solution: The fix is to use the newly introduced
	  ilookup5_nowait() which does not wait on the inode's lock and hence
	  avoids the deadlock.  This is safe as we do not care about the VFS
	  inode and only use the fact that it is in the VFS inode cache and the
	  fact that the vfs and ntfs inodes are one struct in memory to find
	  the ntfs inode in memory if present.  Also, the ntfs inode has its
	  own locking so it does not matter if the vfs inode is locked.
	- Fix bug in mft record writing where we forgot to set the device in
	  the buffers when mapping them after the VM had discarded them.
	  Thanks to Martin MOKREJÅ for the bug report.

2.1.22 - Many bug and race fixes and error handling improvements.

	- Improve error handling in fs/ntfs/inode.c::ntfs_truncate().
	- Change fs/ntfs/inode.c::ntfs_truncate() to return an error code
	  instead of void and provide a helper ntfs_truncate_vfs() for the
	  vfs ->truncate method.
	- Add a new ntfs inode flag NInoTruncateFailed() and modify
	  fs/ntfs/inode.c::ntfs_truncate() to set and clear it appropriately.
	- Fix min_size and max_size definitions in ATTR_DEF structure in
	  fs/ntfs/layout.h to be signed.
	- Add attribute definition handling helpers to fs/ntfs/attrib.[hc]:
	  ntfs_attr_size_bounds_check(), ntfs_attr_can_be_non_resident(), and
	  ntfs_attr_can_be_resident(), which in turn use the new private helper
	  ntfs_attr_find_in_attrdef().
	- In fs/ntfs/aops.c::mark_ntfs_record_dirty(), take the
	  mapping->private_lock around the dirtying of the buffer heads
	  analagous to the way it is done in __set_page_dirty_buffers().
	- Ensure the mft record size does not exceed the PAGE_CACHE_SIZE at
	  mount time as this cannot work with the current implementation.
	- Check for location of attribute name and improve error handling in
	  general in fs/ntfs/inode.c::ntfs_read_locked_inode() and friends.
	- In fs/ntfs/aops.c::ntfs_writepage(), if the page is fully outside
	  i_size, i.e. race with truncate, invalidate the buffers on the page
	  so that they become freeable and hence the page does not leak.
	- Remove unused function fs/ntfs/runlist.c::ntfs_rl_merge().  (Adrian
	  Bunk)
	- Fix stupid bug in fs/ntfs/attrib.c::ntfs_attr_find() that resulted in
	  a NULL pointer dereference in the error code path when a corrupt
	  attribute was found.  (Thanks to Domen Puncer for the bug report.)
	- Add MODULE_VERSION() to fs/ntfs/super.c.
	- Make several functions and variables static.  (Adrian Bunk)
	- Modify fs/ntfs/aops.c::mark_ntfs_record_dirty() so it allocates
	  buffers for the page if they are not present and then marks the
	  buffers belonging to the ntfs record dirty.  This causes the buffers
	  to become busy and hence they are safe from removal until the page
	  has been written out.
	- Fix stupid bug in fs/ntfs/attrib.c::ntfs_external_attr_find() in the
	  error handling code path that resulted in a BUG() due to trying to
	  unmap an extent mft record when the mapping of it had failed and it
	  thus was not mapped.  (Thanks to Ken MacFerrin for the bug report.)
	- Drop the runlist lock after the vcn has been read in
	  fs/ntfs/lcnalloc.c::__ntfs_cluster_free().
	- Rewrite handling of multi sector transfer errors.  We now do not set
	  PageError() when such errors are detected in the async i/o handler
	  fs/ntfs/aops.c::ntfs_end_buffer_async_read().  All users of mst
	  protected attributes now check the magic of each ntfs record as they
	  use it and act appropriately.  This has the effect of making errors
	  granular per ntfs record rather than per page which solves the case
	  where we cannot access any of the ntfs records in a page when a
	  single one of them had an mst error.  (Thanks to Ken MacFerrin for
	  the bug report.)
	- Fix error handling in fs/ntfs/quota.c::ntfs_mark_quotas_out_of_date()
	  where we failed to release i_mutex on the $Quota/$Q attribute inode.
	- Fix bug in handling of bad inodes in fs/ntfs/namei.c::ntfs_lookup().
	- Add mapping of unmapped buffers to all remaining code paths, i.e.
	  fs/ntfs/aops.c::ntfs_write_mst_block(), mft.c::ntfs_sync_mft_mirror(),
	  and write_mft_record_nolock().  From now on we require that the
	  complete runlist for the mft mirror is always mapped into memory.
	- Add creation of buffers to fs/ntfs/mft.c::ntfs_sync_mft_mirror().
	- Improve error handling in fs/ntfs/aops.c::ntfs_{read,write}_block().
	- Cleanup fs/ntfs/aops.c::ntfs_{read,write}page() since we know that a
	  resident attribute will be smaller than a page which makes the code
	  simpler.  Also make the code more tolerant to concurrent ->truncate.

2.1.21 - Fix some races and bugs, rewrite mft write code, add mft allocator.

	- Implement extent mft record deallocation
	  fs/ntfs/mft.c::ntfs_extent_mft_record_free().
	- Splitt runlist related functions off from attrib.[hc] to runlist.[hc].
	- Add vol->mft_data_pos and initialize it at mount time.
	- Rename init_runlist() to ntfs_init_runlist(), ntfs_vcn_to_lcn() to
	  ntfs_rl_vcn_to_lcn(), decompress_mapping_pairs() to
	  ntfs_mapping_pairs_decompress(), ntfs_merge_runlists() to
	  ntfs_runlists_merge() and adapt all callers.
	- Add fs/ntfs/runlist.[hc]::ntfs_get_nr_significant_bytes(),
	  ntfs_get_size_for_mapping_pairs(), ntfs_write_significant_bytes(),
	  and ntfs_mapping_pairs_build(), adapted from libntfs.
	- Make fs/ntfs/lcnalloc.c::ntfs_cluster_free_from_rl_nolock() not
	  static and add a declaration for it to lcnalloc.h.
	- Add fs/ntfs/lcnalloc.h::ntfs_cluster_free_from_rl() which is a static
	  inline wrapper for ntfs_cluster_free_from_rl_nolock() which takes the
	  cluster bitmap lock for the duration of the call.
	- Add fs/ntfs/attrib.[hc]::ntfs_attr_record_resize().
	- Implement the equivalent of memset() for an ntfs attribute in
	  fs/ntfs/attrib.[hc]::ntfs_attr_set() and switch
	  fs/ntfs/logfile.c::ntfs_empty_logfile() to using it.
	- Remove unnecessary casts from LCN_* constants.
	- Implement fs/ntfs/runlist.c::ntfs_rl_truncate_nolock().
	- Add MFT_RECORD_OLD as a copy of MFT_RECORD in fs/ntfs/layout.h and
	  change MFT_RECORD to contain the NTFS 3.1+ specific fields.
	- Add a helper function fs/ntfs/aops.c::mark_ntfs_record_dirty() which
	  marks all buffers belonging to an ntfs record dirty, followed by
	  marking the page the ntfs record is in dirty and also marking the vfs
	  inode containing the ntfs record dirty (I_DIRTY_PAGES).
	- Switch fs/ntfs/index.h::ntfs_index_entry_mark_dirty() to using the
	  new helper fs/ntfs/aops.c::mark_ntfs_record_dirty() and remove the no
	  longer needed fs/ntfs/index.[hc]::__ntfs_index_entry_mark_dirty().
	- Move ntfs_{un,}map_page() from ntfs.h to aops.h and fix resulting
	  include errors.
	- Move the typedefs for runlist_element and runlist from types.h to
	  runlist.h and fix resulting include errors.
	- Remove unused {__,}format_mft_record() from fs/ntfs/mft.c.
	- Modify fs/ntfs/mft.c::__mark_mft_record_dirty() to use the helper
	  mark_ntfs_record_dirty() which also changes the behaviour in that we
	  now set the buffers belonging to the mft record dirty as well as the
	  page itself.
	- Update fs/ntfs/mft.c::write_mft_record_nolock() and sync_mft_mirror()
	  to cope with the fact that there now are dirty buffers in mft pages.
	- Update fs/ntfs/inode.c::ntfs_write_inode() to also use the helper
	  mark_ntfs_record_dirty() and thus to set the buffers belonging to the
	  mft record dirty as well as the page itself.
	- Fix compiler warnings on x86-64 in fs/ntfs/dir.c.  (Randy Dunlap,
	  slightly modified by me)
	- Add fs/ntfs/mft.c::try_map_mft_record() which fails with -EALREADY if
	  the mft record is already locked and otherwise behaves the same way
	  as fs/ntfs/mft.c::map_mft_record().
	- Modify fs/ntfs/mft.c::write_mft_record_nolock() so that it only
	  writes the mft record if the buffers belonging to it are dirty.
	  Otherwise we assume that it was written out by other means already.
	- Attempting to write outside initialized size is _not_ a bug so remove
	  the bug check from fs/ntfs/aops.c::ntfs_write_mst_block().  It is in
	  fact required to write outside initialized size when preparing to
	  extend the initialized size.
	- Map the page instead of using page_address() before writing to it in
	  fs/ntfs/aops.c::ntfs_mft_writepage().
	- Provide exclusion between opening an inode / mapping an mft record
	  and accessing the mft record in fs/ntfs/mft.c::ntfs_mft_writepage()
	  by setting the page not uptodate throughout ntfs_mft_writepage().
	- Clear the page uptodate flag in fs/ntfs/aops.c::ntfs_write_mst_block()
	  to ensure noone can see the page whilst the mst fixups are applied.
	- Add the helper fs/ntfs/mft.c::ntfs_may_write_mft_record() which
	  checks if an mft record may be written out safely obtaining any
	  necessary locks in the process.  This is used by
	  fs/ntfs/aops.c::ntfs_write_mst_block().
	- Modify fs/ntfs/aops.c::ntfs_write_mst_block() to also work for
	  writing mft records and improve its error handling in the process.
	  Now if any of the records in the page fail to be written out, all
	  other records will be written out instead of aborting completely.
	- Remove ntfs_mft_aops and update all users to use ntfs_mst_aops.
	- Modify fs/ntfs/inode.c::ntfs_read_locked_inode() to set the
	  ntfs_mst_aops for all inodes which are NInoMstProtected() and
	  ntfs_aops for all other inodes.
	- Rename fs/ntfs/mft.c::sync_mft_mirror{,_umount}() to
	  ntfs_sync_mft_mirror{,_umount}() and change their parameters so they
	  no longer require an ntfs inode to be present.  Update all callers.
	- Cleanup the error handling in fs/ntfs/mft.c::ntfs_sync_mft_mirror().
	- Clear the page uptodate flag in fs/ntfs/mft.c::ntfs_sync_mft_mirror()
	  to ensure noone can see the page whilst the mst fixups are applied.
	- Remove the no longer needed fs/ntfs/mft.c::ntfs_mft_writepage() and
	  fs/ntfs/mft.c::try_map_mft_record().
	- Fix callers of fs/ntfs/aops.c::mark_ntfs_record_dirty() to call it
	  with the ntfs inode which contains the page rather than the ntfs
	  inode the mft record of which is in the page.
	- Fix race condition in fs/ntfs/inode.c::ntfs_put_inode() by moving the
	  index inode bitmap inode release code from there to
	  fs/ntfs/inode.c::ntfs_clear_big_inode().  (Thanks to Christoph
	  Hellwig for spotting this.)
	- Fix race condition in fs/ntfs/inode.c::ntfs_put_inode() by taking the
	  inode semaphore around the code that sets ni->itype.index.bmp_ino to
	  NULL and reorganize the code to optimize it a bit.  (Thanks to
	  Christoph Hellwig for spotting this.)
	- Modify fs/ntfs/aops.c::mark_ntfs_record_dirty() to no longer take the
	  ntfs inode as a parameter as this is confusing and misleading and the
	  needed ntfs inode is available via NTFS_I(page->mapping->host).
	  Adapt all callers to this change.
	- Modify fs/ntfs/mft.c::write_mft_record_nolock() and
	  fs/ntfs/aops.c::ntfs_write_mst_block() to only check the dirty state
	  of the first buffer in a record and to take this as the ntfs record
	  dirty state.  We cannot look at the dirty state for subsequent
	  buffers because we might be racing with
	  fs/ntfs/aops.c::mark_ntfs_record_dirty().
	- Move the static inline ntfs_init_big_inode() from fs/ntfs/inode.c to
	  inode.h and make fs/ntfs/inode.c::__ntfs_init_inode() non-static and
	  add a declaration for it to inode.h.  Fix some compilation issues
	  that resulted due to #includes and header file interdependencies.
	- Simplify setup of i_mode in fs/ntfs/inode.c::ntfs_read_locked_inode().
	- Add helpers fs/ntfs/layout.h::MK_MREF() and MK_LE_MREF().
	- Modify fs/ntfs/mft.c::map_extent_mft_record() to only verify the mft
	  record sequence number if it is specified (i.e. not zero).
	- Add fs/ntfs/mft.[hc]::ntfs_mft_record_alloc() and various helper
	  functions used by it.
	- Update Documentation/filesystems/ntfs.txt with instructions on how to
	  use the Device-Mapper driver with NTFS ftdisk/LDM raid.  This removes
	  the linear raid problem with the Software RAID / MD driver when one
	  or more of the devices has an odd number of sectors.

2.1.20 - Fix two stupid bugs introduced in 2.1.18 release.

	- Fix stupid bug in fs/ntfs/attrib.c::ntfs_attr_reinit_search_ctx()
	  where we did not clear ctx->al_entry but it was still set due to
	  changes in ntfs_attr_lookup() and ntfs_external_attr_find() in
	  particular.
	- Fix another stupid bug in fs/ntfs/attrib.c::ntfs_external_attr_find()
	  where we forgot to unmap the extent mft record when we had finished
	  enumerating an attribute which caused a bug check to trigger when the
	  VFS calls ->clear_inode.

2.1.19 - Many cleanups, improvements, and a minor bug fix.

	- Update ->setattr (fs/ntfs/inode.c::ntfs_setattr()) to refuse to
	  change the uid, gid, and mode of an inode as we do not support NTFS
	  ACLs yet.
	- Remove BKL use from ntfs_setattr() syncing up with the rest of the
	  kernel.
	- Get rid of the ugly transparent union in fs/ntfs/dir.c::ntfs_readdir()
	  and ntfs_filldir() as per suggestion from Al Viro.
	- Change '\0' and L'\0' to simply 0 as per advice from Linus Torvalds.
	- Update ->truncate (fs/ntfs/inode.c::ntfs_truncate()) to check if the
	  inode size has changed and to only output an error if so.
	- Rename fs/ntfs/attrib.h::attribute_value_length() to ntfs_attr_size().
	- Add le{16,32,64} as well as sle{16,32,64} data types to
	  fs/ntfs/types.h.
	- Change ntfschar to be le16 instead of u16 in fs/ntfs/types.h.
	- Add le versions of VCN, LCN, and LSN called leVCN, leLCN, and leLSN,
	  respectively, to fs/ntfs/types.h.
	- Update endianness conversion macros in fs/ntfs/endian.h to use the
	  new types as appropriate.
	- Do proper type casting when using sle64_to_cpup() in fs/ntfs/dir.c
	  and index.c.
	- Add leMFT_REF data type to fs/ntfs/layout.h.
	- Update all NTFS header files with the new little endian data types.
	  Affected files are fs/ntfs/layout.h, logfile.h, and time.h.
	- Do proper type casting when using ntfs_is_*_recordp() in
	  fs/ntfs/logfile.c, mft.c, and super.c. 
	- Fix all the sparse bitwise warnings.  Had to change all the typedef
	  enums storing little endian values to simple enums plus a typedef for
	  the datatype to make sparse happy.
	- Fix a bug found by the new sparse bitwise warnings where the default
	  upcase table was defined as a pointer to wchar_t rather than ntfschar
	  in fs/ntfs/ntfs.h and super.c.
	- Change {const_,}cpu_to_le{16,32}(0) to just 0 as suggested by Al Viro.

2.1.18 - Fix scheduling latencies at mount time as well as an endianness bug.

	- Remove vol->nr_mft_records as it was pretty meaningless and optimize
	  the calculation of total/free inodes as used by statfs().
	- Fix scheduling latencies in ntfs_fill_super() by dropping the BKL
	  because the code itself is using the ntfs_lock semaphore which
	  provides safe locking.  (Ingo Molnar)
	- Fix a potential bug in fs/ntfs/mft.c::map_extent_mft_record() that
	  could occur in the future for when we start closing/freeing extent
	  inodes if we don't set base_ni->ext.extent_ntfs_inos to NULL after
	  we free it.
	- Rename {find,lookup}_attr() to ntfs_attr_{find,lookup}() as well as
	  find_external_attr() to ntfs_external_attr_find() to cleanup the
	  namespace a bit and to be more consistent with libntfs.
	- Rename {{re,}init,get,put}_attr_search_ctx() to
	  ntfs_attr_{{re,}init,get,put}_search_ctx() as well as the type
	  attr_search_context to ntfs_attr_search_ctx.
	- Force use of ntfs_attr_find() in ntfs_attr_lookup() when searching
	  for the attribute list attribute itself.
	- Fix endianness bug in ntfs_external_attr_find().
	- Change ntfs_{external_,}attr_find() to return 0 on success, -ENOENT
	  if the attribute is not found, and -EIO on real error.  In the case
	  of -ENOENT, the search context is updated to describe the attribute
	  before which the attribute being searched for would need to be
	  inserted if such an action were to be desired and in the case of
	  ntfs_external_attr_find() the search context is also updated to
	  indicate the attribute list entry before which the attribute list
	  entry of the attribute being searched for would need to be inserted
	  if such an action were to be desired.  Also make ntfs_find_attr()
	  static and remove its prototype from attrib.h as it is not used
	  anywhere other than attrib.c.  Update ntfs_attr_lookup() and all
	  callers of ntfs_{external,}attr_{find,lookup}() for the new return
	  values.
	- Minor cleanup of fs/ntfs/inode.c::ntfs_init_locked_inode().

2.1.17 - Fix bugs in mount time error code paths and other updates.

	- Implement bitmap modification code (fs/ntfs/bitmap.[hc]).  This
	  includes functions to set/clear a single bit or a run of bits.
	- Add fs/ntfs/attrib.[hc]::ntfs_find_vcn() which returns the locked
	  runlist element containing a particular vcn.  It also takes care of
	  mapping any needed runlist fragments.
	- Implement cluster (de-)allocation code (fs/ntfs/lcnalloc.[hc]).
	- Load attribute definition table from $AttrDef at mount time.
	- Fix bugs in mount time error code paths involving (de)allocation of
	  the default and volume upcase tables.
	- Remove ntfs_nr_mounts as it is no longer used.

2.1.16 - Implement access time updates, file sync, async io, and read/writev.

	- Add support for readv/writev and aio_read/aio_write (fs/ntfs/file.c).
	  This is done by setting the appropriate file operations pointers to
	  the generic helper functions provided by mm/filemap.c.
	- Implement fsync, fdatasync, and msync both for files (fs/ntfs/file.c)
	  and directories (fs/ntfs/dir.c).
	- Add support for {a,m,c}time updates to inode.c::ntfs_write_inode().
	  Note, except for the root directory and any other system files opened
	  by the user, the system files will not have their access times
	  updated as they are only accessed at the inode level an hence the
	  file level functions which cause the times to be updated are never
	  invoked.

2.1.15 - Invalidate quotas when (re)mounting read-write.

	- Add new element itype.index.collation_rule to the ntfs inode
	  structure and set it appropriately in ntfs_read_locked_inode().
	- Implement a new inode type "index" to allow efficient access to the
	  indices found in various system files and adapt inode handling
	  accordingly (fs/ntfs/inode.[hc]).  An index inode is essentially an
	  attribute inode (NInoAttr() is true) with an attribute type of
	  AT_INDEX_ALLOCATION.  As such, it is no longer allowed to call
	  ntfs_attr_iget() with an attribute type of AT_INDEX_ALLOCATION as
	  there would be no way to distinguish between normal attribute inodes
	  and index inodes.  The function to obtain an index inode is
	  ntfs_index_iget() and it uses the helper function
	  ntfs_read_locked_index_inode().  Note, we do not overload
	  ntfs_attr_iget() as indices consist of multiple attributes so using
	  ntfs_attr_iget() to obtain an index inode would be confusing.
	- Ensure that there is no overflow when doing page->index <<
	  PAGE_CACHE_SHIFT by casting page->index to s64 in fs/ntfs/aops.c.
	- Use atomic kmap instead of kmap() in fs/ntfs/aops.c::ntfs_read_page()
	  and ntfs_read_block().
	- Use case sensitive attribute lookups instead of case insensitive ones.
	- Lock all page cache pages belonging to mst protected attributes while
	  accessing them to ensure we never see corrupt data while the page is
	  under writeout.
	- Add framework for generic ntfs collation (fs/ntfs/collation.[hc]).
	  We have ntfs_is_collation_rule_supported() to check if the collation
	  rule you want to use is supported and ntfs_collation() which actually
	  collates two data items.  We currently only support COLLATION_BINARY
	  and COLLATION_NTOFS_ULONG but support for other collation rules will
	  be added as the need arises.
	- Add a new type, ntfs_index_context, to allow retrieval of an index
	  entry using the corresponding index key.  To get an index context,
	  use ntfs_index_ctx_get() and to release it, use ntfs_index_ctx_put().
	  This also adds a new slab cache for the index contexts.  To lookup a
	  key in an index inode, use ntfs_index_lookup().  After modifying an
	  index entry, call ntfs_index_entry_flush_dcache_page() followed by
	  ntfs_index_entry_mark_dirty() to ensure the changes are written out
	  to disk.  For details see fs/ntfs/index.[hc].  Note, at present, if
	  an index entry is in the index allocation attribute rather than the
	  index root attribute it will not be written out (you will get a
	  warning message about discarded changes instead).
	- Load the quota file ($Quota) and check if quota tracking is enabled
	  and if so, mark the quotas out of date.  This causes windows to
	  rescan the volume on boot and update all quota entries.
	- Add a set_page_dirty address space operation for ntfs_m[fs]t_aops.
	  It is simply set to __set_page_dirty_nobuffers() to make sure that
	  running set_page_dirty() on a page containing mft/ntfs records will
	  not affect the dirty state of the page buffers.
	- Add fs/ntfs/index.c::__ntfs_index_entry_mark_dirty() which sets all
	  buffers that are inside the ntfs record in the page dirty after which
	  it sets the page dirty.  This allows ->writepage to only write the
	  dirty index records rather than having to write all the records in
	  the page.  Modify fs/ntfs/index.h::ntfs_index_entry_mark_dirty() to
	  use this rather than __set_page_dirty_nobuffers().
	- Implement fs/ntfs/aops.c::ntfs_write_mst_block() which enables the
	  writing of page cache pages belonging to mst protected attributes
	  like the index allocation attribute in directory indices and other
	  indices like $Quota/$Q, etc.  This means that the quota is now marked
	  out of date on all volumes rather than only on ones where the quota
	  defaults entry is in the index root attribute of the $Quota/$Q index.

2.1.14 - Fix an NFSd caused deadlock reported by several users.

	- Modify fs/ntfs/ntfs_readdir() to copy the index root attribute value
	  to a buffer so that we can put the search context and unmap the mft
	  record before calling the filldir() callback.  We need to do this
	  because of NFSd which calls ->lookup() from its filldir callback()
	  and this causes NTFS to deadlock as ntfs_lookup() maps the mft record
	  of the directory and since ntfs_readdir() has got it mapped already
	  ntfs_lookup() deadlocks.

2.1.13 - Enable overwriting of resident files and housekeeping of system files.

	- Implement writing of mft records (fs/ntfs/mft.[hc]), which includes
	  keeping the mft mirror in sync with the mft when mirrored mft records
	  are written.  The functions are write_mft_record{,_nolock}().  The
	  implementation is quite rudimentary for now with lots of things not
	  implemented yet but I am not sure any of them can actually occur so
	  I will wait for people to hit each one and only then implement it.
	- Commit open system inodes at umount time.  This should make it
	  virtually impossible for sync_mft_mirror_umount() to ever be needed.
	- Implement ->write_inode (fs/ntfs/inode.c::ntfs_write_inode()) for the
	  ntfs super operations.  This gives us inode writing via the VFS inode
	  dirty code paths.  Note:  Access time updates are not implemented yet.
	- Implement fs/ntfs/mft.[hc]::{,__}mark_mft_record_dirty() and make
	  fs/ntfs/aops.c::ntfs_writepage() and ntfs_commit_write() use it, thus
	  finally enabling resident file overwrite!  (-8  This also includes a
	  placeholder for ->writepage (ntfs_mft_writepage()), which for now
	  just redirties the page and returns.  Also, at umount time, we for
	  now throw away all mft data page cache pages after the last call to
	  ntfs_commit_inode() in the hope that all inodes will have been
	  written out by then and hence no dirty (meta)data will be lost.  We
	  also check for this case and emit an error message telling the user
	  to run chkdsk.
	- Use set_page_writeback() and end_page_writeback() in the resident
	  attribute code path of fs/ntfs/aops.c::ntfs_writepage() otherwise
	  the radix-tree tag PAGECACHE_TAG_DIRTY remains set even though the
	  page is clean.
	- Implement ntfs_mft_writepage() so it now checks if any of the mft
	  records in the page are dirty and if so redirties the page and
	  returns.  Otherwise it just returns (after doing set_page_writeback(),
	  unlock_page(), end_page_writeback() or the radix-tree tag
	  PAGECACHE_TAG_DIRTY remains set even though the page is clean), thus
	  alowing the VM to do with the page as it pleases.  Also, at umount
	  time, now only throw away dirty mft (meta)data pages if dirty inodes
	  are present and ask the user to email us if they see this happening.
	- Add functions ntfs_{clear,set}_volume_flags(), to modify the volume
	  information flags (fs/ntfs/super.c).
	- Mark the volume dirty when (re)mounting read-write and mark it clean
	  when unmounting or remounting read-only.  If any volume errors are
	  found, the volume is left marked dirty to force chkdsk to run.
	- Add code to set the NT4 compatibility flag when (re)mounting
	  read-write for newer NTFS versions but leave it commented out for now
	  since we do not make any modifications that are NTFS 1.2 specific yet
	  and since setting this flag breaks Captive-NTFS which is not nice.
	  This code must be enabled once we start writing NTFS 1.2 specific
	  changes otherwise Windows NTFS driver might crash / cause corruption.

2.1.12 - Fix the second fix to the decompression engine and some cleanups.

	- Add a new address space operations struct, ntfs_mst_aops, for mst
	  protected attributes.  This is because the default ntfs_aops do not
	  make sense with mst protected data and were they to write anything to
	  such an attribute they would cause data corruption so we provide
	  ntfs_mst_aops which does not have any write related operations set.
	- Cleanup dirty ntfs inode handling (fs/ntfs/inode.[hc]) which also
	  includes an adapted ntfs_commit_inode() and an implementation of
	  ntfs_write_inode() which for now just cleans dirty inodes without
	  writing them (it does emit a warning that this is happening).
	- Undo the second decompression engine fix (see 2.1.9 release ChangeLog
	  entry) as it was only fixing a theoretical bug but at the same time
	  it badly broke the handling of sparse and uncompressed compression
	  blocks.

2.1.11 - Driver internal cleanups.

	- Only build logfile.o if building the driver with read-write support.
	- Really final white space cleanups.
	- Use generic_ffs() instead of ffs() in logfile.c which allows the
	  log_page_size variable to be optimized by gcc into a constant.
	- Rename uchar_t to ntfschar everywhere as uchar_t is unsigned 1-byte
	  char as defined by POSIX and as found on some systems.

2.1.10 - Force read-only (re)mounting of volumes with unsupported volume flags.

	- Finish off the white space cleanups (remove trailing spaces, etc).
	- Clean up ntfs_fill_super() and ntfs_read_inode_mount() by removing
	  the kludges around the first iget().  Instead of (re)setting ->s_op
	  we have the $MFT inode set up by explicit new_inode() / set ->i_ino /
	  insert_inode_hash() / call ntfs_read_inode_mount() directly.  This
	  kills the need for second super_operations and allows to return error
	  from ntfs_read_inode_mount() without resorting to ugly "poisoning"
	  tricks.  (Al Viro)
	- Force read-only (re)mounting if any of the following bits are set in
	  the volume information flags:
	  	VOLUME_IS_DIRTY, VOLUME_RESIZE_LOG_FILE,
		VOLUME_UPGRADE_ON_MOUNT, VOLUME_DELETE_USN_UNDERWAY,
		VOLUME_REPAIR_OBJECT_ID, VOLUME_MODIFIED_BY_CHKDSK
	  To make this easier we define VOLUME_MUST_MOUNT_RO_MASK with all the
	  above bits set so the test is made easy.

2.1.9 - Fix two bugs in decompression engine.

	- Fix a bug where we would not always detect that we have reached the
	  end of a compression block because we were ending at minus one byte
	  which is effectively the same as being at the end.  The fix is to
	  check whether the uncompressed buffer has been fully filled and if so
	  we assume we have reached the end of the compression block.  A big
	  thank you to Marcin Gibuła for the bug report, the assistance in
	  tracking down the bug and testing the fix.
	- Fix a possible bug where when a compressed read is truncated to the
	  end of the file, the offset inside the last page was not truncated.

2.1.8 - Handle $MFT mirror and $LogFile, improve time handling, and cleanups.

	- Use get_bh() instead of manual atomic_inc() in fs/ntfs/compress.c.
	- Modify fs/ntfs/time.c::ntfs2utc(), get_current_ntfs_time(), and
	  utc2ntfs() to work with struct timespec instead of time_t on the
	  Linux UTC time side thus preserving the full precision of the NTFS
	  time and only loosing up to 99 nano-seconds in the Linux UTC time.
	- Move fs/ntfs/time.c to fs/ntfs/time.h and make the time functions
	  static inline.
	- Remove unused ntfs_dirty_inode().
	- Cleanup super operations declaration in fs/ntfs/super.c.
	- Wrap flush_dcache_mft_record_page() in #ifdef NTFS_RW.
	- Add NInoTestSetFoo() and NInoTestClearFoo() macro magic to
	  fs/ntfs/inode.h and use it to declare NInoTest{Set,Clear}Dirty.
	- Move typedefs for ntfs_attr and test_t from fs/ntfs/inode.c to
	  fs/ntfs/inode.h so they can be used elsewhere.
	- Determine the mft mirror size as the number of mirrored mft records
	  and store it in ntfs_volume->mftmirr_size (fs/ntfs/super.c).
	- Load the mft mirror at mount time and compare the mft records stored
	  in it to the ones in the mft.  Force a read-only mount if the two do
	  not match (fs/ntfs/super.c).
	- Fix type casting related warnings on 64-bit architectures.  Thanks
	  to Meelis Roos for reporting them.
	- Move %L to %ll as %L is floating point and %ll is integer which is
	  what we want.
	- Read the journal ($LogFile) and determine if the volume has been
	  shutdown cleanly and force a read-only mount if not (fs/ntfs/super.c
	  and fs/ntfs/logfile.c).  This is a little bit of a crude check in
	  that we only look at the restart areas and not at the actual log
	  records so that there will be a very small number of cases where we
	  think that a volume is dirty when in fact it is clean.  This should
	  only affect volumes that have not been shutdown cleanly and did not
	  have any pending, non-check-pointed i/o.
	- If the $LogFile indicates a clean shutdown and a read-write (re)mount
	  is requested, empty $LogFile by overwriting it with 0xff bytes to
	  ensure that Windows cannot cause data corruption by replaying a stale
	  journal after Linux has written to the volume.

2.1.7 - Enable NFS exporting of mounted NTFS volumes.

	- Set i_generation in the VFS inode from the seq_no of the NTFS inode.
	- Make ntfs_lookup() NFS export safe, i.e. use d_splice_alias(), etc.
	- Implement ->get_dentry() in fs/ntfs/namei.c::ntfs_get_dentry() as the
	  default doesn't allow inode number 0 which is a valid inode on NTFS
	  and even if it did allow that it uses iget() instead of ntfs_iget()
	  which makes it useless for us.
	- Implement ->get_parent() in fs/ntfs/namei.c::ntfs_get_parent() as the
	  default just returns -EACCES which is not very useful.
	- Define export operations (->s_export_op) for NTFS (ntfs_export_ops)
	  and set them up in the super block at mount time (super.c) this
	  allows mounted NTFS volumes to be exported via NFS.
	- Add missing return -EOPNOTSUPP; in
	  fs/ntfs/aops.c::ntfs_commit_nonresident_write().
	- Enforce no atime and no dir atime updates at mount/remount time as
	  they are not implemented yet anyway.
	- Move a few assignments in fs/ntfs/attrib.c::load_attribute_list() to
	  after a NULL check.  Thanks to Dave Jones for pointing this out.

2.1.6 - Fix minor bug in handling of compressed directories.

	- Fix bug in handling of compressed directories.  A compressed
	  directory is not really compressed so when we set the ->i_blocks
	  field of a compressed directory inode we were setting it from the
	  non-existing field ni->itype.compressed.size which gave random
	  results...  For directories we now always use ni->allocated_size.

2.1.5 - Fix minor bug in attribute list attribute handling.

	- Fix bug in attribute list handling.  Actually it is not as much a bug
	  as too much protection in that we were not allowing attribute lists
	  which waste space on disk while Windows XP clearly allows it and in
	  fact creates such attribute lists so our driver was failing.
	- Update NTFS documentation ready for 2.6 kernel release.

2.1.4 - Reduce compiler requirements.

	- Remove all uses of unnamed structs and unions in the driver to make
	  old and newer gcc versions happy. Makes it a bit uglier IMO but at
	  least people will stop hassling me about it.

2.1.3 - Important bug fixes in corner cases.

	- super.c::parse_ntfs_boot_sector(): Correct the check for 64-bit
	  clusters. (Philipp Thomas)
	- attrib.c::load_attribute_list(): Fix bug when initialized_size is a
	  multiple of the block_size but not the cluster size. (Szabolcs
	  Szakacsits)

2.1.2 - Important bug fixes aleviating the hangs in statfs.

	- Fix buggy free cluster and free inode determination logic.

2.1.1 - Minor updates.

	- Add handling for initialized_size != data_size in compressed files.
	- Reduce function local stack usage from 0x3d4 bytes to just noise in
	  fs/ntfs/upcase.c. (Randy Dunlap)
	- Remove compiler warnings for newer gcc.
	- Pages are no longer kmapped by mm/filemap.c::generic_file_write()
	  around calls to ->{prepare,commit}_write.  Adapt NTFS appropriately
	  in fs/ntfs/aops.c::ntfs_prepare_nonresident_write() by using
	  kmap_atomic(KM_USER0).

2.1.0 - First steps towards write support: implement file overwrite.

	- Add configuration option for developmental write support with an
	  appropriately scary configuration help text.
	- Initial implementation of fs/ntfs/aops.c::ntfs_writepage() and its
	  helper fs/ntfs/aops.c::ntfs_write_block(). This enables mmap(2) based
	  overwriting of existing files on ntfs. Note: Resident files are
	  only written into memory, and not written out to disk at present, so
	  avoid writing to files smaller than about 1kiB.
	- Initial implementation of fs/ntfs/aops.c::ntfs_prepare_write(), its
	  helper fs/ntfs/aops.c::ntfs_prepare_nonresident_write() and their
	  counterparts, fs/ntfs/aops.c::ntfs_commit_write(), and
	  fs/ntfs/aops.c::ntfs_commit_nonresident_write(), respectively. Also,
	  add generic_file_write() to the ntfs file operations (fs/ntfs/file.c).
	  This enables write(2) based overwriting of existing files on ntfs.
	  Note: As with mmap(2) based overwriting, resident files are only
	  written into memory, and not written out to disk at present, so avoid
	  writing to files smaller than about 1kiB.
	- Implement ->truncate (fs/ntfs/inode.c::ntfs_truncate()) and
	  ->setattr() (fs/ntfs/inode.c::ntfs_setattr()) inode operations for
	  files with the purpose of intercepting and aborting all i_size
	  changes which we do not support yet. ntfs_truncate() actually only
	  emits a warning message but AFAICS our interception of i_size changes
	  elsewhere means ntfs_truncate() never gets called for i_size changes.
	  It is only called from generic_file_write() when we fail in
	  ntfs_prepare_{,nonresident_}write() in order to discard any
	  instantiated buffers beyond i_size. Thus i_size is not actually
	  changed so our warning message is enough. Unfortunately it is not
	  possible to easily determine if i_size is being changed or not hence
	  we just emit an appropriately worded error message.

2.0.25 - Small bug fixes and cleanups.

	- Unlock the page in an out of memory error code path in
	  fs/ntfs/aops.c::ntfs_read_block().
	- If fs/ntfs/aops.c::ntfs_read_page() is called on an uptodate page,
	  just unlock the page and return. (This can happen due to ->writepage
	  clearing PageUptodate() during write out of MstProtected()
	  attributes.
	- Remove leaked write code again.

2.0.24 - Cleanups.

	- Treat BUG_ON() as ASSERT() not VERIFY(), i.e. do not use side effects
	  inside BUG_ON(). (Adam J. Richter)
	- Split logical OR expressions inside BUG_ON() into individual BUG_ON()
	  calls for improved debugging. (Adam J. Richter)
	- Add errors flag to the ntfs volume state, accessed via
	  NVol{,Set,Clear}Errors(vol).
	- Do not allow read-write remounts of read-only volumes with errors.
	- Clarify comment for ntfs file operation sendfile which was added by
	  Christoph Hellwig a while ago (just using generic_file_sendfile())
	  to say that ntfs ->sendfile is only used for the case where the
	  source data is on the ntfs partition and the destination is
	  somewhere else, i.e. nothing we need to concern ourselves with.
	- Add generic_file_write() as our ntfs file write operation.

2.0.23 - Major bug fixes (races, deadlocks, non-i386 architectures).

	- Massive internal locking changes to mft record locking. Fixes lock
	  recursion and replaces the mrec_lock read/write semaphore with a
	  mutex. Also removes the now superfluous mft_count. This fixes several
	  race conditions and deadlocks, especially in the future write code.
	- Fix ntfs over loopback for compressed files by adding an
	  optimization barrier. (gcc was screwing up otherwise ?)
	- Miscellaneous cleanups all over the code and a fix or two in error
	  handling code paths.
	Thanks go to Christoph Hellwig for pointing out the following two:
	- Remove now unused function fs/ntfs/malloc.h::vmalloc_nofs().
	- Fix ntfs_free() for ia64 and parisc by checking for VMALLOC_END, too.

2.0.22 - Cleanups, mainly to ntfs_readdir(), and use C99 initializers.

	- Change fs/ntfs/dir.c::ntfs_reddir() to only read/write ->f_pos once
	  at entry/exit respectively.
	- Use C99 initializers for structures.
	- Remove unused variable blocks from fs/ntfs/aops.c::ntfs_read_block().

2.0.21 - Check for, and refuse to work with too large files/directories/volumes.

	- Limit volume size at mount time to 2TiB on architectures where
	  unsigned long is 32-bits (fs/ntfs/super.c::parse_ntfs_boot_sector()).
	  This is the most we can do without overflowing the 32-bit limit of
	  the block device size imposed on us by sb_bread() and sb_getblk()
	  for the time being.
	- Limit file/directory size at open() time to 16TiB on architectures
	  where unsigned long is 32-bits (fs/ntfs/file.c::ntfs_file_open() and
	  fs/ntfs/dir.c::ntfs_dir_open()). This is the most we can do without
	  overflowing the page cache page index.

2.0.20 - Support non-resident directory index bitmaps, fix page leak in readdir.

	- Move the directory index bitmap to use an attribute inode instead of
	  having special fields for it inside the ntfs inode structure. This
	  means that the index bitmaps now use the page cache for i/o, too,
	  and also as a side effect we get support for non-resident index
	  bitmaps for free.
	- Simplify/cleanup error handling in fs/ntfs/dir.c::ntfs_readdir() and
	  fix a page leak that manifested itself in some cases.
	- Add fs/ntfs/inode.c::ntfs_put_inode(), which we need to release the
	  index bitmap inode on the final iput().

2.0.19 - Fix race condition, improvements, and optimizations in i/o interface.

	- Apply block optimization added to fs/ntfs/aops.c::ntfs_read_block()
	  to fs/ntfs/compress.c::ntfs_file_read_compressed_block() as well.
	- Drop the "file" from ntfs_file_read_compressed_block().
	- Rename fs/ntfs/aops.c::ntfs_enb_buffer_read_async() to
	  ntfs_end_buffer_async_read() (more like the fs/buffer.c counterpart).
	- Update ntfs_end_buffer_async_read() with the improved logic from
	  its updated counterpart fs/buffer.c::end_buffer_async_read(). Apply
	  further logic improvements to better determine when we set PageError.
	- Update submission of buffers in fs/ntfs/aops.c::ntfs_read_block() to
	  check for the buffers being uptodate first in line with the updated
	  fs/buffer.c::block_read_full_page(). This plugs a small race
	  condition.

2.0.18 - Fix race condition in reading of compressed files.

	- There was a narrow window between checking a buffer head for being
	  uptodate and locking it in ntfs_file_read_compressed_block(). We now
	  lock the buffer and then check whether it is uptodate or not.

2.0.17 - Cleanups and optimizations - shrinking the ToDo list.

	- Modify fs/ntfs/inode.c::ntfs_read_locked_inode() to return an error
	  code and update callers, i.e. ntfs_iget(), to pass that error code
	  up instead of just using -EIO.
	- Modifications to super.c to ensure that both mount and remount
	  cannot set any write related options when the driver is compiled
	  read-only.
	- Optimize block resolution in fs/ntfs/aops.c::ntfs_read_block() to
	  cache the current runlist element. This should improve performance
	  when reading very large and/or very fragmented data.

2.0.16 - Convert access to $MFT/$BITMAP to attribute inode API.

	- Fix a stupid bug introduced in 2.0.15 where we were unmapping the
	  wrong inode in fs/ntfs/inode.c::ntfs_attr_iget().
	- Fix debugging check in fs/ntfs/aops.c::ntfs_read_block().
	- Convert $MFT/$BITMAP access to attribute inode API and remove all
	  remnants of the ugly mftbmp address space and operations hack. This
	  means we finally have only one readpage function as well as only one
	  async io completion handler. Yey! The mft bitmap is now just an
	  attribute inode and is accessed from vol->mftbmp_ino just as if it
	  were a normal file. Fake inodes rule. (-:

2.0.15 - Fake inodes based attribute i/o via the pagecache, fixes and cleanups.

	- Fix silly bug in fs/ntfs/super.c::parse_options() which was causing
	  remounts to fail when the partition had an entry in /etc/fstab and
	  the entry specified the nls= option.
	- Apply same macro magic used in fs/ntfs/inode.h to fs/ntfs/volume.h to
	  expand all the helper functions NVolFoo(), NVolSetFoo(), and
	  NVolClearFoo().
	- Move copyright statement from driver initialisation message to
	  module description (fs/super.c). This makes the initialisation
	  message fit on one line and fits in better with rest of kernel.
	- Update fs/ntfs/attrib.c::map_run_list() to work on both real and
	  attribute inodes, and both for files and directories.
	- Implement fake attribute inodes allowing all attribute i/o to go via
	  the page cache and to use all the normal vfs/mm functionality:
	  - Add ntfs_attr_iget() and its helper ntfs_read_locked_attr_inode()
	    to fs/ntfs/inode.c.
	  - Add needed cleanup code to ntfs_clear_big_inode().
	- Merge address space operations for files and directories (aops.c),
	  now just have ntfs_aops:
	  - Rename:
		end_buffer_read_attr_async() ->	ntfs_end_buffer_read_async(),
		ntfs_attr_read_block()	     ->	ntfs_read_block(),
		ntfs_file_read_page()	     ->	ntfs_readpage().
	  - Rewrite fs/ntfs/aops.c::ntfs_readpage() to work on both real and
	    attribute inodes, and both for files and directories.
	  - Remove obsolete fs/ntfs/aops.c::ntfs_mst_readpage().

2.0.14 - Run list merging code cleanup, minor locking changes, typo fixes.

	- Change fs/ntfs/super.c::ntfs_statfs() to not rely on BKL by moving
	  the locking out of super.c::get_nr_free_mft_records() and taking and
	  dropping the mftbmp_lock rw_semaphore in ntfs_statfs() itself.
	- Bring attribute runlist merging code (fs/ntfs/attrib.c) in sync with
	  current userspace ntfs library code. This means that if a merge
	  fails the original runlists are always left unmodified instead of
	  being silently corrupted.
	- Misc typo fixes.

2.0.13 - Use iget5_locked() in preparation for fake inodes and small cleanups.

	- Remove nr_mft_bits and the now superfluous union with nr_mft_records
	  from ntfs_volume structure.
	- Remove nr_lcn_bits and the now superfluous union with nr_clusters
	  from ntfs_volume structure.
	- Use iget5_locked() and friends instead of conventional iget(). Wrap
	  the call in fs/ntfs/inode.c::ntfs_iget() and update callers of iget()
	  to use ntfs_iget(). Leave only one iget() call at mount time so we
	  don't need an ntfs_iget_mount().
	- Change fs/ntfs/inode.c::ntfs_new_extent_inode() to take mft_no as an
	  additional argument.

2.0.12 - Initial cleanup of address space operations following 2.0.11 changes.

	- Merge fs/ntfs/aops.c::end_buffer_read_mst_async() and
	  fs/ntfs/aops.c::end_buffer_read_file_async() into one function
	  fs/ntfs/aops.c::end_buffer_read_attr_async() using NInoMstProtected()
	  to determine whether to apply mst fixups or not.
	- Above change allows merging fs/ntfs/aops.c::ntfs_file_read_block()
	  and fs/ntfs/aops.c::ntfs_mst_readpage() into one function
	  fs/ntfs/aops.c::ntfs_attr_read_block(). Also, create a tiny wrapper
	  fs/ntfs/aops.c::ntfs_mst_readpage() to transform the parameters from
	  the VFS readpage function prototype to the ntfs_attr_read_block()
	  function prototype.

2.0.11 - Initial preparations for fake inode based attribute i/o.

	- Move definition of ntfs_inode_state_bits to fs/ntfs/inode.h and
	  do some macro magic (adapted from include/linux/buffer_head.h) to
	  expand all the helper functions NInoFoo(), NInoSetFoo(), and
	  NInoClearFoo().
	- Add new flag to ntfs_inode_state_bits: NI_Sparse.
	- Add new fields to ntfs_inode structure to allow use of fake inodes
	  for attribute i/o: type, name, name_len. Also add new state bits:
	  NI_Attr, which, if set, indicates the inode is a fake inode, and
	  NI_MstProtected, which, if set, indicates the attribute uses multi
	  sector transfer protection, i.e. fixups need to be applied after
	  reads and before/after writes.
	- Rename fs/ntfs/inode.c::ntfs_{new,clear,destroy}_inode() to
	  ntfs_{new,clear,destroy}_extent_inode() and update callers.
	- Use ntfs_clear_extent_inode() in fs/ntfs/inode.c::__ntfs_clear_inode()
	  instead of ntfs_destroy_extent_inode().
	- Cleanup memory deallocations in {__,}ntfs_clear_{,big_}inode().
	- Make all operations on ntfs inode state bits use the NIno* functions.
	- Set up the new ntfs inode fields and state bits in
	  fs/ntfs/inode.c::ntfs_read_inode() and add appropriate cleanup of
	  allocated memory to __ntfs_clear_inode().
	- Cleanup ntfs_inode structure a bit for better ordering of elements
	  w.r.t. their size to allow better packing of the structure in memory.

2.0.10 - There can only be 2^32 - 1 inodes on an NTFS volume.

	- Add check at mount time to verify that the number of inodes on the
	  volume does not exceed 2^32 - 1, which is the maximum allowed for
	  NTFS according to Microsoft.
	- Change mft_no member of ntfs_inode structure to be unsigned long.
	  Update all users. This makes ntfs_inode->mft_no just a copy of struct
	  inode->i_ino. But we can't just always use struct inode->i_ino and
	  remove mft_no because extent inodes do not have an attached struct
	  inode.

2.0.9 - Decompression engine now uses a single buffer and other cleanups.

	- Change decompression engine to use a single buffer protected by a
	  spin lock instead of per-CPU buffers. (Rusty Russell)
	- Do not update cb_pos when handling a partial final page during
	  decompression of a sparse compression block, as the value is later
	  reset without being read/used. (Rusty Russell)
	- Switch to using the new KM_BIO_SRC_IRQ for atomic kmap()s. (Andrew
	  Morton)
	- Change buffer size in ntfs_readdir()/ntfs_filldir() to use
	  NLS_MAX_CHARSET_SIZE which makes the buffers almost 1kiB each but
	  it also makes everything safer so it is a good thing.
	- Miscellaneous minor cleanups to comments.

2.0.8 - Major updates for handling of case sensitivity and dcache aliasing.

	Big thanks go to Al Viro and other inhabitants of #kernel for investing
	their time to discuss the case sensitivity and dcache aliasing issues.

	- Remove unused source file fs/ntfs/attraops.c.
	- Remove show_inodes mount option(s), thus dropping support for
	  displaying of short file names.
	- Remove deprecated mount option posix.
	- Restore show_sys_files mount option.
	- Add new mount option case_sensitive, to determine if the driver
	  treats file names as case sensitive or not. If case sensitive, create
	  file names in the POSIX namespace. Otherwise create file names in the
	  LONG/WIN32 namespace. Note, files remain accessible via their short
	  file name, if it exists.
	- Remove really dumb logic bug in boot sector recovery code.
	- Fix dcache aliasing issues wrt short/long file names via changes
	  to fs/ntfs/dir.c::ntfs_lookup_inode_by_name() and
	  fs/ntfs/namei.c::ntfs_lookup():
	  - Add additional argument to ntfs_lookup_inode_by_name() in which we
	    return information about the matching file name if the case is not
	    matching or the match is a short file name. See comments above the
	    function definition for details.
	  - Change ntfs_lookup() to only create dcache entries for the correctly
	    cased file name and only for the WIN32 namespace counterpart of DOS
	    namespace file names. This ensures we have only one dentry per
	    directory and also removes all dcache aliasing issues between short
	    and long file names once we add write support. See comments above
	    function for details.
	- Fix potential 1 byte overflow in fs/ntfs/unistr.c::ntfs_ucstonls().

2.0.7 - Minor cleanups and updates for changes in core kernel code.

	- Remove much of the NULL struct element initializers.
	- Various updates to make compatible with recent kernels.
	- Remove defines of MAX_BUF_PER_PAGE and include linux/buffer_head.h
	  in fs/ntfs/ntfs.h instead.
	- Remove no longer needed KERNEL_VERSION checks. We are now in the
	  kernel proper so they are no longer needed.

2.0.6 - Major bugfix to make compatible with other kernel changes.

	- Initialize the mftbmp address space properly now that there are more
	  fields in the struct address_space. This was leading to hangs and
	  oopses on umount since 2.5.12 because of changes to other parts of
	  the kernel. We probably want a kernel generic init_address_space()
	  function...
	- Drop BKL from ntfs_readdir() after consultation with Al Viro. The
	  only caller of ->readdir() is vfs_readdir() which holds i_mutex
	  during the call, and i_mutex is sufficient protection against changes
	  in the directory inode (including ->i_size).
	- Use generic_file_llseek() for directories (as opposed to
	  default_llseek()) as this downs i_mutex instead of the BKL which is
	  what we now need for exclusion against ->f_pos changes considering we
	  no longer take the BKL in ntfs_readdir().

2.0.5 - Major bugfix. Buffer overflow in extent inode handling.

	- No need to set old blocksize in super.c::ntfs_fill_super() as the
	  VFS does so via invocation of deactivate_super() calling
	  fs->fill_super() calling block_kill_super() which does it.
	- BKL moved from VFS into dir.c::ntfs_readdir(). (Linus Torvalds)
	  -> Do we really need it? I don't think so as we have exclusion on
	  the directory ntfs_inode rw_semaphore mrec_lock. We mmight have to
	  move the ->f_pos accesses under the mrec_lock though. Check this...
	- Fix really, really, really stupid buffer overflow in extent inode
	  handling in mft.c::map_extent_mft_record().

2.0.4 - Cleanups and updates for kernel 2.5.11.

	- Add documentation on how to use the MD driver to be able to use NTFS
	  stripe and volume sets in Linux and generally cleanup documentation
	  a bit.
	Remove all uses of kdev_t in favour of struct block_device *:
	- Change compress.c::ntfs_file_read_compressed_block() to use
	  sb_getblk() instead of getblk().
	- Change super.c::ntfs_fill_super() to use bdev_hardsect_size() instead
	  of get_hardsect_size().
	- No need to get old blocksize in super.c::ntfs_fill_super() as
	  fs/super.c::get_sb_bdev() already does this.
	- Set bh->b_bdev instead of bh->b_dev throughout aops.c.

2.0.3 - Small bug fixes, cleanups, and performance improvements.

	- Remove some dead code from mft.c.
	- Optimize readpage and read_block functions throughout aops.c so that
	  only initialized blocks are read. Non-initialized ones have their
	  buffer head mapped, zeroed, and set up to date, without scheduling
	  any i/o. Thanks to Al Viro for advice on how to avoid the device i/o.
	Thanks go to Andrew Morton for spotting the below:
	- Fix buglet in allocate_compression_buffers() error code path.
	- Call flush_dcache_page() after modifying page cache page contents in
	  ntfs_file_readpage().
	- Check for existence of page buffers throughout aops.c before calling
	  create_empty_buffers(). This happens when an I/O error occurs and the
	  read is retried. (It also happens once writing is implemented so that
	  needed doing anyway but I had left it for later...)
	- Don't BUG_ON() uptodate and/or mapped buffers throughout aops.c in
	  readpage and read_block functions. Reasoning same as above (i.e. I/O
	  error retries and future write code paths.)

2.0.2 - Minor updates and cleanups.

	- Cleanup: rename mst.c::__post_read_mst_fixup to post_write_mst_fixup
	  and cleanup the code a bit, removing the unused size parameter.
	- Change default fmask to 0177 and update documentation.
	- Change attrib.c::get_attr_search_ctx() to return the search context
	  directly instead of taking the address of a pointer. A return value
	  of NULL means the allocation failed. Updated all callers
	  appropriately.
	- Update to 2.5.9 kernel (preserving backwards compatibility) by
	  replacing all occurences of page->buffers with page_buffers(page).
	- Fix minor bugs in runlist merging, also minor cleanup.
	- Updates to bootsector layout and mft mirror contents descriptions.
	- Small bug fix in error detection in unistr.c and some cleanups.
	- Grow name buffer allocations in unistr.c in aligned mutlipled of 64
	  bytes.

2.0.1 - Minor updates.

	- Make default umask correspond to documentation.
	- Improve documentation.
	- Set default mode to include execute bit. The {u,f,d}mask can be used
	  to take it away if desired. This allows binaries to be executed from
	  a mounted ntfs partition.

2.0.0 - New version number. Remove TNG from the name. Now in the kernel.

	- Add kill_super, just keeping up with the vfs changes in the kernel.
	- Repeat some changes from tng-0.0.8 that somehow got lost on the way
	  from the CVS import into BitKeeper.
	- Begin to implement proper handling of allocated_size vs
	  initialized_size vs data_size (i.e. i_size). Done are
	  mft.c::ntfs_mft_readpage(), aops.c::end_buffer_read_index_async(),
	  and attrib.c::load_attribute_list().
	- Lock the runlist in attrib.c::load_attribute_list() while using it.
	- Fix memory leak in ntfs_file_read_compressed_block() and generally
	  clean up compress.c a little, removing some uncommented/unused debug
	  code.
	- Tidy up dir.c a little bit.
	- Don't bother getting the runlist in inode.c::ntfs_read_inode().
	- Merge mft.c::ntfs_mft_readpage() and aops.c::ntfs_index_readpage()
	  creating aops.c::ntfs_mst_readpage(), improving the handling of
	  holes and overflow in the process and implementing the correct
	  equivalent of ntfs_file_get_block() in ntfs_mst_readpage() itself.
	  I am aiming for correctness at the moment. Modularisation can come
	  later.
	- Rename aops.c::end_buffer_read_index_async() to
	  end_buffer_read_mst_async() and optimize the overflow checking and
	  handling.
	- Use the host of the mftbmp address space mapping to hold the ntfs
	  volume. This is needed so the async i/o completion handler can
	  retrieve a pointer to the volume. Hopefully this will not cause
	  problems elsewhere in the kernel... Otherwise will need to use a
	  fake inode.
	- Complete implementation of proper handling of allocated_size vs
	  initialized_size vs data_size (i.e. i_size) in whole driver.
	  Basically aops.c is now completely rewritten.
	- Change NTFS driver name to just NTFS and set version number to 2.0.0
	  to make a clear distinction from the old driver which is still on
	  version 1.1.22.

tng-0.0.8 - 08/03/2002 - Now using BitKeeper, http://linux-ntfs.bkbits.net/

	- Replace bdevname(sb->s_dev) with sb->s_id.
	- Remove now superfluous new-line characters in all callers of
	  ntfs_debug().
	- Apply kludge in ntfs_read_inode(), setting i_nlink to 1 for
	  directories. Without this the "find" utility gets very upset which is
	  fair enough as Linux/Unix do not support directory hard links.
	- Further runlist merging work. (Richard Russon)
	- Backwards compatibility for gcc-2.95. (Richard Russon)
	- Update to kernel 2.5.5-pre1 and rediff the now tiny patch.
	- Convert to new filesystem declaration using ->ntfs_get_sb() and
	  replacing ntfs_read_super() with ntfs_fill_super().
	- Set s_maxbytes to MAX_LFS_FILESIZE to avoid page cache page index
	  overflow on 32-bit architectures.
	- Cleanup upcase loading code to use ntfs_(un)map_page().
	- Disable/reenable preemtion in critical sections of compession engine.
	- Replace device size determination in ntfs_fill_super() with
	  sb->s_bdev->bd_inode->i_size (in bytes) and remove now superfluous
	  function super.c::get_nr_blocks().
	- Implement a mount time option (show_inodes) allowing choice of which
	  types of inode names readdir() returns and modify ntfs_filldir()
	  accordingly. There are several parameters to show_inodes:
		system:	system files
		win32:	long file names (including POSIX file names) [DEFAULT]
		long:	same as win32
		dos:	short file names only (excluding POSIX file names)
		short:	same as dos
		posix:	same as both win32 and dos
		all:	all file names
	  Note that the options are additive, i.e. specifying:
		-o show_inodes=system,show_inodes=win32,show_inodes=dos
	  is the same as specifying:
		-o show_inodes=all
	  Note that the "posix" and "all" options will show all directory
	  names, BUT the link count on each directory inode entry is set to 1,
	  due to Linux not supporting directory hard links. This may well
	  confuse some userspace applications, since the directory names will
	  have the same inode numbers. Thus it is NOT advisable to use the
	  "posix" or "all" options. We provide them only for completeness sake.
	- Add copies of allocated_size, initialized_size, and compressed_size to
	  the ntfs inode structure and set them up in
	  inode.c::ntfs_read_inode(). These reflect the unnamed data attribute
	  for files and the index allocation attribute for directories.
	- Add copies of allocated_size and initialized_size to ntfs inode for
	  $BITMAP attribute of large directories and set them up in
	  inode.c::ntfs_read_inode().
	- Add copies of allocated_size and initialized_size to ntfs volume for
	  $BITMAP attribute of $MFT and set them up in
	  super.c::load_system_files().
	- Parse deprecated ntfs driver options (iocharset, show_sys_files,
	  posix, and utf8) and tell user what the new options to use are. Note
	  we still do support them but they will be removed with kernel 2.7.x.
	- Change all occurences of integer long long printf formatting to hex
	  as printk() will not support long long integer format if/when the
	  div64 patch goes into the kernel.
	- Make slab caches have stable names and change the names to what they
	  were intended to be. These changes are required/made possible by the
	  new slab cache name handling which removes the length limitation by
	  requiring the caller of kmem_cache_create() to supply a stable name
	  which is then referenced but not copied.
	- Rename run_list structure to run_list_element and create a new
	  run_list structure containing a pointer to a run_list_element
	  structure and a read/write semaphore. Adapt all users of runlists
	  to new scheme and take and release the lock as needed. This fixes a
	  nasty race as the run_list changes even when inodes are locked for
	  reading and even when the inode isn't locked at all, so we really
	  needed the serialization. We use a semaphore rather than a spinlock
	  as memory allocations can sleep and doing everything GFP_ATOMIC
	  would be silly.
	- Cleanup read_inode() removing all code checking for lowest_vcn != 0.
	  This can never happen due to the nature of lookup_attr() and how we
	  support attribute lists. If it did happen it would imply the inode
	  being corrupt.
	- Check for lowest_vcn != 0 in ntfs_read_inode() and mark the inode as
	  bad if found.
	- Update to 2.5.6-pre2 changes in struct address_space.
	- Use parent_ino() when accessing d_parent inode number in dir.c.
	- Import Sourceforge CVS repository into BitKeeper repository:
		http://linux-ntfs.bkbits.net/ntfs-tng-2.5
	- Update fs/Makefile, fs/Config.help, fs/Config.in, and
	  Documentation/filesystems/ntfs.txt for NTFS TNG.
	- Create kernel configuration option controlling whether debugging
	  is enabled or not.
	- Add the required export of end_buffer_io_sync() from the patches
	  directory to the kernel code.
	- Update inode.c::ntfs_show_options() with show_inodes mount option.
	- Update errors mount option.

tng-0.0.7 - 13/02/2002 - The driver is now feature complete for read-only!

	- Cleanup mft.c and it's debug/error output in particular. Fix a minor
	  bug in mapping of extent inodes. Update all the comments to fit all
	  the recent code changes.
	- Modify vcn_to_lcn() to cope with entirely unmapped runlists.
	- Cleanups in compress.c, mostly comments and folding help.
	- Implement attrib.c::map_run_list() as a generic helper.
	- Make compress.c::ntfs_file_read_compressed_block() use map_run_list()
	  thus making code shorter and enabling attribute list support.
	- Cleanup incorrect use of [su]64 with %L printf format specifier in
	  all source files. Type casts to [unsigned] long long added to correct
	  the mismatches (important for architectures which have long long not
	  being 64 bits).
	- Merge async io completion handlers for directory indexes and $MFT
	  data into one by setting the index_block_size{_bits} of the ntfs
	  inode for $MFT to the mft_record_size{_bits} of the ntfs_volume.
	- Cleanup aops.c, update comments.
	- Make ntfs_file_get_block() use map_run_list() so all files now
	  support attribute lists.
	- Make ntfs_dir_readpage() almost verbatim copy of
	  block_read_full_page() by using ntfs_file_get_block() with only real
	  difference being the use of our own async io completion handler
	  rather than the default one, thus reducing the amount of code and
	  automatically enabling attribute list support for directory indices.
	- Fix bug in load_attribute_list() - forgot to call brelse in error
	  code path.
	- Change parameters to find_attr() and lookup_attr(). We no longer
	  pass in the upcase table and its length. These can be gotten from
	  ctx->ntfs_ino->vol->upcase{_len}. Update all callers.
	- Cleanups in attrib.c.
	- Implement merging of runlists, attrib.c::merge_run_lists() and its
	  helpers. (Richard Russon)
	- Attribute lists part 2, attribute extents and multi part runlists:
	  enable proper support for LCN_RL_NOT_MAPPED and automatic mapping of
	  further runlist parts via attrib.c::map_run_list().
	- Tiny endianness bug fix in decompress_mapping_pairs().

tng-0.0.6 - Encrypted directories, bug fixes, cleanups, debugging enhancements.

	- Enable encrypted directories. (Their index root is marked encrypted
	  to indicate that new files in that directory should be created
	  encrypted.)
	- Fix bug in NInoBmpNonResident() macro. (Cut and paste error.)
	- Enable $Extend system directory. Most (if not all) extended system
	  files do not have unnamed data attributes so ntfs_read_inode() had to
	  special case them but that is ok, as the special casing recovery
	  happens inside an error code path so there is zero slow down in the
	  normal fast path. The special casing is done by introducing a new
	  function inode.c::ntfs_is_extended_system_file() which checks if any
	  of the hard links in the inode point to $Extend as being their parent
	  directory and if they do we assume this is an extended system file.
	- Create a sysctl/proc interface to allow {dis,en}abling of debug output
	  when compiled with -DDEBUG. Default is debug messages to be disabled.
	  To enable them, one writes a non-zero value to /proc/sys/fs/ntfs-debug
	  (if /proc is enabled) or uses sysctl(2) to effect the same (if sysctl
	  interface is enabled). Inspired by old ntfs driver.
	- Add debug_msgs insmod/kernel boot parameter to set whether debug
	  messages are {dis,en}abled. This is useful to enable debug messages
	  during ntfs initialization and is the only way to activate debugging
	  when the sysctl interface is not enabled.
	- Cleanup debug output in various places.
	- Remove all dollar signs ($) from the source (except comments) to
	  enable compilation on architectures whose gcc compiler does not
	  support dollar signs in the names of variables/constants. Attribute
	  types now start with AT_ instead of $ and $I30 is now just I30.
	- Cleanup ntfs_lookup() and add consistency check of sequence numbers.
	- Load complete runlist for $MFT/$BITMAP during mount and cleanup
	  access functions. This means we now cope with $MFT/$BITMAP being
	  spread accross several mft records.
	- Disable modification of mft_zone_multiplier on remount. We can always
	  reenable this later on if we really want to, but we will need to make
	  sure we readjust the mft_zone size / layout accordingly.

tng-0.0.5 - Modernize for 2.5.x and further in line-ing with Al Viro's comments.

	- Use sb_set_blocksize() instead of set_blocksize() and verify the
	  return value.
	- Use sb_bread() instead of bread() throughout.
	- Add index_vcn_size{_bits} to ntfs_inode structure to store the size
	  of a directory index block vcn. Apply resulting simplifications in
	  dir.c everywhere.
	- Fix a small bug somewhere (but forgot what it was).
	- Change ntfs_{debug,error,warning} to enable gcc to do type checking
	  on the printf-format parameter list and fix bugs reported by gcc
	  as a result. (Richard Russon)
	- Move inode allocation strategy to Al's new stuff but maintain the
	  divorce of ntfs_inode from struct inode. To achieve this we have two
	  separate slab caches, one for big ntfs inodes containing a struct
	  inode and pure ntfs inodes and at the same time fix some faulty
	  error code paths in ntfs_read_inode().
	- Show mount options in proc (inode.c::ntfs_show_options()).

tng-0.0.4 - Big changes, getting in line with Al Viro's comments.

	- Modified (un)map_mft_record functions to be common for read and write
	  case. To specify which is which, added extra parameter at front of
	  parameter list. Pass either READ or WRITE to this, each has the
	  obvious meaning.
	- General cleanups to allow for easier folding in vi.
	- attrib.c::decompress_mapping_pairs() now accepts the old runlist
	  argument, and invokes attrib.c::merge_run_lists() to merge the old
	  and the new runlists.
	- Removed attrib.c::find_first_attr().
	- Implemented loading of attribute list and complete runlist for $MFT.
	  This means we now cope with $MFT being spread across several mft
	  records.
	- Adapt to 2.5.2-pre9 and the changed create_empty_buffers() syntax.
	- Adapt major/minor/kdev_t/[bk]devname stuff to new 2.5.x kernels.
	- Make ntfs_volume be allocated via kmalloc() instead of using a slab
	  cache. There are too little ntfs_volume structures at any one time
	  to justify a private slab cache.
	- Fix bogus kmap() use in async io completion. Now use kmap_atomic().
	  Use KM_BIO_IRQ on advice from IRC/kernel...
	- Use ntfs_map_page() in map_mft_record() and create ->readpage method
	  for reading $MFT (ntfs_mft_readpage). In the process create dedicated
	  address space operations (ntfs_mft_aops) for $MFT inode mapping. Also
	  removed the now superfluous exports from the kernel core patch.
	- Fix a bug where kfree() was used instead of ntfs_free().
	- Change map_mft_record() to take ntfs_inode as argument instead of
	  vfs inode. Dito for unmap_mft_record(). Adapt all callers.
	- Add pointer to ntfs_volume to ntfs_inode.
	- Add mft record number and sequence number to ntfs_inode. Stop using
	  i_ino and i_generation for in-driver purposes.
	- Implement attrib.c::merge_run_lists(). (Richard Russon)
	- Remove use of proper inodes by extent inodes. Move i_ino and
	  i_generation to ntfs_inode to do this. Apply simplifications that
	  result and remove iget_no_wait(), etc.
	- Pass ntfs_inode everywhere in the driver (used to be struct inode).
	- Add reference counting in ntfs_inode for the ntfs inode itself and
	  for the mapped mft record.
	- Extend mft record mapping so we can (un)map extent mft records (new
	  functions (un)map_extent_mft_record), and so mappings are reference
	  counted and don't have to happen twice if already mapped - just ref
	  count increases.
	- Add -o iocharset as alias to -o nls for backwards compatibility.
	- The latest core patch is now tiny. In fact just a single additional
	  export is necessary over the base kernel.

tng-0.0.3 - Cleanups, enhancements, bug fixes.

	- Work on attrib.c::decompress_mapping_pairs() to detect base extents
	  and setup the runlist appropriately using knowledge provided by the
	  sizes in the base attribute record.
	- Balance the get_/put_attr_search_ctx() calls so we don't leak memory
	  any more.
	- Introduce ntfs_malloc_nofs() and ntfs_free() to allocate/free a single
	  page or use vmalloc depending on the amount of memory requested.
	- Cleanup error output. The __FUNCTION__ "(): " is now added
	  automatically. Introduced a new header file debug.h to support this
	  and also moved ntfs_debug() function into it.
	- Make reading of compressed files more intelligent and especially get
	  rid of the vmalloc_nofs() from readpage(). This now uses per CPU
	  buffers (allocated at first mount with cluster size <= 4kiB and
	  deallocated on last umount with cluster size <= 4kiB), and
	  asynchronous io for the compressed data using a list of buffer heads.
	  Er, we use synchronous io as async io only works on whole pages
	  covered by buffers and not on individual buffer heads...
	- Bug fix for reading compressed files with sparse compression blocks.

tng-0.0.2 - Now handles larger/fragmented/compressed volumes/files/dirs.

	- Fixed handling of directories when cluster size exceeds index block
	  size.
	- Hide DOS only name space directory entries from readdir() but allow
	  them in lookup(). This should fix the problem that Linux doesn't
	  support directory hard links, while still allowing access to entries
	  via their short file name. This also has the benefit of mimicking
	  what Windows users are used to, so it is the ideal solution.
	- Implemented sync_page everywhere so no more hangs in D state when
	  waiting for a page.
	- Stop using bforget() in favour of brelse().
	- Stop locking buffers unnecessarily.
	- Implemented compressed files (inode->mapping contains uncompressed
	  data, raw compressed data is currently bread() into a vmalloc()ed
	  memory buffer).
	- Enable compressed directories. (Their index root is marked compressed
	  to indicate that new files in that directory should be created
	  compressed.)
	- Use vsnprintf rather than vsprintf in the ntfs_error and ntfs_warning
	  functions. (Thanks to Will Dyson for pointing this out.)
	- Moved the ntfs_inode and ntfs_volume (the former ntfs_inode_info and
	  ntfs_sb_info) out of the common inode and super_block structures and
	  started using the generic_ip and generic_sbp pointers instead. This
	  makes ntfs entirely private with respect to the kernel tree.
	- Detect compiler version and abort with error message if gcc less than
	  2.96 is used.
	- Fix bug in name comparison function in unistr.c.
	- Implement attribute lists part 1, the infrastructure: search contexts
	  and operations, find_external_attr(), lookup_attr()) and make the
	  code use the infrastructure.
	- Fix stupid buffer overflow bug that became apparent on larger run
	  list containing attributes.
	- Fix bugs in readdir() that became apparent on larger directories.

	The driver is now really useful and survives the test
		find . -type f -exec md5sum "{}" \;
	without any error messages on a over 1GiB sized partition with >16k
	files on it, including compressed files and directories and many files
	and directories with attribute lists.

tng-0.0.1 - The first useful version.

	- Added ntfs_lookup().
	- Added default upcase generation and handling.
	- Added compile options to be shown on module init.
	- Many bug fixes that were "hidden" before.
	- Update to latest kernel.
	- Added ntfs_readdir().
	- Added file operations for mmap(), read(), open() and llseek(). We just
	  use the generic ones. The whole point of going through implementing
	  readpage() methods and where possible get_block() call backs is that
	  this allows us to make use of the generic high level methods provided
	  by the kernel.

	The driver is now actually useful! Yey. (-: It undoubtedly has got bugs
	though and it doesn't implement accesssing compressed files yet. Also,
	accessing files with attribute list attributes is not implemented yet
	either. But for small or simple filesystems it should work and allow
	you to list directories, use stat on directory entries and the file
	system, open, read, mmap and llseek around in files. A big mile stone
	has been reached!

tng-0.0.0 - Initial version tag.

	Initial driver implementation. The driver can mount and umount simple
	NTFS filesystems (i.e. ones without attribute lists in the system
	files). If the mount fails there might be problems in the error handling
	code paths, so be warned. Otherwise it seems to be loading the system
	files nicely and the mft record read mapping/unmapping seems to be
	working nicely, too. Proof of inode metadata in the page cache and non-
	resident file unnamed stream data in the page cache concepts is thus
	complete.
