Lines Matching +full:case +full:- +full:sensitive
1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (c) 2001-2007 Anton Altaparmakov
27 * ntfs_lookup_inode_by_name - find an inode in a directory given its name
37 * is a 64-bit number containing the sequence number.
40 * particular if the inode is not found -ENOENT is returned. Note that you
47 * Note, we look for a case sensitive match first but we also look for a case
48 * insensitive match at the same time. If we find a case insensitive match, we
49 * save that for the case that we don't find an exact match, where we return
50 * the case insensitive match and setup @res (which we allocate!) with the mft
59 * Locking: - Caller must hold i_mutex on the directory.
60 * - Each page cache page in the index allocation mapping must be
62 * page due to it being under ->writepage at the moment which
70 struct ntfs_volume *vol = dir_ni->vol; in ntfs_lookup_inode_by_name()
71 struct super_block *sb = vol->sb; in ntfs_lookup_inode_by_name()
91 -PTR_ERR(m)); in ntfs_lookup_inode_by_name()
96 err = -ENOMEM; in ntfs_lookup_inode_by_name()
103 if (err == -ENOENT) { in ntfs_lookup_inode_by_name()
106 dir_ni->mft_no); in ntfs_lookup_inode_by_name()
107 err = -EIO; in ntfs_lookup_inode_by_name()
112 ir = (struct index_root *)((u8 *)ctx->attr + in ntfs_lookup_inode_by_name()
113 le16_to_cpu(ctx->attr->data.resident.value_offset)); in ntfs_lookup_inode_by_name()
114 index_end = (u8 *)&ir->index + le32_to_cpu(ir->index.index_length); in ntfs_lookup_inode_by_name()
116 ie = (struct index_entry *)((u8 *)&ir->index + in ntfs_lookup_inode_by_name()
117 le32_to_cpu(ir->index.entries_offset)); in ntfs_lookup_inode_by_name()
119 * Loop until we exceed valid memory (corruption case) or until we in ntfs_lookup_inode_by_name()
122 for (;; ie = (struct index_entry *)((u8 *)ie + le16_to_cpu(ie->length))) { in ntfs_lookup_inode_by_name()
124 if ((u8 *)ie < (u8 *)ctx->mrec || in ntfs_lookup_inode_by_name()
126 (u8 *)ie + sizeof(struct index_entry_header) + le16_to_cpu(ie->key_length) > in ntfs_lookup_inode_by_name()
127 index_end || (u8 *)ie + le16_to_cpu(ie->length) > index_end) in ntfs_lookup_inode_by_name()
133 if (ie->flags & INDEX_ENTRY_END) in ntfs_lookup_inode_by_name()
136 if (!ie->key_length) in ntfs_lookup_inode_by_name()
140 dir_ni->mft_no)) in ntfs_lookup_inode_by_name()
143 * We perform a case sensitive comparison and if that matches in ntfs_lookup_inode_by_name()
150 (__le16 *)&ie->key.file_name.file_name, in ntfs_lookup_inode_by_name()
151 ie->key.file_name.file_name_length, in ntfs_lookup_inode_by_name()
152 CASE_SENSITIVE, vol->upcase, vol->upcase_len)) { in ntfs_lookup_inode_by_name()
164 if (ie->key.file_name.file_name_type == FILE_NAME_DOS) { in ntfs_lookup_inode_by_name()
169 err = -ENOMEM; in ntfs_lookup_inode_by_name()
173 name->mref = le64_to_cpu( in ntfs_lookup_inode_by_name()
174 ie->data.dir.indexed_file); in ntfs_lookup_inode_by_name()
175 name->type = FILE_NAME_DOS; in ntfs_lookup_inode_by_name()
176 name->len = 0; in ntfs_lookup_inode_by_name()
182 mref = le64_to_cpu(ie->data.dir.indexed_file); in ntfs_lookup_inode_by_name()
188 * For a case insensitive mount, we also perform a case in ntfs_lookup_inode_by_name()
198 ie->key.file_name.file_name_type == FILE_NAME_DOS) && in ntfs_lookup_inode_by_name()
200 (__le16 *)&ie->key.file_name.file_name, in ntfs_lookup_inode_by_name()
201 ie->key.file_name.file_name_length, in ntfs_lookup_inode_by_name()
202 IGNORE_CASE, vol->upcase, in ntfs_lookup_inode_by_name()
203 vol->upcase_len)) { in ntfs_lookup_inode_by_name()
205 u8 type = ie->key.file_name.file_name_type; in ntfs_lookup_inode_by_name()
206 u8 len = ie->key.file_name.file_name_length; in ntfs_lookup_inode_by_name()
208 /* Only one case insensitive matching name allowed. */ in ntfs_lookup_inode_by_name()
219 err = -ENOMEM; in ntfs_lookup_inode_by_name()
222 name->mref = le64_to_cpu(ie->data.dir.indexed_file); in ntfs_lookup_inode_by_name()
223 name->type = type; in ntfs_lookup_inode_by_name()
225 name->len = len; in ntfs_lookup_inode_by_name()
226 memcpy(name->name, ie->key.file_name.file_name, in ntfs_lookup_inode_by_name()
229 name->len = 0; in ntfs_lookup_inode_by_name()
237 (__le16 *)&ie->key.file_name.file_name, in ntfs_lookup_inode_by_name()
238 ie->key.file_name.file_name_length, 1, in ntfs_lookup_inode_by_name()
239 IGNORE_CASE, vol->upcase, vol->upcase_len); in ntfs_lookup_inode_by_name()
245 if (rc == -1) in ntfs_lookup_inode_by_name()
251 * Names match with case insensitive comparison, now try the in ntfs_lookup_inode_by_name()
252 * case sensitive comparison, which is required for proper in ntfs_lookup_inode_by_name()
256 (__le16 *)&ie->key.file_name.file_name, in ntfs_lookup_inode_by_name()
257 ie->key.file_name.file_name_length, 1, in ntfs_lookup_inode_by_name()
258 CASE_SENSITIVE, vol->upcase, vol->upcase_len); in ntfs_lookup_inode_by_name()
259 if (rc == -1) in ntfs_lookup_inode_by_name()
272 * presence of a child node and if not present return -ENOENT, unless in ntfs_lookup_inode_by_name()
273 * we have got a matching name cached in name in which case return the in ntfs_lookup_inode_by_name()
276 if (!(ie->flags & INDEX_ENTRY_NODE)) { in ntfs_lookup_inode_by_name()
280 return name->mref; in ntfs_lookup_inode_by_name()
283 err = -ENOENT; in ntfs_lookup_inode_by_name()
288 vcn = le64_to_cpup((__le64 *)((u8 *)ie + le16_to_cpu(ie->length) - 8)); in ntfs_lookup_inode_by_name()
305 ia_mapping = ia_vi->i_mapping; in ntfs_lookup_inode_by_name()
313 dir_ni->itype.index.vcn_size_bits >> PAGE_SHIFT, NULL); in ntfs_lookup_inode_by_name()
316 -PTR_ERR(folio)); in ntfs_lookup_inode_by_name()
324 err = -ENOMEM; in ntfs_lookup_inode_by_name()
337 dir_ni->itype.index.vcn_size_bits) & ~PAGE_MASK)); in ntfs_lookup_inode_by_name()
342 dir_ni->mft_no); in ntfs_lookup_inode_by_name()
346 if (unlikely(!ntfs_is_indx_record(ia->magic))) { in ntfs_lookup_inode_by_name()
349 vcn, dir_ni->mft_no); in ntfs_lookup_inode_by_name()
352 if (le64_to_cpu(ia->index_block_vcn) != vcn) { in ntfs_lookup_inode_by_name()
355 le64_to_cpu(ia->index_block_vcn), in ntfs_lookup_inode_by_name()
356 vcn, dir_ni->mft_no); in ntfs_lookup_inode_by_name()
359 if (le32_to_cpu(ia->index.allocated_size) + 0x18 != in ntfs_lookup_inode_by_name()
360 dir_ni->itype.index.block_size) { in ntfs_lookup_inode_by_name()
363 vcn, dir_ni->mft_no, in ntfs_lookup_inode_by_name()
364 le32_to_cpu(ia->index.allocated_size) + 0x18, in ntfs_lookup_inode_by_name()
365 dir_ni->itype.index.block_size); in ntfs_lookup_inode_by_name()
368 index_end = (u8 *)ia + dir_ni->itype.index.block_size; in ntfs_lookup_inode_by_name()
372 vcn, dir_ni->mft_no); in ntfs_lookup_inode_by_name()
375 index_end = (u8 *)&ia->index + le32_to_cpu(ia->index.index_length); in ntfs_lookup_inode_by_name()
376 if (index_end > (u8 *)ia + dir_ni->itype.index.block_size) { in ntfs_lookup_inode_by_name()
379 vcn, dir_ni->mft_no); in ntfs_lookup_inode_by_name()
383 ie = (struct index_entry *)((u8 *)&ia->index + in ntfs_lookup_inode_by_name()
384 le32_to_cpu(ia->index.entries_offset)); in ntfs_lookup_inode_by_name()
387 * loop until we exceed valid memory (corruption case) or until we in ntfs_lookup_inode_by_name()
390 for (;; ie = (struct index_entry *)((u8 *)ie + le16_to_cpu(ie->length))) { in ntfs_lookup_inode_by_name()
394 (u8 *)ie + sizeof(struct index_entry_header) + le16_to_cpu(ie->key_length) > in ntfs_lookup_inode_by_name()
395 index_end || (u8 *)ie + le16_to_cpu(ie->length) > index_end) { in ntfs_lookup_inode_by_name()
397 dir_ni->mft_no); in ntfs_lookup_inode_by_name()
404 if (ie->flags & INDEX_ENTRY_END) in ntfs_lookup_inode_by_name()
407 if (!ie->key_length) in ntfs_lookup_inode_by_name()
411 dir_ni->mft_no)) in ntfs_lookup_inode_by_name()
414 * We perform a case sensitive comparison and if that matches in ntfs_lookup_inode_by_name()
421 (__le16 *)&ie->key.file_name.file_name, in ntfs_lookup_inode_by_name()
422 ie->key.file_name.file_name_length, in ntfs_lookup_inode_by_name()
423 CASE_SENSITIVE, vol->upcase, vol->upcase_len)) { in ntfs_lookup_inode_by_name()
435 if (ie->key.file_name.file_name_type == FILE_NAME_DOS) { in ntfs_lookup_inode_by_name()
440 err = -ENOMEM; in ntfs_lookup_inode_by_name()
444 name->mref = le64_to_cpu( in ntfs_lookup_inode_by_name()
445 ie->data.dir.indexed_file); in ntfs_lookup_inode_by_name()
446 name->type = FILE_NAME_DOS; in ntfs_lookup_inode_by_name()
447 name->len = 0; in ntfs_lookup_inode_by_name()
453 mref = le64_to_cpu(ie->data.dir.indexed_file); in ntfs_lookup_inode_by_name()
459 * For a case insensitive mount, we also perform a case in ntfs_lookup_inode_by_name()
469 ie->key.file_name.file_name_type == FILE_NAME_DOS) && in ntfs_lookup_inode_by_name()
471 (__le16 *)&ie->key.file_name.file_name, in ntfs_lookup_inode_by_name()
472 ie->key.file_name.file_name_length, in ntfs_lookup_inode_by_name()
473 IGNORE_CASE, vol->upcase, in ntfs_lookup_inode_by_name()
474 vol->upcase_len)) { in ntfs_lookup_inode_by_name()
476 u8 type = ie->key.file_name.file_name_type; in ntfs_lookup_inode_by_name()
477 u8 len = ie->key.file_name.file_name_length; in ntfs_lookup_inode_by_name()
479 /* Only one case insensitive matching name allowed. */ in ntfs_lookup_inode_by_name()
491 err = -ENOMEM; in ntfs_lookup_inode_by_name()
494 name->mref = le64_to_cpu(ie->data.dir.indexed_file); in ntfs_lookup_inode_by_name()
495 name->type = type; in ntfs_lookup_inode_by_name()
497 name->len = len; in ntfs_lookup_inode_by_name()
498 memcpy(name->name, ie->key.file_name.file_name, in ntfs_lookup_inode_by_name()
501 name->len = 0; in ntfs_lookup_inode_by_name()
509 (__le16 *)&ie->key.file_name.file_name, in ntfs_lookup_inode_by_name()
510 ie->key.file_name.file_name_length, 1, in ntfs_lookup_inode_by_name()
511 IGNORE_CASE, vol->upcase, vol->upcase_len); in ntfs_lookup_inode_by_name()
517 if (rc == -1) in ntfs_lookup_inode_by_name()
523 * Names match with case insensitive comparison, now try the in ntfs_lookup_inode_by_name()
524 * case sensitive comparison, which is required for proper in ntfs_lookup_inode_by_name()
528 (__le16 *)&ie->key.file_name.file_name, in ntfs_lookup_inode_by_name()
529 ie->key.file_name.file_name_length, 1, in ntfs_lookup_inode_by_name()
530 CASE_SENSITIVE, vol->upcase, vol->upcase_len); in ntfs_lookup_inode_by_name()
531 if (rc == -1) in ntfs_lookup_inode_by_name()
546 if (ie->flags & INDEX_ENTRY_NODE) { in ntfs_lookup_inode_by_name()
547 if ((ia->index.flags & NODE_MASK) == LEAF_NODE) { in ntfs_lookup_inode_by_name()
550 dir_ni->mft_no); in ntfs_lookup_inode_by_name()
556 le16_to_cpu(ie->length) - 8)); in ntfs_lookup_inode_by_name()
570 dir_ni->mft_no); in ntfs_lookup_inode_by_name()
574 * No child node present, return -ENOENT, unless we have got a matching in ntfs_lookup_inode_by_name()
575 * name cached in name in which case return the mft reference in ntfs_lookup_inode_by_name()
581 return name->mref; in ntfs_lookup_inode_by_name()
584 err = -ENOENT; in ntfs_lookup_inode_by_name()
589 err = -EIO; in ntfs_lookup_inode_by_name()
605 * ntfs_filldir - ntfs specific filldir method
620 * @filldir() call otherwise we would deadlock with NFSd when it calls ->lookup
622 * retake the lock if we are returning a non-zero value as ntfs_readdir()
634 name_type = ie->key.file_name.file_name_type; in ntfs_filldir()
639 if (MREF_LE(ie->data.dir.indexed_file) == FILE_root) { in ntfs_filldir()
643 if (MREF_LE(ie->data.dir.indexed_file) < FILE_first_user && in ntfs_filldir()
649 (ie->key.file_name.file_attributes & FILE_ATTR_HIDDEN)) { in ntfs_filldir()
654 name_len = ntfs_ucstonls(vol, (__le16 *)&ie->key.file_name.file_name, in ntfs_filldir()
655 ie->key.file_name.file_name_length, &name, in ntfs_filldir()
658 ntfs_warning(vol->sb, "Skipping unrepresentable inode 0x%llx.", in ntfs_filldir()
659 (long long)MREF_LE(ie->data.dir.indexed_file)); in ntfs_filldir()
663 mref = MREF_LE(ie->data.dir.indexed_file); in ntfs_filldir()
664 if (ie->key.file_name.file_attributes & in ntfs_filldir()
667 else if (ie->key.file_name.file_attributes & FILE_ATTR_REPARSE_POINT) in ntfs_filldir()
674 * ->lookup since ntfs_lookup() will lock the same page. in ntfs_filldir()
679 name, name_len, actor->pos, mref, dt_type == DT_DIR ? "DIR" : "REG"); in ntfs_filldir()
682 /* Relock the page but not if we are aborting ->readdir. */ in ntfs_filldir()
703 struct rb_node **new = &root->rb_node, *parent = NULL; in ntfs_insert_rb()
709 if (nir->start_index < cnir->start_index) in ntfs_insert_rb()
710 new = &parent->rb_left; in ntfs_insert_rb()
711 else if (nir->start_index >= cnir->start_index + cnir->count) in ntfs_insert_rb()
712 new = &parent->rb_right; in ntfs_insert_rb()
715 nir->start_index, nir->count, cnir->start_index, cnir->count); in ntfs_insert_rb()
720 rb_link_node(&nir->rb_node, parent, new); in ntfs_insert_rb()
721 rb_insert_color(&nir->rb_node, root); in ntfs_insert_rb()
730 dir_end_index = (i_size_read(ia_vi) + PAGE_SIZE - 1) >> PAGE_SHIFT; in ntfs_ia_blocks_readahead()
731 dir_start_index = (pos + PAGE_SIZE - 1) >> PAGE_SHIFT; in ntfs_ia_blocks_readahead()
738 return -ENOMEM; in ntfs_ia_blocks_readahead()
740 file_ra_state_init(dir_ra, ia_vi->i_mapping); in ntfs_ia_blocks_readahead()
741 dir_end_index = (i_size_read(ia_vi) + PAGE_SIZE - 1) >> PAGE_SHIFT; in ntfs_ia_blocks_readahead()
742 dir_start_index = (pos + PAGE_SIZE - 1) >> PAGE_SHIFT; in ntfs_ia_blocks_readahead()
743 dir_ra->ra_pages = dir_end_index - dir_start_index; in ntfs_ia_blocks_readahead()
744 page_cache_sync_readahead(ia_vi->i_mapping, dir_ra, NULL, in ntfs_ia_blocks_readahead()
745 dir_start_index, dir_end_index - dir_start_index); in ntfs_ia_blocks_readahead()
754 struct super_block *sb = vdir->i_sb; in ntfs_readdir()
771 ndir->mft_no, actor->pos); in ntfs_readdir()
773 if (file->private_data) { in ntfs_readdir()
774 private = file->private_data; in ntfs_readdir()
776 if (actor->pos != private->curr_pos) { in ntfs_readdir()
778 * If actor->pos is different from the previous passed in ntfs_readdir()
779 * one, Discard the private->key and fill dirent buffer in ntfs_readdir()
782 kfree(private->key); in ntfs_readdir()
783 private->key = NULL; in ntfs_readdir()
784 private->end_in_iterate = false; in ntfs_readdir()
785 } else if (private->end_in_iterate) { in ntfs_readdir()
786 kfree(private->key); in ntfs_readdir()
787 kfree(file->private_data); in ntfs_readdir()
788 file->private_data = NULL; in ntfs_readdir()
803 return -ENOMEM; in ntfs_readdir()
805 mutex_lock_nested(&ndir->mrec_lock, NTFS_INODE_MUTEX_PARENT); in ntfs_readdir()
809 mutex_unlock(&ndir->mrec_lock); in ntfs_readdir()
810 return -ENOMEM; in ntfs_readdir()
817 mutex_unlock(&ndir->mrec_lock); in ntfs_readdir()
818 return -ENOMEM; in ntfs_readdir()
820 file_ra_state_init(ra, vol->mft_ino->i_mapping); in ntfs_readdir()
822 if (private && private->key) { in ntfs_readdir()
824 * Find index witk private->key using ntfs_index_lookup() in ntfs_readdir()
827 err = ntfs_index_lookup(private->key, in ntfs_readdir()
828 le16_to_cpu(private->key_length), in ntfs_readdir()
831 next = ictx->entry; in ntfs_readdir()
833 * Update ie_pos with private->curr_pos in ntfs_readdir()
836 ie_pos = private->curr_pos; in ntfs_readdir()
838 if (actor->pos > vol->mft_record_size && ictx->ia_ni) { in ntfs_readdir()
839 err = ntfs_ia_blocks_readahead(ictx->ia_ni, actor->pos); in ntfs_readdir()
851 err = -ENOMEM; in ntfs_readdir()
854 file->private_data = private; in ntfs_readdir()
859 err = -ENOMEM; in ntfs_readdir()
867 ndir->mft_no); in ntfs_readdir()
869 err = -ENOMEM; in ntfs_readdir()
874 ir = (struct index_root *)((u8 *)ctx->attr + in ntfs_readdir()
875 le16_to_cpu(ctx->attr->data.resident.value_offset)); in ntfs_readdir()
877 ictx->ir = ir; in ntfs_readdir()
878 ictx->actx = ctx; in ntfs_readdir()
879 ictx->parent_vcn[ictx->pindex] = VCN_INDEX_ROOT_PARENT; in ntfs_readdir()
880 ictx->is_in_root = true; in ntfs_readdir()
881 ictx->parent_pos[ictx->pindex] = 0; in ntfs_readdir()
883 ictx->block_size = le32_to_cpu(ir->index_block_size); in ntfs_readdir()
884 if (ictx->block_size < NTFS_BLOCK_SIZE) { in ntfs_readdir()
886 ictx->block_size, NTFS_BLOCK_SIZE); in ntfs_readdir()
887 err = -EIO; in ntfs_readdir()
891 if (vol->cluster_size <= ictx->block_size) in ntfs_readdir()
892 ictx->vcn_size_bits = vol->cluster_size_bits; in ntfs_readdir()
894 ictx->vcn_size_bits = NTFS_BLOCK_SIZE_BITS; in ntfs_readdir()
897 next = (struct index_entry *)((u8 *)&ir->index + in ntfs_readdir()
898 le32_to_cpu(ir->index.entries_offset)); in ntfs_readdir()
900 if (next->flags & INDEX_ENTRY_NODE) { in ntfs_readdir()
901 ictx->ia_ni = ntfs_ia_open(ictx, ictx->idx_ni); in ntfs_readdir()
902 if (!ictx->ia_ni) { in ntfs_readdir()
903 err = -EINVAL; in ntfs_readdir()
907 err = ntfs_ia_blocks_readahead(ictx->ia_ni, actor->pos); in ntfs_readdir()
912 if (next->flags & INDEX_ENTRY_NODE) { in ntfs_readdir()
920 if (next && !(next->flags & INDEX_ENTRY_END)) in ntfs_readdir()
934 ndir->mft_no)) { in ntfs_readdir()
935 err = -EIO; in ntfs_readdir()
939 if (ie_pos < actor->pos) { in ntfs_readdir()
940 ie_pos += le16_to_cpu(next->length); in ntfs_readdir()
944 actor->pos = ie_pos; in ntfs_readdir()
947 MREF_LE(next->data.dir.indexed_file)); in ntfs_readdir()
952 if (nir->start_index <= index && in ntfs_readdir()
953 index < nir->start_index + nir->count) { in ntfs_readdir()
960 if (cnir->start_index <= index && in ntfs_readdir()
961 index < cnir->start_index + cnir->count) { in ntfs_readdir()
963 } else if (cnir->start_index + cnir->count == index) { in ntfs_readdir()
964 cnir->count++; in ntfs_readdir()
966 } else if (!cnir->start_index && cnir->start_index - 1 == index) { in ntfs_readdir()
967 cnir->start_index = index; in ntfs_readdir()
971 if (index < cnir->start_index) in ntfs_readdir()
972 node = node->rb_left; in ntfs_readdir()
973 else if (index >= cnir->start_index + cnir->count) in ntfs_readdir()
974 node = node->rb_right; in ntfs_readdir()
977 if (nir->start_index + nir->count == index) { in ntfs_readdir()
978 nir->count++; in ntfs_readdir()
979 } else if (!nir->start_index && nir->start_index - 1 == index) { in ntfs_readdir()
980 nir->start_index = index; in ntfs_readdir()
981 } else if (nir->count > 2) { in ntfs_readdir()
985 nir->start_index = index; in ntfs_readdir()
986 nir->count = 1; in ntfs_readdir()
993 nir->start_index = index; in ntfs_readdir()
994 nir->count = 1; in ntfs_readdir()
1006 private = file->private_data; in ntfs_readdir()
1007 kfree(private->key); in ntfs_readdir()
1008 private->key = kmalloc(le16_to_cpu(next->key_length), GFP_KERNEL); in ntfs_readdir()
1009 if (!private->key) { in ntfs_readdir()
1010 err = -ENOMEM; in ntfs_readdir()
1014 memcpy(private->key, &next->key.file_name, le16_to_cpu(next->key_length)); in ntfs_readdir()
1015 private->key_length = next->key_length; in ntfs_readdir()
1018 ie_pos += le16_to_cpu(next->length); in ntfs_readdir()
1022 private->end_in_iterate = true; in ntfs_readdir()
1026 private->curr_pos = actor->pos = ie_pos; in ntfs_readdir()
1034 ra->ra_pages = cnir->count; in ntfs_readdir()
1035 page_cache_sync_readahead(vol->mft_ino->i_mapping, ra, NULL, in ntfs_readdir()
1036 cnir->start_index, cnir->count); in ntfs_readdir()
1043 private->curr_pos = actor->pos; in ntfs_readdir()
1044 private->end_in_iterate = true; in ntfs_readdir()
1052 mutex_unlock(&ndir->mrec_lock); in ntfs_readdir()
1061 if (!(ni_mrec->flags & MFT_RECORD_IS_DIRECTORY)) in ntfs_check_empty_dir()
1066 ntfs_error(ni->vol->sb, "Failed to get search context"); in ntfs_check_empty_dir()
1067 return -ENOMEM; in ntfs_check_empty_dir()
1074 ntfs_error(ni->vol->sb, "Index root attribute missing in directory inode %llu", in ntfs_check_empty_dir()
1075 ni->mft_no); in ntfs_check_empty_dir()
1080 /* Non-empty directory? */ in ntfs_check_empty_dir()
1081 if (le32_to_cpu(ctx->attr->data.resident.value_length) != in ntfs_check_empty_dir()
1084 ret = -ENOTEMPTY; in ntfs_check_empty_dir()
1094 * ntfs_dir_open - called when an inode is about to be opened
1099 * long is 32-bits. This is the most we can do for now without overflowing the
1103 * anyone is going to hit this check on a 32-bit architecture, so there is no
1106 * On 64-bit architectures, the check is hopefully optimized away by the
1113 return -EFBIG; in ntfs_dir_open()
1120 if (filp->private_data) { in ntfs_dir_release()
1121 kfree(((struct ntfs_file_private *)filp->private_data)->key); in ntfs_dir_release()
1122 kfree(filp->private_data); in ntfs_dir_release()
1123 filp->private_data = NULL; in ntfs_dir_release()
1129 * ntfs_dir_fsync - sync a directory to disk
1133 * @datasync: if non-zero only flush user data and not metadata
1152 struct inode *bmp_vi, *vi = filp->f_mapping->host; in ntfs_dir_fsync()
1153 struct ntfs_volume *vol = NTFS_I(vi)->vol; in ntfs_dir_fsync()
1160 ntfs_debug("Entering for inode 0x%llx.", ni->mft_no); in ntfs_dir_fsync()
1163 return -EIO; in ntfs_dir_fsync()
1167 return -ENOMEM; in ntfs_dir_fsync()
1169 mutex_lock_nested(&ni->mrec_lock, NTFS_INODE_MUTEX_NORMAL_CHILD); in ntfs_dir_fsync()
1171 struct file_name_attr *fn = (struct file_name_attr *)((u8 *)ctx->attr + in ntfs_dir_fsync()
1172 le16_to_cpu(ctx->attr->data.resident.value_offset)); in ntfs_dir_fsync()
1174 if (MREF_LE(fn->parent_directory) == ni->mft_no) in ntfs_dir_fsync()
1177 parent_vi = ntfs_iget(vi->i_sb, MREF_LE(fn->parent_directory)); in ntfs_dir_fsync()
1180 mutex_lock_nested(&NTFS_I(parent_vi)->mrec_lock, NTFS_INODE_MUTEX_NORMAL); in ntfs_dir_fsync()
1182 mutex_unlock(&NTFS_I(parent_vi)->mrec_lock); in ntfs_dir_fsync()
1192 mutex_unlock(&ni->mrec_lock); in ntfs_dir_fsync()
1201 na.mft_no = vi->i_ino; in ntfs_dir_fsync()
1205 bmp_vi = ilookup5(vi->i_sb, vi->i_ino, ntfs_test_inode, &na); in ntfs_dir_fsync()
1214 write_inode_now(vol->mftbmp_ino, 1); in ntfs_dir_fsync()
1215 down_write(&vol->lcnbmp_lock); in ntfs_dir_fsync()
1216 write_inode_now(vol->lcnbmp_ino, 1); in ntfs_dir_fsync()
1217 up_write(&vol->lcnbmp_lock); in ntfs_dir_fsync()
1218 write_inode_now(vol->mft_ino, 1); in ntfs_dir_fsync()
1220 err = sync_blockdev(vi->i_sb->s_bdev); in ntfs_dir_fsync()
1226 ntfs_warning(vi->i_sb, in ntfs_dir_fsync()
1228 datasync ? "data" : "", ni->mft_no, -ret); in ntfs_dir_fsync()
1235 .read = generic_read_dir, /* Return -EISDIR. */