Lines Matching +full:de +full:- +full:be
1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Creates, reads, walks and deletes directory-nodes
13 * Laboratoire MASI - Institut Blaise pascal
71 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_supports_dir_trailer()
73 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_supports_dir_trailer()
84 * is turned off. Only directory-initialization type functions should
89 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_new_dir_wants_trailer()
97 return sb->s_blocksize - sizeof(struct ocfs2_dir_block_trailer); in ocfs2_dir_trailer_blk_off()
100 #define ocfs2_trailer_from_bh(_bh, _sb) ((struct ocfs2_dir_block_trailer *) ((_bh)->b_data + ocfs2_…
102 /* XXX ocfs2_block_dqtrailer() is similar but not quite - can we make
109 p += blocksize - sizeof(struct ocfs2_dir_block_trailer); in ocfs2_dir_trailer_from_size()
118 struct ocfs2_dir_entry *de, in ocfs2_skip_dir_trailer() argument
122 unsigned long toff = blklen - sizeof(struct ocfs2_dir_block_trailer); in ocfs2_skip_dir_trailer()
138 trailer = ocfs2_trailer_from_bh(bh, inode->i_sb); in ocfs2_init_dir_trailer()
139 strcpy(trailer->db_signature, OCFS2_DIR_TRAILER_SIGNATURE); in ocfs2_init_dir_trailer()
140 trailer->db_compat_rec_len = in ocfs2_init_dir_trailer()
142 trailer->db_parent_dinode = cpu_to_le64(OCFS2_I(inode)->ip_blkno); in ocfs2_init_dir_trailer()
143 trailer->db_blkno = cpu_to_le64(bh->b_blocknr); in ocfs2_init_dir_trailer()
144 trailer->db_free_rec_len = cpu_to_le16(rec_len); in ocfs2_init_dir_trailer()
165 trailer = ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb); in ocfs2_dx_dir_link_trailer()
166 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_dx_dir_link_trailer()
168 trailer->db_free_next = dx_root->dr_free_blk; in ocfs2_dx_dir_link_trailer()
169 dx_root->dr_free_blk = cpu_to_le64(dirdata_bh->b_blocknr); in ocfs2_dx_dir_link_trailer()
179 return res->dl_prev_leaf_bh == NULL; in ocfs2_free_list_at_root()
184 brelse(res->dl_dx_root_bh); in ocfs2_free_dir_lookup_result()
185 brelse(res->dl_leaf_bh); in ocfs2_free_dir_lookup_result()
186 brelse(res->dl_dx_leaf_bh); in ocfs2_free_dir_lookup_result()
187 brelse(res->dl_prev_leaf_bh); in ocfs2_free_dir_lookup_result()
192 if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INDEXED_DIR_FL) in ocfs2_dir_indexed()
199 return dx_root->dr_flags & OCFS2_DX_FLAG_INLINE; in ocfs2_dx_root_inline()
218 } while (--n); in TEA_transform()
242 num--; in str2hashbuf()
245 if (--num >= 0) in str2hashbuf()
247 while (--num >= 0) in str2hashbuf()
254 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_dx_dir_name_hash()
271 * should never allow this to be selected without hand editing in ocfs2_dx_dir_name_hash()
278 memcpy(buf, osb->osb_dx_seed, sizeof(buf)); in ocfs2_dx_dir_name_hash()
284 len -= 16; in ocfs2_dx_dir_name_hash()
289 hinfo->major_hash = buf[0]; in ocfs2_dx_dir_name_hash()
290 hinfo->minor_hash = buf[1]; in ocfs2_dx_dir_name_hash()
294 * bh passed here can be an inode block or a dir data block, depending
298 struct ocfs2_dir_entry *de, in ocfs2_check_dir_entry() argument
305 const int rlen = le16_to_cpu(de->rec_len); in ocfs2_check_dir_entry()
306 const unsigned long next_offset = ((char *) de - buf) + rlen; in ocfs2_check_dir_entry()
312 else if (unlikely(rlen < OCFS2_DIR_REC_LEN(de->name_len))) in ocfs2_check_dir_entry()
316 else if (unlikely(next_offset > size - OCFS2_DIR_REC_LEN(1)) && in ocfs2_check_dir_entry()
321 mlog(ML_ERROR, "bad entry in directory #%llu: %s - " in ocfs2_check_dir_entry()
323 (unsigned long long)OCFS2_I(dir)->ip_blkno, error_msg, in ocfs2_check_dir_entry()
324 offset, (unsigned long long)le64_to_cpu(de->inode), rlen, in ocfs2_check_dir_entry()
325 de->name_len); in ocfs2_check_dir_entry()
332 struct ocfs2_dir_entry *de) in ocfs2_match() argument
334 if (len != de->name_len) in ocfs2_match()
336 if (!de->inode) in ocfs2_match()
338 return !memcmp(name, de->name, len); in ocfs2_match()
342 * Returns 0 if not found, -1 on failure, and 1 on success
352 struct ocfs2_dir_entry *de; in ocfs2_search_dirblock() local
360 while (de_buf < dlimit - OCFS2_DIR_MEMBER_LEN) { in ocfs2_search_dirblock()
364 de = (struct ocfs2_dir_entry *) de_buf; in ocfs2_search_dirblock()
366 if (de->name + namelen <= dlimit && in ocfs2_search_dirblock()
367 ocfs2_match(namelen, name, de)) { in ocfs2_search_dirblock()
368 /* found a match - just to be sure, do a full check */ in ocfs2_search_dirblock()
369 if (!ocfs2_check_dir_entry(dir, de, bh, first_de, in ocfs2_search_dirblock()
371 ret = -1; in ocfs2_search_dirblock()
374 *res_dir = de; in ocfs2_search_dirblock()
380 de_len = le16_to_cpu(de->rec_len); in ocfs2_search_dirblock()
382 ret = -1; in ocfs2_search_dirblock()
411 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_find_entry_id()
412 data = &di->id2.i_data; in ocfs2_find_entry_id()
415 data->id_data, i_size_read(dir), res_dir); in ocfs2_find_entry_id()
434 * in-place when the code walks them. in ocfs2_validate_dir_block()
436 trace_ocfs2_validate_dir_block((unsigned long long)bh->b_blocknr); in ocfs2_validate_dir_block()
449 rc = ocfs2_validate_meta_ecc(sb, bh->b_data, &trailer->db_check); in ocfs2_validate_dir_block()
452 (unsigned long long)bh->b_blocknr); in ocfs2_validate_dir_block()
468 trailer = ocfs2_trailer_from_bh(bh, dir->i_sb); in ocfs2_check_dir_trailer()
470 rc = ocfs2_error(dir->i_sb, in ocfs2_check_dir_trailer()
472 (unsigned long long)bh->b_blocknr, 7, in ocfs2_check_dir_trailer()
473 trailer->db_signature); in ocfs2_check_dir_trailer()
476 if (le64_to_cpu(trailer->db_blkno) != bh->b_blocknr) { in ocfs2_check_dir_trailer()
477 rc = ocfs2_error(dir->i_sb, in ocfs2_check_dir_trailer()
479 (unsigned long long)bh->b_blocknr, in ocfs2_check_dir_trailer()
480 (unsigned long long)le64_to_cpu(trailer->db_blkno)); in ocfs2_check_dir_trailer()
483 if (le64_to_cpu(trailer->db_parent_dinode) != in ocfs2_check_dir_trailer()
484 OCFS2_I(dir)->ip_blkno) { in ocfs2_check_dir_trailer()
485 rc = ocfs2_error(dir->i_sb, in ocfs2_check_dir_trailer()
487 (unsigned long long)bh->b_blocknr, in ocfs2_check_dir_trailer()
488 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_check_dir_trailer()
489 (unsigned long long)le64_to_cpu(trailer->db_blkno)); in ocfs2_check_dir_trailer()
497 * This function forces all errors to -EIO for consistency with its
531 return rc ? -EIO : 0; in ocfs2_read_dir_block()
536 * inode. This function does no virtual->physical block translation -
537 * what's passed in is assumed to be a valid directory block.
576 dx_root = (struct ocfs2_dx_root_block *) bh->b_data; in ocfs2_validate_dx_root()
578 ret = ocfs2_validate_meta_ecc(sb, bh->b_data, &dx_root->dr_check); in ocfs2_validate_dx_root()
582 (unsigned long long)bh->b_blocknr); in ocfs2_validate_dx_root()
589 (unsigned long long)le64_to_cpu(dx_root->dr_blkno), in ocfs2_validate_dx_root()
590 7, dx_root->dr_signature); in ocfs2_validate_dx_root()
600 u64 blkno = le64_to_cpu(di->i_dx_root); in ocfs2_read_dx_root()
617 struct ocfs2_dx_leaf *dx_leaf = (struct ocfs2_dx_leaf *)bh->b_data; in ocfs2_validate_dx_leaf()
621 ret = ocfs2_validate_meta_ecc(sb, bh->b_data, &dx_leaf->dl_check); in ocfs2_validate_dx_leaf()
625 (unsigned long long)bh->b_blocknr); in ocfs2_validate_dx_leaf()
631 7, dx_leaf->dl_signature); in ocfs2_validate_dx_leaf()
655 * pointers to be NULL on function entry.
685 sb = dir->i_sb; in ocfs2_find_entry_el()
687 nblocks = i_size_read(dir) >> sb->s_blocksize_bits; in ocfs2_find_entry_el()
688 start = OCFS2_I(dir)->ip_dir_start_lookup; in ocfs2_find_entry_el()
696 * We deal with the read-ahead logic here. in ocfs2_find_entry_el()
727 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_find_entry_el()
732 block << sb->s_blocksize_bits, in ocfs2_find_entry_el()
733 bh->b_data, sb->s_blocksize, in ocfs2_find_entry_el()
736 OCFS2_I(dir)->ip_dir_start_lookup = block; in ocfs2_find_entry_el()
754 nblocks = i_size_read(dir) >> sb->s_blocksize_bits; in ocfs2_find_entry_el()
761 /* Clean up the read-ahead blocks */ in ocfs2_find_entry_el()
781 if (el->l_tree_depth) { in ocfs2_dx_dir_lookup_rec()
789 eb = (struct ocfs2_extent_block *) eb_bh->b_data; in ocfs2_dx_dir_lookup_rec()
790 el = &eb->h_list; in ocfs2_dx_dir_lookup_rec()
792 if (el->l_tree_depth) { in ocfs2_dx_dir_lookup_rec()
793 ret = ocfs2_error(inode->i_sb, in ocfs2_dx_dir_lookup_rec()
795 inode->i_ino, in ocfs2_dx_dir_lookup_rec()
796 (unsigned long long)eb_bh->b_blocknr); in ocfs2_dx_dir_lookup_rec()
802 for (i = le16_to_cpu(el->l_next_free_rec) - 1; i >= 0; i--) { in ocfs2_dx_dir_lookup_rec()
803 rec = &el->l_recs[i]; in ocfs2_dx_dir_lookup_rec()
805 if (le32_to_cpu(rec->e_cpos) <= major_hash) { in ocfs2_dx_dir_lookup_rec()
812 ret = ocfs2_error(inode->i_sb, in ocfs2_dx_dir_lookup_rec()
814 inode->i_ino, in ocfs2_dx_dir_lookup_rec()
815 le32_to_cpu(rec->e_cpos), in ocfs2_dx_dir_lookup_rec()
821 *ret_phys_blkno = le64_to_cpu(rec->e_blkno); in ocfs2_dx_dir_lookup_rec()
823 *ret_cpos = le32_to_cpu(rec->e_cpos); in ocfs2_dx_dir_lookup_rec()
825 *ret_clen = le16_to_cpu(rec->e_leaf_clusters); in ocfs2_dx_dir_lookup_rec()
839 return minor_hash & osb->osb_dx_mask; in __ocfs2_dx_dir_hash_idx()
845 return __ocfs2_dx_dir_hash_idx(osb, hinfo->minor_hash); in ocfs2_dx_dir_hash_idx()
858 u32 name_hash = hinfo->major_hash; in ocfs2_dx_dir_lookup()
870 blkno += ocfs2_clusters_to_blocks(inode->i_sb, clen - 1); in ocfs2_dx_dir_lookup()
871 cpos += clen - 1; in ocfs2_dx_dir_lookup()
873 blkno += ocfs2_clusters_to_blocks(inode->i_sb, in ocfs2_dx_dir_lookup()
874 name_hash - cpos); in ocfs2_dx_dir_lookup()
883 blkno += ocfs2_dx_dir_hash_idx(OCFS2_SB(inode->i_sb), hinfo); in ocfs2_dx_dir_lookup()
907 struct ocfs2_dx_hinfo *hinfo = &res->dl_hinfo; in ocfs2_dx_dir_search()
911 ocfs2_dx_dir_name_hash(dir, name, namelen, &res->dl_hinfo); in ocfs2_dx_dir_search()
914 entry_list = &dx_root->dr_entries; in ocfs2_dx_dir_search()
918 dr_el = &dx_root->dr_list; in ocfs2_dx_dir_search()
926 trace_ocfs2_dx_dir_search((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_search()
927 namelen, name, hinfo->major_hash, in ocfs2_dx_dir_search()
928 hinfo->minor_hash, (unsigned long long)phys); in ocfs2_dx_dir_search()
936 dx_leaf = (struct ocfs2_dx_leaf *) dx_leaf_bh->b_data; in ocfs2_dx_dir_search()
939 le16_to_cpu(dx_leaf->dl_list.de_num_used), in ocfs2_dx_dir_search()
940 le16_to_cpu(dx_leaf->dl_list.de_count)); in ocfs2_dx_dir_search()
942 entry_list = &dx_leaf->dl_list; in ocfs2_dx_dir_search()
949 for (i = 0; i < le16_to_cpu(entry_list->de_num_used); i++) { in ocfs2_dx_dir_search()
950 dx_entry = &entry_list->de_entries[i]; in ocfs2_dx_dir_search()
952 if (hinfo->major_hash != le32_to_cpu(dx_entry->dx_major_hash) in ocfs2_dx_dir_search()
953 || hinfo->minor_hash != le32_to_cpu(dx_entry->dx_minor_hash)) in ocfs2_dx_dir_search()
961 le64_to_cpu(dx_entry->dx_dirent_blk), in ocfs2_dx_dir_search()
974 0, dir_ent_bh->b_data, in ocfs2_dx_dir_search()
975 dir->i_sb->s_blocksize, &dir_ent); in ocfs2_dx_dir_search()
979 if (found == -1) { in ocfs2_dx_dir_search()
981 ret = -EIO; in ocfs2_dx_dir_search()
991 ret = -ENOENT; in ocfs2_dx_dir_search()
995 res->dl_leaf_bh = dir_ent_bh; in ocfs2_dx_dir_search()
996 res->dl_entry = dir_ent; in ocfs2_dx_dir_search()
997 res->dl_dx_leaf_bh = dx_leaf_bh; in ocfs2_dx_dir_search()
998 res->dl_dx_entry = dx_entry; in ocfs2_dx_dir_search()
1025 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_find_entry_dx()
1032 dx_root = (struct ocfs2_dx_root_block *) dx_root_bh->b_data; in ocfs2_find_entry_dx()
1036 if (ret != -ENOENT) in ocfs2_find_entry_dx()
1041 lookup->dl_dx_root_bh = dx_root_bh; in ocfs2_find_entry_dx()
1052 * If nothing was found, -ENOENT is returned. Otherwise, zero is
1057 * buffer_heads - they are passed back only so that it can be passed
1060 * data block, in the inline-data case it actually points to an inode,
1074 ret = -EFSCORRUPTED; in ocfs2_find_entry()
1083 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in ocfs2_find_entry()
1084 if (unlikely(i_size_read(dir) > dir->i_sb->s_blocksize)) { in ocfs2_find_entry()
1085 ret = -EFSCORRUPTED; in ocfs2_find_entry()
1095 return -ENOENT; in ocfs2_find_entry()
1097 lookup->dl_leaf_bh = bh; in ocfs2_find_entry()
1098 lookup->dl_entry = res_dir; in ocfs2_find_entry()
1112 struct ocfs2_dir_entry *de = res->dl_entry; in ocfs2_update_entry() local
1113 struct buffer_head *de_bh = res->dl_leaf_bh; in ocfs2_update_entry()
1116 * The same code works fine for both inline-data and extent in ocfs2_update_entry()
1121 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_update_entry()
1131 de->inode = cpu_to_le64(OCFS2_I(new_entry_inode)->ip_blkno); in ocfs2_update_entry()
1132 ocfs2_set_de_type(de, new_entry_inode->i_mode); in ocfs2_update_entry()
1149 struct ocfs2_dir_entry *de, *pde; in __ocfs2_delete_entry() local
1150 int i, status = -ENOENT; in __ocfs2_delete_entry()
1153 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in __ocfs2_delete_entry()
1158 de = (struct ocfs2_dir_entry *) first_de; in __ocfs2_delete_entry()
1160 if (!ocfs2_check_dir_entry(dir, de, bh, first_de, bytes, i)) { in __ocfs2_delete_entry()
1161 status = -EIO; in __ocfs2_delete_entry()
1165 if (de == de_del) { in __ocfs2_delete_entry()
1169 status = -EIO; in __ocfs2_delete_entry()
1174 le16_add_cpu(&pde->rec_len, in __ocfs2_delete_entry()
1175 le16_to_cpu(de->rec_len)); in __ocfs2_delete_entry()
1176 de->inode = 0; in __ocfs2_delete_entry()
1181 i += le16_to_cpu(de->rec_len); in __ocfs2_delete_entry()
1182 pde = de; in __ocfs2_delete_entry()
1183 de = (struct ocfs2_dir_entry *)((char *)de + le16_to_cpu(de->rec_len)); in __ocfs2_delete_entry()
1189 static unsigned int ocfs2_figure_dirent_hole(struct ocfs2_dir_entry *de) in ocfs2_figure_dirent_hole() argument
1193 if (le64_to_cpu(de->inode) == 0) in ocfs2_figure_dirent_hole()
1194 hole = le16_to_cpu(de->rec_len); in ocfs2_figure_dirent_hole()
1196 hole = le16_to_cpu(de->rec_len) - in ocfs2_figure_dirent_hole()
1197 OCFS2_DIR_REC_LEN(de->name_len); in ocfs2_figure_dirent_hole()
1206 char *trailer, *de_buf, *limit, *start = dirblock_bh->b_data; in ocfs2_find_max_rec_len()
1207 struct ocfs2_dir_entry *de; in ocfs2_find_max_rec_len() local
1213 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_find_max_rec_len()
1216 this_hole = ocfs2_figure_dirent_hole(de); in ocfs2_find_max_rec_len()
1221 de_buf += le16_to_cpu(de->rec_len); in ocfs2_find_max_rec_len()
1222 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_find_max_rec_len()
1233 int num_used = le16_to_cpu(entry_list->de_num_used); in ocfs2_dx_list_remove_entry()
1235 if (num_used == 1 || index == (num_used - 1)) in ocfs2_dx_list_remove_entry()
1238 memmove(&entry_list->de_entries[index], in ocfs2_dx_list_remove_entry()
1239 &entry_list->de_entries[index + 1], in ocfs2_dx_list_remove_entry()
1240 (num_used - index - 1)*sizeof(struct ocfs2_dx_entry)); in ocfs2_dx_list_remove_entry()
1242 num_used--; in ocfs2_dx_list_remove_entry()
1243 memset(&entry_list->de_entries[num_used], 0, in ocfs2_dx_list_remove_entry()
1245 entry_list->de_num_used = cpu_to_le16(num_used); in ocfs2_dx_list_remove_entry()
1252 struct buffer_head *dx_root_bh = lookup->dl_dx_root_bh; in ocfs2_delete_entry_dx()
1253 struct buffer_head *leaf_bh = lookup->dl_leaf_bh; in ocfs2_delete_entry_dx()
1255 struct ocfs2_dx_entry *dx_entry = lookup->dl_dx_entry; in ocfs2_delete_entry_dx()
1271 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_delete_entry_dx()
1273 entry_list = &dx_root->dr_entries; in ocfs2_delete_entry_dx()
1275 dx_leaf = (struct ocfs2_dx_leaf *) lookup->dl_dx_leaf_bh->b_data; in ocfs2_delete_entry_dx()
1276 entry_list = &dx_leaf->dl_list; in ocfs2_delete_entry_dx()
1279 /* Neither of these are a disk corruption - that should have in ocfs2_delete_entry_dx()
1281 BUG_ON(le16_to_cpu(entry_list->de_count) <= 0); in ocfs2_delete_entry_dx()
1282 BUG_ON(le16_to_cpu(entry_list->de_num_used) <= 0); in ocfs2_delete_entry_dx()
1284 index = (char *)dx_entry - (char *)entry_list->de_entries; in ocfs2_delete_entry_dx()
1287 if (index >= le16_to_cpu(entry_list->de_num_used)) { in ocfs2_delete_entry_dx()
1289 (unsigned long long)OCFS2_I(dir)->ip_blkno, index, in ocfs2_delete_entry_dx()
1291 return -EIO; in ocfs2_delete_entry_dx()
1299 trailer = ocfs2_trailer_from_bh(leaf_bh, dir->i_sb); in ocfs2_delete_entry_dx()
1300 if (trailer->db_free_rec_len == 0) in ocfs2_delete_entry_dx()
1311 * the entry count needs to be updated. Also, we might be in ocfs2_delete_entry_dx()
1323 lookup->dl_dx_leaf_bh, in ocfs2_delete_entry_dx()
1331 trace_ocfs2_delete_entry_dx((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_delete_entry_dx()
1334 ret = __ocfs2_delete_entry(handle, dir, lookup->dl_entry, in ocfs2_delete_entry_dx()
1335 leaf_bh, leaf_bh->b_data, leaf_bh->b_size); in ocfs2_delete_entry_dx()
1341 max_rec_len = ocfs2_find_max_rec_len(dir->i_sb, leaf_bh); in ocfs2_delete_entry_dx()
1342 trailer->db_free_rec_len = cpu_to_le16(max_rec_len); in ocfs2_delete_entry_dx()
1344 trailer->db_free_next = dx_root->dr_free_blk; in ocfs2_delete_entry_dx()
1345 dx_root->dr_free_blk = cpu_to_le64(leaf_bh->b_blocknr); in ocfs2_delete_entry_dx()
1352 le32_add_cpu(&dx_root->dr_num_entries, -1); in ocfs2_delete_entry_dx()
1358 ocfs2_journal_dirty(handle, lookup->dl_dx_leaf_bh); in ocfs2_delete_entry_dx()
1380 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_delete_entry_id()
1381 data = &di->id2.i_data; in ocfs2_delete_entry_id()
1383 ret = __ocfs2_delete_entry(handle, dir, de_del, bh, data->id_data, in ocfs2_delete_entry_id()
1396 return __ocfs2_delete_entry(handle, dir, de_del, bh, bh->b_data, in ocfs2_delete_entry_el()
1397 bh->b_size); in ocfs2_delete_entry_el()
1411 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_delete_entry()
1412 return ocfs2_delete_entry_id(handle, dir, res->dl_entry, in ocfs2_delete_entry()
1413 res->dl_leaf_bh); in ocfs2_delete_entry()
1415 return ocfs2_delete_entry_el(handle, dir, res->dl_entry, in ocfs2_delete_entry()
1416 res->dl_leaf_bh); in ocfs2_delete_entry()
1420 * Check whether 'de' has enough room to hold an entry of
1423 static inline int ocfs2_dirent_would_fit(struct ocfs2_dir_entry *de, in ocfs2_dirent_would_fit() argument
1429 if (le64_to_cpu(de->inode) == 0 && in ocfs2_dirent_would_fit()
1430 le16_to_cpu(de->rec_len) >= new_rec_len) in ocfs2_dirent_would_fit()
1437 de_really_used = OCFS2_DIR_REC_LEN(de->name_len); in ocfs2_dirent_would_fit()
1438 if (le16_to_cpu(de->rec_len) >= (de_really_used + new_rec_len)) in ocfs2_dirent_would_fit()
1449 i = le16_to_cpu(dx_leaf->dl_list.de_num_used); in ocfs2_dx_dir_leaf_insert_tail()
1450 dx_leaf->dl_list.de_entries[i] = *dx_new_entry; in ocfs2_dx_dir_leaf_insert_tail()
1452 le16_add_cpu(&dx_leaf->dl_list.de_num_used, 1); in ocfs2_dx_dir_leaf_insert_tail()
1462 i = le16_to_cpu(entry_list->de_num_used); in ocfs2_dx_entry_list_insert()
1463 dx_entry = &entry_list->de_entries[i]; in ocfs2_dx_entry_list_insert()
1466 dx_entry->dx_major_hash = cpu_to_le32(hinfo->major_hash); in ocfs2_dx_entry_list_insert()
1467 dx_entry->dx_minor_hash = cpu_to_le32(hinfo->minor_hash); in ocfs2_dx_entry_list_insert()
1468 dx_entry->dx_dirent_blk = cpu_to_le64(dirent_blk); in ocfs2_dx_entry_list_insert()
1470 le16_add_cpu(&entry_list->de_num_used, 1); in ocfs2_dx_entry_list_insert()
1488 dx_leaf = (struct ocfs2_dx_leaf *)dx_leaf_bh->b_data; in __ocfs2_dx_dir_leaf_insert()
1489 ocfs2_dx_entry_list_insert(&dx_leaf->dl_list, hinfo, dirent_blk); in __ocfs2_dx_dir_leaf_insert()
1501 ocfs2_dx_entry_list_insert(&dx_root->dr_entries, hinfo, dirent_blk); in ocfs2_dx_inline_root_insert()
1509 struct buffer_head *dx_root_bh = lookup->dl_dx_root_bh; in ocfs2_dx_dir_insert()
1518 dx_root = (struct ocfs2_dx_root_block *)lookup->dl_dx_root_bh->b_data; in ocfs2_dx_dir_insert()
1521 &lookup->dl_hinfo, in ocfs2_dx_dir_insert()
1522 lookup->dl_leaf_bh->b_blocknr, in ocfs2_dx_dir_insert()
1525 ret = __ocfs2_dx_dir_leaf_insert(dir, handle, &lookup->dl_hinfo, in ocfs2_dx_dir_insert()
1526 lookup->dl_leaf_bh->b_blocknr, in ocfs2_dx_dir_insert()
1527 lookup->dl_dx_leaf_bh); in ocfs2_dx_dir_insert()
1532 le32_add_cpu(&dx_root->dr_num_entries, 1); in ocfs2_dx_dir_insert()
1547 trailer = ocfs2_trailer_from_bh(lookup->dl_leaf_bh, dir->i_sb); in ocfs2_remove_block_from_free_list()
1550 bh = lookup->dl_dx_root_bh; in ocfs2_remove_block_from_free_list()
1551 dx_root = (struct ocfs2_dx_root_block *)bh->b_data; in ocfs2_remove_block_from_free_list()
1552 dx_root->dr_free_blk = trailer->db_free_next; in ocfs2_remove_block_from_free_list()
1554 bh = lookup->dl_prev_leaf_bh; in ocfs2_remove_block_from_free_list()
1555 prev = ocfs2_trailer_from_bh(bh, dir->i_sb); in ocfs2_remove_block_from_free_list()
1556 prev->db_free_next = trailer->db_free_next; in ocfs2_remove_block_from_free_list()
1559 trailer->db_free_rec_len = cpu_to_le16(0); in ocfs2_remove_block_from_free_list()
1560 trailer->db_free_next = cpu_to_le64(0); in ocfs2_remove_block_from_free_list()
1563 ocfs2_journal_dirty(handle, lookup->dl_leaf_bh); in ocfs2_remove_block_from_free_list()
1568 * lookup->dl_prev_leaf_bh or lookup->dl_dx_root_bh
1577 max_rec_len = ocfs2_find_max_rec_len(dir->i_sb, lookup->dl_leaf_bh); in ocfs2_recalc_free_list()
1584 trailer = ocfs2_trailer_from_bh(lookup->dl_leaf_bh, dir->i_sb); in ocfs2_recalc_free_list()
1585 trailer->db_free_rec_len = cpu_to_le16(max_rec_len); in ocfs2_recalc_free_list()
1586 ocfs2_journal_dirty(handle, lookup->dl_leaf_bh); in ocfs2_recalc_free_list()
1607 struct ocfs2_dir_entry *de, *de1; in __ocfs2_add_entry() local
1608 struct ocfs2_dinode *di = (struct ocfs2_dinode *)parent_fe_bh->b_data; in __ocfs2_add_entry()
1609 struct super_block *sb = dir->i_sb; in __ocfs2_add_entry()
1611 unsigned int size = sb->s_blocksize; in __ocfs2_add_entry()
1612 struct buffer_head *insert_bh = lookup->dl_leaf_bh; in __ocfs2_add_entry()
1613 char *data_start = insert_bh->b_data; in __ocfs2_add_entry()
1623 * XXX: This can be either a dx_root_block, or an unindexed in __ocfs2_add_entry()
1627 bh = lookup->dl_dx_root_bh; in __ocfs2_add_entry()
1632 bh = lookup->dl_prev_leaf_bh; in __ocfs2_add_entry()
1641 } else if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in __ocfs2_add_entry()
1642 data_start = di->id2.i_data.id_data; in __ocfs2_add_entry()
1650 de = (struct ocfs2_dir_entry *) data_start; in __ocfs2_add_entry()
1652 BUG_ON((char *)de >= (size + data_start)); in __ocfs2_add_entry()
1657 if (!ocfs2_check_dir_entry(dir, de, insert_bh, data_start, in __ocfs2_add_entry()
1659 retval = -ENOENT; in __ocfs2_add_entry()
1662 if (ocfs2_match(namelen, name, de)) { in __ocfs2_add_entry()
1663 retval = -EEXIST; in __ocfs2_add_entry()
1669 mlog_bug_on_msg(ocfs2_skip_dir_trailer(dir, de, offset, size), in __ocfs2_add_entry()
1674 (unsigned long long)parent_fe_bh->b_blocknr, in __ocfs2_add_entry()
1675 offset, ocfs2_dir_trailer_blk_off(dir->i_sb)); in __ocfs2_add_entry()
1677 if (ocfs2_dirent_would_fit(de, rec_len)) { in __ocfs2_add_entry()
1709 offset += le16_to_cpu(de->rec_len); in __ocfs2_add_entry()
1710 if (le64_to_cpu(de->inode)) { in __ocfs2_add_entry()
1711 de1 = (struct ocfs2_dir_entry *)((char *) de + in __ocfs2_add_entry()
1712 OCFS2_DIR_REC_LEN(de->name_len)); in __ocfs2_add_entry()
1713 de1->rec_len = in __ocfs2_add_entry()
1714 cpu_to_le16(le16_to_cpu(de->rec_len) - in __ocfs2_add_entry()
1715 OCFS2_DIR_REC_LEN(de->name_len)); in __ocfs2_add_entry()
1716 de->rec_len = cpu_to_le16(OCFS2_DIR_REC_LEN(de->name_len)); in __ocfs2_add_entry()
1717 de = de1; in __ocfs2_add_entry()
1719 de->file_type = FT_UNKNOWN; in __ocfs2_add_entry()
1721 de->inode = cpu_to_le64(blkno); in __ocfs2_add_entry()
1722 ocfs2_set_de_type(de, inode->i_mode); in __ocfs2_add_entry()
1724 de->inode = 0; in __ocfs2_add_entry()
1725 de->name_len = namelen; in __ocfs2_add_entry()
1726 memcpy(de->name, name, namelen); in __ocfs2_add_entry()
1737 offset += le16_to_cpu(de->rec_len); in __ocfs2_add_entry()
1738 de = (struct ocfs2_dir_entry *) ((char *) de + le16_to_cpu(de->rec_len)); in __ocfs2_add_entry()
1743 retval = -ENOSPC; in __ocfs2_add_entry()
1756 unsigned long offset = ctx->pos; in ocfs2_dir_foreach_blk_id()
1760 struct ocfs2_dir_entry *de; in ocfs2_dir_foreach_blk_id() local
1765 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_dir_foreach_blk_id()
1769 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_dir_foreach_blk_id()
1770 data = &di->id2.i_data; in ocfs2_dir_foreach_blk_id()
1772 while (ctx->pos < i_size_read(inode)) { in ocfs2_dir_foreach_blk_id()
1774 * readdir(2), then we might be pointing to an invalid in ocfs2_dir_foreach_blk_id()
1779 de = (struct ocfs2_dir_entry *) in ocfs2_dir_foreach_blk_id()
1780 (data->id_data + i); in ocfs2_dir_foreach_blk_id()
1784 * least that it is non-zero. A in ocfs2_dir_foreach_blk_id()
1785 * failure will be detected in the in ocfs2_dir_foreach_blk_id()
1787 if (le16_to_cpu(de->rec_len) < in ocfs2_dir_foreach_blk_id()
1790 i += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_id()
1792 ctx->pos = offset = i; in ocfs2_dir_foreach_blk_id()
1796 de = (struct ocfs2_dir_entry *) (data->id_data + ctx->pos); in ocfs2_dir_foreach_blk_id()
1797 if (!ocfs2_check_dir_entry(inode, de, di_bh, (char *)data->id_data, in ocfs2_dir_foreach_blk_id()
1798 i_size_read(inode), ctx->pos)) { in ocfs2_dir_foreach_blk_id()
1800 ctx->pos = i_size_read(inode); in ocfs2_dir_foreach_blk_id()
1803 offset += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_id()
1804 if (le64_to_cpu(de->inode)) { in ocfs2_dir_foreach_blk_id()
1805 if (!dir_emit(ctx, de->name, de->name_len, in ocfs2_dir_foreach_blk_id()
1806 le64_to_cpu(de->inode), in ocfs2_dir_foreach_blk_id()
1807 fs_ftype_to_dtype(de->file_type))) in ocfs2_dir_foreach_blk_id()
1810 ctx->pos += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_id()
1818 * NOTE: This function can be called against unindexed directories,
1829 struct ocfs2_dir_entry * de; in ocfs2_dir_foreach_blk_el() local
1830 struct super_block * sb = inode->i_sb; in ocfs2_dir_foreach_blk_el()
1836 offset = ctx->pos & (sb->s_blocksize - 1); in ocfs2_dir_foreach_blk_el()
1838 while (ctx->pos < i_size_read(inode)) { in ocfs2_dir_foreach_blk_el()
1839 blk = ctx->pos >> sb->s_blocksize_bits; in ocfs2_dir_foreach_blk_el()
1842 ctx->pos += sb->s_blocksize - offset; in ocfs2_dir_foreach_blk_el()
1846 /* The idea here is to begin with 8k read-ahead and to stay in ocfs2_dir_foreach_blk_el()
1850 * make sure it's cluster-safe... */ in ocfs2_dir_foreach_blk_el()
1852 || (((last_ra_blk - blk) << 9) <= (ra_sectors / 2))) { in ocfs2_dir_foreach_blk_el()
1853 for (i = ra_sectors >> (sb->s_blocksize_bits - 9); in ocfs2_dir_foreach_blk_el()
1854 i > 0; i--) { in ocfs2_dir_foreach_blk_el()
1865 * readdir(2), then we might be pointing to an invalid in ocfs2_dir_foreach_blk_el()
1869 for (i = 0; i < sb->s_blocksize && i < offset; ) { in ocfs2_dir_foreach_blk_el()
1870 de = (struct ocfs2_dir_entry *) (bh->b_data + i); in ocfs2_dir_foreach_blk_el()
1874 * least that it is non-zero. A in ocfs2_dir_foreach_blk_el()
1875 * failure will be detected in the in ocfs2_dir_foreach_blk_el()
1877 if (le16_to_cpu(de->rec_len) < in ocfs2_dir_foreach_blk_el()
1880 i += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_el()
1883 ctx->pos = (ctx->pos & ~(sb->s_blocksize - 1)) in ocfs2_dir_foreach_blk_el()
1888 while (ctx->pos < i_size_read(inode) in ocfs2_dir_foreach_blk_el()
1889 && offset < sb->s_blocksize) { in ocfs2_dir_foreach_blk_el()
1890 de = (struct ocfs2_dir_entry *) (bh->b_data + offset); in ocfs2_dir_foreach_blk_el()
1891 if (!ocfs2_check_dir_entry(inode, de, bh, bh->b_data, in ocfs2_dir_foreach_blk_el()
1892 sb->s_blocksize, offset)) { in ocfs2_dir_foreach_blk_el()
1895 ctx->pos = (ctx->pos | (sb->s_blocksize - 1)) + 1; in ocfs2_dir_foreach_blk_el()
1898 if (le64_to_cpu(de->inode)) { in ocfs2_dir_foreach_blk_el()
1899 if (!dir_emit(ctx, de->name, in ocfs2_dir_foreach_blk_el()
1900 de->name_len, in ocfs2_dir_foreach_blk_el()
1901 le64_to_cpu(de->inode), in ocfs2_dir_foreach_blk_el()
1902 fs_ftype_to_dtype(de->file_type))) { in ocfs2_dir_foreach_blk_el()
1908 offset += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_el()
1909 ctx->pos += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_el()
1924 if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_dir_foreach_blk()
1930 * This is intended to be called from inside other kernel functions,
1948 struct ocfs2_file_private *fp = file->private_data; in ocfs2_readdir()
1951 trace_ocfs2_readdir((unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_readdir()
1953 error = ocfs2_inode_lock_atime(inode, file->f_path.mnt, &lock_level, 1); in ocfs2_readdir()
1963 if (error != -ENOENT) in ocfs2_readdir()
1969 error = ocfs2_dir_foreach_blk(inode, &fp->cookie, ctx, false); in ocfs2_readdir()
1981 * NOTE: this should always be called with parent dir i_rwsem taken.
1989 int status = -ENOENT; in ocfs2_find_files_on_disk()
1992 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_find_files_on_disk()
1998 *blkno = le64_to_cpu(lookup->dl_entry->inode); in ocfs2_find_files_on_disk()
2025 * Return -EEXIST if the directory contains the name
2026 * Return -EFSCORRUPTED if found corruption
2038 (unsigned long long)OCFS2_I(dir)->ip_blkno, namelen, name); in ocfs2_check_dir_for_entry()
2042 ret = -EEXIST; in ocfs2_check_dir_for_entry()
2044 } else if (ret == -ENOENT) { in ocfs2_check_dir_for_entry()
2068 * Check the positions of "." and ".." records to be sure in ocfs2_empty_dir_filldir()
2079 p->seen_dot = 1; in ocfs2_empty_dir_filldir()
2085 p->seen_dot_dot = 1; in ocfs2_empty_dir_filldir()
2087 if (p->dx_dir && p->seen_dot) in ocfs2_empty_dir_filldir()
2093 p->seen_other = 1; in ocfs2_empty_dir_filldir()
2106 priv->dx_dir = 1; in ocfs2_empty_dir_dx()
2113 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_empty_dir_dx()
2120 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_empty_dir_dx()
2122 if (le32_to_cpu(dx_root->dr_num_entries) != 2) in ocfs2_empty_dir_dx()
2123 priv->seen_other = 1; in ocfs2_empty_dir_dx()
2160 mlog(ML_ERROR, "bad directory (dir #%llu) - no `.' or `..'\n", in ocfs2_empty_dir()
2161 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_empty_dir()
2173 * "..", which might be used during creation of a directory with a trailing
2181 struct ocfs2_dir_entry *de = (struct ocfs2_dir_entry *)start; in ocfs2_fill_initial_dirents() local
2183 de->inode = cpu_to_le64(OCFS2_I(inode)->ip_blkno); in ocfs2_fill_initial_dirents()
2184 de->name_len = 1; in ocfs2_fill_initial_dirents()
2185 de->rec_len = in ocfs2_fill_initial_dirents()
2186 cpu_to_le16(OCFS2_DIR_REC_LEN(de->name_len)); in ocfs2_fill_initial_dirents()
2187 strcpy(de->name, "."); in ocfs2_fill_initial_dirents()
2188 ocfs2_set_de_type(de, S_IFDIR); in ocfs2_fill_initial_dirents()
2190 de = (struct ocfs2_dir_entry *) ((char *)de + le16_to_cpu(de->rec_len)); in ocfs2_fill_initial_dirents()
2191 de->inode = cpu_to_le64(OCFS2_I(parent)->ip_blkno); in ocfs2_fill_initial_dirents()
2192 de->rec_len = cpu_to_le16(size - OCFS2_DIR_REC_LEN(1)); in ocfs2_fill_initial_dirents()
2193 de->name_len = 2; in ocfs2_fill_initial_dirents()
2194 strcpy(de->name, ".."); in ocfs2_fill_initial_dirents()
2195 ocfs2_set_de_type(de, S_IFDIR); in ocfs2_fill_initial_dirents()
2197 return de; in ocfs2_fill_initial_dirents()
2202 * the inline-data flag and initializes the inline-data section.
2211 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_fill_new_dir_id()
2212 struct ocfs2_inline_data *data = &di->id2.i_data; in ocfs2_fill_new_dir_id()
2213 unsigned int size = le16_to_cpu(data->id_count); in ocfs2_fill_new_dir_id()
2222 ocfs2_fill_initial_dirents(inode, parent, data->id_data, size); in ocfs2_fill_new_dir_id()
2227 inode->i_blocks = ocfs2_inode_sector_count(inode); in ocfs2_fill_new_dir_id()
2246 unsigned int size = osb->sb->s_blocksize; in ocfs2_fill_new_dir_el()
2248 struct ocfs2_dir_entry *de; in ocfs2_fill_new_dir_el() local
2251 size = ocfs2_dir_trailer_blk_off(parent->i_sb); in ocfs2_fill_new_dir_el()
2253 status = ocfs2_do_extend_dir(osb->sb, handle, inode, fe_bh, in ocfs2_fill_new_dir_el()
2268 memset(new_bh->b_data, 0, osb->sb->s_blocksize); in ocfs2_fill_new_dir_el()
2270 de = ocfs2_fill_initial_dirents(inode, parent, new_bh->b_data, size); in ocfs2_fill_new_dir_el()
2272 int size = le16_to_cpu(de->rec_len); in ocfs2_fill_new_dir_el()
2279 size -= OCFS2_DIR_REC_LEN(2); in ocfs2_fill_new_dir_el()
2280 size -= sizeof(struct ocfs2_dir_block_trailer); in ocfs2_fill_new_dir_el()
2287 i_size_write(inode, inode->i_sb->s_blocksize); in ocfs2_fill_new_dir_el()
2289 inode->i_blocks = ocfs2_inode_sector_count(inode); in ocfs2_fill_new_dir_el()
2316 struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data; in ocfs2_dx_dir_attach_index()
2323 ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb); in ocfs2_dx_dir_attach_index()
2333 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_attach_index()
2336 dx_root_bh = sb_getblk(osb->sb, dr_blkno); in ocfs2_dx_dir_attach_index()
2338 ret = -ENOMEM; in ocfs2_dx_dir_attach_index()
2350 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_dx_dir_attach_index()
2351 memset(dx_root, 0, osb->sb->s_blocksize); in ocfs2_dx_dir_attach_index()
2352 strcpy(dx_root->dr_signature, OCFS2_DX_ROOT_SIGNATURE); in ocfs2_dx_dir_attach_index()
2353 dx_root->dr_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); in ocfs2_dx_dir_attach_index()
2354 dx_root->dr_suballoc_loc = cpu_to_le64(suballoc_loc); in ocfs2_dx_dir_attach_index()
2355 dx_root->dr_suballoc_bit = cpu_to_le16(dr_suballoc_bit); in ocfs2_dx_dir_attach_index()
2356 dx_root->dr_fs_generation = cpu_to_le32(osb->fs_generation); in ocfs2_dx_dir_attach_index()
2357 dx_root->dr_blkno = cpu_to_le64(dr_blkno); in ocfs2_dx_dir_attach_index()
2358 dx_root->dr_dir_blkno = cpu_to_le64(OCFS2_I(dir)->ip_blkno); in ocfs2_dx_dir_attach_index()
2359 dx_root->dr_num_entries = cpu_to_le32(num_entries); in ocfs2_dx_dir_attach_index()
2360 if (le16_to_cpu(trailer->db_free_rec_len)) in ocfs2_dx_dir_attach_index()
2361 dx_root->dr_free_blk = cpu_to_le64(dirdata_bh->b_blocknr); in ocfs2_dx_dir_attach_index()
2363 dx_root->dr_free_blk = cpu_to_le64(0); in ocfs2_dx_dir_attach_index()
2366 dx_root->dr_flags |= OCFS2_DX_FLAG_INLINE; in ocfs2_dx_dir_attach_index()
2367 dx_root->dr_entries.de_count = in ocfs2_dx_dir_attach_index()
2368 cpu_to_le16(ocfs2_dx_entries_per_root(osb->sb)); in ocfs2_dx_dir_attach_index()
2370 dx_root->dr_list.l_count = in ocfs2_dx_dir_attach_index()
2371 cpu_to_le16(ocfs2_extent_recs_per_dx_root(osb->sb)); in ocfs2_dx_dir_attach_index()
2382 di->i_dx_root = cpu_to_le64(dr_blkno); in ocfs2_dx_dir_attach_index()
2384 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_attach_index()
2385 OCFS2_I(dir)->ip_dyn_features |= OCFS2_INDEXED_DIR_FL; in ocfs2_dx_dir_attach_index()
2386 di->i_dyn_features = cpu_to_le16(OCFS2_I(dir)->ip_dyn_features); in ocfs2_dx_dir_attach_index()
2387 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_attach_index()
2409 bh = sb_getblk(osb->sb, start_blk + i); in ocfs2_dx_dir_format_cluster()
2411 ret = -ENOMEM; in ocfs2_dx_dir_format_cluster()
2425 dx_leaf = (struct ocfs2_dx_leaf *) bh->b_data; in ocfs2_dx_dir_format_cluster()
2427 memset(dx_leaf, 0, osb->sb->s_blocksize); in ocfs2_dx_dir_format_cluster()
2428 strcpy(dx_leaf->dl_signature, OCFS2_DX_LEAF_SIGNATURE); in ocfs2_dx_dir_format_cluster()
2429 dx_leaf->dl_fs_generation = cpu_to_le32(osb->fs_generation); in ocfs2_dx_dir_format_cluster()
2430 dx_leaf->dl_blkno = cpu_to_le64(bh->b_blocknr); in ocfs2_dx_dir_format_cluster()
2431 dx_leaf->dl_list.de_count = in ocfs2_dx_dir_format_cluster()
2432 cpu_to_le16(ocfs2_dx_entries_per_leaf(osb->sb)); in ocfs2_dx_dir_format_cluster()
2435 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_format_cluster()
2436 (unsigned long long)bh->b_blocknr, in ocfs2_dx_dir_format_cluster()
2437 le16_to_cpu(dx_leaf->dl_list.de_count)); in ocfs2_dx_dir_format_cluster()
2449 * leaf. This version will not do the extent insert, so that it can be
2461 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in __ocfs2_dx_dir_new_cluster()
2479 phys_blkno = ocfs2_clusters_to_blocks(osb->sb, phys); in __ocfs2_dx_dir_new_cluster()
2571 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_fill_new_dir_dx()
2572 entry_list = &dx_root->dr_entries; in ocfs2_fill_new_dir_dx()
2576 ocfs2_dx_entry_list_insert(entry_list, &hinfo, leaf_bh->b_blocknr); in ocfs2_fill_new_dir_dx()
2579 ocfs2_dx_entry_list_insert(entry_list, &hinfo, leaf_bh->b_blocknr); in ocfs2_fill_new_dir_dx()
2598 if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_fill_new_dir()
2618 struct ocfs2_dir_entry *de; in ocfs2_dx_dir_index_block() local
2621 u64 dirent_blk = dirent_bh->b_blocknr; in ocfs2_dx_dir_index_block()
2623 de_buf = dirent_bh->b_data; in ocfs2_dx_dir_index_block()
2624 limit = de_buf + dir->i_sb->s_blocksize; in ocfs2_dx_dir_index_block()
2627 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_dx_dir_index_block()
2629 namelen = de->name_len; in ocfs2_dx_dir_index_block()
2630 if (!namelen || !de->inode) in ocfs2_dx_dir_index_block()
2633 ocfs2_dx_dir_name_hash(dir, de->name, namelen, &hinfo); in ocfs2_dx_dir_index_block()
2635 i = ocfs2_dx_dir_hash_idx(OCFS2_SB(dir->i_sb), &hinfo); in ocfs2_dx_dir_index_block()
2648 de_buf += le16_to_cpu(de->rec_len); in ocfs2_dx_dir_index_block()
2656 * XXX: This expects dx_root_bh to already be part of the transaction.
2664 struct ocfs2_dir_entry *de; in ocfs2_dx_dir_index_root_block() local
2666 u64 dirent_blk = dirent_bh->b_blocknr; in ocfs2_dx_dir_index_root_block()
2668 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_dx_dir_index_root_block()
2670 de_buf = dirent_bh->b_data; in ocfs2_dx_dir_index_root_block()
2671 limit = de_buf + dir->i_sb->s_blocksize; in ocfs2_dx_dir_index_root_block()
2674 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_dx_dir_index_root_block()
2676 if (!de->name_len || !de->inode) in ocfs2_dx_dir_index_root_block()
2679 ocfs2_dx_dir_name_hash(dir, de->name, de->name_len, &hinfo); in ocfs2_dx_dir_index_root_block()
2682 (unsigned long long)dir->i_ino, in ocfs2_dx_dir_index_root_block()
2684 de->name_len, de->name, in ocfs2_dx_dir_index_root_block()
2685 le16_to_cpu(dx_root->dr_entries.de_num_used)); in ocfs2_dx_dir_index_root_block()
2687 ocfs2_dx_entry_list_insert(&dx_root->dr_entries, &hinfo, in ocfs2_dx_dir_index_root_block()
2690 le32_add_cpu(&dx_root->dr_num_entries, 1); in ocfs2_dx_dir_index_root_block()
2692 de_buf += le16_to_cpu(de->rec_len); in ocfs2_dx_dir_index_root_block()
2706 struct ocfs2_dir_entry *de; in ocfs2_new_dx_should_be_inline() local
2707 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_new_dx_should_be_inline()
2709 de_buf = di->id2.i_data.id_data; in ocfs2_new_dx_should_be_inline()
2713 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_new_dx_should_be_inline()
2715 if (de->name_len && de->inode) in ocfs2_new_dx_should_be_inline()
2718 de_buf += le16_to_cpu(de->rec_len); in ocfs2_new_dx_should_be_inline()
2722 return dirent_count < ocfs2_dx_entries_per_root(dir->i_sb); in ocfs2_new_dx_should_be_inline()
2742 struct super_block *sb = dir->i_sb; in ocfs2_expand_last_dirent()
2743 struct ocfs2_dir_entry *de; in ocfs2_expand_last_dirent() local
2746 unsigned int new_size = sb->s_blocksize; in ocfs2_expand_last_dirent()
2753 bytes = new_size - old_size; in ocfs2_expand_last_dirent()
2757 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_expand_last_dirent()
2759 this_hole = ocfs2_figure_dirent_hole(de); in ocfs2_expand_last_dirent()
2763 prev_de = de; in ocfs2_expand_last_dirent()
2764 de_buf += le16_to_cpu(de->rec_len); in ocfs2_expand_last_dirent()
2765 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_expand_last_dirent()
2768 le16_add_cpu(&prev_de->rec_len, bytes); in ocfs2_expand_last_dirent()
2795 struct super_block *sb = dir->i_sb; in ocfs2_expand_inline_dir()
2799 bytes = blocks_wanted << sb->s_blocksize_bits; in ocfs2_expand_inline_dir()
2800 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_expand_inline_dir()
2807 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_expand_inline_dir()
2818 down_write(&oi->ip_alloc_sem); in ocfs2_expand_inline_dir()
2830 ret = -ENOMEM; in ocfs2_expand_inline_dir()
2846 * tree - maximum dirent size is far less than one block. In in ocfs2_expand_inline_dir()
2875 ocfs2_clusters_to_bytes(osb->sb, alloc + dx_alloc)); in ocfs2_expand_inline_dir()
2893 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1); in ocfs2_expand_inline_dir()
2899 * will be claimed after the conversion to extents. in ocfs2_expand_inline_dir()
2902 data_ac->ac_resv = &oi->ip_la_data_resv; in ocfs2_expand_inline_dir()
2908 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1); in ocfs2_expand_inline_dir()
2915 blkno = ocfs2_clusters_to_blocks(dir->i_sb, bit_off); in ocfs2_expand_inline_dir()
2918 ret = -ENOMEM; in ocfs2_expand_inline_dir()
2932 memcpy(dirdata_bh->b_data, di->id2.i_data.id_data, i_size_read(dir)); in ocfs2_expand_inline_dir()
2933 memset(dirdata_bh->b_data + i_size_read(dir), 0, in ocfs2_expand_inline_dir()
2934 sb->s_blocksize - i_size_read(dir)); in ocfs2_expand_inline_dir()
2935 i = ocfs2_expand_last_dirent(dirdata_bh->b_data, i_size_read(dir), dir); in ocfs2_expand_inline_dir()
2955 * be correctly set once the dx_root has been in ocfs2_expand_inline_dir()
2970 * be fully accessible from system calls. in ocfs2_expand_inline_dir()
2972 * We let the later dirent insert modify c/mtime - to the user in ocfs2_expand_inline_dir()
2982 spin_lock(&oi->ip_lock); in ocfs2_expand_inline_dir()
2983 oi->ip_dyn_features &= ~OCFS2_INLINE_DATA_FL; in ocfs2_expand_inline_dir()
2984 di->i_dyn_features = cpu_to_le16(oi->ip_dyn_features); in ocfs2_expand_inline_dir()
2985 spin_unlock(&oi->ip_lock); in ocfs2_expand_inline_dir()
2989 i_size_write(dir, sb->s_blocksize); in ocfs2_expand_inline_dir()
2992 di->i_size = cpu_to_le64(sb->s_blocksize); in ocfs2_expand_inline_dir()
2993 di->i_ctime = di->i_mtime = cpu_to_le64(inode_get_ctime_sec(dir)); in ocfs2_expand_inline_dir()
2994 di->i_ctime_nsec = di->i_mtime_nsec = cpu_to_le32(inode_get_ctime_nsec(dir)); in ocfs2_expand_inline_dir()
3012 dir->i_blocks = ocfs2_inode_sector_count(dir); in ocfs2_expand_inline_dir()
3050 blkno = ocfs2_clusters_to_blocks(dir->i_sb, bit_off); in ocfs2_expand_inline_dir()
3058 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1); in ocfs2_expand_inline_dir()
3072 &lookup->dl_hinfo); in ocfs2_expand_inline_dir()
3074 lookup->dl_dx_leaf_bh = dx_leaves[off]; in ocfs2_expand_inline_dir()
3076 lookup->dl_dx_root_bh = dx_root_bh; in ocfs2_expand_inline_dir()
3087 up_write(&oi->ip_alloc_sem); in ocfs2_expand_inline_dir()
3118 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_do_extend_dir()
3119 extend = (i_size_read(dir) == ocfs2_clusters_to_bytes(sb, OCFS2_I(dir)->ip_clusters)); in ocfs2_do_extend_dir()
3120 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_do_extend_dir()
3123 u32 offset = OCFS2_I(dir)->ip_clusters; in ocfs2_do_extend_dir()
3134 BUG_ON(status == -EAGAIN); in ocfs2_do_extend_dir()
3150 status = -ENOMEM; in ocfs2_do_extend_dir()
3165 * is to be turned into an extent based one. The size of the dirent to
3166 * insert might be larger than the space gained by growing to just one
3169 * If the directory is already indexed, dx_root_bh must be provided.
3181 struct ocfs2_dinode *fe = (struct ocfs2_dinode *) parent_fe_bh->b_data; in ocfs2_extend_dir()
3182 struct ocfs2_extent_list *el = &fe->id2.i_list; in ocfs2_extend_dir()
3187 struct ocfs2_dir_entry * de; in ocfs2_extend_dir() local
3188 struct super_block *sb = osb->sb; in ocfs2_extend_dir()
3190 struct buffer_head *dx_root_bh = lookup->dl_dx_root_bh; in ocfs2_extend_dir()
3192 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in ocfs2_extend_dir()
3194 * This would be a code error as an inline directory should in ocfs2_extend_dir()
3209 dx_root_bh = lookup->dl_dx_root_bh; in ocfs2_extend_dir()
3224 * Get rid of 'new_bh' - we want to format the 2nd in ocfs2_extend_dir()
3230 down_write(&OCFS2_I(dir)->ip_alloc_sem); in ocfs2_extend_dir()
3237 down_write(&OCFS2_I(dir)->ip_alloc_sem); in ocfs2_extend_dir()
3240 trace_ocfs2_extend_dir((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_extend_dir()
3243 /* dir->i_size is always block aligned. */ in ocfs2_extend_dir()
3244 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_extend_dir()
3245 if (dir_i_size == ocfs2_clusters_to_bytes(sb, OCFS2_I(dir)->ip_clusters)) { in ocfs2_extend_dir()
3246 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_extend_dir()
3259 if (status != -ENOSPC) in ocfs2_extend_dir()
3267 if (status != -ENOSPC) in ocfs2_extend_dir()
3273 data_ac->ac_resv = &OCFS2_I(dir)->ip_la_data_resv; in ocfs2_extend_dir()
3277 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_extend_dir()
3294 status = ocfs2_do_extend_dir(osb->sb, handle, dir, parent_fe_bh, in ocfs2_extend_dir()
3309 memset(new_bh->b_data, 0, sb->s_blocksize); in ocfs2_extend_dir()
3311 de = (struct ocfs2_dir_entry *) new_bh->b_data; in ocfs2_extend_dir()
3312 de->inode = 0; in ocfs2_extend_dir()
3314 de->rec_len = cpu_to_le16(ocfs2_dir_trailer_blk_off(sb)); in ocfs2_extend_dir()
3316 ocfs2_init_dir_trailer(dir, new_bh, le16_to_cpu(de->rec_len)); in ocfs2_extend_dir()
3327 de->rec_len = cpu_to_le16(sb->s_blocksize); in ocfs2_extend_dir()
3332 dir_i_size += dir->i_sb->s_blocksize; in ocfs2_extend_dir()
3334 dir->i_blocks = ocfs2_inode_sector_count(dir); in ocfs2_extend_dir()
3348 up_write(&OCFS2_I(dir)->ip_alloc_sem); in ocfs2_extend_dir()
3366 struct super_block *sb = dir->i_sb; in ocfs2_find_dir_space_id()
3367 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_find_dir_space_id()
3368 struct ocfs2_dir_entry *de, *last_de = NULL; in ocfs2_find_dir_space_id() local
3378 free_space = ocfs2_dir_trailer_blk_off(sb) - i_size_read(dir); in ocfs2_find_dir_space_id()
3380 free_space = dir->i_sb->s_blocksize - i_size_read(dir); in ocfs2_find_dir_space_id()
3382 first_de = di->id2.i_data.id_data; in ocfs2_find_dir_space_id()
3388 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_find_dir_space_id()
3390 if (!ocfs2_check_dir_entry(dir, de, di_bh, first_de, in ocfs2_find_dir_space_id()
3392 ret = -ENOENT; in ocfs2_find_dir_space_id()
3395 if (ocfs2_match(namelen, name, de)) { in ocfs2_find_dir_space_id()
3396 ret = -EEXIST; in ocfs2_find_dir_space_id()
3404 if (ocfs2_dirent_would_fit(de, rec_len)) { in ocfs2_find_dir_space_id()
3413 last_de = de; in ocfs2_find_dir_space_id()
3414 de_buf += le16_to_cpu(de->rec_len); in ocfs2_find_dir_space_id()
3415 offset += le16_to_cpu(de->rec_len); in ocfs2_find_dir_space_id()
3419 * We're going to require expansion of the directory - figure in ocfs2_find_dir_space_id()
3421 * dirent can be found. in ocfs2_find_dir_space_id()
3424 new_rec_len = le16_to_cpu(last_de->rec_len) + free_space; in ocfs2_find_dir_space_id()
3425 if (new_rec_len < (rec_len + OCFS2_DIR_REC_LEN(last_de->name_len))) in ocfs2_find_dir_space_id()
3428 ret = -ENOSPC; in ocfs2_find_dir_space_id()
3439 struct ocfs2_dir_entry *de; in ocfs2_find_dir_space_el() local
3440 struct super_block *sb = dir->i_sb; in ocfs2_find_dir_space_el()
3442 int blocksize = dir->i_sb->s_blocksize; in ocfs2_find_dir_space_el()
3450 de = (struct ocfs2_dir_entry *) bh->b_data; in ocfs2_find_dir_space_el()
3452 if ((char *)de >= sb->s_blocksize + bh->b_data) { in ocfs2_find_dir_space_el()
3461 status = -ENOSPC; in ocfs2_find_dir_space_el()
3465 offset >> sb->s_blocksize_bits, in ocfs2_find_dir_space_el()
3471 de = (struct ocfs2_dir_entry *) bh->b_data; in ocfs2_find_dir_space_el()
3473 if (!ocfs2_check_dir_entry(dir, de, bh, bh->b_data, blocksize, in ocfs2_find_dir_space_el()
3475 status = -ENOENT; in ocfs2_find_dir_space_el()
3478 if (ocfs2_match(namelen, name, de)) { in ocfs2_find_dir_space_el()
3479 status = -EEXIST; in ocfs2_find_dir_space_el()
3483 if (ocfs2_skip_dir_trailer(dir, de, offset % blocksize, in ocfs2_find_dir_space_el()
3487 if (ocfs2_dirent_would_fit(de, rec_len)) { in ocfs2_find_dir_space_el()
3496 offset += le16_to_cpu(de->rec_len); in ocfs2_find_dir_space_el()
3497 de = (struct ocfs2_dir_entry *)((char *) de + le16_to_cpu(de->rec_len)); in ocfs2_find_dir_space_el()
3512 u32 major_hash1 = le32_to_cpu(entry1->dx_major_hash); in dx_leaf_sort_cmp()
3513 u32 major_hash2 = le32_to_cpu(entry2->dx_major_hash); in dx_leaf_sort_cmp()
3514 u32 minor_hash1 = le32_to_cpu(entry1->dx_minor_hash); in dx_leaf_sort_cmp()
3515 u32 minor_hash2 = le32_to_cpu(entry2->dx_minor_hash); in dx_leaf_sort_cmp()
3520 return -1; in dx_leaf_sort_cmp()
3528 return -1; in dx_leaf_sort_cmp()
3534 struct ocfs2_dx_entry_list *dl_list = &dx_leaf->dl_list; in ocfs2_dx_leaf_same_major()
3535 int i, num = le16_to_cpu(dl_list->de_num_used); in ocfs2_dx_leaf_same_major()
3537 for (i = 0; i < (num - 1); i++) { in ocfs2_dx_leaf_same_major()
3538 if (le32_to_cpu(dl_list->de_entries[i].dx_major_hash) != in ocfs2_dx_leaf_same_major()
3539 le32_to_cpu(dl_list->de_entries[i + 1].dx_major_hash)) in ocfs2_dx_leaf_same_major()
3548 * entries to be in sorted order.
3553 * This function is only concerned with the major hash - that which
3560 struct ocfs2_dx_entry_list *dl_list = &dx_leaf->dl_list; in ocfs2_dx_dir_find_leaf_split()
3561 int i, num_used = le16_to_cpu(dl_list->de_num_used); in ocfs2_dx_dir_find_leaf_split()
3574 u32 val = le32_to_cpu(dl_list->de_entries[0].dx_major_hash); in ocfs2_dx_dir_find_leaf_split()
3582 * won't be space after the split. in ocfs2_dx_dir_find_leaf_split()
3584 return -ENOSPC; in ocfs2_dx_dir_find_leaf_split()
3592 * know that insert_hash *must* be larger than in ocfs2_dx_dir_find_leaf_split()
3595 * We also know then, that there cannot be an in ocfs2_dx_dir_find_leaf_split()
3596 * adjacent extent (otherwise we'd be looking in ocfs2_dx_dir_find_leaf_split()
3606 * val can not be the same as insert hash, and in ocfs2_dx_dir_find_leaf_split()
3607 * also must be larger than leaf_cpos. Also, in ocfs2_dx_dir_find_leaf_split()
3608 * we know that there can't be a leaf between in ocfs2_dx_dir_find_leaf_split()
3610 * hash 'val' would be there. in ocfs2_dx_dir_find_leaf_split()
3627 if (le32_to_cpu(dl_list->de_entries[i].dx_major_hash) > in ocfs2_dx_dir_find_leaf_split()
3631 BUG_ON(i == num_used); /* Should be impossible */ in ocfs2_dx_dir_find_leaf_split()
3632 *split_hash = le32_to_cpu(dl_list->de_entries[i].dx_major_hash); in ocfs2_dx_dir_find_leaf_split()
3642 * of minor_hash, we can optimize - an item at block offset X within
3643 * the original cluster, will be at offset X within the new cluster.
3658 tmp_list = &tmp_dx_leaf->dl_list; in ocfs2_dx_dir_transfer_leaf()
3661 orig_dx_leaf = (struct ocfs2_dx_leaf *) orig_dx_leaves[i]->b_data; in ocfs2_dx_dir_transfer_leaf()
3662 orig_list = &orig_dx_leaf->dl_list; in ocfs2_dx_dir_transfer_leaf()
3663 new_dx_leaf = (struct ocfs2_dx_leaf *) new_dx_leaves[i]->b_data; in ocfs2_dx_dir_transfer_leaf()
3665 num_used = le16_to_cpu(orig_list->de_num_used); in ocfs2_dx_dir_transfer_leaf()
3667 memcpy(tmp_dx_leaf, orig_dx_leaf, dir->i_sb->s_blocksize); in ocfs2_dx_dir_transfer_leaf()
3668 tmp_list->de_num_used = cpu_to_le16(0); in ocfs2_dx_dir_transfer_leaf()
3669 memset(&tmp_list->de_entries, 0, sizeof(*dx_entry)*num_used); in ocfs2_dx_dir_transfer_leaf()
3672 dx_entry = &orig_list->de_entries[j]; in ocfs2_dx_dir_transfer_leaf()
3673 major_hash = le32_to_cpu(dx_entry->dx_major_hash); in ocfs2_dx_dir_transfer_leaf()
3681 memcpy(orig_dx_leaf, tmp_dx_leaf, dir->i_sb->s_blocksize); in ocfs2_dx_dir_transfer_leaf()
3691 int credits = ocfs2_clusters_to_blocks(osb->sb, 3); in ocfs2_dx_dir_rebalance_credits()
3693 credits += ocfs2_calc_extend_credits(osb->sb, &dx_root->dr_list); in ocfs2_dx_dir_rebalance_credits()
3694 credits += ocfs2_quota_trans_credits(osb->sb); in ocfs2_dx_dir_rebalance_credits()
3708 struct ocfs2_dx_leaf *dx_leaf = (struct ocfs2_dx_leaf *)dx_leaf_bh->b_data; in ocfs2_dx_dir_rebalance()
3710 u32 cpos, split_hash, insert_hash = hinfo->major_hash; in ocfs2_dx_dir_rebalance()
3721 trace_ocfs2_dx_dir_rebalance((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_rebalance()
3727 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_dx_dir_rebalance()
3732 if (le32_to_cpu(dx_root->dr_clusters) == UINT_MAX) in ocfs2_dx_dir_rebalance()
3733 return -ENOSPC; in ocfs2_dx_dir_rebalance()
3735 num_used = le16_to_cpu(dx_leaf->dl_list.de_num_used); in ocfs2_dx_dir_rebalance()
3736 if (num_used < le16_to_cpu(dx_leaf->dl_list.de_count)) { in ocfs2_dx_dir_rebalance()
3738 "%llu, %d\n", (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_rebalance()
3740 ret = -EIO; in ocfs2_dx_dir_rebalance()
3744 orig_dx_leaves = ocfs2_dx_dir_kmalloc_leaves(osb->sb, &num_dx_leaves); in ocfs2_dx_dir_rebalance()
3746 ret = -ENOMEM; in ocfs2_dx_dir_rebalance()
3751 new_dx_leaves = ocfs2_dx_dir_kmalloc_leaves(osb->sb, NULL); in ocfs2_dx_dir_rebalance()
3753 ret = -ENOMEM; in ocfs2_dx_dir_rebalance()
3760 if (ret != -ENOSPC) in ocfs2_dx_dir_rebalance()
3775 ocfs2_clusters_to_bytes(dir->i_sb, 1)); in ocfs2_dx_dir_rebalance()
3790 sort(dx_leaf->dl_list.de_entries, num_used, in ocfs2_dx_dir_rebalance()
3807 * which want to be in the new cluster before insert, but in in ocfs2_dx_dir_rebalance()
3823 tmp_dx_leaf = kmalloc(osb->sb->s_blocksize, GFP_NOFS); in ocfs2_dx_dir_rebalance()
3825 ret = -ENOMEM; in ocfs2_dx_dir_rebalance()
3830 orig_leaves_start = ocfs2_block_to_cluster_start(dir->i_sb, leaf_blkno); in ocfs2_dx_dir_rebalance()
3871 ocfs2_clusters_to_bytes(dir->i_sb, 1)); in ocfs2_dx_dir_rebalance()
3910 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_find_dir_space_dx()
3913 ret = ocfs2_dx_dir_lookup(dir, &dx_root->dr_list, &lookup->dl_hinfo, in ocfs2_find_dir_space_dx()
3926 dx_leaf = (struct ocfs2_dx_leaf *)dx_leaf_bh->b_data; in ocfs2_find_dir_space_dx()
3928 if (le16_to_cpu(dx_leaf->dl_list.de_num_used) >= in ocfs2_find_dir_space_dx()
3929 le16_to_cpu(dx_leaf->dl_list.de_count)) { in ocfs2_find_dir_space_dx()
3938 ret = -ENOSPC; in ocfs2_find_dir_space_dx()
3943 &lookup->dl_hinfo, leaf_cpos, in ocfs2_find_dir_space_dx()
3946 if (ret != -ENOSPC) in ocfs2_find_dir_space_dx()
3962 lookup->dl_dx_leaf_bh = dx_leaf_bh; in ocfs2_find_dir_space_dx()
3975 int ret = -ENOSPC; in ocfs2_search_dx_free_list()
3982 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_search_dx_free_list()
3983 next_block = le64_to_cpu(dx_root->dr_free_blk); in ocfs2_search_dx_free_list()
3996 db = ocfs2_trailer_from_bh(leaf_bh, dir->i_sb); in ocfs2_search_dx_free_list()
3997 if (rec_len <= le16_to_cpu(db->db_free_rec_len)) { in ocfs2_search_dx_free_list()
3998 lookup->dl_leaf_bh = leaf_bh; in ocfs2_search_dx_free_list()
3999 lookup->dl_prev_leaf_bh = prev_leaf_bh; in ocfs2_search_dx_free_list()
4005 next_block = le64_to_cpu(db->db_free_next); in ocfs2_search_dx_free_list()
4009 ret = -ENOSPC; in ocfs2_search_dx_free_list()
4026 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_expand_inline_dx_root()
4039 dx_leaves = ocfs2_dx_dir_kmalloc_leaves(osb->sb, &num_dx_leaves); in ocfs2_expand_inline_dx_root()
4041 ret = -ENOMEM; in ocfs2_expand_inline_dx_root()
4046 handle = ocfs2_start_trans(osb, ocfs2_calc_dxi_expand_credits(osb->sb)); in ocfs2_expand_inline_dx_root()
4054 ocfs2_clusters_to_bytes(osb->sb, 1)); in ocfs2_expand_inline_dx_root()
4082 dx_root = (struct ocfs2_dx_root_block *) dx_root_bh->b_data; in ocfs2_expand_inline_dx_root()
4083 entry_list = &dx_root->dr_entries; in ocfs2_expand_inline_dx_root()
4085 for (i = 0; i < le16_to_cpu(entry_list->de_num_used); i++) { in ocfs2_expand_inline_dx_root()
4086 dx_entry = &entry_list->de_entries[i]; in ocfs2_expand_inline_dx_root()
4089 le32_to_cpu(dx_entry->dx_minor_hash)); in ocfs2_expand_inline_dx_root()
4090 target_leaf = (struct ocfs2_dx_leaf *)dx_leaves[j]->b_data; in ocfs2_expand_inline_dx_root()
4098 dx_root->dr_flags &= ~OCFS2_DX_FLAG_INLINE; in ocfs2_expand_inline_dx_root()
4099 memset(&dx_root->dr_list, 0, osb->sb->s_blocksize - in ocfs2_expand_inline_dx_root()
4101 dx_root->dr_list.l_count = in ocfs2_expand_inline_dx_root()
4102 cpu_to_le16(ocfs2_extent_recs_per_dx_root(osb->sb)); in ocfs2_expand_inline_dx_root()
4118 ocfs2_clusters_to_bytes(dir->i_sb, 1)); in ocfs2_expand_inline_dx_root()
4139 dx_root = (struct ocfs2_dx_root_block *) dx_root_bh->b_data; in ocfs2_inline_dx_has_space()
4140 entry_list = &dx_root->dr_entries; in ocfs2_inline_dx_has_space()
4142 if (le16_to_cpu(entry_list->de_num_used) >= in ocfs2_inline_dx_has_space()
4143 le16_to_cpu(entry_list->de_count)) in ocfs2_inline_dx_has_space()
4144 return -ENOSPC; in ocfs2_inline_dx_has_space()
4156 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_prepare_dx_dir_for_insert()
4159 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_prepare_dx_dir_for_insert()
4168 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_prepare_dx_dir_for_insert()
4169 if (le32_to_cpu(dx_root->dr_num_entries) == OCFS2_DX_ENTRIES_MAX) { in ocfs2_prepare_dx_dir_for_insert()
4170 ret = -ENOSPC; in ocfs2_prepare_dx_dir_for_insert()
4214 if (ret && ret != -ENOSPC) { in ocfs2_prepare_dx_dir_for_insert()
4219 /* Do this up here - ocfs2_extend_dir might need the dx_root */ in ocfs2_prepare_dx_dir_for_insert()
4220 lookup->dl_dx_root_bh = dx_root_bh; in ocfs2_prepare_dx_dir_for_insert()
4223 if (ret == -ENOSPC) { in ocfs2_prepare_dx_dir_for_insert()
4235 lookup->dl_prev_leaf_bh = NULL; in ocfs2_prepare_dx_dir_for_insert()
4236 lookup->dl_leaf_bh = leaf_bh; in ocfs2_prepare_dx_dir_for_insert()
4248 * lookup result that ocfs2_add_entry() will be able complete the task
4263 (unsigned long long)OCFS2_I(dir)->ip_blkno, namelen); in ocfs2_prepare_dir_for_insert()
4268 * The directory might start inline, then be turned into an in ocfs2_prepare_dir_for_insert()
4277 ocfs2_dx_dir_name_hash(dir, name, namelen, &lookup->dl_hinfo); in ocfs2_prepare_dir_for_insert()
4287 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in ocfs2_prepare_dir_for_insert()
4293 if (ret && ret != -ENOSPC) { in ocfs2_prepare_dir_for_insert()
4298 if (ret == -ENOSPC) { in ocfs2_prepare_dir_for_insert()
4307 if (ret != -ENOSPC) in ocfs2_prepare_dir_for_insert()
4315 lookup->dl_leaf_bh = bh; in ocfs2_prepare_dir_for_insert()
4327 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_dx_dir_remove_index()
4328 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_dx_dir_remove_index()
4337 dx_root = (struct ocfs2_dx_root_block *) dx_root_bh->b_data; in ocfs2_dx_dir_remove_index()
4341 le16_to_cpu(dx_root->dr_suballoc_slot)); in ocfs2_dx_dir_remove_index()
4343 ret = -ENOMEM; in ocfs2_dx_dir_remove_index()
4369 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_remove_index()
4370 OCFS2_I(dir)->ip_dyn_features &= ~OCFS2_INDEXED_DIR_FL; in ocfs2_dx_dir_remove_index()
4371 di->i_dyn_features = cpu_to_le16(OCFS2_I(dir)->ip_dyn_features); in ocfs2_dx_dir_remove_index()
4372 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_remove_index()
4373 di->i_dx_root = cpu_to_le64(0ULL); in ocfs2_dx_dir_remove_index()
4378 blk = le64_to_cpu(dx_root->dr_blkno); in ocfs2_dx_dir_remove_index()
4379 bit = le16_to_cpu(dx_root->dr_suballoc_bit); in ocfs2_dx_dir_remove_index()
4380 if (dx_root->dr_suballoc_loc) in ocfs2_dx_dir_remove_index()
4381 bg_blkno = le64_to_cpu(dx_root->dr_suballoc_loc); in ocfs2_dx_dir_remove_index()
4409 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_dx_dir_truncate()
4412 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_dx_dir_truncate()
4426 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_dx_dir_truncate()
4434 while (le32_to_cpu(dx_root->dr_clusters)) { in ocfs2_dx_dir_truncate()
4435 ret = ocfs2_dx_dir_lookup_rec(dir, &dx_root->dr_list, in ocfs2_dx_dir_truncate()
4442 p_cpos = ocfs2_blocks_to_clusters(dir->i_sb, blkno); in ocfs2_dx_dir_truncate()
4454 major_hash = cpos - 1; in ocfs2_dx_dir_truncate()