717 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			717 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
The Linux NTFS filesystem driver
 | 
						|
================================
 | 
						|
 | 
						|
 | 
						|
Table of contents
 | 
						|
=================
 | 
						|
 | 
						|
- Overview
 | 
						|
- Web site
 | 
						|
- Features
 | 
						|
- Supported mount options
 | 
						|
- Known bugs and (mis-)features
 | 
						|
- Using NTFS volume and stripe sets
 | 
						|
  - The Device-Mapper driver
 | 
						|
  - The Software RAID / MD driver
 | 
						|
  - Limitations when using the MD driver
 | 
						|
- ChangeLog
 | 
						|
 | 
						|
 | 
						|
Overview
 | 
						|
========
 | 
						|
 | 
						|
Linux-NTFS comes with a number of user-space programs known as ntfsprogs.
 | 
						|
These include mkntfs, a full-featured ntfs filesystem format utility,
 | 
						|
ntfsundelete used for recovering files that were unintentionally deleted
 | 
						|
from an NTFS volume and ntfsresize which is used to resize an NTFS partition.
 | 
						|
See the web site for more information.
 | 
						|
 | 
						|
To mount an NTFS 1.2/3.x (Windows NT4/2000/XP/2003) volume, use the file
 | 
						|
system type 'ntfs'.  The driver currently supports read-only mode (with no
 | 
						|
fault-tolerance, encryption or journalling) and very limited, but safe, write
 | 
						|
support.
 | 
						|
 | 
						|
For fault tolerance and raid support (i.e. volume and stripe sets), you can
 | 
						|
use the kernel's Software RAID / MD driver.  See section "Using Software RAID
 | 
						|
with NTFS" for details.
 | 
						|
 | 
						|
 | 
						|
Web site
 | 
						|
========
 | 
						|
 | 
						|
There is plenty of additional information on the linux-ntfs web site
 | 
						|
at http://www.linux-ntfs.org/
 | 
						|
 | 
						|
The web site has a lot of additional information, such as a comprehensive
 | 
						|
FAQ, documentation on the NTFS on-disk format, information on the Linux-NTFS
 | 
						|
userspace utilities, etc.
 | 
						|
 | 
						|
 | 
						|
Features
 | 
						|
========
 | 
						|
 | 
						|
- This is a complete rewrite of the NTFS driver that used to be in the 2.4 and
 | 
						|
  earlier kernels.  This new driver implements NTFS read support and is
 | 
						|
  functionally equivalent to the old ntfs driver and it also implements limited
 | 
						|
  write support.  The biggest limitation at present is that files/directories
 | 
						|
  cannot be created or deleted.  See below for the list of write features that
 | 
						|
  are so far supported.  Another limitation is that writing to compressed files
 | 
						|
  is not implemented at all.  Also, neither read nor write access to encrypted
 | 
						|
  files is so far implemented.
 | 
						|
- The new driver has full support for sparse files on NTFS 3.x volumes which
 | 
						|
  the old driver isn't happy with.
 | 
						|
- The new driver supports execution of binaries due to mmap() now being
 | 
						|
  supported.
 | 
						|
- The new driver supports loopback mounting of files on NTFS which is used by
 | 
						|
  some Linux distributions to enable the user to run Linux from an NTFS
 | 
						|
  partition by creating a large file while in Windows and then loopback
 | 
						|
  mounting the file while in Linux and creating a Linux filesystem on it that
 | 
						|
  is used to install Linux on it.
 | 
						|
- A comparison of the two drivers using:
 | 
						|
	time find . -type f -exec md5sum "{}" \;
 | 
						|
  run three times in sequence with each driver (after a reboot) on a 1.4GiB
 | 
						|
  NTFS partition, showed the new driver to be 20% faster in total time elapsed
 | 
						|
  (from 9:43 minutes on average down to 7:53).  The time spent in user space
 | 
						|
  was unchanged but the time spent in the kernel was decreased by a factor of
 | 
						|
  2.5 (from 85 CPU seconds down to 33).
 | 
						|
- The driver does not support short file names in general.  For backwards
 | 
						|
  compatibility, we implement access to files using their short file names if
 | 
						|
  they exist.  The driver will not create short file names however, and a
 | 
						|
  rename will discard any existing short file name.
 | 
						|
- The new driver supports exporting of mounted NTFS volumes via NFS.
 | 
						|
- The new driver supports async io (aio).
 | 
						|
- The new driver supports fsync(2), fdatasync(2), and msync(2).
 | 
						|
- The new driver supports readv(2) and writev(2).
 | 
						|
- The new driver supports access time updates (including mtime and ctime).
 | 
						|
- The new driver supports truncate(2) and open(2) with O_TRUNC.  But at present
 | 
						|
  only very limited support for highly fragmented files, i.e. ones which have
 | 
						|
  their data attribute split across multiple extents, is included.  Another
 | 
						|
  limitation is that at present truncate(2) will never create sparse files,
 | 
						|
  since to mark a file sparse we need to modify the directory entry for the
 | 
						|
  file and we do not implement directory modifications yet.
 | 
						|
- The new driver supports write(2) which can both overwrite existing data and
 | 
						|
  extend the file size so that you can write beyond the existing data.  Also,
 | 
						|
  writing into sparse regions is supported and the holes are filled in with
 | 
						|
  clusters.  But at present only limited support for highly fragmented files,
 | 
						|
  i.e. ones which have their data attribute split across multiple extents, is
 | 
						|
  included.  Another limitation is that write(2) will never create sparse
 | 
						|
  files, since to mark a file sparse we need to modify the directory entry for
 | 
						|
  the file and we do not implement directory modifications yet.
 | 
						|
 | 
						|
Supported mount options
 | 
						|
=======================
 | 
						|
 | 
						|
In addition to the generic mount options described by the manual page for the
 | 
						|
mount command (man 8 mount, also see man 5 fstab), the NTFS driver supports the
 | 
						|
following mount options:
 | 
						|
 | 
						|
iocharset=name		Deprecated option.  Still supported but please use
 | 
						|
			nls=name in the future.  See description for nls=name.
 | 
						|
 | 
						|
nls=name		Character set to use when returning file names.
 | 
						|
			Unlike VFAT, NTFS suppresses names that contain
 | 
						|
			unconvertible characters.  Note that most character
 | 
						|
			sets contain insufficient characters to represent all
 | 
						|
			possible Unicode characters that can exist on NTFS.
 | 
						|
			To be sure you are not missing any files, you are
 | 
						|
			advised to use nls=utf8 which is capable of
 | 
						|
			representing all Unicode characters.
 | 
						|
 | 
						|
utf8=<bool>		Option no longer supported.  Currently mapped to
 | 
						|
			nls=utf8 but please use nls=utf8 in the future and
 | 
						|
			make sure utf8 is compiled either as module or into
 | 
						|
			the kernel.  See description for nls=name.
 | 
						|
 | 
						|
uid=
 | 
						|
gid=
 | 
						|
umask=			Provide default owner, group, and access mode mask.
 | 
						|
			These options work as documented in mount(8).  By
 | 
						|
			default, the files/directories are owned by root and
 | 
						|
			he/she has read and write permissions, as well as
 | 
						|
			browse permission for directories.  No one else has any
 | 
						|
			access permissions.  I.e. the mode on all files is by
 | 
						|
			default rw------- and for directories rwx------, a
 | 
						|
			consequence of the default fmask=0177 and dmask=0077.
 | 
						|
			Using a umask of zero will grant all permissions to
 | 
						|
			everyone, i.e. all files and directories will have mode
 | 
						|
			rwxrwxrwx.
 | 
						|
 | 
						|
fmask=
 | 
						|
dmask=			Instead of specifying umask which applies both to
 | 
						|
			files and directories, fmask applies only to files and
 | 
						|
			dmask only to directories.
 | 
						|
 | 
						|
sloppy=<BOOL>		If sloppy is specified, ignore unknown mount options.
 | 
						|
			Otherwise the default behaviour is to abort mount if
 | 
						|
			any unknown options are found.
 | 
						|
 | 
						|
show_sys_files=<BOOL>	If show_sys_files is specified, show the system files
 | 
						|
			in directory listings.  Otherwise the default behaviour
 | 
						|
			is to hide the system files.
 | 
						|
			Note that even when show_sys_files is specified, "$MFT"
 | 
						|
			will not be visible due to bugs/mis-features in glibc.
 | 
						|
			Further, note that irrespective of show_sys_files, all
 | 
						|
			files are accessible by name, i.e. you can always do
 | 
						|
			"ls -l \$UpCase" for example to specifically show the
 | 
						|
			system file containing the Unicode upcase table.
 | 
						|
 | 
						|
case_sensitive=<BOOL>	If case_sensitive is specified, treat all file names as
 | 
						|
			case sensitive and create file names in the POSIX
 | 
						|
			namespace.  Otherwise the default behaviour is to treat
 | 
						|
			file names as case insensitive and to create file names
 | 
						|
			in the WIN32/LONG name space.  Note, the Linux NTFS
 | 
						|
			driver will never create short file names and will
 | 
						|
			remove them on rename/delete of the corresponding long
 | 
						|
			file name.
 | 
						|
			Note that files remain accessible via their short file
 | 
						|
			name, if it exists.  If case_sensitive, you will need
 | 
						|
			to provide the correct case of the short file name.
 | 
						|
 | 
						|
disable_sparse=<BOOL>	If disable_sparse is specified, creation of sparse
 | 
						|
			regions, i.e. holes, inside files is disabled for the
 | 
						|
			volume (for the duration of this mount only).  By
 | 
						|
			default, creation of sparse regions is enabled, which
 | 
						|
			is consistent with the behaviour of traditional Unix
 | 
						|
			filesystems.
 | 
						|
 | 
						|
errors=opt		What to do when critical filesystem errors are found.
 | 
						|
			Following values can be used for "opt":
 | 
						|
			  continue: DEFAULT, try to clean-up as much as
 | 
						|
				    possible, e.g. marking a corrupt inode as
 | 
						|
				    bad so it is no longer accessed, and then
 | 
						|
				    continue.
 | 
						|
			  recover:  At present only supported is recovery of
 | 
						|
				    the boot sector from the backup copy.
 | 
						|
				    If read-only mount, the recovery is done
 | 
						|
				    in memory only and not written to disk.
 | 
						|
			Note that the options are additive, i.e. specifying:
 | 
						|
			   errors=continue,errors=recover
 | 
						|
			means the driver will attempt to recover and if that
 | 
						|
			fails it will clean-up as much as possible and
 | 
						|
			continue.
 | 
						|
 | 
						|
mft_zone_multiplier=	Set the MFT zone multiplier for the volume (this
 | 
						|
			setting is not persistent across mounts and can be
 | 
						|
			changed from mount to mount but cannot be changed on
 | 
						|
			remount).  Values of 1 to 4 are allowed, 1 being the
 | 
						|
			default.  The MFT zone multiplier determines how much
 | 
						|
			space is reserved for the MFT on the volume.  If all
 | 
						|
			other space is used up, then the MFT zone will be
 | 
						|
			shrunk dynamically, so this has no impact on the
 | 
						|
			amount of free space.  However, it can have an impact
 | 
						|
			on performance by affecting fragmentation of the MFT.
 | 
						|
			In general use the default.  If you have a lot of small
 | 
						|
			files then use a higher value.  The values have the
 | 
						|
			following meaning:
 | 
						|
			      Value	     MFT zone size (% of volume size)
 | 
						|
				1		12.5%
 | 
						|
				2		25%
 | 
						|
				3		37.5%
 | 
						|
				4		50%
 | 
						|
			Note this option is irrelevant for read-only mounts.
 | 
						|
 | 
						|
 | 
						|
Known bugs and (mis-)features
 | 
						|
=============================
 | 
						|
 | 
						|
- 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 user space
 | 
						|
  applications, since the directory names will have the same inode numbers.
 | 
						|
  This also speeds up ntfs_read_inode() immensely.  And we haven't found any
 | 
						|
  problems with this approach so far.  If you find a problem with this, please
 | 
						|
  let us know.
 | 
						|
 | 
						|
 | 
						|
Please send bug reports/comments/feedback/abuse to the Linux-NTFS development
 | 
						|
list at sourceforge: linux-ntfs-dev@lists.sourceforge.net
 | 
						|
 | 
						|
 | 
						|
Using NTFS volume and stripe sets
 | 
						|
=================================
 | 
						|
 | 
						|
For support of volume and stripe sets, you can either use the kernel's
 | 
						|
Device-Mapper driver or the kernel's Software RAID / MD driver.  The former is
 | 
						|
the recommended one to use for linear raid.  But the latter is required for
 | 
						|
raid level 5.  For striping and mirroring, either driver should work fine.
 | 
						|
 | 
						|
 | 
						|
The Device-Mapper driver
 | 
						|
------------------------
 | 
						|
 | 
						|
You will need to create a table of the components of the volume/stripe set and
 | 
						|
how they fit together and load this into the kernel using the dmsetup utility
 | 
						|
(see man 8 dmsetup).
 | 
						|
 | 
						|
Linear volume sets, i.e. linear raid, has been tested and works fine.  Even
 | 
						|
though untested, there is no reason why stripe sets, i.e. raid level 0, and
 | 
						|
mirrors, i.e. raid level 1 should not work, too.  Stripes with parity, i.e.
 | 
						|
raid level 5, unfortunately cannot work yet because the current version of the
 | 
						|
Device-Mapper driver does not support raid level 5.  You may be able to use the
 | 
						|
Software RAID / MD driver for raid level 5, see the next section for details.
 | 
						|
 | 
						|
To create the table describing your volume you will need to know each of its
 | 
						|
components and their sizes in sectors, i.e. multiples of 512-byte blocks.
 | 
						|
 | 
						|
For NT4 fault tolerant volumes you can obtain the sizes using fdisk.  So for
 | 
						|
example if one of your partitions is /dev/hda2 you would do:
 | 
						|
 | 
						|
$ fdisk -ul /dev/hda
 | 
						|
 | 
						|
Disk /dev/hda: 81.9 GB, 81964302336 bytes
 | 
						|
255 heads, 63 sectors/track, 9964 cylinders, total 160086528 sectors
 | 
						|
Units = sectors of 1 * 512 = 512 bytes
 | 
						|
 | 
						|
   Device Boot      Start         End      Blocks   Id  System
 | 
						|
   /dev/hda1   *          63     4209029     2104483+  83  Linux
 | 
						|
   /dev/hda2         4209030    37768814    16779892+  86  NTFS
 | 
						|
   /dev/hda3        37768815    46170809     4200997+  83  Linux
 | 
						|
 | 
						|
And you would know that /dev/hda2 has a size of 37768814 - 4209030 + 1 =
 | 
						|
33559785 sectors.
 | 
						|
 | 
						|
For Win2k and later dynamic disks, you can for example use the ldminfo utility
 | 
						|
which is part of the Linux LDM tools (the latest version at the time of
 | 
						|
writing is linux-ldm-0.0.8.tar.bz2).  You can download it from:
 | 
						|
	http://www.linux-ntfs.org/
 | 
						|
Simply extract the downloaded archive (tar xvjf linux-ldm-0.0.8.tar.bz2), go
 | 
						|
into it (cd linux-ldm-0.0.8) and change to the test directory (cd test).  You
 | 
						|
will find the precompiled (i386) ldminfo utility there.  NOTE: You will not be
 | 
						|
able to compile this yourself easily so use the binary version!
 | 
						|
 | 
						|
Then you would use ldminfo in dump mode to obtain the necessary information:
 | 
						|
 | 
						|
$ ./ldminfo --dump /dev/hda
 | 
						|
 | 
						|
This would dump the LDM database found on /dev/hda which describes all of your
 | 
						|
dynamic disks and all the volumes on them.  At the bottom you will see the
 | 
						|
VOLUME DEFINITIONS section which is all you really need.  You may need to look
 | 
						|
further above to determine which of the disks in the volume definitions is
 | 
						|
which device in Linux.  Hint: Run ldminfo on each of your dynamic disks and
 | 
						|
look at the Disk Id close to the top of the output for each (the PRIVATE HEADER
 | 
						|
section).  You can then find these Disk Ids in the VBLK DATABASE section in the
 | 
						|
<Disk> components where you will get the LDM Name for the disk that is found in
 | 
						|
the VOLUME DEFINITIONS section.
 | 
						|
 | 
						|
Note you will also need to enable the LDM driver in the Linux kernel.  If your
 | 
						|
distribution did not enable it, you will need to recompile the kernel with it
 | 
						|
enabled.  This will create the LDM partitions on each device at boot time.  You
 | 
						|
would then use those devices (for /dev/hda they would be /dev/hda1, 2, 3, etc)
 | 
						|
in the Device-Mapper table.
 | 
						|
 | 
						|
You can also bypass using the LDM driver by using the main device (e.g.
 | 
						|
/dev/hda) and then using the offsets of the LDM partitions into this device as
 | 
						|
the "Start sector of device" when creating the table.  Once again ldminfo would
 | 
						|
give you the correct information to do this.
 | 
						|
 | 
						|
Assuming you know all your devices and their sizes things are easy.
 | 
						|
 | 
						|
For a linear raid the table would look like this (note all values are in
 | 
						|
512-byte sectors):
 | 
						|
 | 
						|
--- cut here ---
 | 
						|
# Offset into	Size of this	Raid type	Device		Start sector
 | 
						|
# volume	device						of device
 | 
						|
0		1028161		linear		/dev/hda1	0
 | 
						|
1028161		3903762		linear		/dev/hdb2	0
 | 
						|
4931923		2103211		linear		/dev/hdc1	0
 | 
						|
--- cut here ---
 | 
						|
 | 
						|
For a striped volume, i.e. raid level 0, you will need to know the chunk size
 | 
						|
you used when creating the volume.  Windows uses 64kiB as the default, so it
 | 
						|
will probably be this unless you changes the defaults when creating the array.
 | 
						|
 | 
						|
For a raid level 0 the table would look like this (note all values are in
 | 
						|
512-byte sectors):
 | 
						|
 | 
						|
--- cut here ---
 | 
						|
# Offset   Size	    Raid     Number   Chunk  1st        Start	2nd	  Start
 | 
						|
# into     of the   type     of	      size   Device	in	Device	  in
 | 
						|
# volume   volume	     stripes			device		  device
 | 
						|
0	   2056320  striped  2	      128    /dev/hda1	0	/dev/hdb1 0
 | 
						|
--- cut here ---
 | 
						|
 | 
						|
If there are more than two devices, just add each of them to the end of the
 | 
						|
line.
 | 
						|
 | 
						|
Finally, for a mirrored volume, i.e. raid level 1, the table would look like
 | 
						|
this (note all values are in 512-byte sectors):
 | 
						|
 | 
						|
--- cut here ---
 | 
						|
# Ofs Size   Raid   Log  Number Region Should Number Source  Start Target Start
 | 
						|
# in  of the type   type of log size   sync?  of     Device  in    Device in
 | 
						|
# vol volume		 params		     mirrors	     Device	  Device
 | 
						|
0    2056320 mirror core 2	16     nosync 2	   /dev/hda1 0   /dev/hdb1 0
 | 
						|
--- cut here ---
 | 
						|
 | 
						|
If you are mirroring to multiple devices you can specify further targets at the
 | 
						|
end of the line.
 | 
						|
 | 
						|
Note the "Should sync?" parameter "nosync" means that the two mirrors are
 | 
						|
already in sync which will be the case on a clean shutdown of Windows.  If the
 | 
						|
mirrors are not clean, you can specify the "sync" option instead of "nosync"
 | 
						|
and the Device-Mapper driver will then copy the entirety of the "Source Device"
 | 
						|
to the "Target Device" or if you specified multipled target devices to all of
 | 
						|
them.
 | 
						|
 | 
						|
Once you have your table, save it in a file somewhere (e.g. /etc/ntfsvolume1),
 | 
						|
and hand it over to dmsetup to work with, like so:
 | 
						|
 | 
						|
$ dmsetup create myvolume1 /etc/ntfsvolume1
 | 
						|
 | 
						|
You can obviously replace "myvolume1" with whatever name you like.
 | 
						|
 | 
						|
If it all worked, you will now have the device /dev/device-mapper/myvolume1
 | 
						|
which you can then just use as an argument to the mount command as usual to
 | 
						|
mount the ntfs volume.  For example:
 | 
						|
 | 
						|
$ mount -t ntfs -o ro /dev/device-mapper/myvolume1 /mnt/myvol1
 | 
						|
 | 
						|
(You need to create the directory /mnt/myvol1 first and of course you can use
 | 
						|
anything you like instead of /mnt/myvol1 as long as it is an existing
 | 
						|
directory.)
 | 
						|
 | 
						|
It is advisable to do the mount read-only to see if the volume has been setup
 | 
						|
correctly to avoid the possibility of causing damage to the data on the ntfs
 | 
						|
volume.
 | 
						|
 | 
						|
 | 
						|
The Software RAID / MD driver
 | 
						|
-----------------------------
 | 
						|
 | 
						|
An alternative to using the Device-Mapper driver is to use the kernel's
 | 
						|
Software RAID / MD driver.  For which you need to set up your /etc/raidtab
 | 
						|
appropriately (see man 5 raidtab).
 | 
						|
 | 
						|
Linear volume sets, i.e. linear raid, as well as stripe sets, i.e. raid level
 | 
						|
0, have been tested and work fine (though see section "Limitations when using
 | 
						|
the MD driver with NTFS volumes" especially if you want to use linear raid).
 | 
						|
Even though untested, there is no reason why mirrors, i.e. raid level 1, and
 | 
						|
stripes with parity, i.e. raid level 5, should not work, too.
 | 
						|
 | 
						|
You have to use the "persistent-superblock 0" option for each raid-disk in the
 | 
						|
NTFS volume/stripe you are configuring in /etc/raidtab as the persistent
 | 
						|
superblock used by the MD driver would damage the NTFS volume.
 | 
						|
 | 
						|
Windows by default uses a stripe chunk size of 64k, so you probably want the
 | 
						|
"chunk-size 64k" option for each raid-disk, too.
 | 
						|
 | 
						|
For example, if you have a stripe set consisting of two partitions /dev/hda5
 | 
						|
and /dev/hdb1 your /etc/raidtab would look like this:
 | 
						|
 | 
						|
raiddev /dev/md0
 | 
						|
	raid-level	0
 | 
						|
	nr-raid-disks	2
 | 
						|
	nr-spare-disks	0
 | 
						|
	persistent-superblock	0
 | 
						|
	chunk-size	64k
 | 
						|
	device		/dev/hda5
 | 
						|
	raid-disk	0
 | 
						|
	device		/dev/hdb1
 | 
						|
	raid-disk	1
 | 
						|
 | 
						|
For linear raid, just change the raid-level above to "raid-level linear", for
 | 
						|
mirrors, change it to "raid-level 1", and for stripe sets with parity, change
 | 
						|
it to "raid-level 5".
 | 
						|
 | 
						|
Note for stripe sets with parity you will also need to tell the MD driver
 | 
						|
which parity algorithm to use by specifying the option "parity-algorithm
 | 
						|
which", where you need to replace "which" with the name of the algorithm to
 | 
						|
use (see man 5 raidtab for available algorithms) and you will have to try the
 | 
						|
different available algorithms until you find one that works.  Make sure you
 | 
						|
are working read-only when playing with this as you may damage your data
 | 
						|
otherwise.  If you find which algorithm works please let us know (email the
 | 
						|
linux-ntfs developers list linux-ntfs-dev@lists.sourceforge.net or drop in on
 | 
						|
IRC in channel #ntfs on the irc.freenode.net network) so we can update this
 | 
						|
documentation.
 | 
						|
 | 
						|
Once the raidtab is setup, run for example raid0run -a to start all devices or
 | 
						|
raid0run /dev/md0 to start a particular md device, in this case /dev/md0.
 | 
						|
 | 
						|
Then just use the mount command as usual to mount the ntfs volume using for
 | 
						|
example:	mount -t ntfs -o ro /dev/md0 /mnt/myntfsvolume
 | 
						|
 | 
						|
It is advisable to do the mount read-only to see if the md volume has been
 | 
						|
setup correctly to avoid the possibility of causing damage to the data on the
 | 
						|
ntfs volume.
 | 
						|
 | 
						|
 | 
						|
Limitations when using the Software RAID / MD driver
 | 
						|
-----------------------------------------------------
 | 
						|
 | 
						|
Using the md driver will not work properly if any of your NTFS partitions have
 | 
						|
an odd number of sectors.  This is especially important for linear raid as all
 | 
						|
data after the first partition with an odd number of sectors will be offset by
 | 
						|
one or more sectors so if you mount such a partition with write support you
 | 
						|
will cause massive damage to the data on the volume which will only become
 | 
						|
apparent when you try to use the volume again under Windows.
 | 
						|
 | 
						|
So when using linear raid, make sure that all your partitions have an even
 | 
						|
number of sectors BEFORE attempting to use it.  You have been warned!
 | 
						|
 | 
						|
Even better is to simply use the Device-Mapper for linear raid and then you do
 | 
						|
not have this problem with odd numbers of sectors.
 | 
						|
 | 
						|
 | 
						|
ChangeLog
 | 
						|
=========
 | 
						|
 | 
						|
Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.
 | 
						|
 | 
						|
2.1.29:
 | 
						|
	- Fix a deadlock when mounting read-write.
 | 
						|
2.1.28:
 | 
						|
	- Fix a deadlock.
 | 
						|
2.1.27:
 | 
						|
	- Implement page migration support so the kernel can move memory used
 | 
						|
	  by NTFS files and directories around for management purposes.
 | 
						|
	- Add support for writing to sparse files created with Windows XP SP2.
 | 
						|
	- Many minor improvements and bug fixes.
 | 
						|
2.1.26:
 | 
						|
	- Implement support for sector sizes above 512 bytes (up to the maximum
 | 
						|
	  supported by NTFS which is 4096 bytes).
 | 
						|
	- Enhance support for NTFS volumes which were supported by Windows but
 | 
						|
	  not by Linux due to invalid attribute list attribute flags.
 | 
						|
	- A few minor updates and bug fixes.
 | 
						|
2.1.25:
 | 
						|
	- Write support is now extended with write(2) being able to both
 | 
						|
	  overwrite existing file data and to extend files.  Also, if a write
 | 
						|
	  to a sparse region occurs, write(2) will fill in the hole.  Note,
 | 
						|
	  mmap(2) based writes still do not support writing into holes or
 | 
						|
	  writing beyond the initialized size.
 | 
						|
	- Write support has a new feature and that is that truncate(2) and
 | 
						|
	  open(2) with O_TRUNC are now implemented thus files can be both made
 | 
						|
	  smaller and larger.
 | 
						|
	- Note: Both write(2) and truncate(2)/open(2) with O_TRUNC still have
 | 
						|
	  limitations in that they
 | 
						|
	  - only provide limited support for highly fragmented files.
 | 
						|
	  - only work on regular, i.e. uncompressed and unencrypted files.
 | 
						|
	  - never create sparse files although this will change once directory
 | 
						|
	    operations are implemented.
 | 
						|
	- Lots of bug fixes and enhancements across the board.
 | 
						|
2.1.24:
 | 
						|
	- 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.
 | 
						|
	- 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.
 | 
						|
	- Lots of bug fixes and enhancements across the board.
 | 
						|
2.1.23:
 | 
						|
	- Stamp the user space journal, aka transaction log, aka $UsnJrnl, if
 | 
						|
	  it is present and active thus telling Windows and applications using
 | 
						|
	  the transaction log that changes can have happened on the volume
 | 
						|
	  which are not recorded in $UsnJrnl.
 | 
						|
	- Detect the case when Windows has been hibernated (suspended to disk)
 | 
						|
	  and if this is the case do not allow (re)mounting read-write to
 | 
						|
	  prevent data corruption when you boot back into the suspended
 | 
						|
	  Windows session.
 | 
						|
	- Implement extension of resident files using the normal file write
 | 
						|
	  code paths, i.e. most very small files can be extended to be a little
 | 
						|
	  bit bigger but not by much.
 | 
						|
	- Add new mount option "disable_sparse".  (See list of mount options
 | 
						|
	  above for details.)
 | 
						|
	- Improve handling of ntfs volumes with errors and strange boot sectors
 | 
						|
	  in particular.
 | 
						|
	- Fix various bugs including a nasty deadlock that appeared in recent
 | 
						|
	  kernels (around 2.6.11-2.6.12 timeframe).
 | 
						|
2.1.22:
 | 
						|
	- Improve handling of ntfs volumes with errors.
 | 
						|
	- Fix various bugs and race conditions.
 | 
						|
2.1.21:
 | 
						|
	- Fix several race conditions and various other bugs.
 | 
						|
	- Many internal cleanups, code reorganization, optimizations, and mft
 | 
						|
	  and index record writing code rewritten to fit in with the changes.
 | 
						|
	- Update Documentation/filesystems/ntfs.txt with instructions on how to
 | 
						|
	  use the Device-Mapper driver with NTFS ftdisk/LDM raid.
 | 
						|
2.1.20:
 | 
						|
	- Fix two stupid bugs introduced in 2.1.18 release.
 | 
						|
2.1.19:
 | 
						|
	- Minor bugfix in handling of the default upcase table.
 | 
						|
	- Many internal cleanups and improvements.  Many thanks to Linus
 | 
						|
	  Torvalds and Al Viro for the help and advice with the sparse
 | 
						|
	  annotations and cleanups.
 | 
						|
2.1.18:
 | 
						|
	- Fix scheduling latencies at mount time.  (Ingo Molnar)
 | 
						|
	- Fix endianness bug in a little traversed portion of the attribute
 | 
						|
	  lookup code.
 | 
						|
2.1.17:
 | 
						|
	- Fix bugs in mount time error code paths.
 | 
						|
2.1.16:
 | 
						|
	- Implement access time updates (including mtime and ctime).
 | 
						|
	- Implement fsync(2), fdatasync(2), and msync(2) system calls.
 | 
						|
	- Enable the readv(2) and writev(2) system calls.
 | 
						|
	- Enable access via the asynchronous io (aio) API by adding support for
 | 
						|
	  the aio_read(3) and aio_write(3) functions.
 | 
						|
2.1.15:
 | 
						|
	- Invalidate quotas when (re)mounting read-write.
 | 
						|
	  NOTE:  This now only leave user space journalling on the side.  (See
 | 
						|
	  note for version 2.1.13, below.)
 | 
						|
2.1.14:
 | 
						|
	- Fix an NFSd caused deadlock reported by several users.
 | 
						|
2.1.13:
 | 
						|
	- Implement writing of inodes (access time updates are not implemented
 | 
						|
	  yet so mounting with -o noatime,nodiratime is enforced).
 | 
						|
	- Enable writing out of resident files so you can now overwrite any
 | 
						|
	  uncompressed, unencrypted, nonsparse file as long as you do not
 | 
						|
	  change the file size.
 | 
						|
	- Add housekeeping of ntfs system files so that ntfsfix no longer needs
 | 
						|
	  to be run after writing to an NTFS volume.
 | 
						|
	  NOTE:  This still leaves quota tracking and user space journalling on
 | 
						|
	  the side but they should not cause data corruption.  In the worst
 | 
						|
	  case the charged quotas will be out of date ($Quota) and some
 | 
						|
	  userspace applications might get confused due to the out of date
 | 
						|
	  userspace journal ($UsnJrnl).
 | 
						|
2.1.12:
 | 
						|
	- Fix the second fix to the decompression engine from the 2.1.9 release
 | 
						|
	  and some further internals cleanups.
 | 
						|
2.1.11:
 | 
						|
	- Driver internal cleanups.
 | 
						|
2.1.10:
 | 
						|
	- Force read-only (re)mounting of volumes with unsupported volume
 | 
						|
	  flags and various cleanups.
 | 
						|
2.1.9:
 | 
						|
	- Fix two bugs in handling of corner cases in the decompression engine.
 | 
						|
2.1.8:
 | 
						|
	- Read the $MFT mirror and compare it to the $MFT and if the two do not
 | 
						|
	  match, force a read-only mount and do not allow read-write remounts.
 | 
						|
	- Read and parse the $LogFile journal and if it indicates that the
 | 
						|
	  volume was not shutdown cleanly, force a read-only mount and do not
 | 
						|
	  allow read-write remounts.  If the $LogFile indicates a clean
 | 
						|
	  shutdown and a read-write (re)mount is requested, empty $LogFile to
 | 
						|
	  ensure that Windows cannot cause data corruption by replaying a stale
 | 
						|
	  journal after Linux has written to the volume.
 | 
						|
	- Improve time handling so that the NTFS time is fully preserved when
 | 
						|
	  converted to kernel time and only up to 99 nano-seconds are lost when
 | 
						|
	  kernel time is converted to NTFS time.
 | 
						|
2.1.7:
 | 
						|
	- Enable NFS exporting of mounted NTFS volumes.
 | 
						|
2.1.6:
 | 
						|
	- Fix minor bug in handling of compressed directories that fixes the
 | 
						|
	  erroneous "du" and "stat" output people reported.
 | 
						|
2.1.5:
 | 
						|
	- Minor bug fix in attribute list attribute handling that fixes the
 | 
						|
	  I/O errors on "ls" of certain fragmented files found by at least two
 | 
						|
	  people running Windows XP.
 | 
						|
2.1.4:
 | 
						|
	- Minor update allowing compilation with all gcc versions (well, the
 | 
						|
	  ones the kernel can be compiled with anyway).
 | 
						|
2.1.3:
 | 
						|
	- Major bug fixes for reading files and volumes in corner cases which
 | 
						|
	  were being hit by Windows 2k/XP users.
 | 
						|
2.1.2:
 | 
						|
	- Major bug fixes alleviating the hangs in statfs experienced by some
 | 
						|
	  users.
 | 
						|
2.1.1:
 | 
						|
	- Update handling of compressed files so people no longer get the
 | 
						|
	  frequently reported warning messages about initialized_size !=
 | 
						|
	  data_size.
 | 
						|
2.1.0:
 | 
						|
	- Add configuration option for developmental write support.
 | 
						|
	- Initial implementation of file overwriting. (Writes to resident files
 | 
						|
	  are not written out to disk yet, so avoid writing to files smaller
 | 
						|
	  than about 1kiB.)
 | 
						|
	- Intercept/abort changes in file size as they are not implemented yet.
 | 
						|
2.0.25:
 | 
						|
	- Minor bugfixes in error code paths and small cleanups.
 | 
						|
2.0.24:
 | 
						|
	- Small internal cleanups.
 | 
						|
	- Support for sendfile system call. (Christoph Hellwig)
 | 
						|
2.0.23:
 | 
						|
	- Massive internal locking changes to mft record locking. Fixes
 | 
						|
	  various race conditions and deadlocks.
 | 
						|
	- Fix ntfs over loopback for compressed files by adding an
 | 
						|
	  optimization barrier. (gcc was screwing up otherwise ?)
 | 
						|
	Thanks go to Christoph Hellwig for pointing these two out:
 | 
						|
	- Remove now unused function fs/ntfs/malloc.h::vmalloc_nofs().
 | 
						|
	- Fix ntfs_free() for ia64 and parisc.
 | 
						|
2.0.22:
 | 
						|
	- Small internal cleanups.
 | 
						|
2.0.21:
 | 
						|
	These only affect 32-bit architectures:
 | 
						|
	- Check for, and refuse to mount too large volumes (maximum is 2TiB).
 | 
						|
	- Check for, and refuse to open too large files and directories
 | 
						|
	  (maximum is 16TiB).
 | 
						|
2.0.20:
 | 
						|
	- Support non-resident directory index bitmaps. This means we now cope
 | 
						|
	  with huge directories without problems.
 | 
						|
	- Fix a page leak that manifested itself in some cases when reading
 | 
						|
	  directory contents.
 | 
						|
	- Internal cleanups.
 | 
						|
2.0.19:
 | 
						|
	- Fix race condition and improvements in block i/o interface.
 | 
						|
	- Optimization when reading compressed files.
 | 
						|
2.0.18:
 | 
						|
	- Fix race condition in reading of compressed files.
 | 
						|
2.0.17:
 | 
						|
	- Cleanups and optimizations.
 | 
						|
2.0.16:
 | 
						|
	- Fix stupid bug introduced in 2.0.15 in new attribute inode API.
 | 
						|
	- Big internal cleanup replacing the mftbmp access hacks by using the
 | 
						|
	  new attribute inode API instead.
 | 
						|
2.0.15:
 | 
						|
	- Bug fix in parsing of remount options.
 | 
						|
	- Internal changes implementing attribute (fake) inodes allowing all
 | 
						|
	  attribute i/o to go via the page cache and to use all the normal
 | 
						|
	  vfs/mm functionality.
 | 
						|
2.0.14:
 | 
						|
	- Internal changes improving run list merging code and minor locking
 | 
						|
	  change to not rely on BKL in ntfs_statfs().
 | 
						|
2.0.13:
 | 
						|
	- Internal changes towards using iget5_locked() in preparation for
 | 
						|
	  fake inodes and small cleanups to ntfs_volume structure.
 | 
						|
2.0.12:
 | 
						|
	- Internal cleanups in address space operations made possible by the
 | 
						|
	  changes introduced in the previous release.
 | 
						|
2.0.11:
 | 
						|
	- Internal updates and cleanups introducing the first step towards
 | 
						|
	  fake inode based attribute i/o.
 | 
						|
2.0.10:
 | 
						|
	- Microsoft says that the maximum number of inodes is 2^32 - 1. Update
 | 
						|
	  the driver accordingly to only use 32-bits to store inode numbers on
 | 
						|
	  32-bit architectures. This improves the speed of the driver a little.
 | 
						|
2.0.9:
 | 
						|
	- Change decompression engine to use a single buffer. This should not
 | 
						|
	  affect performance except perhaps on the most heavy i/o on SMP
 | 
						|
	  systems when accessing multiple compressed files from multiple
 | 
						|
	  devices simultaneously.
 | 
						|
	- Minor updates and cleanups.
 | 
						|
2.0.8:
 | 
						|
	- Remove now obsolete show_inodes and posix mount option(s).
 | 
						|
	- 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.
 | 
						|
	- Mostly drop support for short file names (for backwards compatibility
 | 
						|
	  we only support accessing files via their short file name if one
 | 
						|
	  exists).
 | 
						|
	- Fix dcache aliasing issues wrt short/long file names.
 | 
						|
	- Cleanups and minor fixes.
 | 
						|
2.0.7:
 | 
						|
	- Just cleanups.
 | 
						|
2.0.6:
 | 
						|
	- Major bugfix to make compatible with other kernel changes. This fixes
 | 
						|
	  the hangs/oopses on umount.
 | 
						|
	- Locking cleanup in directory operations (remove BKL usage).
 | 
						|
2.0.5:
 | 
						|
	- Major buffer overflow bug fix.
 | 
						|
	- Minor cleanups and updates for kernel 2.5.12.
 | 
						|
2.0.4:
 | 
						|
	- Cleanups and updates for kernel 2.5.11.
 | 
						|
2.0.3:
 | 
						|
	- Small bug fixes, cleanups, and performance improvements.
 | 
						|
2.0.2:
 | 
						|
	- Use default fmask of 0177 so that files are no executable by default.
 | 
						|
	  If you want owner executable files, just use fmask=0077.
 | 
						|
	- Update for kernel 2.5.9 but preserve backwards compatibility with
 | 
						|
	  kernel 2.5.7.
 | 
						|
	- Minor bug fixes, cleanups, and updates.
 | 
						|
2.0.1:
 | 
						|
	- Minor updates, primarily set the executable bit by default on files
 | 
						|
	  so they can be executed.
 | 
						|
2.0.0:
 | 
						|
	- Started ChangeLog.
 | 
						|
 |