ALSA: hda - Fix pending unsol events at shutdown
[linux-2.6-block.git] / fs / ntfs / dir.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /**
3  * dir.c - NTFS kernel directory operations. Part of the Linux-NTFS project.
4  *
5  * Copyright (c) 2001-2007 Anton Altaparmakov
6  * Copyright (c) 2002 Richard Russon
7  */
8
9 #include <linux/buffer_head.h>
10 #include <linux/slab.h>
11
12 #include "dir.h"
13 #include "aops.h"
14 #include "attrib.h"
15 #include "mft.h"
16 #include "debug.h"
17 #include "ntfs.h"
18
19 /**
20  * The little endian Unicode string $I30 as a global constant.
21  */
22 ntfschar I30[5] = { cpu_to_le16('$'), cpu_to_le16('I'),
23                 cpu_to_le16('3'),       cpu_to_le16('0'), 0 };
24
25 /**
26  * ntfs_lookup_inode_by_name - find an inode in a directory given its name
27  * @dir_ni:     ntfs inode of the directory in which to search for the name
28  * @uname:      Unicode name for which to search in the directory
29  * @uname_len:  length of the name @uname in Unicode characters
30  * @res:        return the found file name if necessary (see below)
31  *
32  * Look for an inode with name @uname in the directory with inode @dir_ni.
33  * ntfs_lookup_inode_by_name() walks the contents of the directory looking for
34  * the Unicode name. If the name is found in the directory, the corresponding
35  * inode number (>= 0) is returned as a mft reference in cpu format, i.e. it
36  * is a 64-bit number containing the sequence number.
37  *
38  * On error, a negative value is returned corresponding to the error code. In
39  * particular if the inode is not found -ENOENT is returned. Note that you
40  * can't just check the return value for being negative, you have to check the
41  * inode number for being negative which you can extract using MREC(return
42  * value).
43  *
44  * Note, @uname_len does not include the (optional) terminating NULL character.
45  *
46  * Note, we look for a case sensitive match first but we also look for a case
47  * insensitive match at the same time. If we find a case insensitive match, we
48  * save that for the case that we don't find an exact match, where we return
49  * the case insensitive match and setup @res (which we allocate!) with the mft
50  * reference, the file name type, length and with a copy of the little endian
51  * Unicode file name itself. If we match a file name which is in the DOS name
52  * space, we only return the mft reference and file name type in @res.
53  * ntfs_lookup() then uses this to find the long file name in the inode itself.
54  * This is to avoid polluting the dcache with short file names. We want them to
55  * work but we don't care for how quickly one can access them. This also fixes
56  * the dcache aliasing issues.
57  *
58  * Locking:  - Caller must hold i_mutex on the directory.
59  *           - Each page cache page in the index allocation mapping must be
60  *             locked whilst being accessed otherwise we may find a corrupt
61  *             page due to it being under ->writepage at the moment which
62  *             applies the mst protection fixups before writing out and then
63  *             removes them again after the write is complete after which it 
64  *             unlocks the page.
65  */
66 MFT_REF ntfs_lookup_inode_by_name(ntfs_inode *dir_ni, const ntfschar *uname,
67                 const int uname_len, ntfs_name **res)
68 {
69         ntfs_volume *vol = dir_ni->vol;
70         struct super_block *sb = vol->sb;
71         MFT_RECORD *m;
72         INDEX_ROOT *ir;
73         INDEX_ENTRY *ie;
74         INDEX_ALLOCATION *ia;
75         u8 *index_end;
76         u64 mref;
77         ntfs_attr_search_ctx *ctx;
78         int err, rc;
79         VCN vcn, old_vcn;
80         struct address_space *ia_mapping;
81         struct page *page;
82         u8 *kaddr;
83         ntfs_name *name = NULL;
84
85         BUG_ON(!S_ISDIR(VFS_I(dir_ni)->i_mode));
86         BUG_ON(NInoAttr(dir_ni));
87         /* Get hold of the mft record for the directory. */
88         m = map_mft_record(dir_ni);
89         if (IS_ERR(m)) {
90                 ntfs_error(sb, "map_mft_record() failed with error code %ld.",
91                                 -PTR_ERR(m));
92                 return ERR_MREF(PTR_ERR(m));
93         }
94         ctx = ntfs_attr_get_search_ctx(dir_ni, m);
95         if (unlikely(!ctx)) {
96                 err = -ENOMEM;
97                 goto err_out;
98         }
99         /* Find the index root attribute in the mft record. */
100         err = ntfs_attr_lookup(AT_INDEX_ROOT, I30, 4, CASE_SENSITIVE, 0, NULL,
101                         0, ctx);
102         if (unlikely(err)) {
103                 if (err == -ENOENT) {
104                         ntfs_error(sb, "Index root attribute missing in "
105                                         "directory inode 0x%lx.",
106                                         dir_ni->mft_no);
107                         err = -EIO;
108                 }
109                 goto err_out;
110         }
111         /* Get to the index root value (it's been verified in read_inode). */
112         ir = (INDEX_ROOT*)((u8*)ctx->attr +
113                         le16_to_cpu(ctx->attr->data.resident.value_offset));
114         index_end = (u8*)&ir->index + le32_to_cpu(ir->index.index_length);
115         /* The first index entry. */
116         ie = (INDEX_ENTRY*)((u8*)&ir->index +
117                         le32_to_cpu(ir->index.entries_offset));
118         /*
119          * Loop until we exceed valid memory (corruption case) or until we
120          * reach the last entry.
121          */
122         for (;; ie = (INDEX_ENTRY*)((u8*)ie + le16_to_cpu(ie->length))) {
123                 /* Bounds checks. */
124                 if ((u8*)ie < (u8*)ctx->mrec || (u8*)ie +
125                                 sizeof(INDEX_ENTRY_HEADER) > index_end ||
126                                 (u8*)ie + le16_to_cpu(ie->key_length) >
127                                 index_end)
128                         goto dir_err_out;
129                 /*
130                  * The last entry cannot contain a name. It can however contain
131                  * a pointer to a child node in the B+tree so we just break out.
132                  */
133                 if (ie->flags & INDEX_ENTRY_END)
134                         break;
135                 /*
136                  * We perform a case sensitive comparison and if that matches
137                  * we are done and return the mft reference of the inode (i.e.
138                  * the inode number together with the sequence number for
139                  * consistency checking). We convert it to cpu format before
140                  * returning.
141                  */
142                 if (ntfs_are_names_equal(uname, uname_len,
143                                 (ntfschar*)&ie->key.file_name.file_name,
144                                 ie->key.file_name.file_name_length,
145                                 CASE_SENSITIVE, vol->upcase, vol->upcase_len)) {
146 found_it:
147                         /*
148                          * We have a perfect match, so we don't need to care
149                          * about having matched imperfectly before, so we can
150                          * free name and set *res to NULL.
151                          * However, if the perfect match is a short file name,
152                          * we need to signal this through *res, so that
153                          * ntfs_lookup() can fix dcache aliasing issues.
154                          * As an optimization we just reuse an existing
155                          * allocation of *res.
156                          */
157                         if (ie->key.file_name.file_name_type == FILE_NAME_DOS) {
158                                 if (!name) {
159                                         name = kmalloc(sizeof(ntfs_name),
160                                                         GFP_NOFS);
161                                         if (!name) {
162                                                 err = -ENOMEM;
163                                                 goto err_out;
164                                         }
165                                 }
166                                 name->mref = le64_to_cpu(
167                                                 ie->data.dir.indexed_file);
168                                 name->type = FILE_NAME_DOS;
169                                 name->len = 0;
170                                 *res = name;
171                         } else {
172                                 kfree(name);
173                                 *res = NULL;
174                         }
175                         mref = le64_to_cpu(ie->data.dir.indexed_file);
176                         ntfs_attr_put_search_ctx(ctx);
177                         unmap_mft_record(dir_ni);
178                         return mref;
179                 }
180                 /*
181                  * For a case insensitive mount, we also perform a case
182                  * insensitive comparison (provided the file name is not in the
183                  * POSIX namespace). If the comparison matches, and the name is
184                  * in the WIN32 namespace, we cache the filename in *res so
185                  * that the caller, ntfs_lookup(), can work on it. If the
186                  * comparison matches, and the name is in the DOS namespace, we
187                  * only cache the mft reference and the file name type (we set
188                  * the name length to zero for simplicity).
189                  */
190                 if (!NVolCaseSensitive(vol) &&
191                                 ie->key.file_name.file_name_type &&
192                                 ntfs_are_names_equal(uname, uname_len,
193                                 (ntfschar*)&ie->key.file_name.file_name,
194                                 ie->key.file_name.file_name_length,
195                                 IGNORE_CASE, vol->upcase, vol->upcase_len)) {
196                         int name_size = sizeof(ntfs_name);
197                         u8 type = ie->key.file_name.file_name_type;
198                         u8 len = ie->key.file_name.file_name_length;
199
200                         /* Only one case insensitive matching name allowed. */
201                         if (name) {
202                                 ntfs_error(sb, "Found already allocated name "
203                                                 "in phase 1. Please run chkdsk "
204                                                 "and if that doesn't find any "
205                                                 "errors please report you saw "
206                                                 "this message to "
207                                                 "linux-ntfs-dev@lists."
208                                                 "sourceforge.net.");
209                                 goto dir_err_out;
210                         }
211
212                         if (type != FILE_NAME_DOS)
213                                 name_size += len * sizeof(ntfschar);
214                         name = kmalloc(name_size, GFP_NOFS);
215                         if (!name) {
216                                 err = -ENOMEM;
217                                 goto err_out;
218                         }
219                         name->mref = le64_to_cpu(ie->data.dir.indexed_file);
220                         name->type = type;
221                         if (type != FILE_NAME_DOS) {
222                                 name->len = len;
223                                 memcpy(name->name, ie->key.file_name.file_name,
224                                                 len * sizeof(ntfschar));
225                         } else
226                                 name->len = 0;
227                         *res = name;
228                 }
229                 /*
230                  * Not a perfect match, need to do full blown collation so we
231                  * know which way in the B+tree we have to go.
232                  */
233                 rc = ntfs_collate_names(uname, uname_len,
234                                 (ntfschar*)&ie->key.file_name.file_name,
235                                 ie->key.file_name.file_name_length, 1,
236                                 IGNORE_CASE, vol->upcase, vol->upcase_len);
237                 /*
238                  * If uname collates before the name of the current entry, there
239                  * is definitely no such name in this index but we might need to
240                  * descend into the B+tree so we just break out of the loop.
241                  */
242                 if (rc == -1)
243                         break;
244                 /* The names are not equal, continue the search. */
245                 if (rc)
246                         continue;
247                 /*
248                  * Names match with case insensitive comparison, now try the
249                  * case sensitive comparison, which is required for proper
250                  * collation.
251                  */
252                 rc = ntfs_collate_names(uname, uname_len,
253                                 (ntfschar*)&ie->key.file_name.file_name,
254                                 ie->key.file_name.file_name_length, 1,
255                                 CASE_SENSITIVE, vol->upcase, vol->upcase_len);
256                 if (rc == -1)
257                         break;
258                 if (rc)
259                         continue;
260                 /*
261                  * Perfect match, this will never happen as the
262                  * ntfs_are_names_equal() call will have gotten a match but we
263                  * still treat it correctly.
264                  */
265                 goto found_it;
266         }
267         /*
268          * We have finished with this index without success. Check for the
269          * presence of a child node and if not present return -ENOENT, unless
270          * we have got a matching name cached in name in which case return the
271          * mft reference associated with it.
272          */
273         if (!(ie->flags & INDEX_ENTRY_NODE)) {
274                 if (name) {
275                         ntfs_attr_put_search_ctx(ctx);
276                         unmap_mft_record(dir_ni);
277                         return name->mref;
278                 }
279                 ntfs_debug("Entry not found.");
280                 err = -ENOENT;
281                 goto err_out;
282         } /* Child node present, descend into it. */
283         /* Consistency check: Verify that an index allocation exists. */
284         if (!NInoIndexAllocPresent(dir_ni)) {
285                 ntfs_error(sb, "No index allocation attribute but index entry "
286                                 "requires one. Directory inode 0x%lx is "
287                                 "corrupt or driver bug.", dir_ni->mft_no);
288                 goto err_out;
289         }
290         /* Get the starting vcn of the index_block holding the child node. */
291         vcn = sle64_to_cpup((sle64*)((u8*)ie + le16_to_cpu(ie->length) - 8));
292         ia_mapping = VFS_I(dir_ni)->i_mapping;
293         /*
294          * We are done with the index root and the mft record. Release them,
295          * otherwise we deadlock with ntfs_map_page().
296          */
297         ntfs_attr_put_search_ctx(ctx);
298         unmap_mft_record(dir_ni);
299         m = NULL;
300         ctx = NULL;
301 descend_into_child_node:
302         /*
303          * Convert vcn to index into the index allocation attribute in units
304          * of PAGE_SIZE and map the page cache page, reading it from
305          * disk if necessary.
306          */
307         page = ntfs_map_page(ia_mapping, vcn <<
308                         dir_ni->itype.index.vcn_size_bits >> PAGE_SHIFT);
309         if (IS_ERR(page)) {
310                 ntfs_error(sb, "Failed to map directory index page, error %ld.",
311                                 -PTR_ERR(page));
312                 err = PTR_ERR(page);
313                 goto err_out;
314         }
315         lock_page(page);
316         kaddr = (u8*)page_address(page);
317 fast_descend_into_child_node:
318         /* Get to the index allocation block. */
319         ia = (INDEX_ALLOCATION*)(kaddr + ((vcn <<
320                         dir_ni->itype.index.vcn_size_bits) & ~PAGE_MASK));
321         /* Bounds checks. */
322         if ((u8*)ia < kaddr || (u8*)ia > kaddr + PAGE_SIZE) {
323                 ntfs_error(sb, "Out of bounds check failed. Corrupt directory "
324                                 "inode 0x%lx or driver bug.", dir_ni->mft_no);
325                 goto unm_err_out;
326         }
327         /* Catch multi sector transfer fixup errors. */
328         if (unlikely(!ntfs_is_indx_record(ia->magic))) {
329                 ntfs_error(sb, "Directory index record with vcn 0x%llx is "
330                                 "corrupt.  Corrupt inode 0x%lx.  Run chkdsk.",
331                                 (unsigned long long)vcn, dir_ni->mft_no);
332                 goto unm_err_out;
333         }
334         if (sle64_to_cpu(ia->index_block_vcn) != vcn) {
335                 ntfs_error(sb, "Actual VCN (0x%llx) of index buffer is "
336                                 "different from expected VCN (0x%llx). "
337                                 "Directory inode 0x%lx is corrupt or driver "
338                                 "bug.", (unsigned long long)
339                                 sle64_to_cpu(ia->index_block_vcn),
340                                 (unsigned long long)vcn, dir_ni->mft_no);
341                 goto unm_err_out;
342         }
343         if (le32_to_cpu(ia->index.allocated_size) + 0x18 !=
344                         dir_ni->itype.index.block_size) {
345                 ntfs_error(sb, "Index buffer (VCN 0x%llx) of directory inode "
346                                 "0x%lx has a size (%u) differing from the "
347                                 "directory specified size (%u). Directory "
348                                 "inode is corrupt or driver bug.",
349                                 (unsigned long long)vcn, dir_ni->mft_no,
350                                 le32_to_cpu(ia->index.allocated_size) + 0x18,
351                                 dir_ni->itype.index.block_size);
352                 goto unm_err_out;
353         }
354         index_end = (u8*)ia + dir_ni->itype.index.block_size;
355         if (index_end > kaddr + PAGE_SIZE) {
356                 ntfs_error(sb, "Index buffer (VCN 0x%llx) of directory inode "
357                                 "0x%lx crosses page boundary. Impossible! "
358                                 "Cannot access! This is probably a bug in the "
359                                 "driver.", (unsigned long long)vcn,
360                                 dir_ni->mft_no);
361                 goto unm_err_out;
362         }
363         index_end = (u8*)&ia->index + le32_to_cpu(ia->index.index_length);
364         if (index_end > (u8*)ia + dir_ni->itype.index.block_size) {
365                 ntfs_error(sb, "Size of index buffer (VCN 0x%llx) of directory "
366                                 "inode 0x%lx exceeds maximum size.",
367                                 (unsigned long long)vcn, dir_ni->mft_no);
368                 goto unm_err_out;
369         }
370         /* The first index entry. */
371         ie = (INDEX_ENTRY*)((u8*)&ia->index +
372                         le32_to_cpu(ia->index.entries_offset));
373         /*
374          * Iterate similar to above big loop but applied to index buffer, thus
375          * loop until we exceed valid memory (corruption case) or until we
376          * reach the last entry.
377          */
378         for (;; ie = (INDEX_ENTRY*)((u8*)ie + le16_to_cpu(ie->length))) {
379                 /* Bounds check. */
380                 if ((u8*)ie < (u8*)ia || (u8*)ie +
381                                 sizeof(INDEX_ENTRY_HEADER) > index_end ||
382                                 (u8*)ie + le16_to_cpu(ie->key_length) >
383                                 index_end) {
384                         ntfs_error(sb, "Index entry out of bounds in "
385                                         "directory inode 0x%lx.",
386                                         dir_ni->mft_no);
387                         goto unm_err_out;
388                 }
389                 /*
390                  * The last entry cannot contain a name. It can however contain
391                  * a pointer to a child node in the B+tree so we just break out.
392                  */
393                 if (ie->flags & INDEX_ENTRY_END)
394                         break;
395                 /*
396                  * We perform a case sensitive comparison and if that matches
397                  * we are done and return the mft reference of the inode (i.e.
398                  * the inode number together with the sequence number for
399                  * consistency checking). We convert it to cpu format before
400                  * returning.
401                  */
402                 if (ntfs_are_names_equal(uname, uname_len,
403                                 (ntfschar*)&ie->key.file_name.file_name,
404                                 ie->key.file_name.file_name_length,
405                                 CASE_SENSITIVE, vol->upcase, vol->upcase_len)) {
406 found_it2:
407                         /*
408                          * We have a perfect match, so we don't need to care
409                          * about having matched imperfectly before, so we can
410                          * free name and set *res to NULL.
411                          * However, if the perfect match is a short file name,
412                          * we need to signal this through *res, so that
413                          * ntfs_lookup() can fix dcache aliasing issues.
414                          * As an optimization we just reuse an existing
415                          * allocation of *res.
416                          */
417                         if (ie->key.file_name.file_name_type == FILE_NAME_DOS) {
418                                 if (!name) {
419                                         name = kmalloc(sizeof(ntfs_name),
420                                                         GFP_NOFS);
421                                         if (!name) {
422                                                 err = -ENOMEM;
423                                                 goto unm_err_out;
424                                         }
425                                 }
426                                 name->mref = le64_to_cpu(
427                                                 ie->data.dir.indexed_file);
428                                 name->type = FILE_NAME_DOS;
429                                 name->len = 0;
430                                 *res = name;
431                         } else {
432                                 kfree(name);
433                                 *res = NULL;
434                         }
435                         mref = le64_to_cpu(ie->data.dir.indexed_file);
436                         unlock_page(page);
437                         ntfs_unmap_page(page);
438                         return mref;
439                 }
440                 /*
441                  * For a case insensitive mount, we also perform a case
442                  * insensitive comparison (provided the file name is not in the
443                  * POSIX namespace). If the comparison matches, and the name is
444                  * in the WIN32 namespace, we cache the filename in *res so
445                  * that the caller, ntfs_lookup(), can work on it. If the
446                  * comparison matches, and the name is in the DOS namespace, we
447                  * only cache the mft reference and the file name type (we set
448                  * the name length to zero for simplicity).
449                  */
450                 if (!NVolCaseSensitive(vol) &&
451                                 ie->key.file_name.file_name_type &&
452                                 ntfs_are_names_equal(uname, uname_len,
453                                 (ntfschar*)&ie->key.file_name.file_name,
454                                 ie->key.file_name.file_name_length,
455                                 IGNORE_CASE, vol->upcase, vol->upcase_len)) {
456                         int name_size = sizeof(ntfs_name);
457                         u8 type = ie->key.file_name.file_name_type;
458                         u8 len = ie->key.file_name.file_name_length;
459
460                         /* Only one case insensitive matching name allowed. */
461                         if (name) {
462                                 ntfs_error(sb, "Found already allocated name "
463                                                 "in phase 2. Please run chkdsk "
464                                                 "and if that doesn't find any "
465                                                 "errors please report you saw "
466                                                 "this message to "
467                                                 "linux-ntfs-dev@lists."
468                                                 "sourceforge.net.");
469                                 unlock_page(page);
470                                 ntfs_unmap_page(page);
471                                 goto dir_err_out;
472                         }
473
474                         if (type != FILE_NAME_DOS)
475                                 name_size += len * sizeof(ntfschar);
476                         name = kmalloc(name_size, GFP_NOFS);
477                         if (!name) {
478                                 err = -ENOMEM;
479                                 goto unm_err_out;
480                         }
481                         name->mref = le64_to_cpu(ie->data.dir.indexed_file);
482                         name->type = type;
483                         if (type != FILE_NAME_DOS) {
484                                 name->len = len;
485                                 memcpy(name->name, ie->key.file_name.file_name,
486                                                 len * sizeof(ntfschar));
487                         } else
488                                 name->len = 0;
489                         *res = name;
490                 }
491                 /*
492                  * Not a perfect match, need to do full blown collation so we
493                  * know which way in the B+tree we have to go.
494                  */
495                 rc = ntfs_collate_names(uname, uname_len,
496                                 (ntfschar*)&ie->key.file_name.file_name,
497                                 ie->key.file_name.file_name_length, 1,
498                                 IGNORE_CASE, vol->upcase, vol->upcase_len);
499                 /*
500                  * If uname collates before the name of the current entry, there
501                  * is definitely no such name in this index but we might need to
502                  * descend into the B+tree so we just break out of the loop.
503                  */
504                 if (rc == -1)
505                         break;
506                 /* The names are not equal, continue the search. */
507                 if (rc)
508                         continue;
509                 /*
510                  * Names match with case insensitive comparison, now try the
511                  * case sensitive comparison, which is required for proper
512                  * collation.
513                  */
514                 rc = ntfs_collate_names(uname, uname_len,
515                                 (ntfschar*)&ie->key.file_name.file_name,
516                                 ie->key.file_name.file_name_length, 1,
517                                 CASE_SENSITIVE, vol->upcase, vol->upcase_len);
518                 if (rc == -1)
519                         break;
520                 if (rc)
521                         continue;
522                 /*
523                  * Perfect match, this will never happen as the
524                  * ntfs_are_names_equal() call will have gotten a match but we
525                  * still treat it correctly.
526                  */
527                 goto found_it2;
528         }
529         /*
530          * We have finished with this index buffer without success. Check for
531          * the presence of a child node.
532          */
533         if (ie->flags & INDEX_ENTRY_NODE) {
534                 if ((ia->index.flags & NODE_MASK) == LEAF_NODE) {
535                         ntfs_error(sb, "Index entry with child node found in "
536                                         "a leaf node in directory inode 0x%lx.",
537                                         dir_ni->mft_no);
538                         goto unm_err_out;
539                 }
540                 /* Child node present, descend into it. */
541                 old_vcn = vcn;
542                 vcn = sle64_to_cpup((sle64*)((u8*)ie +
543                                 le16_to_cpu(ie->length) - 8));
544                 if (vcn >= 0) {
545                         /* If vcn is in the same page cache page as old_vcn we
546                          * recycle the mapped page. */
547                         if (old_vcn << vol->cluster_size_bits >>
548                                         PAGE_SHIFT == vcn <<
549                                         vol->cluster_size_bits >>
550                                         PAGE_SHIFT)
551                                 goto fast_descend_into_child_node;
552                         unlock_page(page);
553                         ntfs_unmap_page(page);
554                         goto descend_into_child_node;
555                 }
556                 ntfs_error(sb, "Negative child node vcn in directory inode "
557                                 "0x%lx.", dir_ni->mft_no);
558                 goto unm_err_out;
559         }
560         /*
561          * No child node present, return -ENOENT, unless we have got a matching
562          * name cached in name in which case return the mft reference
563          * associated with it.
564          */
565         if (name) {
566                 unlock_page(page);
567                 ntfs_unmap_page(page);
568                 return name->mref;
569         }
570         ntfs_debug("Entry not found.");
571         err = -ENOENT;
572 unm_err_out:
573         unlock_page(page);
574         ntfs_unmap_page(page);
575 err_out:
576         if (!err)
577                 err = -EIO;
578         if (ctx)
579                 ntfs_attr_put_search_ctx(ctx);
580         if (m)
581                 unmap_mft_record(dir_ni);
582         if (name) {
583                 kfree(name);
584                 *res = NULL;
585         }
586         return ERR_MREF(err);
587 dir_err_out:
588         ntfs_error(sb, "Corrupt directory.  Aborting lookup.");
589         goto err_out;
590 }
591
592 #if 0
593
594 // TODO: (AIA)
595 // The algorithm embedded in this code will be required for the time when we
596 // want to support adding of entries to directories, where we require correct
597 // collation of file names in order not to cause corruption of the filesystem.
598
599 /**
600  * ntfs_lookup_inode_by_name - find an inode in a directory given its name
601  * @dir_ni:     ntfs inode of the directory in which to search for the name
602  * @uname:      Unicode name for which to search in the directory
603  * @uname_len:  length of the name @uname in Unicode characters
604  *
605  * Look for an inode with name @uname in the directory with inode @dir_ni.
606  * ntfs_lookup_inode_by_name() walks the contents of the directory looking for
607  * the Unicode name. If the name is found in the directory, the corresponding
608  * inode number (>= 0) is returned as a mft reference in cpu format, i.e. it
609  * is a 64-bit number containing the sequence number.
610  *
611  * On error, a negative value is returned corresponding to the error code. In
612  * particular if the inode is not found -ENOENT is returned. Note that you
613  * can't just check the return value for being negative, you have to check the
614  * inode number for being negative which you can extract using MREC(return
615  * value).
616  *
617  * Note, @uname_len does not include the (optional) terminating NULL character.
618  */
619 u64 ntfs_lookup_inode_by_name(ntfs_inode *dir_ni, const ntfschar *uname,
620                 const int uname_len)
621 {
622         ntfs_volume *vol = dir_ni->vol;
623         struct super_block *sb = vol->sb;
624         MFT_RECORD *m;
625         INDEX_ROOT *ir;
626         INDEX_ENTRY *ie;
627         INDEX_ALLOCATION *ia;
628         u8 *index_end;
629         u64 mref;
630         ntfs_attr_search_ctx *ctx;
631         int err, rc;
632         IGNORE_CASE_BOOL ic;
633         VCN vcn, old_vcn;
634         struct address_space *ia_mapping;
635         struct page *page;
636         u8 *kaddr;
637
638         /* Get hold of the mft record for the directory. */
639         m = map_mft_record(dir_ni);
640         if (IS_ERR(m)) {
641                 ntfs_error(sb, "map_mft_record() failed with error code %ld.",
642                                 -PTR_ERR(m));
643                 return ERR_MREF(PTR_ERR(m));
644         }
645         ctx = ntfs_attr_get_search_ctx(dir_ni, m);
646         if (!ctx) {
647                 err = -ENOMEM;
648                 goto err_out;
649         }
650         /* Find the index root attribute in the mft record. */
651         err = ntfs_attr_lookup(AT_INDEX_ROOT, I30, 4, CASE_SENSITIVE, 0, NULL,
652                         0, ctx);
653         if (unlikely(err)) {
654                 if (err == -ENOENT) {
655                         ntfs_error(sb, "Index root attribute missing in "
656                                         "directory inode 0x%lx.",
657                                         dir_ni->mft_no);
658                         err = -EIO;
659                 }
660                 goto err_out;
661         }
662         /* Get to the index root value (it's been verified in read_inode). */
663         ir = (INDEX_ROOT*)((u8*)ctx->attr +
664                         le16_to_cpu(ctx->attr->data.resident.value_offset));
665         index_end = (u8*)&ir->index + le32_to_cpu(ir->index.index_length);
666         /* The first index entry. */
667         ie = (INDEX_ENTRY*)((u8*)&ir->index +
668                         le32_to_cpu(ir->index.entries_offset));
669         /*
670          * Loop until we exceed valid memory (corruption case) or until we
671          * reach the last entry.
672          */
673         for (;; ie = (INDEX_ENTRY*)((u8*)ie + le16_to_cpu(ie->length))) {
674                 /* Bounds checks. */
675                 if ((u8*)ie < (u8*)ctx->mrec || (u8*)ie +
676                                 sizeof(INDEX_ENTRY_HEADER) > index_end ||
677                                 (u8*)ie + le16_to_cpu(ie->key_length) >
678                                 index_end)
679                         goto dir_err_out;
680                 /*
681                  * The last entry cannot contain a name. It can however contain
682                  * a pointer to a child node in the B+tree so we just break out.
683                  */
684                 if (ie->flags & INDEX_ENTRY_END)
685                         break;
686                 /*
687                  * If the current entry has a name type of POSIX, the name is
688                  * case sensitive and not otherwise. This has the effect of us
689                  * not being able to access any POSIX file names which collate
690                  * after the non-POSIX one when they only differ in case, but
691                  * anyone doing screwy stuff like that deserves to burn in
692                  * hell... Doing that kind of stuff on NT4 actually causes
693                  * corruption on the partition even when using SP6a and Linux
694                  * is not involved at all.
695                  */
696                 ic = ie->key.file_name.file_name_type ? IGNORE_CASE :
697                                 CASE_SENSITIVE;
698                 /*
699                  * If the names match perfectly, we are done and return the
700                  * mft reference of the inode (i.e. the inode number together
701                  * with the sequence number for consistency checking. We
702                  * convert it to cpu format before returning.
703                  */
704                 if (ntfs_are_names_equal(uname, uname_len,
705                                 (ntfschar*)&ie->key.file_name.file_name,
706                                 ie->key.file_name.file_name_length, ic,
707                                 vol->upcase, vol->upcase_len)) {
708 found_it:
709                         mref = le64_to_cpu(ie->data.dir.indexed_file);
710                         ntfs_attr_put_search_ctx(ctx);
711                         unmap_mft_record(dir_ni);
712                         return mref;
713                 }
714                 /*
715                  * Not a perfect match, need to do full blown collation so we
716                  * know which way in the B+tree we have to go.
717                  */
718                 rc = ntfs_collate_names(uname, uname_len,
719                                 (ntfschar*)&ie->key.file_name.file_name,
720                                 ie->key.file_name.file_name_length, 1,
721                                 IGNORE_CASE, vol->upcase, vol->upcase_len);
722                 /*
723                  * If uname collates before the name of the current entry, there
724                  * is definitely no such name in this index but we might need to
725                  * descend into the B+tree so we just break out of the loop.
726                  */
727                 if (rc == -1)
728                         break;
729                 /* The names are not equal, continue the search. */
730                 if (rc)
731                         continue;
732                 /*
733                  * Names match with case insensitive comparison, now try the
734                  * case sensitive comparison, which is required for proper
735                  * collation.
736                  */
737                 rc = ntfs_collate_names(uname, uname_len,
738                                 (ntfschar*)&ie->key.file_name.file_name,
739                                 ie->key.file_name.file_name_length, 1,
740                                 CASE_SENSITIVE, vol->upcase, vol->upcase_len);
741                 if (rc == -1)
742                         break;
743                 if (rc)
744                         continue;
745                 /*
746                  * Perfect match, this will never happen as the
747                  * ntfs_are_names_equal() call will have gotten a match but we
748                  * still treat it correctly.
749                  */
750                 goto found_it;
751         }
752         /*
753          * We have finished with this index without success. Check for the
754          * presence of a child node.
755          */
756         if (!(ie->flags & INDEX_ENTRY_NODE)) {
757                 /* No child node, return -ENOENT. */
758                 err = -ENOENT;
759                 goto err_out;
760         } /* Child node present, descend into it. */
761         /* Consistency check: Verify that an index allocation exists. */
762         if (!NInoIndexAllocPresent(dir_ni)) {
763                 ntfs_error(sb, "No index allocation attribute but index entry "
764                                 "requires one. Directory inode 0x%lx is "
765                                 "corrupt or driver bug.", dir_ni->mft_no);
766                 goto err_out;
767         }
768         /* Get the starting vcn of the index_block holding the child node. */
769         vcn = sle64_to_cpup((u8*)ie + le16_to_cpu(ie->length) - 8);
770         ia_mapping = VFS_I(dir_ni)->i_mapping;
771         /*
772          * We are done with the index root and the mft record. Release them,
773          * otherwise we deadlock with ntfs_map_page().
774          */
775         ntfs_attr_put_search_ctx(ctx);
776         unmap_mft_record(dir_ni);
777         m = NULL;
778         ctx = NULL;
779 descend_into_child_node:
780         /*
781          * Convert vcn to index into the index allocation attribute in units
782          * of PAGE_SIZE and map the page cache page, reading it from
783          * disk if necessary.
784          */
785         page = ntfs_map_page(ia_mapping, vcn <<
786                         dir_ni->itype.index.vcn_size_bits >> PAGE_SHIFT);
787         if (IS_ERR(page)) {
788                 ntfs_error(sb, "Failed to map directory index page, error %ld.",
789                                 -PTR_ERR(page));
790                 err = PTR_ERR(page);
791                 goto err_out;
792         }
793         lock_page(page);
794         kaddr = (u8*)page_address(page);
795 fast_descend_into_child_node:
796         /* Get to the index allocation block. */
797         ia = (INDEX_ALLOCATION*)(kaddr + ((vcn <<
798                         dir_ni->itype.index.vcn_size_bits) & ~PAGE_MASK));
799         /* Bounds checks. */
800         if ((u8*)ia < kaddr || (u8*)ia > kaddr + PAGE_SIZE) {
801                 ntfs_error(sb, "Out of bounds check failed. Corrupt directory "
802                                 "inode 0x%lx or driver bug.", dir_ni->mft_no);
803                 goto unm_err_out;
804         }
805         /* Catch multi sector transfer fixup errors. */
806         if (unlikely(!ntfs_is_indx_record(ia->magic))) {
807                 ntfs_error(sb, "Directory index record with vcn 0x%llx is "
808                                 "corrupt.  Corrupt inode 0x%lx.  Run chkdsk.",
809                                 (unsigned long long)vcn, dir_ni->mft_no);
810                 goto unm_err_out;
811         }
812         if (sle64_to_cpu(ia->index_block_vcn) != vcn) {
813                 ntfs_error(sb, "Actual VCN (0x%llx) of index buffer is "
814                                 "different from expected VCN (0x%llx). "
815                                 "Directory inode 0x%lx is corrupt or driver "
816                                 "bug.", (unsigned long long)
817                                 sle64_to_cpu(ia->index_block_vcn),
818                                 (unsigned long long)vcn, dir_ni->mft_no);
819                 goto unm_err_out;
820         }
821         if (le32_to_cpu(ia->index.allocated_size) + 0x18 !=
822                         dir_ni->itype.index.block_size) {
823                 ntfs_error(sb, "Index buffer (VCN 0x%llx) of directory inode "
824                                 "0x%lx has a size (%u) differing from the "
825                                 "directory specified size (%u). Directory "
826                                 "inode is corrupt or driver bug.",
827                                 (unsigned long long)vcn, dir_ni->mft_no,
828                                 le32_to_cpu(ia->index.allocated_size) + 0x18,
829                                 dir_ni->itype.index.block_size);
830                 goto unm_err_out;
831         }
832         index_end = (u8*)ia + dir_ni->itype.index.block_size;
833         if (index_end > kaddr + PAGE_SIZE) {
834                 ntfs_error(sb, "Index buffer (VCN 0x%llx) of directory inode "
835                                 "0x%lx crosses page boundary. Impossible! "
836                                 "Cannot access! This is probably a bug in the "
837                                 "driver.", (unsigned long long)vcn,
838                                 dir_ni->mft_no);
839                 goto unm_err_out;
840         }
841         index_end = (u8*)&ia->index + le32_to_cpu(ia->index.index_length);
842         if (index_end > (u8*)ia + dir_ni->itype.index.block_size) {
843                 ntfs_error(sb, "Size of index buffer (VCN 0x%llx) of directory "
844                                 "inode 0x%lx exceeds maximum size.",
845                                 (unsigned long long)vcn, dir_ni->mft_no);
846                 goto unm_err_out;
847         }
848         /* The first index entry. */
849         ie = (INDEX_ENTRY*)((u8*)&ia->index +
850                         le32_to_cpu(ia->index.entries_offset));
851         /*
852          * Iterate similar to above big loop but applied to index buffer, thus
853          * loop until we exceed valid memory (corruption case) or until we
854          * reach the last entry.
855          */
856         for (;; ie = (INDEX_ENTRY*)((u8*)ie + le16_to_cpu(ie->length))) {
857                 /* Bounds check. */
858                 if ((u8*)ie < (u8*)ia || (u8*)ie +
859                                 sizeof(INDEX_ENTRY_HEADER) > index_end ||
860                                 (u8*)ie + le16_to_cpu(ie->key_length) >
861                                 index_end) {
862                         ntfs_error(sb, "Index entry out of bounds in "
863                                         "directory inode 0x%lx.",
864                                         dir_ni->mft_no);
865                         goto unm_err_out;
866                 }
867                 /*
868                  * The last entry cannot contain a name. It can however contain
869                  * a pointer to a child node in the B+tree so we just break out.
870                  */
871                 if (ie->flags & INDEX_ENTRY_END)
872                         break;
873                 /*
874                  * If the current entry has a name type of POSIX, the name is
875                  * case sensitive and not otherwise. This has the effect of us
876                  * not being able to access any POSIX file names which collate
877                  * after the non-POSIX one when they only differ in case, but
878                  * anyone doing screwy stuff like that deserves to burn in
879                  * hell... Doing that kind of stuff on NT4 actually causes
880                  * corruption on the partition even when using SP6a and Linux
881                  * is not involved at all.
882                  */
883                 ic = ie->key.file_name.file_name_type ? IGNORE_CASE :
884                                 CASE_SENSITIVE;
885                 /*
886                  * If the names match perfectly, we are done and return the
887                  * mft reference of the inode (i.e. the inode number together
888                  * with the sequence number for consistency checking. We
889                  * convert it to cpu format before returning.
890                  */
891                 if (ntfs_are_names_equal(uname, uname_len,
892                                 (ntfschar*)&ie->key.file_name.file_name,
893                                 ie->key.file_name.file_name_length, ic,
894                                 vol->upcase, vol->upcase_len)) {
895 found_it2:
896                         mref = le64_to_cpu(ie->data.dir.indexed_file);
897                         unlock_page(page);
898                         ntfs_unmap_page(page);
899                         return mref;
900                 }
901                 /*
902                  * Not a perfect match, need to do full blown collation so we
903                  * know which way in the B+tree we have to go.
904                  */
905                 rc = ntfs_collate_names(uname, uname_len,
906                                 (ntfschar*)&ie->key.file_name.file_name,
907                                 ie->key.file_name.file_name_length, 1,
908                                 IGNORE_CASE, vol->upcase, vol->upcase_len);
909                 /*
910                  * If uname collates before the name of the current entry, there
911                  * is definitely no such name in this index but we might need to
912                  * descend into the B+tree so we just break out of the loop.
913                  */
914                 if (rc == -1)
915                         break;
916                 /* The names are not equal, continue the search. */
917                 if (rc)
918                         continue;
919                 /*
920                  * Names match with case insensitive comparison, now try the
921                  * case sensitive comparison, which is required for proper
922                  * collation.
923                  */
924                 rc = ntfs_collate_names(uname, uname_len,
925                                 (ntfschar*)&ie->key.file_name.file_name,
926                                 ie->key.file_name.file_name_length, 1,
927                                 CASE_SENSITIVE, vol->upcase, vol->upcase_len);
928                 if (rc == -1)
929                         break;
930                 if (rc)
931                         continue;
932                 /*
933                  * Perfect match, this will never happen as the
934                  * ntfs_are_names_equal() call will have gotten a match but we
935                  * still treat it correctly.
936                  */
937                 goto found_it2;
938         }
939         /*
940          * We have finished with this index buffer without success. Check for
941          * the presence of a child node.
942          */
943         if (ie->flags & INDEX_ENTRY_NODE) {
944                 if ((ia->index.flags & NODE_MASK) == LEAF_NODE) {
945                         ntfs_error(sb, "Index entry with child node found in "
946                                         "a leaf node in directory inode 0x%lx.",
947                                         dir_ni->mft_no);
948                         goto unm_err_out;
949                 }
950                 /* Child node present, descend into it. */
951                 old_vcn = vcn;
952                 vcn = sle64_to_cpup((u8*)ie + le16_to_cpu(ie->length) - 8);
953                 if (vcn >= 0) {
954                         /* If vcn is in the same page cache page as old_vcn we
955                          * recycle the mapped page. */
956                         if (old_vcn << vol->cluster_size_bits >>
957                                         PAGE_SHIFT == vcn <<
958                                         vol->cluster_size_bits >>
959                                         PAGE_SHIFT)
960                                 goto fast_descend_into_child_node;
961                         unlock_page(page);
962                         ntfs_unmap_page(page);
963                         goto descend_into_child_node;
964                 }
965                 ntfs_error(sb, "Negative child node vcn in directory inode "
966                                 "0x%lx.", dir_ni->mft_no);
967                 goto unm_err_out;
968         }
969         /* No child node, return -ENOENT. */
970         ntfs_debug("Entry not found.");
971         err = -ENOENT;
972 unm_err_out:
973         unlock_page(page);
974         ntfs_unmap_page(page);
975 err_out:
976         if (!err)
977                 err = -EIO;
978         if (ctx)
979                 ntfs_attr_put_search_ctx(ctx);
980         if (m)
981                 unmap_mft_record(dir_ni);
982         return ERR_MREF(err);
983 dir_err_out:
984         ntfs_error(sb, "Corrupt directory. Aborting lookup.");
985         goto err_out;
986 }
987
988 #endif
989
990 /**
991  * ntfs_filldir - ntfs specific filldir method
992  * @vol:        current ntfs volume
993  * @ndir:       ntfs inode of current directory
994  * @ia_page:    page in which the index allocation buffer @ie is in resides
995  * @ie:         current index entry
996  * @name:       buffer to use for the converted name
997  * @actor:      what to feed the entries to
998  *
999  * Convert the Unicode @name to the loaded NLS and pass it to the @filldir
1000  * callback.
1001  *
1002  * If @ia_page is not NULL it is the locked page containing the index
1003  * allocation block containing the index entry @ie.
1004  *
1005  * Note, we drop (and then reacquire) the page lock on @ia_page across the
1006  * @filldir() call otherwise we would deadlock with NFSd when it calls ->lookup
1007  * since ntfs_lookup() will lock the same page.  As an optimization, we do not
1008  * retake the lock if we are returning a non-zero value as ntfs_readdir()
1009  * would need to drop the lock immediately anyway.
1010  */
1011 static inline int ntfs_filldir(ntfs_volume *vol,
1012                 ntfs_inode *ndir, struct page *ia_page, INDEX_ENTRY *ie,
1013                 u8 *name, struct dir_context *actor)
1014 {
1015         unsigned long mref;
1016         int name_len;
1017         unsigned dt_type;
1018         FILE_NAME_TYPE_FLAGS name_type;
1019
1020         name_type = ie->key.file_name.file_name_type;
1021         if (name_type == FILE_NAME_DOS) {
1022                 ntfs_debug("Skipping DOS name space entry.");
1023                 return 0;
1024         }
1025         if (MREF_LE(ie->data.dir.indexed_file) == FILE_root) {
1026                 ntfs_debug("Skipping root directory self reference entry.");
1027                 return 0;
1028         }
1029         if (MREF_LE(ie->data.dir.indexed_file) < FILE_first_user &&
1030                         !NVolShowSystemFiles(vol)) {
1031                 ntfs_debug("Skipping system file.");
1032                 return 0;
1033         }
1034         name_len = ntfs_ucstonls(vol, (ntfschar*)&ie->key.file_name.file_name,
1035                         ie->key.file_name.file_name_length, &name,
1036                         NTFS_MAX_NAME_LEN * NLS_MAX_CHARSET_SIZE + 1);
1037         if (name_len <= 0) {
1038                 ntfs_warning(vol->sb, "Skipping unrepresentable inode 0x%llx.",
1039                                 (long long)MREF_LE(ie->data.dir.indexed_file));
1040                 return 0;
1041         }
1042         if (ie->key.file_name.file_attributes &
1043                         FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT)
1044                 dt_type = DT_DIR;
1045         else
1046                 dt_type = DT_REG;
1047         mref = MREF_LE(ie->data.dir.indexed_file);
1048         /*
1049          * Drop the page lock otherwise we deadlock with NFS when it calls
1050          * ->lookup since ntfs_lookup() will lock the same page.
1051          */
1052         if (ia_page)
1053                 unlock_page(ia_page);
1054         ntfs_debug("Calling filldir for %s with len %i, fpos 0x%llx, inode "
1055                         "0x%lx, DT_%s.", name, name_len, actor->pos, mref,
1056                         dt_type == DT_DIR ? "DIR" : "REG");
1057         if (!dir_emit(actor, name, name_len, mref, dt_type))
1058                 return 1;
1059         /* Relock the page but not if we are aborting ->readdir. */
1060         if (ia_page)
1061                 lock_page(ia_page);
1062         return 0;
1063 }
1064
1065 /*
1066  * We use the same basic approach as the old NTFS driver, i.e. we parse the
1067  * index root entries and then the index allocation entries that are marked
1068  * as in use in the index bitmap.
1069  *
1070  * While this will return the names in random order this doesn't matter for
1071  * ->readdir but OTOH results in a faster ->readdir.
1072  *
1073  * VFS calls ->readdir without BKL but with i_mutex held. This protects the VFS
1074  * parts (e.g. ->f_pos and ->i_size, and it also protects against directory
1075  * modifications).
1076  *
1077  * Locking:  - Caller must hold i_mutex on the directory.
1078  *           - Each page cache page in the index allocation mapping must be
1079  *             locked whilst being accessed otherwise we may find a corrupt
1080  *             page due to it being under ->writepage at the moment which
1081  *             applies the mst protection fixups before writing out and then
1082  *             removes them again after the write is complete after which it 
1083  *             unlocks the page.
1084  */
1085 static int ntfs_readdir(struct file *file, struct dir_context *actor)
1086 {
1087         s64 ia_pos, ia_start, prev_ia_pos, bmp_pos;
1088         loff_t i_size;
1089         struct inode *bmp_vi, *vdir = file_inode(file);
1090         struct super_block *sb = vdir->i_sb;
1091         ntfs_inode *ndir = NTFS_I(vdir);
1092         ntfs_volume *vol = NTFS_SB(sb);
1093         MFT_RECORD *m;
1094         INDEX_ROOT *ir = NULL;
1095         INDEX_ENTRY *ie;
1096         INDEX_ALLOCATION *ia;
1097         u8 *name = NULL;
1098         int rc, err, ir_pos, cur_bmp_pos;
1099         struct address_space *ia_mapping, *bmp_mapping;
1100         struct page *bmp_page = NULL, *ia_page = NULL;
1101         u8 *kaddr, *bmp, *index_end;
1102         ntfs_attr_search_ctx *ctx;
1103
1104         ntfs_debug("Entering for inode 0x%lx, fpos 0x%llx.",
1105                         vdir->i_ino, actor->pos);
1106         rc = err = 0;
1107         /* Are we at end of dir yet? */
1108         i_size = i_size_read(vdir);
1109         if (actor->pos >= i_size + vol->mft_record_size)
1110                 return 0;
1111         /* Emulate . and .. for all directories. */
1112         if (!dir_emit_dots(file, actor))
1113                 return 0;
1114         m = NULL;
1115         ctx = NULL;
1116         /*
1117          * Allocate a buffer to store the current name being processed
1118          * converted to format determined by current NLS.
1119          */
1120         name = kmalloc(NTFS_MAX_NAME_LEN * NLS_MAX_CHARSET_SIZE + 1, GFP_NOFS);
1121         if (unlikely(!name)) {
1122                 err = -ENOMEM;
1123                 goto err_out;
1124         }
1125         /* Are we jumping straight into the index allocation attribute? */
1126         if (actor->pos >= vol->mft_record_size)
1127                 goto skip_index_root;
1128         /* Get hold of the mft record for the directory. */
1129         m = map_mft_record(ndir);
1130         if (IS_ERR(m)) {
1131                 err = PTR_ERR(m);
1132                 m = NULL;
1133                 goto err_out;
1134         }
1135         ctx = ntfs_attr_get_search_ctx(ndir, m);
1136         if (unlikely(!ctx)) {
1137                 err = -ENOMEM;
1138                 goto err_out;
1139         }
1140         /* Get the offset into the index root attribute. */
1141         ir_pos = (s64)actor->pos;
1142         /* Find the index root attribute in the mft record. */
1143         err = ntfs_attr_lookup(AT_INDEX_ROOT, I30, 4, CASE_SENSITIVE, 0, NULL,
1144                         0, ctx);
1145         if (unlikely(err)) {
1146                 ntfs_error(sb, "Index root attribute missing in directory "
1147                                 "inode 0x%lx.", vdir->i_ino);
1148                 goto err_out;
1149         }
1150         /*
1151          * Copy the index root attribute value to a buffer so that we can put
1152          * the search context and unmap the mft record before calling the
1153          * filldir() callback.  We need to do this because of NFSd which calls
1154          * ->lookup() from its filldir callback() and this causes NTFS to
1155          * deadlock as ntfs_lookup() maps the mft record of the directory and
1156          * we have got it mapped here already.  The only solution is for us to
1157          * unmap the mft record here so that a call to ntfs_lookup() is able to
1158          * map the mft record without deadlocking.
1159          */
1160         rc = le32_to_cpu(ctx->attr->data.resident.value_length);
1161         ir = kmalloc(rc, GFP_NOFS);
1162         if (unlikely(!ir)) {
1163                 err = -ENOMEM;
1164                 goto err_out;
1165         }
1166         /* Copy the index root value (it has been verified in read_inode). */
1167         memcpy(ir, (u8*)ctx->attr +
1168                         le16_to_cpu(ctx->attr->data.resident.value_offset), rc);
1169         ntfs_attr_put_search_ctx(ctx);
1170         unmap_mft_record(ndir);
1171         ctx = NULL;
1172         m = NULL;
1173         index_end = (u8*)&ir->index + le32_to_cpu(ir->index.index_length);
1174         /* The first index entry. */
1175         ie = (INDEX_ENTRY*)((u8*)&ir->index +
1176                         le32_to_cpu(ir->index.entries_offset));
1177         /*
1178          * Loop until we exceed valid memory (corruption case) or until we
1179          * reach the last entry or until filldir tells us it has had enough
1180          * or signals an error (both covered by the rc test).
1181          */
1182         for (;; ie = (INDEX_ENTRY*)((u8*)ie + le16_to_cpu(ie->length))) {
1183                 ntfs_debug("In index root, offset 0x%zx.", (u8*)ie - (u8*)ir);
1184                 /* Bounds checks. */
1185                 if (unlikely((u8*)ie < (u8*)ir || (u8*)ie +
1186                                 sizeof(INDEX_ENTRY_HEADER) > index_end ||
1187                                 (u8*)ie + le16_to_cpu(ie->key_length) >
1188                                 index_end))
1189                         goto err_out;
1190                 /* The last entry cannot contain a name. */
1191                 if (ie->flags & INDEX_ENTRY_END)
1192                         break;
1193                 /* Skip index root entry if continuing previous readdir. */
1194                 if (ir_pos > (u8*)ie - (u8*)ir)
1195                         continue;
1196                 /* Advance the position even if going to skip the entry. */
1197                 actor->pos = (u8*)ie - (u8*)ir;
1198                 /* Submit the name to the filldir callback. */
1199                 rc = ntfs_filldir(vol, ndir, NULL, ie, name, actor);
1200                 if (rc) {
1201                         kfree(ir);
1202                         goto abort;
1203                 }
1204         }
1205         /* We are done with the index root and can free the buffer. */
1206         kfree(ir);
1207         ir = NULL;
1208         /* If there is no index allocation attribute we are finished. */
1209         if (!NInoIndexAllocPresent(ndir))
1210                 goto EOD;
1211         /* Advance fpos to the beginning of the index allocation. */
1212         actor->pos = vol->mft_record_size;
1213 skip_index_root:
1214         kaddr = NULL;
1215         prev_ia_pos = -1LL;
1216         /* Get the offset into the index allocation attribute. */
1217         ia_pos = (s64)actor->pos - vol->mft_record_size;
1218         ia_mapping = vdir->i_mapping;
1219         ntfs_debug("Inode 0x%lx, getting index bitmap.", vdir->i_ino);
1220         bmp_vi = ntfs_attr_iget(vdir, AT_BITMAP, I30, 4);
1221         if (IS_ERR(bmp_vi)) {
1222                 ntfs_error(sb, "Failed to get bitmap attribute.");
1223                 err = PTR_ERR(bmp_vi);
1224                 goto err_out;
1225         }
1226         bmp_mapping = bmp_vi->i_mapping;
1227         /* Get the starting bitmap bit position and sanity check it. */
1228         bmp_pos = ia_pos >> ndir->itype.index.block_size_bits;
1229         if (unlikely(bmp_pos >> 3 >= i_size_read(bmp_vi))) {
1230                 ntfs_error(sb, "Current index allocation position exceeds "
1231                                 "index bitmap size.");
1232                 goto iput_err_out;
1233         }
1234         /* Get the starting bit position in the current bitmap page. */
1235         cur_bmp_pos = bmp_pos & ((PAGE_SIZE * 8) - 1);
1236         bmp_pos &= ~(u64)((PAGE_SIZE * 8) - 1);
1237 get_next_bmp_page:
1238         ntfs_debug("Reading bitmap with page index 0x%llx, bit ofs 0x%llx",
1239                         (unsigned long long)bmp_pos >> (3 + PAGE_SHIFT),
1240                         (unsigned long long)bmp_pos &
1241                         (unsigned long long)((PAGE_SIZE * 8) - 1));
1242         bmp_page = ntfs_map_page(bmp_mapping,
1243                         bmp_pos >> (3 + PAGE_SHIFT));
1244         if (IS_ERR(bmp_page)) {
1245                 ntfs_error(sb, "Reading index bitmap failed.");
1246                 err = PTR_ERR(bmp_page);
1247                 bmp_page = NULL;
1248                 goto iput_err_out;
1249         }
1250         bmp = (u8*)page_address(bmp_page);
1251         /* Find next index block in use. */
1252         while (!(bmp[cur_bmp_pos >> 3] & (1 << (cur_bmp_pos & 7)))) {
1253 find_next_index_buffer:
1254                 cur_bmp_pos++;
1255                 /*
1256                  * If we have reached the end of the bitmap page, get the next
1257                  * page, and put away the old one.
1258                  */
1259                 if (unlikely((cur_bmp_pos >> 3) >= PAGE_SIZE)) {
1260                         ntfs_unmap_page(bmp_page);
1261                         bmp_pos += PAGE_SIZE * 8;
1262                         cur_bmp_pos = 0;
1263                         goto get_next_bmp_page;
1264                 }
1265                 /* If we have reached the end of the bitmap, we are done. */
1266                 if (unlikely(((bmp_pos + cur_bmp_pos) >> 3) >= i_size))
1267                         goto unm_EOD;
1268                 ia_pos = (bmp_pos + cur_bmp_pos) <<
1269                                 ndir->itype.index.block_size_bits;
1270         }
1271         ntfs_debug("Handling index buffer 0x%llx.",
1272                         (unsigned long long)bmp_pos + cur_bmp_pos);
1273         /* If the current index buffer is in the same page we reuse the page. */
1274         if ((prev_ia_pos & (s64)PAGE_MASK) !=
1275                         (ia_pos & (s64)PAGE_MASK)) {
1276                 prev_ia_pos = ia_pos;
1277                 if (likely(ia_page != NULL)) {
1278                         unlock_page(ia_page);
1279                         ntfs_unmap_page(ia_page);
1280                 }
1281                 /*
1282                  * Map the page cache page containing the current ia_pos,
1283                  * reading it from disk if necessary.
1284                  */
1285                 ia_page = ntfs_map_page(ia_mapping, ia_pos >> PAGE_SHIFT);
1286                 if (IS_ERR(ia_page)) {
1287                         ntfs_error(sb, "Reading index allocation data failed.");
1288                         err = PTR_ERR(ia_page);
1289                         ia_page = NULL;
1290                         goto err_out;
1291                 }
1292                 lock_page(ia_page);
1293                 kaddr = (u8*)page_address(ia_page);
1294         }
1295         /* Get the current index buffer. */
1296         ia = (INDEX_ALLOCATION*)(kaddr + (ia_pos & ~PAGE_MASK &
1297                                           ~(s64)(ndir->itype.index.block_size - 1)));
1298         /* Bounds checks. */
1299         if (unlikely((u8*)ia < kaddr || (u8*)ia > kaddr + PAGE_SIZE)) {
1300                 ntfs_error(sb, "Out of bounds check failed. Corrupt directory "
1301                                 "inode 0x%lx or driver bug.", vdir->i_ino);
1302                 goto err_out;
1303         }
1304         /* Catch multi sector transfer fixup errors. */
1305         if (unlikely(!ntfs_is_indx_record(ia->magic))) {
1306                 ntfs_error(sb, "Directory index record with vcn 0x%llx is "
1307                                 "corrupt.  Corrupt inode 0x%lx.  Run chkdsk.",
1308                                 (unsigned long long)ia_pos >>
1309                                 ndir->itype.index.vcn_size_bits, vdir->i_ino);
1310                 goto err_out;
1311         }
1312         if (unlikely(sle64_to_cpu(ia->index_block_vcn) != (ia_pos &
1313                         ~(s64)(ndir->itype.index.block_size - 1)) >>
1314                         ndir->itype.index.vcn_size_bits)) {
1315                 ntfs_error(sb, "Actual VCN (0x%llx) of index buffer is "
1316                                 "different from expected VCN (0x%llx). "
1317                                 "Directory inode 0x%lx is corrupt or driver "
1318                                 "bug. ", (unsigned long long)
1319                                 sle64_to_cpu(ia->index_block_vcn),
1320                                 (unsigned long long)ia_pos >>
1321                                 ndir->itype.index.vcn_size_bits, vdir->i_ino);
1322                 goto err_out;
1323         }
1324         if (unlikely(le32_to_cpu(ia->index.allocated_size) + 0x18 !=
1325                         ndir->itype.index.block_size)) {
1326                 ntfs_error(sb, "Index buffer (VCN 0x%llx) of directory inode "
1327                                 "0x%lx has a size (%u) differing from the "
1328                                 "directory specified size (%u). Directory "
1329                                 "inode is corrupt or driver bug.",
1330                                 (unsigned long long)ia_pos >>
1331                                 ndir->itype.index.vcn_size_bits, vdir->i_ino,
1332                                 le32_to_cpu(ia->index.allocated_size) + 0x18,
1333                                 ndir->itype.index.block_size);
1334                 goto err_out;
1335         }
1336         index_end = (u8*)ia + ndir->itype.index.block_size;
1337         if (unlikely(index_end > kaddr + PAGE_SIZE)) {
1338                 ntfs_error(sb, "Index buffer (VCN 0x%llx) of directory inode "
1339                                 "0x%lx crosses page boundary. Impossible! "
1340                                 "Cannot access! This is probably a bug in the "
1341                                 "driver.", (unsigned long long)ia_pos >>
1342                                 ndir->itype.index.vcn_size_bits, vdir->i_ino);
1343                 goto err_out;
1344         }
1345         ia_start = ia_pos & ~(s64)(ndir->itype.index.block_size - 1);
1346         index_end = (u8*)&ia->index + le32_to_cpu(ia->index.index_length);
1347         if (unlikely(index_end > (u8*)ia + ndir->itype.index.block_size)) {
1348                 ntfs_error(sb, "Size of index buffer (VCN 0x%llx) of directory "
1349                                 "inode 0x%lx exceeds maximum size.",
1350                                 (unsigned long long)ia_pos >>
1351                                 ndir->itype.index.vcn_size_bits, vdir->i_ino);
1352                 goto err_out;
1353         }
1354         /* The first index entry in this index buffer. */
1355         ie = (INDEX_ENTRY*)((u8*)&ia->index +
1356                         le32_to_cpu(ia->index.entries_offset));
1357         /*
1358          * Loop until we exceed valid memory (corruption case) or until we
1359          * reach the last entry or until filldir tells us it has had enough
1360          * or signals an error (both covered by the rc test).
1361          */
1362         for (;; ie = (INDEX_ENTRY*)((u8*)ie + le16_to_cpu(ie->length))) {
1363                 ntfs_debug("In index allocation, offset 0x%llx.",
1364                                 (unsigned long long)ia_start +
1365                                 (unsigned long long)((u8*)ie - (u8*)ia));
1366                 /* Bounds checks. */
1367                 if (unlikely((u8*)ie < (u8*)ia || (u8*)ie +
1368                                 sizeof(INDEX_ENTRY_HEADER) > index_end ||
1369                                 (u8*)ie + le16_to_cpu(ie->key_length) >
1370                                 index_end))
1371                         goto err_out;
1372                 /* The last entry cannot contain a name. */
1373                 if (ie->flags & INDEX_ENTRY_END)
1374                         break;
1375                 /* Skip index block entry if continuing previous readdir. */
1376                 if (ia_pos - ia_start > (u8*)ie - (u8*)ia)
1377                         continue;
1378                 /* Advance the position even if going to skip the entry. */
1379                 actor->pos = (u8*)ie - (u8*)ia +
1380                                 (sle64_to_cpu(ia->index_block_vcn) <<
1381                                 ndir->itype.index.vcn_size_bits) +
1382                                 vol->mft_record_size;
1383                 /*
1384                  * Submit the name to the @filldir callback.  Note,
1385                  * ntfs_filldir() drops the lock on @ia_page but it retakes it
1386                  * before returning, unless a non-zero value is returned in
1387                  * which case the page is left unlocked.
1388                  */
1389                 rc = ntfs_filldir(vol, ndir, ia_page, ie, name, actor);
1390                 if (rc) {
1391                         /* @ia_page is already unlocked in this case. */
1392                         ntfs_unmap_page(ia_page);
1393                         ntfs_unmap_page(bmp_page);
1394                         iput(bmp_vi);
1395                         goto abort;
1396                 }
1397         }
1398         goto find_next_index_buffer;
1399 unm_EOD:
1400         if (ia_page) {
1401                 unlock_page(ia_page);
1402                 ntfs_unmap_page(ia_page);
1403         }
1404         ntfs_unmap_page(bmp_page);
1405         iput(bmp_vi);
1406 EOD:
1407         /* We are finished, set fpos to EOD. */
1408         actor->pos = i_size + vol->mft_record_size;
1409 abort:
1410         kfree(name);
1411         return 0;
1412 err_out:
1413         if (bmp_page) {
1414                 ntfs_unmap_page(bmp_page);
1415 iput_err_out:
1416                 iput(bmp_vi);
1417         }
1418         if (ia_page) {
1419                 unlock_page(ia_page);
1420                 ntfs_unmap_page(ia_page);
1421         }
1422         kfree(ir);
1423         kfree(name);
1424         if (ctx)
1425                 ntfs_attr_put_search_ctx(ctx);
1426         if (m)
1427                 unmap_mft_record(ndir);
1428         if (!err)
1429                 err = -EIO;
1430         ntfs_debug("Failed. Returning error code %i.", -err);
1431         return err;
1432 }
1433
1434 /**
1435  * ntfs_dir_open - called when an inode is about to be opened
1436  * @vi:         inode to be opened
1437  * @filp:       file structure describing the inode
1438  *
1439  * Limit directory size to the page cache limit on architectures where unsigned
1440  * long is 32-bits. This is the most we can do for now without overflowing the
1441  * page cache page index. Doing it this way means we don't run into problems
1442  * because of existing too large directories. It would be better to allow the
1443  * user to read the accessible part of the directory but I doubt very much
1444  * anyone is going to hit this check on a 32-bit architecture, so there is no
1445  * point in adding the extra complexity required to support this.
1446  *
1447  * On 64-bit architectures, the check is hopefully optimized away by the
1448  * compiler.
1449  */
1450 static int ntfs_dir_open(struct inode *vi, struct file *filp)
1451 {
1452         if (sizeof(unsigned long) < 8) {
1453                 if (i_size_read(vi) > MAX_LFS_FILESIZE)
1454                         return -EFBIG;
1455         }
1456         return 0;
1457 }
1458
1459 #ifdef NTFS_RW
1460
1461 /**
1462  * ntfs_dir_fsync - sync a directory to disk
1463  * @filp:       directory to be synced
1464  * @dentry:     dentry describing the directory to sync
1465  * @datasync:   if non-zero only flush user data and not metadata
1466  *
1467  * Data integrity sync of a directory to disk.  Used for fsync, fdatasync, and
1468  * msync system calls.  This function is based on file.c::ntfs_file_fsync().
1469  *
1470  * Write the mft record and all associated extent mft records as well as the
1471  * $INDEX_ALLOCATION and $BITMAP attributes and then sync the block device.
1472  *
1473  * If @datasync is true, we do not wait on the inode(s) to be written out
1474  * but we always wait on the page cache pages to be written out.
1475  *
1476  * Note: In the past @filp could be NULL so we ignore it as we don't need it
1477  * anyway.
1478  *
1479  * Locking: Caller must hold i_mutex on the inode.
1480  *
1481  * TODO: We should probably also write all attribute/index inodes associated
1482  * with this inode but since we have no simple way of getting to them we ignore
1483  * this problem for now.  We do write the $BITMAP attribute if it is present
1484  * which is the important one for a directory so things are not too bad.
1485  */
1486 static int ntfs_dir_fsync(struct file *filp, loff_t start, loff_t end,
1487                           int datasync)
1488 {
1489         struct inode *bmp_vi, *vi = filp->f_mapping->host;
1490         int err, ret;
1491         ntfs_attr na;
1492
1493         ntfs_debug("Entering for inode 0x%lx.", vi->i_ino);
1494
1495         err = file_write_and_wait_range(filp, start, end);
1496         if (err)
1497                 return err;
1498         inode_lock(vi);
1499
1500         BUG_ON(!S_ISDIR(vi->i_mode));
1501         /* If the bitmap attribute inode is in memory sync it, too. */
1502         na.mft_no = vi->i_ino;
1503         na.type = AT_BITMAP;
1504         na.name = I30;
1505         na.name_len = 4;
1506         bmp_vi = ilookup5(vi->i_sb, vi->i_ino, (test_t)ntfs_test_inode, &na);
1507         if (bmp_vi) {
1508                 write_inode_now(bmp_vi, !datasync);
1509                 iput(bmp_vi);
1510         }
1511         ret = __ntfs_write_inode(vi, 1);
1512         write_inode_now(vi, !datasync);
1513         err = sync_blockdev(vi->i_sb->s_bdev);
1514         if (unlikely(err && !ret))
1515                 ret = err;
1516         if (likely(!ret))
1517                 ntfs_debug("Done.");
1518         else
1519                 ntfs_warning(vi->i_sb, "Failed to f%ssync inode 0x%lx.  Error "
1520                                 "%u.", datasync ? "data" : "", vi->i_ino, -ret);
1521         inode_unlock(vi);
1522         return ret;
1523 }
1524
1525 #endif /* NTFS_RW */
1526
1527 const struct file_operations ntfs_dir_ops = {
1528         .llseek         = generic_file_llseek,  /* Seek inside directory. */
1529         .read           = generic_read_dir,     /* Return -EISDIR. */
1530         .iterate        = ntfs_readdir,         /* Read directory contents. */
1531 #ifdef NTFS_RW
1532         .fsync          = ntfs_dir_fsync,       /* Sync a directory to disk. */
1533 #endif /* NTFS_RW */
1534         /*.ioctl        = ,*/                   /* Perform function on the
1535                                                    mounted filesystem. */
1536         .open           = ntfs_dir_open,        /* Open directory. */
1537 };