Lines Matching +full:de +full:- +full:be
1 // SPDX-License-Identifier: GPL-2.0
7 * Laboratoire MASI - Institut Blaise Pascal
16 * Big-endian to little-endian byte-swapping/bitmaps by
19 * for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998
60 if (unlikely(EXT4_SB(inode->i_sb)->s_max_dir_size_kb && in ext4_append()
61 ((inode->i_size >> 10) >= in ext4_append()
62 EXT4_SB(inode->i_sb)->s_max_dir_size_kb))) in ext4_append()
63 return ERR_PTR(-ENOSPC); in ext4_append()
65 *block = inode->i_size >> inode->i_sb->s_blocksize_bits; in ext4_append()
70 inode->i_size += inode->i_sb->s_blocksize; in ext4_append()
71 EXT4_I(inode)->i_disksize = inode->i_size; in ext4_append()
73 err = ext4_journal_get_write_access(handle, inode->i_sb, bh, in ext4_append()
77 ext4_std_error(inode->i_sb, err); in ext4_append()
88 * block being read to be an index block, or a block containing
93 * the caller doesn't know what kind of directory block will be read,
94 * so no specific verification will be done.
113 if (ext4_simulate_fail(inode->i_sb, EXT4_SIM_DIRBLOCK_EIO)) in __ext4_read_dirblock()
114 bh = ERR_PTR(-EIO); in __ext4_read_dirblock()
118 __ext4_warning(inode->i_sb, func, line, in __ext4_read_dirblock()
121 inode->i_ino, (unsigned long)block, in __ext4_read_dirblock()
122 current->comm, PTR_ERR(bh)); in __ext4_read_dirblock()
130 return ERR_PTR(-EFSCORRUPTED); in __ext4_read_dirblock()
134 dirent = (struct ext4_dir_entry *) bh->b_data; in __ext4_read_dirblock()
139 else if (ext4_rec_len_from_disk(dirent->rec_len, in __ext4_read_dirblock()
140 inode->i_sb->s_blocksize) == in __ext4_read_dirblock()
141 inode->i_sb->s_blocksize) in __ext4_read_dirblock()
148 return ERR_PTR(-EFSCORRUPTED); in __ext4_read_dirblock()
150 if (!ext4_has_metadata_csum(inode->i_sb) || in __ext4_read_dirblock()
157 * caller is sure it should be an index block. in __ext4_read_dirblock()
161 !ext4_simulate_fail(inode->i_sb, EXT4_SIM_DIRBLOCK_CRC)) in __ext4_read_dirblock()
168 return ERR_PTR(-EFSBADCRC); in __ext4_read_dirblock()
173 !ext4_simulate_fail(inode->i_sb, EXT4_SIM_DIRBLOCK_CRC)) in __ext4_read_dirblock()
180 return ERR_PTR(-EFSBADCRC); in __ext4_read_dirblock()
214 * dirent the two low bits of the hash version will be zero. Therefore, the
215 * hash version mod 4 should never be 0. Sincerely, the paranoia department.
280 static int dx_make_map(struct inode *dir, struct ext4_dir_entry_2 *de,
305 struct ext4_dir_entry_tail *t = EXT4_DIRENT_TAIL(bh->b_data, blocksize); in ext4_initialize_dirent_tail()
308 t->det_rec_len = ext4_rec_len_to_disk( in ext4_initialize_dirent_tail()
310 t->det_reserved_ft = EXT4_FT_DIR_CSUM; in ext4_initialize_dirent_tail()
322 d = (struct ext4_dir_entry *)bh->b_data; in get_dirent_tail()
323 top = (struct ext4_dir_entry *)(bh->b_data + in get_dirent_tail()
324 (EXT4_BLOCK_SIZE(inode->i_sb) - in get_dirent_tail()
326 while (d < top && d->rec_len) in get_dirent_tail()
328 le16_to_cpu(d->rec_len)); in get_dirent_tail()
335 t = EXT4_DIRENT_TAIL(bh->b_data, EXT4_BLOCK_SIZE(inode->i_sb)); in get_dirent_tail()
338 if (t->det_reserved_zero1 || in get_dirent_tail()
339 le16_to_cpu(t->det_rec_len) != sizeof(struct ext4_dir_entry_tail) || in get_dirent_tail()
340 t->det_reserved_zero2 || in get_dirent_tail()
341 t->det_reserved_ft != EXT4_FT_DIR_CSUM) in get_dirent_tail()
349 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_dirblock_csum()
353 csum = ext4_chksum(sbi, ei->i_csum_seed, (__u8 *)dirent, size); in ext4_dirblock_csum()
364 "No space for directory leaf checksum. Please run e2fsck -D."); in __warn_no_space_for_csum()
371 if (!ext4_has_metadata_csum(inode->i_sb)) in ext4_dirblock_csum_verify()
380 if (t->det_checksum != ext4_dirblock_csum(inode, bh->b_data, in ext4_dirblock_csum_verify()
381 (char *)t - bh->b_data)) in ext4_dirblock_csum_verify()
392 if (!ext4_has_metadata_csum(inode->i_sb)) in ext4_dirblock_csum_set()
401 t->det_checksum = ext4_dirblock_csum(inode, bh->b_data, in ext4_dirblock_csum_set()
402 (char *)t - bh->b_data); in ext4_dirblock_csum_set()
421 if (le16_to_cpu(dirent->rec_len) == EXT4_BLOCK_SIZE(inode->i_sb)) in get_dx_countlimit()
423 else if (le16_to_cpu(dirent->rec_len) == 12) { in get_dx_countlimit()
425 if (le16_to_cpu(dp->rec_len) != in get_dx_countlimit()
426 EXT4_BLOCK_SIZE(inode->i_sb) - 12) in get_dx_countlimit()
429 if (root->reserved_zero || in get_dx_countlimit()
430 root->info_length != sizeof(struct dx_root_info)) in get_dx_countlimit()
444 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_dx_csum()
452 csum = ext4_chksum(sbi, ei->i_csum_seed, (__u8 *)dirent, size); in ext4_dx_csum()
466 if (!ext4_has_metadata_csum(inode->i_sb)) in ext4_dx_csum_verify()
471 EXT4_ERROR_INODE(inode, "dir seems corrupt? Run e2fsck -D."); in ext4_dx_csum_verify()
474 limit = le16_to_cpu(c->limit); in ext4_dx_csum_verify()
475 count = le16_to_cpu(c->count); in ext4_dx_csum_verify()
477 EXT4_BLOCK_SIZE(inode->i_sb) - sizeof(struct dx_tail)) { in ext4_dx_csum_verify()
483 if (t->dt_checksum != ext4_dx_csum(inode, dirent, count_offset, in ext4_dx_csum_verify()
495 if (!ext4_has_metadata_csum(inode->i_sb)) in ext4_dx_csum_set()
500 EXT4_ERROR_INODE(inode, "dir seems corrupt? Run e2fsck -D."); in ext4_dx_csum_set()
503 limit = le16_to_cpu(c->limit); in ext4_dx_csum_set()
504 count = le16_to_cpu(c->count); in ext4_dx_csum_set()
506 EXT4_BLOCK_SIZE(inode->i_sb) - sizeof(struct dx_tail)) { in ext4_dx_csum_set()
512 t->dt_checksum = ext4_dx_csum(inode, dirent, count_offset, count, t); in ext4_dx_csum_set()
519 ext4_dx_csum_set(inode, (struct ext4_dir_entry *)bh->b_data); in ext4_handle_dirty_dx_node()
530 ext4_rec_len_from_disk(p->rec_len, blocksize)); in ext4_next_entry()
534 * Future: use high four bits of block for coalesce-on-delete flags
540 return le32_to_cpu(entry->block) & 0x0fffffff; in dx_get_block()
545 entry->block = cpu_to_le32(value); in dx_set_block()
550 return le32_to_cpu(entry->hash); in dx_get_hash()
555 entry->hash = cpu_to_le32(value); in dx_set_hash()
560 return le16_to_cpu(((struct dx_countlimit *) entries)->count); in dx_get_count()
565 return le16_to_cpu(((struct dx_countlimit *) entries)->limit); in dx_get_limit()
570 ((struct dx_countlimit *) entries)->count = cpu_to_le16(value); in dx_set_count()
575 ((struct dx_countlimit *) entries)->limit = cpu_to_le16(value); in dx_set_limit()
580 unsigned int entry_space = dir->i_sb->s_blocksize - in dx_root_limit()
581 ext4_dir_rec_len(1, NULL) - in dx_root_limit()
582 ext4_dir_rec_len(2, NULL) - infosize; in dx_root_limit()
584 if (ext4_has_metadata_csum(dir->i_sb)) in dx_root_limit()
585 entry_space -= sizeof(struct dx_tail); in dx_root_limit()
591 unsigned int entry_space = dir->i_sb->s_blocksize - in dx_node_limit()
594 if (ext4_has_metadata_csum(dir->i_sb)) in dx_node_limit()
595 entry_space -= sizeof(struct dx_tail); in dx_node_limit()
608 printk(KERN_CONT " %x->%lu", in dx_show_index()
624 struct ext4_dir_entry_2 *de, in dx_show_leaf() argument
628 char *base = (char *) de; in dx_show_leaf()
632 while ((char *) de < base + size) in dx_show_leaf()
634 if (de->inode) in dx_show_leaf()
645 name = de->name; in dx_show_leaf()
646 len = de->name_len; in dx_show_leaf()
649 ext4fs_dirhash(dir, de->name, in dx_show_leaf()
650 de->name_len, &h); in dx_show_leaf()
653 (unsigned) ((char *) de in dx_show_leaf()
654 - base)); in dx_show_leaf()
665 "buffer--skipping " in dx_show_leaf()
682 h.hash = EXT4_DIRENT_HASH(de); in dx_show_leaf()
684 ext4fs_dirhash(dir, de->name, in dx_show_leaf()
685 de->name_len, &h); in dx_show_leaf()
687 h.hash, (unsigned) ((char *) de in dx_show_leaf()
688 - base)); in dx_show_leaf()
693 int len = de->name_len; in dx_show_leaf()
694 char *name = de->name; in dx_show_leaf()
695 ext4fs_dirhash(dir, de->name, de->name_len, &h); in dx_show_leaf()
697 (unsigned) ((char *) de - base)); in dx_show_leaf()
700 space += ext4_dir_rec_len(de->name_len, dir); in dx_show_leaf()
703 de = ext4_next_entry(de, size); in dx_show_leaf()
712 unsigned blocksize = dir->i_sb->s_blocksize; in dx_show_entries()
721 u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash; in dx_show_entries()
728 dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): in dx_show_entries()
730 bh->b_data, blocksize, 0); in dx_show_entries()
750 while (n--) { in htree_rep_invariant_check()
753 at--; in htree_rep_invariant_check()
757 ASSERT(at == target - 1); in htree_rep_invariant_check()
788 frame->bh = ext4_read_dirblock(dir, 0, INDEX); in dx_probe()
789 if (IS_ERR(frame->bh)) in dx_probe()
790 return (struct dx_frame *) frame->bh; in dx_probe()
792 root = (struct dx_root *) frame->bh->b_data; in dx_probe()
793 if (root->info.hash_version != DX_HASH_TEA && in dx_probe()
794 root->info.hash_version != DX_HASH_HALF_MD4 && in dx_probe()
795 root->info.hash_version != DX_HASH_LEGACY && in dx_probe()
796 root->info.hash_version != DX_HASH_SIPHASH) { in dx_probe()
798 root->info.hash_version); in dx_probe()
802 if (root->info.hash_version != DX_HASH_SIPHASH) { in dx_probe()
808 if (root->info.hash_version == DX_HASH_SIPHASH) { in dx_probe()
815 hinfo = &fname->hinfo; in dx_probe()
816 hinfo->hash_version = root->info.hash_version; in dx_probe()
817 if (hinfo->hash_version <= DX_HASH_TEA) in dx_probe()
818 hinfo->hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned; in dx_probe()
819 hinfo->seed = EXT4_SB(dir->i_sb)->s_hash_seed; in dx_probe()
824 hash = hinfo->hash; in dx_probe()
826 if (root->info.unused_flags & 1) { in dx_probe()
828 root->info.unused_flags); in dx_probe()
832 indirect = root->info.indirect_levels; in dx_probe()
833 if (indirect >= ext4_dir_htree_level(dir->i_sb)) { in dx_probe()
834 ext4_warning(dir->i_sb, in dx_probe()
836 "supported value", dir->i_ino, in dx_probe()
837 ext4_dir_htree_level(dir->i_sb)); in dx_probe()
838 if (ext4_dir_htree_level(dir->i_sb) < EXT4_HTREE_LEVEL) { in dx_probe()
839 ext4_warning(dir->i_sb, "Enable large directory " in dx_probe()
845 entries = (struct dx_entry *)(((char *)&root->info) + in dx_probe()
846 root->info.info_length); in dx_probe()
849 root->info.info_length)) { in dx_probe()
852 dx_root_limit(dir, root->info.info_length)); in dx_probe()
867 q = entries + count - 1; in dx_probe()
869 m = p + (q - p) / 2; in dx_probe()
872 q = m - 1; in dx_probe()
877 htree_rep_invariant_check(entries, p, hash, count - 1); in dx_probe()
879 at = p - 1; in dx_probe()
880 dxtrace(printk(KERN_CONT " %x->%u\n", in dx_probe()
883 frame->entries = entries; in dx_probe()
884 frame->at = at; in dx_probe()
885 if (!indirect--) in dx_probe()
888 frame->bh = ext4_read_dirblock(dir, dx_get_block(at), INDEX); in dx_probe()
889 if (IS_ERR(frame->bh)) { in dx_probe()
890 ret_err = (struct dx_frame *) frame->bh; in dx_probe()
891 frame->bh = NULL; in dx_probe()
894 entries = ((struct dx_node *) frame->bh->b_data)->entries; in dx_probe()
905 brelse(frame->bh); in dx_probe()
906 frame--; in dx_probe()
924 info = &((struct dx_root *)frames[0].bh->b_data)->info; in dx_release()
925 /* save local copy, "info" may be freed after brelse() */ in dx_release()
926 indirect_levels = info->indirect_levels; in dx_release()
938 * should be necessary. Whether or not the search is necessary is
949 * If start_hash is non-null, it will be filled in with the starting
968 * nodes need to be read. in ext4_htree_next_block()
971 if (++(p->at) < p->entries + dx_get_count(p->entries)) in ext4_htree_next_block()
976 p--; in ext4_htree_next_block()
986 bhash = dx_get_hash(p->at); in ext4_htree_next_block()
997 while (num_frames--) { in ext4_htree_next_block()
998 bh = ext4_read_dirblock(dir, dx_get_block(p->at), INDEX); in ext4_htree_next_block()
1002 brelse(p->bh); in ext4_htree_next_block()
1003 p->bh = bh; in ext4_htree_next_block()
1004 p->at = p->entries = ((struct dx_node *) bh->b_data)->entries; in ext4_htree_next_block()
1011 * This function fills a red-black tree with information from a
1021 struct ext4_dir_entry_2 *de, *top; in htree_dirblock_to_tree() local
1024 int csum = ext4_has_metadata_csum(dir->i_sb); in htree_dirblock_to_tree()
1032 de = (struct ext4_dir_entry_2 *) bh->b_data; in htree_dirblock_to_tree()
1034 top = (struct ext4_dir_entry_2 *) ((char *) de + in htree_dirblock_to_tree()
1035 dir->i_sb->s_blocksize - in htree_dirblock_to_tree()
1053 for (; de < top; de = ext4_next_entry(de, dir->i_sb->s_blocksize)) { in htree_dirblock_to_tree()
1054 if (ext4_check_dir_entry(dir, NULL, de, bh, in htree_dirblock_to_tree()
1055 bh->b_data, bh->b_size, in htree_dirblock_to_tree()
1056 (block<<EXT4_BLOCK_SIZE_BITS(dir->i_sb)) in htree_dirblock_to_tree()
1057 + ((char *)de - bh->b_data))) { in htree_dirblock_to_tree()
1062 if (de->name_len && de->inode) { in htree_dirblock_to_tree()
1063 hinfo->hash = EXT4_DIRENT_HASH(de); in htree_dirblock_to_tree()
1064 hinfo->minor_hash = EXT4_DIRENT_MINOR_HASH(de); in htree_dirblock_to_tree()
1066 hinfo->hash = 0; in htree_dirblock_to_tree()
1067 hinfo->minor_hash = 0; in htree_dirblock_to_tree()
1070 ext4fs_dirhash(dir, de->name, de->name_len, hinfo); in htree_dirblock_to_tree()
1072 if ((hinfo->hash < start_hash) || in htree_dirblock_to_tree()
1073 ((hinfo->hash == start_hash) && in htree_dirblock_to_tree()
1074 (hinfo->minor_hash < start_minor_hash))) in htree_dirblock_to_tree()
1076 if (de->inode == 0) in htree_dirblock_to_tree()
1079 tmp_str.name = de->name; in htree_dirblock_to_tree()
1080 tmp_str.len = de->name_len; in htree_dirblock_to_tree()
1082 hinfo->hash, hinfo->minor_hash, de, in htree_dirblock_to_tree()
1086 struct fscrypt_str de_name = FSTR_INIT(de->name, in htree_dirblock_to_tree()
1087 de->name_len); in htree_dirblock_to_tree()
1090 err = fscrypt_fname_disk_to_usr(dir, hinfo->hash, in htree_dirblock_to_tree()
1091 hinfo->minor_hash, &de_name, in htree_dirblock_to_tree()
1098 hinfo->hash, hinfo->minor_hash, de, in htree_dirblock_to_tree()
1116 * This function fills a red-black tree with information from a
1127 struct ext4_dir_entry_2 *de; in ext4_htree_fill_tree() local
1144 EXT4_SB(dir->i_sb)->s_def_hash_version; in ext4_htree_fill_tree()
1147 EXT4_SB(dir->i_sb)->s_hash_unsigned; in ext4_htree_fill_tree()
1148 hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed; in ext4_htree_fill_tree()
1173 de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data; in ext4_htree_fill_tree()
1174 tmp_str.name = de->name; in ext4_htree_fill_tree()
1175 tmp_str.len = de->name_len; in ext4_htree_fill_tree()
1177 de, &tmp_str); in ext4_htree_fill_tree()
1183 de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data; in ext4_htree_fill_tree()
1184 de = ext4_next_entry(de, dir->i_sb->s_blocksize); in ext4_htree_fill_tree()
1185 tmp_str.name = de->name; in ext4_htree_fill_tree()
1186 tmp_str.len = de->name_len; in ext4_htree_fill_tree()
1188 de, &tmp_str); in ext4_htree_fill_tree()
1196 err = -ERESTARTSYS; in ext4_htree_fill_tree()
1200 block = dx_get_block(frame->at); in ext4_htree_fill_tree()
1240 return ext4_search_dir(bh, bh->b_data, dir->i_sb->s_blocksize, dir, in search_dirblock()
1252 static int dx_make_map(struct inode *dir, struct ext4_dir_entry_2 *de, in dx_make_map() argument
1257 char *base = (char *) de; in dx_make_map()
1260 while ((char *) de < base + blocksize) { in dx_make_map()
1261 if (de->name_len && de->inode) { in dx_make_map()
1263 h.hash = EXT4_DIRENT_HASH(de); in dx_make_map()
1265 ext4fs_dirhash(dir, de->name, de->name_len, &h); in dx_make_map()
1266 map_tail--; in dx_make_map()
1267 map_tail->hash = h.hash; in dx_make_map()
1268 map_tail->offs = ((char *) de - base)>>2; in dx_make_map()
1269 map_tail->size = le16_to_cpu(de->rec_len); in dx_make_map()
1273 /* XXX: do we need to check rec_len == 0 case? -Chris */ in dx_make_map()
1274 de = ext4_next_entry(de, blocksize); in dx_make_map()
1282 struct dx_map_entry *p, *q, *top = map + count - 1; in dx_sort_map()
1287 if (count - 9 < 2) /* 9, 10 -> 11 */ in dx_sort_map()
1289 for (p = top, q = p - count; q >= map; p--, q--) in dx_sort_map()
1290 if (p->hash < q->hash) in dx_sort_map()
1297 while (q-- > map) { in dx_sort_map()
1308 struct dx_entry *entries = frame->entries; in dx_insert_block()
1309 struct dx_entry *old = frame->at, *new = old + 1; in dx_insert_block()
1314 memmove(new + 1, new, (char *)(entries + count) - (char *)(new)); in dx_insert_block()
1322 * Test whether a case-insensitive directory entry matches the filename
1332 const struct super_block *sb = parent->i_sb; in ext4_ci_compare()
1333 const struct unicode_map *um = sb->s_encoding; in ext4_ci_compare()
1344 return -ENOMEM; in ext4_ci_compare()
1362 ret = -EINVAL; in ext4_ci_compare()
1363 else if (name->len != entry.len) in ext4_ci_compare()
1366 ret = !!memcmp(name->name, entry.name, entry.len); in ext4_ci_compare()
1376 struct fscrypt_str *cf_name = &name->cf_name; in ext4_fname_setup_ci_filename()
1377 struct dx_hash_info *hinfo = &name->hinfo; in ext4_fname_setup_ci_filename()
1380 if (!IS_CASEFOLDED(dir) || !dir->i_sb->s_encoding || in ext4_fname_setup_ci_filename()
1382 cf_name->name = NULL; in ext4_fname_setup_ci_filename()
1386 cf_name->name = kmalloc(EXT4_NAME_LEN, GFP_NOFS); in ext4_fname_setup_ci_filename()
1387 if (!cf_name->name) in ext4_fname_setup_ci_filename()
1388 return -ENOMEM; in ext4_fname_setup_ci_filename()
1390 len = utf8_casefold(dir->i_sb->s_encoding, in ext4_fname_setup_ci_filename()
1391 iname, cf_name->name, in ext4_fname_setup_ci_filename()
1394 kfree(cf_name->name); in ext4_fname_setup_ci_filename()
1395 cf_name->name = NULL; in ext4_fname_setup_ci_filename()
1397 cf_name->len = (unsigned) len; in ext4_fname_setup_ci_filename()
1401 hinfo->hash_version = DX_HASH_SIPHASH; in ext4_fname_setup_ci_filename()
1402 hinfo->seed = NULL; in ext4_fname_setup_ci_filename()
1403 if (cf_name->name) in ext4_fname_setup_ci_filename()
1404 ext4fs_dirhash(dir, cf_name->name, cf_name->len, hinfo); in ext4_fname_setup_ci_filename()
1406 ext4fs_dirhash(dir, iname->name, iname->len, hinfo); in ext4_fname_setup_ci_filename()
1418 struct ext4_dir_entry_2 *de) in ext4_match() argument
1422 if (!de->inode) in ext4_match()
1425 f.usr_fname = fname->usr_fname; in ext4_match()
1426 f.disk_name = fname->disk_name; in ext4_match()
1428 f.crypto_buf = fname->crypto_buf; in ext4_match()
1432 if (parent->i_sb->s_encoding && IS_CASEFOLDED(parent) && in ext4_match()
1434 if (fname->cf_name.name) { in ext4_match()
1435 struct qstr cf = {.name = fname->cf_name.name, in ext4_match()
1436 .len = fname->cf_name.len}; in ext4_match()
1438 if (fname->hinfo.hash != EXT4_DIRENT_HASH(de) || in ext4_match()
1439 fname->hinfo.minor_hash != in ext4_match()
1440 EXT4_DIRENT_MINOR_HASH(de)) { in ext4_match()
1445 return !ext4_ci_compare(parent, &cf, de->name, in ext4_match()
1446 de->name_len, true); in ext4_match()
1448 return !ext4_ci_compare(parent, fname->usr_fname, de->name, in ext4_match()
1449 de->name_len, false); in ext4_match()
1453 return fscrypt_match_name(&f, de->name, de->name_len); in ext4_match()
1457 * Returns 0 if not found, -1 on failure, and 1 on success
1463 struct ext4_dir_entry_2 * de; in ext4_search_dir() local
1467 de = (struct ext4_dir_entry_2 *)search_buf; in ext4_search_dir()
1469 while ((char *) de < dlimit) { in ext4_search_dir()
1472 if ((char *) de + de->name_len <= dlimit && in ext4_search_dir()
1473 ext4_match(dir, fname, de)) { in ext4_search_dir()
1474 /* found a match - just to be sure, do in ext4_search_dir()
1476 if (ext4_check_dir_entry(dir, NULL, de, bh, search_buf, in ext4_search_dir()
1478 return -1; in ext4_search_dir()
1479 *res_dir = de; in ext4_search_dir()
1483 de_len = ext4_rec_len_from_disk(de->rec_len, in ext4_search_dir()
1484 dir->i_sb->s_blocksize); in ext4_search_dir()
1486 return -1; in ext4_search_dir()
1488 de = (struct ext4_dir_entry_2 *) ((char *) de + de_len); in ext4_search_dir()
1494 struct ext4_dir_entry *de) in is_dx_internal_node() argument
1496 struct super_block *sb = dir->i_sb; in is_dx_internal_node()
1502 if (de->inode == 0 && in is_dx_internal_node()
1503 ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize) == in is_dx_internal_node()
1504 sb->s_blocksize) in is_dx_internal_node()
1514 * itself (as a parameter - res_dir). It does NOT read the inode of the
1515 * entry - you'll have to do that yourself if you want to.
1517 * The returned buffer_head has ->b_count elevated. The caller is expected
1529 const u8 *name = fname->usr_fname->name; in __ext4_find_entry()
1538 sb = dir->i_sb; in __ext4_find_entry()
1539 namelen = fname->usr_fname->len; in __ext4_find_entry()
1557 * "." or ".." will only be in the first block in __ext4_find_entry()
1558 * NFS may look up ".."; "." should be handled by the VFS in __ext4_find_entry()
1577 nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb); in __ext4_find_entry()
1582 start = EXT4_I(dir)->i_dir_start_lookup; in __ext4_find_entry()
1589 * We deal with the read-ahead logic here. in __ext4_find_entry()
1596 ra_max = start - block; in __ext4_find_entry()
1598 ra_max = nblocks - block; in __ext4_find_entry()
1616 ret = ERR_PTR(-EIO); in __ext4_find_entry()
1621 (struct ext4_dir_entry *)bh->b_data) && in __ext4_find_entry()
1627 ret = ERR_PTR(-EFSBADCRC); in __ext4_find_entry()
1634 EXT4_I(dir)->i_dir_start_lookup = block; in __ext4_find_entry()
1652 nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb); in __ext4_find_entry()
1659 /* Clean up the read-ahead blocks */ in __ext4_find_entry()
1675 if (err == -ENOENT) in ext4_find_entry()
1696 if (err == -ENOENT) in ext4_lookup_entry()
1711 struct super_block * sb = dir->i_sb; in ext4_dx_find_entry()
1724 block = dx_get_block(frame->at); in ext4_dx_find_entry()
1735 if (retval == -1) { in ext4_dx_find_entry()
1741 retval = ext4_htree_next_block(dir, fname->hinfo.hash, frame, in ext4_dx_find_entry()
1754 dxtrace(printk(KERN_DEBUG "%s not found\n", fname->usr_fname->name)); in ext4_dx_find_entry()
1763 struct ext4_dir_entry_2 *de; in ext4_lookup() local
1766 if (dentry->d_name.len > EXT4_NAME_LEN) in ext4_lookup()
1767 return ERR_PTR(-ENAMETOOLONG); in ext4_lookup()
1769 bh = ext4_lookup_entry(dir, dentry, &de); in ext4_lookup()
1774 __u32 ino = le32_to_cpu(de->inode); in ext4_lookup()
1776 if (!ext4_valid_inum(dir->i_sb, ino)) { in ext4_lookup()
1778 return ERR_PTR(-EFSCORRUPTED); in ext4_lookup()
1780 if (unlikely(ino == dir->i_ino)) { in ext4_lookup()
1783 return ERR_PTR(-EFSCORRUPTED); in ext4_lookup()
1785 inode = ext4_iget(dir->i_sb, ino, EXT4_IGET_NORMAL); in ext4_lookup()
1786 if (inode == ERR_PTR(-ESTALE)) { in ext4_lookup()
1790 return ERR_PTR(-EFSCORRUPTED); in ext4_lookup()
1793 (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) && in ext4_lookup()
1795 ext4_warning(inode->i_sb, in ext4_lookup()
1797 dir->i_ino, inode->i_ino); in ext4_lookup()
1799 return ERR_PTR(-EPERM); in ext4_lookup()
1820 struct ext4_dir_entry_2 * de; in ext4_get_parent() local
1823 bh = ext4_find_entry(d_inode(child), &dotdot_name, &de, NULL); in ext4_get_parent()
1827 return ERR_PTR(-ENOENT); in ext4_get_parent()
1828 ino = le32_to_cpu(de->inode); in ext4_get_parent()
1831 if (!ext4_valid_inum(child->d_sb, ino)) { in ext4_get_parent()
1834 return ERR_PTR(-EFSCORRUPTED); in ext4_get_parent()
1837 return d_obtain_alias(ext4_iget(child->d_sb, ino, EXT4_IGET_NORMAL)); in ext4_get_parent()
1851 while (count--) { in dx_move_dirents()
1852 struct ext4_dir_entry_2 *de = (struct ext4_dir_entry_2 *) in dx_move_dirents() local
1853 (from + (map->offs<<2)); in dx_move_dirents()
1854 rec_len = ext4_dir_rec_len(de->name_len, dir); in dx_move_dirents()
1856 memcpy (to, de, rec_len); in dx_move_dirents()
1857 ((struct ext4_dir_entry_2 *) to)->rec_len = in dx_move_dirents()
1861 de->inode = 0; in dx_move_dirents()
1862 memset(&de->name_len, 0, ext4_rec_len_from_disk(de->rec_len, in dx_move_dirents()
1863 blocksize) - in dx_move_dirents()
1870 return (struct ext4_dir_entry_2 *) (to - rec_len); in dx_move_dirents()
1880 struct ext4_dir_entry_2 *next, *to, *prev, *de = (struct ext4_dir_entry_2 *) base; in dx_pack_dirents() local
1883 prev = to = de; in dx_pack_dirents()
1884 while ((char*)de < base + blocksize) { in dx_pack_dirents()
1885 next = ext4_next_entry(de, blocksize); in dx_pack_dirents()
1886 if (de->inode && de->name_len) { in dx_pack_dirents()
1887 rec_len = ext4_dir_rec_len(de->name_len, dir); in dx_pack_dirents()
1888 if (de > to) in dx_pack_dirents()
1889 memmove(to, de, rec_len); in dx_pack_dirents()
1890 to->rec_len = ext4_rec_len_to_disk(rec_len, blocksize); in dx_pack_dirents()
1894 de = next; in dx_pack_dirents()
1902 * Returns pointer to de in block into which the new entry will be inserted.
1908 unsigned blocksize = dir->i_sb->s_blocksize; in do_split()
1914 char *data1 = (*bh)->b_data, *data2; in do_split()
1916 struct ext4_dir_entry_2 *de = NULL, *de2; in do_split() local
1920 if (ext4_has_metadata_csum(dir->i_sb)) in do_split()
1931 err = ext4_journal_get_write_access(handle, dir->i_sb, *bh, in do_split()
1936 BUFFER_TRACE(frame->bh, "get_write_access"); in do_split()
1937 err = ext4_journal_get_write_access(handle, dir->i_sb, frame->bh, in do_split()
1942 data2 = bh2->b_data; in do_split()
1948 map -= count; in do_split()
1953 for (i = count-1; i >= 0; i--) { in do_split()
1968 split = count - move; in do_split()
1973 continued = hash2 == map[split - 1].hash; in do_split()
1975 (unsigned long)dx_get_block(frame->at), in do_split()
1976 hash2, split, count-split)); in do_split()
1979 de2 = dx_move_dirents(dir, data1, data2, map + split, count - split, in do_split()
1981 de = dx_pack_dirents(dir, data1, blocksize); in do_split()
1982 de->rec_len = ext4_rec_len_to_disk(data1 + (blocksize - csum_size) - in do_split()
1983 (char *) de, in do_split()
1985 de2->rec_len = ext4_rec_len_to_disk(data2 + (blocksize - csum_size) - in do_split()
1999 if (hinfo->hash >= hash2) { in do_split()
2001 de = de2; in do_split()
2007 err = ext4_handle_dirty_dx_node(handle, dir, frame->bh); in do_split()
2011 dxtrace(dx_show_index("frame", frame->entries)); in do_split()
2012 return de; in do_split()
2018 ext4_std_error(dir->i_sb, err); in do_split()
2028 struct ext4_dir_entry_2 *de; in ext4_find_dest_de() local
2034 de = (struct ext4_dir_entry_2 *)buf; in ext4_find_dest_de()
2035 top = buf + buf_size - reclen; in ext4_find_dest_de()
2036 while ((char *) de <= top) { in ext4_find_dest_de()
2037 if (ext4_check_dir_entry(dir, NULL, de, bh, in ext4_find_dest_de()
2039 return -EFSCORRUPTED; in ext4_find_dest_de()
2040 if (ext4_match(dir, fname, de)) in ext4_find_dest_de()
2041 return -EEXIST; in ext4_find_dest_de()
2042 nlen = ext4_dir_rec_len(de->name_len, dir); in ext4_find_dest_de()
2043 rlen = ext4_rec_len_from_disk(de->rec_len, buf_size); in ext4_find_dest_de()
2044 if ((de->inode ? rlen - nlen : rlen) >= reclen) in ext4_find_dest_de()
2046 de = (struct ext4_dir_entry_2 *)((char *)de + rlen); in ext4_find_dest_de()
2049 if ((char *) de > top) in ext4_find_dest_de()
2050 return -ENOSPC; in ext4_find_dest_de()
2052 *dest_de = de; in ext4_find_dest_de()
2058 struct ext4_dir_entry_2 *de, in ext4_insert_dentry() argument
2065 nlen = ext4_dir_rec_len(de->name_len, dir); in ext4_insert_dentry()
2066 rlen = ext4_rec_len_from_disk(de->rec_len, buf_size); in ext4_insert_dentry()
2067 if (de->inode) { in ext4_insert_dentry()
2069 (struct ext4_dir_entry_2 *)((char *)de + nlen); in ext4_insert_dentry()
2070 de1->rec_len = ext4_rec_len_to_disk(rlen - nlen, buf_size); in ext4_insert_dentry()
2071 de->rec_len = ext4_rec_len_to_disk(nlen, buf_size); in ext4_insert_dentry()
2072 de = de1; in ext4_insert_dentry()
2074 de->file_type = EXT4_FT_UNKNOWN; in ext4_insert_dentry()
2075 de->inode = cpu_to_le32(inode->i_ino); in ext4_insert_dentry()
2076 ext4_set_de_type(inode->i_sb, de, inode->i_mode); in ext4_insert_dentry()
2077 de->name_len = fname_len(fname); in ext4_insert_dentry()
2078 memcpy(de->name, fname_name(fname), fname_len(fname)); in ext4_insert_dentry()
2080 struct dx_hash_info *hinfo = &fname->hinfo; in ext4_insert_dentry()
2082 EXT4_DIRENT_HASHES(de)->hash = cpu_to_le32(hinfo->hash); in ext4_insert_dentry()
2083 EXT4_DIRENT_HASHES(de)->minor_hash = in ext4_insert_dentry()
2084 cpu_to_le32(hinfo->minor_hash); in ext4_insert_dentry()
2089 * Add a new entry into a directory (leaf) block. If de is non-NULL,
2090 * it points to a directory entry which is guaranteed to be large
2091 * enough for new directory entry. If de is NULL, then
2093 * space. It will return -ENOSPC if no space is available, and -EIO
2094 * and -EEXIST if directory entry already exists.
2098 struct inode *inode, struct ext4_dir_entry_2 *de, in add_dirent_to_buf() argument
2101 unsigned int blocksize = dir->i_sb->s_blocksize; in add_dirent_to_buf()
2105 if (ext4_has_metadata_csum(inode->i_sb)) in add_dirent_to_buf()
2108 if (!de) { in add_dirent_to_buf()
2109 err = ext4_find_dest_de(dir, inode, bh, bh->b_data, in add_dirent_to_buf()
2110 blocksize - csum_size, fname, &de); in add_dirent_to_buf()
2115 err = ext4_journal_get_write_access(handle, dir->i_sb, bh, in add_dirent_to_buf()
2118 ext4_std_error(dir->i_sb, err); in add_dirent_to_buf()
2123 ext4_insert_dentry(dir, inode, de, blocksize, fname); in add_dirent_to_buf()
2136 dir->i_mtime = dir->i_ctime = current_time(dir); in add_dirent_to_buf()
2143 ext4_std_error(dir->i_sb, err); in add_dirent_to_buf()
2159 struct ext4_dir_entry_2 *de, *de2; in make_indexed_dir() local
2168 if (ext4_has_metadata_csum(inode->i_sb)) in make_indexed_dir()
2171 blocksize = dir->i_sb->s_blocksize; in make_indexed_dir()
2172 dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino)); in make_indexed_dir()
2174 retval = ext4_journal_get_write_access(handle, dir->i_sb, bh, in make_indexed_dir()
2177 ext4_std_error(dir->i_sb, retval); in make_indexed_dir()
2181 root = (struct dx_root *) bh->b_data; in make_indexed_dir()
2184 fde = &root->dotdot; in make_indexed_dir()
2185 de = (struct ext4_dir_entry_2 *)((char *)fde + in make_indexed_dir()
2186 ext4_rec_len_from_disk(fde->rec_len, blocksize)); in make_indexed_dir()
2187 if ((char *) de >= (((char *) root) + blocksize)) { in make_indexed_dir()
2190 return -EFSCORRUPTED; in make_indexed_dir()
2192 len = ((char *) root) + (blocksize - csum_size) - (char *) de; in make_indexed_dir()
2201 data2 = bh2->b_data; in make_indexed_dir()
2203 memcpy(data2, de, len); in make_indexed_dir()
2204 memset(de, 0, len); /* wipe old data */ in make_indexed_dir()
2205 de = (struct ext4_dir_entry_2 *) data2; in make_indexed_dir()
2207 while ((char *)(de2 = ext4_next_entry(de, blocksize)) < top) in make_indexed_dir()
2208 de = de2; in make_indexed_dir()
2209 de->rec_len = ext4_rec_len_to_disk(data2 + (blocksize - csum_size) - in make_indexed_dir()
2210 (char *) de, blocksize); in make_indexed_dir()
2216 de = (struct ext4_dir_entry_2 *) (&root->dotdot); in make_indexed_dir()
2217 de->rec_len = ext4_rec_len_to_disk( in make_indexed_dir()
2218 blocksize - ext4_dir_rec_len(2, NULL), blocksize); in make_indexed_dir()
2219 memset (&root->info, 0, sizeof(root->info)); in make_indexed_dir()
2220 root->info.info_length = sizeof(root->info); in make_indexed_dir()
2222 root->info.hash_version = DX_HASH_SIPHASH; in make_indexed_dir()
2224 root->info.hash_version = in make_indexed_dir()
2225 EXT4_SB(dir->i_sb)->s_def_hash_version; in make_indexed_dir()
2227 entries = root->entries; in make_indexed_dir()
2230 dx_set_limit(entries, dx_root_limit(dir, sizeof(root->info))); in make_indexed_dir()
2233 fname->hinfo.hash_version = root->info.hash_version; in make_indexed_dir()
2234 if (fname->hinfo.hash_version <= DX_HASH_TEA) in make_indexed_dir()
2235 fname->hinfo.hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned; in make_indexed_dir()
2236 fname->hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed; in make_indexed_dir()
2241 fname_len(fname), &fname->hinfo); in make_indexed_dir()
2245 frame->entries = entries; in make_indexed_dir()
2246 frame->at = entries; in make_indexed_dir()
2247 frame->bh = bh; in make_indexed_dir()
2249 retval = ext4_handle_dirty_dx_node(handle, dir, frame->bh); in make_indexed_dir()
2256 de = do_split(handle,dir, &bh2, frame, &fname->hinfo); in make_indexed_dir()
2257 if (IS_ERR(de)) { in make_indexed_dir()
2258 retval = PTR_ERR(de); in make_indexed_dir()
2262 retval = add_dirent_to_buf(handle, fname, dir, inode, de, bh2); in make_indexed_dir()
2282 * NOTE!! The inode part of 'de' is left at 0 - which means you
2289 struct inode *dir = d_inode(dentry->d_parent); in ext4_add_entry()
2291 struct ext4_dir_entry_2 *de; in ext4_add_entry() local
2300 if (ext4_has_metadata_csum(inode->i_sb)) in ext4_add_entry()
2303 sb = dir->i_sb; in ext4_add_entry()
2304 blocksize = sb->s_blocksize; in ext4_add_entry()
2305 if (!dentry->d_name.len) in ext4_add_entry()
2306 return -EINVAL; in ext4_add_entry()
2309 return -ENOKEY; in ext4_add_entry()
2313 sb->s_encoding && utf8_validate(sb->s_encoding, &dentry->d_name)) in ext4_add_entry()
2314 return -EINVAL; in ext4_add_entry()
2317 retval = ext4_fname_setup_filename(dir, &dentry->d_name, 0, &fname); in ext4_add_entry()
2339 retval = -EFSCORRUPTED; in ext4_add_entry()
2348 blocks = dir->i_size >> sb->s_blocksize_bits; in ext4_add_entry()
2363 if (retval != -ENOSPC) in ext4_add_entry()
2382 de = (struct ext4_dir_entry_2 *) bh->b_data; in ext4_add_entry()
2383 de->inode = 0; in ext4_add_entry()
2384 de->rec_len = ext4_rec_len_to_disk(blocksize - csum_size, blocksize); in ext4_add_entry()
2389 retval = add_dirent_to_buf(handle, &fname, dir, inode, de, bh); in ext4_add_entry()
2407 struct super_block *sb = dir->i_sb; in ext4_dx_add_entry()
2408 struct ext4_dir_entry_2 *de; in ext4_dx_add_entry() local
2417 entries = frame->entries; in ext4_dx_add_entry()
2418 at = frame->at; in ext4_dx_add_entry()
2419 bh = ext4_read_dirblock(dir, dx_get_block(frame->at), DIRENT_HTREE); in ext4_dx_add_entry()
2432 if (err != -ENOSPC) in ext4_dx_add_entry()
2442 int levels = frame - frames + 1; in ext4_dx_add_entry()
2450 if (dx_get_count((frame - 1)->entries) < in ext4_dx_add_entry()
2451 dx_get_limit((frame - 1)->entries)) { in ext4_dx_add_entry()
2455 frame--; /* split higher index block */ in ext4_dx_add_entry()
2456 at = frame->at; in ext4_dx_add_entry()
2457 entries = frame->entries; in ext4_dx_add_entry()
2463 dir->i_ino, levels); in ext4_dx_add_entry()
2469 err = -ENOSPC; in ext4_dx_add_entry()
2478 node2 = (struct dx_node *)(bh2->b_data); in ext4_dx_add_entry()
2479 entries2 = node2->entries; in ext4_dx_add_entry()
2480 memset(&node2->fake, 0, sizeof(struct fake_dirent)); in ext4_dx_add_entry()
2481 node2->fake.rec_len = ext4_rec_len_to_disk(sb->s_blocksize, in ext4_dx_add_entry()
2482 sb->s_blocksize); in ext4_dx_add_entry()
2483 BUFFER_TRACE(frame->bh, "get_write_access"); in ext4_dx_add_entry()
2484 err = ext4_journal_get_write_access(handle, sb, frame->bh, in ext4_dx_add_entry()
2489 unsigned icount1 = icount/2, icount2 = icount - icount1; in ext4_dx_add_entry()
2494 BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ in ext4_dx_add_entry()
2496 (frame - 1)->bh, in ext4_dx_add_entry()
2508 if (at - entries >= icount1) { in ext4_dx_add_entry()
2509 frame->at = at - entries - icount1 + entries2; in ext4_dx_add_entry()
2510 frame->entries = entries = entries2; in ext4_dx_add_entry()
2511 swap(frame->bh, bh2); in ext4_dx_add_entry()
2513 dx_insert_block((frame - 1), hash2, newblock); in ext4_dx_add_entry()
2514 dxtrace(dx_show_index("node", frame->entries)); in ext4_dx_add_entry()
2516 ((struct dx_node *) bh2->b_data)->entries)); in ext4_dx_add_entry()
2522 (frame - 1)->bh); in ext4_dx_add_entry()
2526 frame->bh); in ext4_dx_add_entry()
2538 dxroot = (struct dx_root *)frames[0].bh->b_data; in ext4_dx_add_entry()
2539 dxroot->info.indirect_levels += 1; in ext4_dx_add_entry()
2542 dxroot->info.indirect_levels)); in ext4_dx_add_entry()
2543 err = ext4_handle_dirty_dx_node(handle, dir, frame->bh); in ext4_dx_add_entry()
2552 de = do_split(handle, dir, &bh, frame, &fname->hinfo); in ext4_dx_add_entry()
2553 if (IS_ERR(de)) { in ext4_dx_add_entry()
2554 err = PTR_ERR(de); in ext4_dx_add_entry()
2557 err = add_dirent_to_buf(handle, fname, dir, inode, de, bh); in ext4_dx_add_entry()
2561 ext4_std_error(dir->i_sb, err); /* this is a no-op if err == 0 */ in ext4_dx_add_entry()
2565 /* @restart is true means htree-path has been changed, we need to in ext4_dx_add_entry()
2566 * repeat dx_probe() to find out valid htree-path in ext4_dx_add_entry()
2584 struct ext4_dir_entry_2 *de, *pde; in ext4_generic_delete_entry() local
2585 unsigned int blocksize = dir->i_sb->s_blocksize; in ext4_generic_delete_entry()
2590 de = (struct ext4_dir_entry_2 *)entry_buf; in ext4_generic_delete_entry()
2591 while (i < buf_size - csum_size) { in ext4_generic_delete_entry()
2592 if (ext4_check_dir_entry(dir, NULL, de, bh, in ext4_generic_delete_entry()
2594 return -EFSCORRUPTED; in ext4_generic_delete_entry()
2595 if (de == de_del) { in ext4_generic_delete_entry()
2597 pde->rec_len = ext4_rec_len_to_disk( in ext4_generic_delete_entry()
2598 ext4_rec_len_from_disk(pde->rec_len, in ext4_generic_delete_entry()
2600 ext4_rec_len_from_disk(de->rec_len, in ext4_generic_delete_entry()
2605 memset(de, 0, ext4_rec_len_from_disk(de->rec_len, in ext4_generic_delete_entry()
2609 de->inode = 0; in ext4_generic_delete_entry()
2610 memset(&de->name_len, 0, in ext4_generic_delete_entry()
2611 ext4_rec_len_from_disk(de->rec_len, in ext4_generic_delete_entry()
2612 blocksize) - in ext4_generic_delete_entry()
2620 i += ext4_rec_len_from_disk(de->rec_len, blocksize); in ext4_generic_delete_entry()
2621 pde = de; in ext4_generic_delete_entry()
2622 de = ext4_next_entry(de, blocksize); in ext4_generic_delete_entry()
2624 return -ENOENT; in ext4_generic_delete_entry()
2642 if (ext4_has_metadata_csum(dir->i_sb)) in ext4_delete_entry()
2646 err = ext4_journal_get_write_access(handle, dir->i_sb, bh, in ext4_delete_entry()
2651 err = ext4_generic_delete_entry(dir, de_del, bh, bh->b_data, in ext4_delete_entry()
2652 dir->i_sb->s_blocksize, csum_size); in ext4_delete_entry()
2663 if (err != -ENOENT) in ext4_delete_entry()
2664 ext4_std_error(dir->i_sb, err); in ext4_delete_entry()
2671 * the 16-bit i_links_count field on disk. Directories with i_nlink == 1 mean
2675 * feature is not enabled and returned -EMLINK. The is_dx() check is a proxy
2676 * for checking S_ISDIR(inode) (since the INODE_INDEX feature will not be set
2677 * on regular files) and to avoid creating huge/slow non-HTREE directories.
2683 (inode->i_nlink > EXT4_LINK_MAX || inode->i_nlink == 2)) in ext4_inc_count()
2688 * If a directory had nlink == 1, then we should let it be 1. This indicates
2693 if (!S_ISDIR(inode->i_mode) || inode->i_nlink > 2) in ext4_dec_count()
2699 * Add non-directory inode to a directory. On success, the inode reference is
2707 struct inode *dir = d_inode(dentry->d_parent); in ext4_add_nondir()
2727 * is so far negative - it has no inode.
2743 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + in ext4_create()
2746 inode = ext4_new_inode_start_handle(mnt_userns, dir, mode, &dentry->d_name, in ext4_create()
2751 inode->i_op = &ext4_file_inode_operations; in ext4_create()
2752 inode->i_fop = &ext4_file_operations; in ext4_create()
2762 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries)) in ext4_create()
2778 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + in ext4_mknod()
2781 inode = ext4_new_inode_start_handle(mnt_userns, dir, mode, &dentry->d_name, in ext4_mknod()
2786 init_special_inode(inode, inode->i_mode, rdev); in ext4_mknod()
2787 inode->i_op = &ext4_special_inode_operations; in ext4_mknod()
2796 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries)) in ext4_mknod()
2816 EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb) + in ext4_tmpfile()
2821 inode->i_op = &ext4_file_inode_operations; in ext4_tmpfile()
2822 inode->i_fop = &ext4_file_operations; in ext4_tmpfile()
2833 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries)) in ext4_tmpfile()
2843 struct ext4_dir_entry_2 *de, in ext4_init_dot_dotdot() argument
2847 de->inode = cpu_to_le32(inode->i_ino); in ext4_init_dot_dotdot()
2848 de->name_len = 1; in ext4_init_dot_dotdot()
2849 de->rec_len = ext4_rec_len_to_disk(ext4_dir_rec_len(de->name_len, NULL), in ext4_init_dot_dotdot()
2851 strcpy(de->name, "."); in ext4_init_dot_dotdot()
2852 ext4_set_de_type(inode->i_sb, de, S_IFDIR); in ext4_init_dot_dotdot()
2854 de = ext4_next_entry(de, blocksize); in ext4_init_dot_dotdot()
2855 de->inode = cpu_to_le32(parent_ino); in ext4_init_dot_dotdot()
2856 de->name_len = 2; in ext4_init_dot_dotdot()
2858 de->rec_len = ext4_rec_len_to_disk(blocksize - in ext4_init_dot_dotdot()
2862 de->rec_len = ext4_rec_len_to_disk( in ext4_init_dot_dotdot()
2863 ext4_dir_rec_len(de->name_len, NULL), in ext4_init_dot_dotdot()
2865 strcpy(de->name, ".."); in ext4_init_dot_dotdot()
2866 ext4_set_de_type(inode->i_sb, de, S_IFDIR); in ext4_init_dot_dotdot()
2868 return ext4_next_entry(de, blocksize); in ext4_init_dot_dotdot()
2875 struct ext4_dir_entry_2 *de; in ext4_init_new_dir() local
2877 unsigned int blocksize = dir->i_sb->s_blocksize; in ext4_init_new_dir()
2881 if (ext4_has_metadata_csum(dir->i_sb)) in ext4_init_new_dir()
2886 if (err < 0 && err != -ENOSPC) in ext4_init_new_dir()
2892 inode->i_size = 0; in ext4_init_new_dir()
2896 de = (struct ext4_dir_entry_2 *)dir_block->b_data; in ext4_init_new_dir()
2897 ext4_init_dot_dotdot(inode, de, blocksize, csum_size, dir->i_ino, 0); in ext4_init_new_dir()
2920 return -EMLINK; in ext4_mkdir()
2926 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + in ext4_mkdir()
2930 &dentry->d_name, in ext4_mkdir()
2937 inode->i_op = &ext4_dir_inode_operations; in ext4_mkdir()
2938 inode->i_fop = &ext4_dir_operations; in ext4_mkdir()
2972 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries)) in ext4_mkdir()
2984 struct ext4_dir_entry_2 *de; in ext4_empty_dir() local
2996 sb = inode->i_sb; in ext4_empty_dir()
2997 if (inode->i_size < ext4_dir_rec_len(1, NULL) + in ext4_empty_dir()
3002 /* The first directory block must not be a hole, in ext4_empty_dir()
3009 de = (struct ext4_dir_entry_2 *) bh->b_data; in ext4_empty_dir()
3010 if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, bh->b_size, in ext4_empty_dir()
3012 le32_to_cpu(de->inode) != inode->i_ino || strcmp(".", de->name)) { in ext4_empty_dir()
3017 offset = ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize); in ext4_empty_dir()
3018 de = ext4_next_entry(de, sb->s_blocksize); in ext4_empty_dir()
3019 if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, bh->b_size, in ext4_empty_dir()
3021 le32_to_cpu(de->inode) == 0 || strcmp("..", de->name)) { in ext4_empty_dir()
3026 offset += ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize); in ext4_empty_dir()
3027 while (offset < inode->i_size) { in ext4_empty_dir()
3028 if (!(offset & (sb->s_blocksize - 1))) { in ext4_empty_dir()
3034 offset += sb->s_blocksize; in ext4_empty_dir()
3040 de = (struct ext4_dir_entry_2 *) (bh->b_data + in ext4_empty_dir()
3041 (offset & (sb->s_blocksize - 1))); in ext4_empty_dir()
3042 if (ext4_check_dir_entry(inode, NULL, de, bh, in ext4_empty_dir()
3043 bh->b_data, bh->b_size, offset)) { in ext4_empty_dir()
3044 offset = (offset | (sb->s_blocksize - 1)) + 1; in ext4_empty_dir()
3047 if (le32_to_cpu(de->inode)) { in ext4_empty_dir()
3051 offset += ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize); in ext4_empty_dir()
3062 struct ext4_dir_entry_2 *de; in ext4_rmdir() local
3065 if (unlikely(ext4_forced_shutdown(EXT4_SB(dir->i_sb)))) in ext4_rmdir()
3066 return -EIO; in ext4_rmdir()
3077 retval = -ENOENT; in ext4_rmdir()
3078 bh = ext4_find_entry(dir, &dentry->d_name, &de, NULL); in ext4_rmdir()
3086 retval = -EFSCORRUPTED; in ext4_rmdir()
3087 if (le32_to_cpu(de->inode) != inode->i_ino) in ext4_rmdir()
3090 retval = -ENOTEMPTY; in ext4_rmdir()
3095 EXT4_DATA_TRANS_BLOCKS(dir->i_sb)); in ext4_rmdir()
3105 retval = ext4_delete_entry(handle, dir, de, bh); in ext4_rmdir()
3111 dentry->d_name.len, dentry->d_name.name, in ext4_rmdir()
3112 inode->i_nlink); in ext4_rmdir()
3118 inode->i_size = 0; in ext4_rmdir()
3120 inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode); in ext4_rmdir()
3131 * Case-insensitiveness. Eventually we'll want avoid in ext4_rmdir()
3150 int retval = -ENOENT; in __ext4_unlink()
3152 struct ext4_dir_entry_2 *de; in __ext4_unlink() local
3155 bh = ext4_find_entry(dir, d_name, &de, NULL); in __ext4_unlink()
3160 return -ENOENT; in __ext4_unlink()
3162 if (le32_to_cpu(de->inode) != inode->i_ino) { in __ext4_unlink()
3168 if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY) in __ext4_unlink()
3178 retval = ext4_delete_entry(handle, dir, de, bh); in __ext4_unlink()
3181 dir->i_ctime = dir->i_mtime = current_time(dir); in __ext4_unlink()
3189 if (inode->i_nlink == 0) in __ext4_unlink()
3191 d_name->len, d_name->name); in __ext4_unlink()
3194 if (!inode->i_nlink) in __ext4_unlink()
3196 inode->i_ctime = current_time(inode); in __ext4_unlink()
3209 if (unlikely(ext4_forced_shutdown(EXT4_SB(dir->i_sb)))) in ext4_unlink()
3210 return -EIO; in ext4_unlink()
3225 EXT4_DATA_TRANS_BLOCKS(dir->i_sb)); in ext4_unlink()
3231 retval = __ext4_unlink(handle, dir, &dentry->d_name, d_inode(dentry)); in ext4_unlink()
3236 * Case-insensitiveness. Eventually we'll want avoid in ext4_unlink()
3261 if (unlikely(ext4_forced_shutdown(EXT4_SB(dir->i_sb)))) in ext4_symlink()
3262 return -EIO; in ext4_symlink()
3264 err = fscrypt_prepare_symlink(dir, symname, len, dir->i_sb->s_blocksize, in ext4_symlink()
3275 * For non-fast symlinks, we just allocate inode and put it on in ext4_symlink()
3280 credits = 4 + EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb) + in ext4_symlink()
3289 credits = EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + in ext4_symlink()
3294 &dentry->d_name, 0, NULL, in ext4_symlink()
3307 inode->i_op = &ext4_encrypted_symlink_inode_operations; in ext4_symlink()
3312 inode->i_op = &ext4_symlink_inode_operations; in ext4_symlink()
3340 EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + in ext4_symlink()
3355 inode->i_op = &ext4_fast_symlink_inode_operations; in ext4_symlink()
3356 inode->i_link = (char *)&EXT4_I(inode)->i_data; in ext4_symlink()
3358 memcpy((char *)&EXT4_I(inode)->i_data, disk_link.name, in ext4_symlink()
3360 inode->i_size = disk_link.len - 1; in ext4_symlink()
3362 EXT4_I(inode)->i_disksize = inode->i_size; in ext4_symlink()
3388 (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + in __ext4_link()
3396 inode->i_ctime = current_time(inode); in __ext4_link()
3406 if (inode->i_nlink == 1) in __ext4_link()
3415 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries)) in __ext4_link()
3426 if (inode->i_nlink >= EXT4_LINK_MAX) in ext4_link()
3427 return -EMLINK; in ext4_link()
3434 (!projid_eq(EXT4_I(dir)->i_projid, in ext4_link()
3435 EXT4_I(old_dentry->d_inode)->i_projid))) in ext4_link()
3436 return -EXDEV; in ext4_link()
3446 * It should be the inode block if it is inlined or the 1st block
3458 /* The first directory block must not be a hole, so in ext4_get_first_dir_block()
3467 (struct ext4_dir_entry_2 *)bh->b_data, in ext4_get_first_dir_block()
3468 inode->i_sb->s_blocksize); in ext4_get_first_dir_block()
3485 struct ext4_dir_entry_2 *de; member
3498 ent->dir_bh = ext4_get_first_dir_block(handle, ent->inode, in ext4_rename_dir_prepare()
3499 &retval, &ent->parent_de, in ext4_rename_dir_prepare()
3500 &ent->dir_inlined); in ext4_rename_dir_prepare()
3501 if (!ent->dir_bh) in ext4_rename_dir_prepare()
3503 if (le32_to_cpu(ent->parent_de->inode) != ent->dir->i_ino) in ext4_rename_dir_prepare()
3504 return -EFSCORRUPTED; in ext4_rename_dir_prepare()
3505 BUFFER_TRACE(ent->dir_bh, "get_write_access"); in ext4_rename_dir_prepare()
3506 return ext4_journal_get_write_access(handle, ent->dir->i_sb, in ext4_rename_dir_prepare()
3507 ent->dir_bh, EXT4_JTR_NONE); in ext4_rename_dir_prepare()
3515 ent->parent_de->inode = cpu_to_le32(dir_ino); in ext4_rename_dir_finish()
3516 BUFFER_TRACE(ent->dir_bh, "call ext4_handle_dirty_metadata"); in ext4_rename_dir_finish()
3517 if (!ent->dir_inlined) { in ext4_rename_dir_finish()
3518 if (is_dx(ent->inode)) { in ext4_rename_dir_finish()
3520 ent->inode, in ext4_rename_dir_finish()
3521 ent->dir_bh); in ext4_rename_dir_finish()
3523 retval = ext4_handle_dirty_dirblock(handle, ent->inode, in ext4_rename_dir_finish()
3524 ent->dir_bh); in ext4_rename_dir_finish()
3527 retval = ext4_mark_inode_dirty(handle, ent->inode); in ext4_rename_dir_finish()
3530 ext4_std_error(ent->dir->i_sb, retval); in ext4_rename_dir_finish()
3541 BUFFER_TRACE(ent->bh, "get write access"); in ext4_setent()
3542 retval = ext4_journal_get_write_access(handle, ent->dir->i_sb, ent->bh, in ext4_setent()
3546 ent->de->inode = cpu_to_le32(ino); in ext4_setent()
3547 if (ext4_has_feature_filetype(ent->dir->i_sb)) in ext4_setent()
3548 ent->de->file_type = file_type; in ext4_setent()
3549 inode_inc_iversion(ent->dir); in ext4_setent()
3550 ent->dir->i_ctime = ent->dir->i_mtime = in ext4_setent()
3551 current_time(ent->dir); in ext4_setent()
3552 retval = ext4_mark_inode_dirty(handle, ent->dir); in ext4_setent()
3553 BUFFER_TRACE(ent->bh, "call ext4_handle_dirty_metadata"); in ext4_setent()
3554 if (!ent->inlined) { in ext4_setent()
3555 retval2 = ext4_handle_dirty_dirblock(handle, ent->dir, ent->bh); in ext4_setent()
3557 ext4_std_error(ent->dir->i_sb, retval2); in ext4_setent()
3571 * old->de could have moved from under us during make indexed dir, in ext4_resetent()
3572 * so the old->de may no longer valid and need to find it again in ext4_resetent()
3575 old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, &old.de, NULL); in ext4_resetent()
3579 retval = -ENOENT; in ext4_resetent()
3581 ext4_std_error(old.dir->i_sb, retval); in ext4_resetent()
3592 int retval = -ENOENT; in ext4_find_delete_entry()
3594 struct ext4_dir_entry_2 *de; in ext4_find_delete_entry() local
3596 bh = ext4_find_entry(dir, d_name, &de, NULL); in ext4_find_delete_entry()
3600 retval = ext4_delete_entry(handle, dir, de, bh); in ext4_find_delete_entry()
3611 * ent->de could have moved from under us during htree split, so make in ext4_rename_delete()
3612 * sure that we are deleting the right entry. We might also be pointing in ext4_rename_delete()
3613 * to a stale entry in the unused part of ent->bh so just checking inum in ext4_rename_delete()
3616 if (le32_to_cpu(ent->de->inode) != ent->inode->i_ino || in ext4_rename_delete()
3617 ent->de->name_len != ent->dentry->d_name.len || in ext4_rename_delete()
3618 strncmp(ent->de->name, ent->dentry->d_name.name, in ext4_rename_delete()
3619 ent->de->name_len) || in ext4_rename_delete()
3621 retval = ext4_find_delete_entry(handle, ent->dir, in ext4_rename_delete()
3622 &ent->dentry->d_name); in ext4_rename_delete()
3624 retval = ext4_delete_entry(handle, ent->dir, ent->de, ent->bh); in ext4_rename_delete()
3625 if (retval == -ENOENT) { in ext4_rename_delete()
3626 retval = ext4_find_delete_entry(handle, ent->dir, in ext4_rename_delete()
3627 &ent->dentry->d_name); in ext4_rename_delete()
3632 ext4_warning_inode(ent->dir, in ext4_rename_delete()
3634 ent->dir->i_nlink, retval); in ext4_rename_delete()
3640 if (ent->dir_nlink_delta) { in ext4_update_dir_count()
3641 if (ent->dir_nlink_delta == -1) in ext4_update_dir_count()
3642 ext4_dec_count(ent->dir); in ext4_update_dir_count()
3644 ext4_inc_count(ent->dir); in ext4_update_dir_count()
3645 ext4_mark_inode_dirty(handle, ent->dir); in ext4_update_dir_count()
3661 credits += (EXT4_MAXQUOTAS_TRANS_BLOCKS(ent->dir->i_sb) + in ext4_whiteout_for_rename()
3664 wh = ext4_new_inode_start_handle(mnt_userns, ent->dir, in ext4_whiteout_for_rename()
3666 &ent->dentry->d_name, 0, NULL, in ext4_whiteout_for_rename()
3673 if (PTR_ERR(wh) == -ENOSPC && in ext4_whiteout_for_rename()
3674 ext4_should_retry_alloc(ent->dir->i_sb, &retries)) in ext4_whiteout_for_rename()
3678 init_special_inode(wh, wh->i_mode, WHITEOUT_DEV); in ext4_whiteout_for_rename()
3679 wh->i_op = &ext4_special_inode_operations; in ext4_whiteout_for_rename()
3686 * higher-level routines.
3713 if (new.inode && new.inode->i_nlink == 0) { in ext4_rename()
3716 return -EFSCORRUPTED; in ext4_rename()
3720 (!projid_eq(EXT4_I(new_dir)->i_projid, in ext4_rename()
3721 EXT4_I(old_dentry->d_inode)->i_projid))) in ext4_rename()
3722 return -EXDEV; in ext4_rename()
3739 old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, &old.de, NULL); in ext4_rename()
3746 * same name. Goodbye sticky bit ;-< in ext4_rename()
3748 retval = -ENOENT; in ext4_rename()
3749 if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino) in ext4_rename()
3752 new.bh = ext4_find_entry(new.dir, &new.dentry->d_name, in ext4_rename()
3753 &new.de, &new.inlined); in ext4_rename()
3765 if (new.inode && !test_opt(new.dir->i_sb, NO_AUTO_DA_ALLOC)) in ext4_rename()
3768 credits = (2 * EXT4_DATA_TRANS_BLOCKS(old.dir->i_sb) + in ext4_rename()
3784 old_file_type = old.de->file_type; in ext4_rename()
3788 if (S_ISDIR(old.inode->i_mode)) { in ext4_rename()
3790 retval = -ENOTEMPTY; in ext4_rename()
3794 retval = -EMLINK; in ext4_rename()
3806 * re-read the directory, or else we end up trying to delete a dirent in ext4_rename()
3809 force_reread = (new.dir->i_ino == old.dir->i_ino && in ext4_rename()
3815 * to be still pointing to the valid old entry. in ext4_rename()
3817 retval = ext4_setent(handle, &old, whiteout->i_ino, in ext4_rename()
3832 old.inode->i_ino, old_file_type); in ext4_rename()
3844 old.inode->i_ctime = current_time(old.inode); in ext4_rename()
3858 new.inode->i_ctime = current_time(new.inode); in ext4_rename()
3860 old.dir->i_ctime = old.dir->i_mtime = current_time(old.dir); in ext4_rename()
3863 retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino); in ext4_rename()
3870 * parent, ext4_dec_count() won't work for many-linked in ext4_rename()
3885 if (S_ISDIR(old.inode->i_mode)) { in ext4_rename()
3891 ext4_fc_mark_ineligible(old.inode->i_sb, in ext4_rename()
3906 if (!new.inode->i_nlink) in ext4_rename()
3915 old.inode->i_ino, old_file_type); in ext4_rename()
3951 !projid_eq(EXT4_I(new_dir)->i_projid, in ext4_cross_rename()
3952 EXT4_I(old_dentry->d_inode)->i_projid)) || in ext4_cross_rename()
3954 !projid_eq(EXT4_I(old_dir)->i_projid, in ext4_cross_rename()
3955 EXT4_I(new_dentry->d_inode)->i_projid))) in ext4_cross_rename()
3956 return -EXDEV; in ext4_cross_rename()
3965 old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, in ext4_cross_rename()
3966 &old.de, &old.inlined); in ext4_cross_rename()
3973 * same name. Goodbye sticky bit ;-< in ext4_cross_rename()
3975 retval = -ENOENT; in ext4_cross_rename()
3976 if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino) in ext4_cross_rename()
3979 new.bh = ext4_find_entry(new.dir, &new.dentry->d_name, in ext4_cross_rename()
3980 &new.de, &new.inlined); in ext4_cross_rename()
3988 if (!new.bh || le32_to_cpu(new.de->inode) != new.inode->i_ino) in ext4_cross_rename()
3992 (2 * EXT4_DATA_TRANS_BLOCKS(old.dir->i_sb) + in ext4_cross_rename()
4003 if (S_ISDIR(old.inode->i_mode)) { in ext4_cross_rename()
4009 if (S_ISDIR(new.inode->i_mode)) { in ext4_cross_rename()
4018 * nlink only needs to be modified if this is a cross directory rename. in ext4_cross_rename()
4021 old.dir_nlink_delta = old.is_dir ? -1 : 1; in ext4_cross_rename()
4022 new.dir_nlink_delta = -old.dir_nlink_delta; in ext4_cross_rename()
4023 retval = -EMLINK; in ext4_cross_rename()
4029 new_file_type = new.de->file_type; in ext4_cross_rename()
4030 retval = ext4_setent(handle, &new, old.inode->i_ino, old.de->file_type); in ext4_cross_rename()
4034 retval = ext4_setent(handle, &old, new.inode->i_ino, new_file_type); in ext4_cross_rename()
4043 old.inode->i_ctime = ctime; in ext4_cross_rename()
4044 new.inode->i_ctime = ctime; in ext4_cross_rename()
4051 ext4_fc_mark_ineligible(new.inode->i_sb, in ext4_cross_rename()
4054 retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino); in ext4_cross_rename()
4059 retval = ext4_rename_dir_finish(handle, &new, old.dir->i_ino); in ext4_cross_rename()
4084 if (unlikely(ext4_forced_shutdown(EXT4_SB(old_dir->i_sb)))) in ext4_rename2()
4085 return -EIO; in ext4_rename2()
4088 return -EINVAL; in ext4_rename2()