diff options
Diffstat (limited to 'fs/ntfs/ChangeLog')
-rw-r--r-- | fs/ntfs/ChangeLog | 179 |
1 files changed, 161 insertions, 18 deletions
diff --git a/fs/ntfs/ChangeLog b/fs/ntfs/ChangeLog index 1d2ad15f1533..9709fac6531d 100644 --- a/fs/ntfs/ChangeLog +++ b/fs/ntfs/ChangeLog | |||
@@ -1,21 +1,18 @@ | |||
1 | ToDo/Notes: | 1 | ToDo/Notes: |
2 | - Find and fix bugs. | 2 | - Find and fix bugs. |
3 | - Checkpoint or disable the user space journal ($UsnJrnl). | ||
4 | - In between ntfs_prepare/commit_write, need exclusion between | 3 | - In between ntfs_prepare/commit_write, need exclusion between |
5 | simultaneous file extensions. Need perhaps an NInoResizeUnderway() | 4 | simultaneous file extensions. This is given to us by holding i_sem |
6 | flag which we can set in ntfs_prepare_write() and clear again in | 5 | on the inode. The only places in the kernel when a file is resized |
7 | ntfs_commit_write(). Just have to be careful in readpage/writepage, | 6 | are prepare/commit write and truncate for both of which i_sem is |
8 | as well as in truncate, that we play nice... We might need to have | 7 | held. Just have to be careful in readpage/writepage and all other |
9 | a data_size field in the ntfs_inode to store the real attribute | 8 | helpers not running under i_sem that we play nice... |
10 | length. Also need to be careful with initialized_size extention in | 9 | Also need to be careful with initialized_size extention in |
11 | ntfs_prepare_write. Basically, just be _very_ careful in this code... | 10 | ntfs_prepare_write. Basically, just be _very_ careful in this code... |
12 | OTOH, perhaps i_sem, which is held accross generic_file_write is | 11 | UPDATE: The only things that need to be checked are read/writepage |
13 | sufficient for synchronisation here. We then just need to make sure | 12 | which do not hold i_sem. Note writepage cannot change i_size but it |
14 | ntfs_readpage/writepage/truncate interoperate properly with us. | 13 | needs to cope with a concurrent i_size change, just like readpage. |
15 | UPDATE: The above is all ok as it is due to i_sem held. The only | 14 | Also both need to cope with concurrent changes to the other sizes, |
16 | thing that needs to be checked is ntfs_writepage() which does not | 15 | i.e. initialized/allocated/compressed size, as well. |
17 | hold i_sem. It cannot change i_size but it needs to cope with a | ||
18 | concurrent i_size change. | ||
19 | - Implement mft.c::sync_mft_mirror_umount(). We currently will just | 16 | - Implement mft.c::sync_mft_mirror_umount(). We currently will just |
20 | leave the volume dirty on umount if the final iput(vol->mft_ino) | 17 | leave the volume dirty on umount if the final iput(vol->mft_ino) |
21 | causes a write of any mirrored mft records due to the mft mirror | 18 | causes a write of any mirrored mft records due to the mft mirror |
@@ -25,12 +22,158 @@ ToDo/Notes: | |||
25 | - Enable the code for setting the NT4 compatibility flag when we start | 22 | - Enable the code for setting the NT4 compatibility flag when we start |
26 | making NTFS 1.2 specific modifications. | 23 | making NTFS 1.2 specific modifications. |
27 | 24 | ||
28 | 2.1.23-WIP | 25 | 2.1.23 - Implement extension of resident files and make writing safe as well as |
26 | many bug fixes, cleanups, and enhancements... | ||
29 | 27 | ||
30 | - Add printk rate limiting for ntfs_warning() and ntfs_error() when | 28 | - Add printk rate limiting for ntfs_warning() and ntfs_error() when |
31 | compiled without debug. This avoids a possible denial of service | 29 | compiled without debug. This avoids a possible denial of service |
32 | attack. Thanks to Carl-Daniel Hailfinger from SuSE for pointing this | 30 | attack. Thanks to Carl-Daniel Hailfinger from SuSE for pointing this |
33 | out. | 31 | out. |
32 | - Fix compilation warnings on ia64. (Randy Dunlap) | ||
33 | - Use i_size_{read,write}() instead of reading i_size by hand and cache | ||
34 | the value where apropriate. | ||
35 | - Add size_lock to the ntfs_inode structure. This is an rw spinlock | ||
36 | and it locks against access to the inode sizes. Note, ->size_lock | ||
37 | is also accessed from irq context so you must use the _irqsave and | ||
38 | _irqrestore lock and unlock functions, respectively. Protect all | ||
39 | accesses to allocated_size, initialized_size, and compressed_size. | ||
40 | - Minor optimization to fs/ntfs/super.c::ntfs_statfs() and its helpers. | ||
41 | - Implement extension of resident files in the regular file write code | ||
42 | paths (fs/ntfs/aops.c::ntfs_{prepare,commit}_write()). At present | ||
43 | this only works until the data attribute becomes too big for the mft | ||
44 | record after which we abort the write returning -EOPNOTSUPP from | ||
45 | ntfs_prepare_write(). | ||
46 | - Add disable_sparse mount option together with a per volume sparse | ||
47 | enable bit which is set appropriately and a per inode sparse disable | ||
48 | bit which is preset on some system file inodes as appropriate. | ||
49 | - Enforce that sparse support is disabled on NTFS volumes pre 3.0. | ||
50 | - Fix a bug in fs/ntfs/runlist.c::ntfs_mapping_pairs_decompress() in | ||
51 | the creation of the unmapped runlist element for the base attribute | ||
52 | extent. | ||
53 | - Split ntfs_map_runlist() into ntfs_map_runlist() and a non-locking | ||
54 | helper ntfs_map_runlist_nolock() which is used by ntfs_map_runlist(). | ||
55 | This allows us to map runlist fragments with the runlist lock already | ||
56 | held without having to drop and reacquire it around the call. Adapt | ||
57 | all callers. | ||
58 | - Change ntfs_find_vcn() to ntfs_find_vcn_nolock() which takes a locked | ||
59 | runlist. This allows us to find runlist elements with the runlist | ||
60 | lock already held without having to drop and reacquire it around the | ||
61 | call. Adapt all callers. | ||
62 | - Change time to u64 in time.h::ntfs2utc() as it otherwise generates a | ||
63 | warning in the do_div() call on sparc32. Thanks to Meelis Roos for | ||
64 | the report and analysis of the warning. | ||
65 | - Fix a nasty runlist merge bug when merging two holes. | ||
66 | - Set the ntfs_inode->allocated_size to the real allocated size in the | ||
67 | mft record for resident attributes (fs/ntfs/inode.c). | ||
68 | - Small readability cleanup to use "a" instead of "ctx->attr" | ||
69 | everywhere (fs/ntfs/inode.c). | ||
70 | - Make fs/ntfs/namei.c::ntfs_get_{parent,dentry} static and move the | ||
71 | definition of ntfs_export_ops from fs/ntfs/super.c to namei.c. Also, | ||
72 | declare ntfs_export_ops in fs/ntfs/ntfs.h. | ||
73 | - Correct sparse file handling. The compressed values need to be | ||
74 | checked and set in the ntfs inode as done for compressed files and | ||
75 | the compressed size needs to be used for vfs inode->i_blocks instead | ||
76 | of the allocated size, again, as done for compressed files. | ||
77 | - Add AT_EA in addition to AT_DATA to whitelist for being allowed to be | ||
78 | non-resident in fs/ntfs/attrib.c::ntfs_attr_can_be_non_resident(). | ||
79 | - Add fs/ntfs/attrib.c::ntfs_attr_vcn_to_lcn_nolock() used by the new | ||
80 | write code. | ||
81 | - Fix bug in fs/ntfs/attrib.c::ntfs_find_vcn_nolock() where after | ||
82 | dropping the read lock and taking the write lock we were not checking | ||
83 | whether someone else did not already do the work we wanted to do. | ||
84 | - Rename fs/ntfs/attrib.c::ntfs_find_vcn_nolock() to | ||
85 | ntfs_attr_find_vcn_nolock() and update all callers. | ||
86 | - Add fs/ntfs/attrib.[hc]::ntfs_attr_make_non_resident(). | ||
87 | - Fix sign of various error return values to be negative in | ||
88 | fs/ntfs/lcnalloc.c. | ||
89 | - Modify ->readpage and ->writepage (fs/ntfs/aops.c) so they detect and | ||
90 | handle the case where an attribute is converted from resident to | ||
91 | non-resident by a concurrent file write. | ||
92 | - Remove checks for NULL before calling kfree() since kfree() does the | ||
93 | checking itself. (Jesper Juhl) | ||
94 | - Some utilities modify the boot sector but do not update the checksum. | ||
95 | Thus, relax the checking in fs/ntfs/super.c::is_boot_sector_ntfs() to | ||
96 | only emit a warning when the checksum is incorrect rather than | ||
97 | refusing the mount. Thanks to Bernd Casimir for pointing this | ||
98 | problem out. | ||
99 | - Update attribute definition handling. | ||
100 | - Add NTFS_MAX_CLUSTER_SIZE and NTFS_MAX_PAGES_PER_CLUSTER constants. | ||
101 | - Use NTFS_MAX_CLUSTER_SIZE in super.c instead of hard coding 0x10000. | ||
102 | - Use MAX_BUF_PER_PAGE instead of variable sized array allocation for | ||
103 | better code generation and one less sparse warning in fs/ntfs/aops.c. | ||
104 | - Remove spurious void pointer casts from fs/ntfs/. (Pekka Enberg) | ||
105 | - Use C99 style structure initialization after memory allocation where | ||
106 | possible (fs/ntfs/{attrib.c,index.c,super.c}). Thanks to Al Viro and | ||
107 | Pekka Enberg. | ||
108 | - Stamp the transaction log ($UsnJrnl), aka user space journal, if it | ||
109 | is active on the volume and we are mounting read-write or remounting | ||
110 | from read-only to read-write. | ||
111 | - Fix a bug in address space operations error recovery code paths where | ||
112 | if the runlist was not mapped at all and a mapping error occured we | ||
113 | would leave the runlist locked on exit to the function so that the | ||
114 | next access to the same file would try to take the lock and deadlock. | ||
115 | - Detect the case when Windows has been suspended to disk on the volume | ||
116 | to be mounted and if this is the case do not allow (re)mounting | ||
117 | read-write. This is done by parsing hiberfil.sys if present. | ||
118 | - Fix several occurences of a bug where we would perform 'var & ~const' | ||
119 | with a 64-bit variable and a int, i.e. 32-bit, constant. This causes | ||
120 | the higher order 32-bits of the 64-bit variable to be zeroed. To fix | ||
121 | this cast the 'const' to the same 64-bit type as 'var'. | ||
122 | - Change the runlist terminator of the newly allocated cluster(s) to | ||
123 | LCN_ENOENT in ntfs_attr_make_non_resident(). Otherwise the runlist | ||
124 | code gets confused. | ||
125 | - Add an extra parameter @last_vcn to ntfs_get_size_for_mapping_pairs() | ||
126 | and ntfs_mapping_pairs_build() to allow the runlist encoding to be | ||
127 | partial which is desirable when filling holes in sparse attributes. | ||
128 | Update all callers. | ||
129 | - Change ntfs_map_runlist_nolock() to only decompress the mapping pairs | ||
130 | if the requested vcn is inside it. Otherwise we get into problems | ||
131 | when we try to map an out of bounds vcn because we then try to map | ||
132 | the already mapped runlist fragment which causes | ||
133 | ntfs_mapping_pairs_decompress() to fail and return error. Update | ||
134 | ntfs_attr_find_vcn_nolock() accordingly. | ||
135 | - Fix a nasty deadlock that appeared in recent kernels. | ||
136 | The situation: VFS inode X on a mounted ntfs volume is dirty. For | ||
137 | same inode X, the ntfs_inode is dirty and thus corresponding on-disk | ||
138 | inode, i.e. mft record, which is in a dirty PAGE_CACHE_PAGE belonging | ||
139 | to the table of inodes, i.e. $MFT, inode 0. | ||
140 | What happens: | ||
141 | Process 1: sys_sync()/umount()/whatever... calls | ||
142 | __sync_single_inode() for $MFT -> do_writepages() -> write_page for | ||
143 | the dirty page containing the on-disk inode X, the page is now locked | ||
144 | -> ntfs_write_mst_block() which clears PageUptodate() on the page to | ||
145 | prevent anyone else getting hold of it whilst it does the write out. | ||
146 | This is necessary as the on-disk inode needs "fixups" applied before | ||
147 | the write to disk which are removed again after the write and | ||
148 | PageUptodate is then set again. It then analyses the page looking | ||
149 | for dirty on-disk inodes and when it finds one it calls | ||
150 | ntfs_may_write_mft_record() to see if it is safe to write this | ||
151 | on-disk inode. This then calls ilookup5() to check if the | ||
152 | corresponding VFS inode is in icache(). This in turn calls ifind() | ||
153 | which waits on the inode lock via wait_on_inode whilst holding the | ||
154 | global inode_lock. | ||
155 | Process 2: pdflush results in a call to __sync_single_inode for the | ||
156 | same VFS inode X on the ntfs volume. This locks the inode (I_LOCK) | ||
157 | then calls write-inode -> ntfs_write_inode -> map_mft_record() -> | ||
158 | read_cache_page() for the page (in page cache of table of inodes | ||
159 | $MFT, inode 0) containing the on-disk inode. This page has | ||
160 | PageUptodate() clear because of Process 1 (see above) so | ||
161 | read_cache_page() blocks when it tries to take the page lock for the | ||
162 | page so it can call ntfs_read_page(). | ||
163 | Thus Process 1 is holding the page lock on the page containing the | ||
164 | on-disk inode X and it is waiting on the inode X to be unlocked in | ||
165 | ifind() so it can write the page out and then unlock the page. | ||
166 | And Process 2 is holding the inode lock on inode X and is waiting for | ||
167 | the page to be unlocked so it can call ntfs_readpage() or discover | ||
168 | that Process 1 set PageUptodate() again and use the page. | ||
169 | Thus we have a deadlock due to ifind() waiting on the inode lock. | ||
170 | The solution: The fix is to use the newly introduced | ||
171 | ilookup5_nowait() which does not wait on the inode's lock and hence | ||
172 | avoids the deadlock. This is safe as we do not care about the VFS | ||
173 | inode and only use the fact that it is in the VFS inode cache and the | ||
174 | fact that the vfs and ntfs inodes are one struct in memory to find | ||
175 | the ntfs inode in memory if present. Also, the ntfs inode has its | ||
176 | own locking so it does not matter if the vfs inode is locked. | ||
34 | 177 | ||
35 | 2.1.22 - Many bug and race fixes and error handling improvements. | 178 | 2.1.22 - Many bug and race fixes and error handling improvements. |
36 | 179 | ||
@@ -1037,7 +1180,7 @@ tng-0.0.8 - 08/03/2002 - Now using BitKeeper, http://linux-ntfs.bkbits.net/ | |||
1037 | - Further runlist merging work. (Richard Russon) | 1180 | - Further runlist merging work. (Richard Russon) |
1038 | - Backwards compatibility for gcc-2.95. (Richard Russon) | 1181 | - Backwards compatibility for gcc-2.95. (Richard Russon) |
1039 | - Update to kernel 2.5.5-pre1 and rediff the now tiny patch. | 1182 | - Update to kernel 2.5.5-pre1 and rediff the now tiny patch. |
1040 | - Convert to new file system declaration using ->ntfs_get_sb() and | 1183 | - Convert to new filesystem declaration using ->ntfs_get_sb() and |
1041 | replacing ntfs_read_super() with ntfs_fill_super(). | 1184 | replacing ntfs_read_super() with ntfs_fill_super(). |
1042 | - Set s_maxbytes to MAX_LFS_FILESIZE to avoid page cache page index | 1185 | - Set s_maxbytes to MAX_LFS_FILESIZE to avoid page cache page index |
1043 | overflow on 32-bit architectures. | 1186 | overflow on 32-bit architectures. |
@@ -1333,7 +1476,7 @@ tng-0.0.1 - The first useful version. | |||
1333 | The driver is now actually useful! Yey. (-: It undoubtedly has got bugs | 1476 | The driver is now actually useful! Yey. (-: It undoubtedly has got bugs |
1334 | though and it doesn't implement accesssing compressed files yet. Also, | 1477 | though and it doesn't implement accesssing compressed files yet. Also, |
1335 | accessing files with attribute list attributes is not implemented yet | 1478 | accessing files with attribute list attributes is not implemented yet |
1336 | either. But for small or simple file systems it should work and allow | 1479 | either. But for small or simple filesystems it should work and allow |
1337 | you to list directories, use stat on directory entries and the file | 1480 | you to list directories, use stat on directory entries and the file |
1338 | system, open, read, mmap and llseek around in files. A big mile stone | 1481 | system, open, read, mmap and llseek around in files. A big mile stone |
1339 | has been reached! | 1482 | has been reached! |
@@ -1341,7 +1484,7 @@ tng-0.0.1 - The first useful version. | |||
1341 | tng-0.0.0 - Initial version tag. | 1484 | tng-0.0.0 - Initial version tag. |
1342 | 1485 | ||
1343 | Initial driver implementation. The driver can mount and umount simple | 1486 | Initial driver implementation. The driver can mount and umount simple |
1344 | NTFS file systems (i.e. ones without attribute lists in the system | 1487 | NTFS filesystems (i.e. ones without attribute lists in the system |
1345 | files). If the mount fails there might be problems in the error handling | 1488 | files). If the mount fails there might be problems in the error handling |
1346 | code paths, so be warned. Otherwise it seems to be loading the system | 1489 | code paths, so be warned. Otherwise it seems to be loading the system |
1347 | files nicely and the mft record read mapping/unmapping seems to be | 1490 | files nicely and the mft record read mapping/unmapping seems to be |