xref: /openbmc/linux/fs/ntfs/dir.c (revision 4fc4dca8)
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 };
1538