Lines Matching +full:de +full:- +full:be
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* -*- mode: c; c-basic-offset: 8; -*-
7 * Creates, reads, walks and deletes directory-nodes
15 * Laboratoire MASI - Institut Blaise pascal
73 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_supports_dir_trailer()
75 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_supports_dir_trailer()
86 * is turned off. Only directory-initialization type functions should
91 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_new_dir_wants_trailer()
99 return sb->s_blocksize - sizeof(struct ocfs2_dir_block_trailer); in ocfs2_dir_trailer_blk_off()
102 #define ocfs2_trailer_from_bh(_bh, _sb) ((struct ocfs2_dir_block_trailer *) ((_bh)->b_data + ocfs2_…
104 /* XXX ocfs2_block_dqtrailer() is similar but not quite - can we make
111 p += blocksize - sizeof(struct ocfs2_dir_block_trailer); in ocfs2_dir_trailer_from_size()
120 struct ocfs2_dir_entry *de, in ocfs2_skip_dir_trailer() argument
124 unsigned long toff = blklen - sizeof(struct ocfs2_dir_block_trailer); in ocfs2_skip_dir_trailer()
140 trailer = ocfs2_trailer_from_bh(bh, inode->i_sb); in ocfs2_init_dir_trailer()
141 strcpy(trailer->db_signature, OCFS2_DIR_TRAILER_SIGNATURE); in ocfs2_init_dir_trailer()
142 trailer->db_compat_rec_len = in ocfs2_init_dir_trailer()
144 trailer->db_parent_dinode = cpu_to_le64(OCFS2_I(inode)->ip_blkno); in ocfs2_init_dir_trailer()
145 trailer->db_blkno = cpu_to_le64(bh->b_blocknr); in ocfs2_init_dir_trailer()
146 trailer->db_free_rec_len = cpu_to_le16(rec_len); in ocfs2_init_dir_trailer()
167 trailer = ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb); in ocfs2_dx_dir_link_trailer()
168 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_dx_dir_link_trailer()
170 trailer->db_free_next = dx_root->dr_free_blk; in ocfs2_dx_dir_link_trailer()
171 dx_root->dr_free_blk = cpu_to_le64(dirdata_bh->b_blocknr); in ocfs2_dx_dir_link_trailer()
181 return res->dl_prev_leaf_bh == NULL; in ocfs2_free_list_at_root()
186 brelse(res->dl_dx_root_bh); in ocfs2_free_dir_lookup_result()
187 brelse(res->dl_leaf_bh); in ocfs2_free_dir_lookup_result()
188 brelse(res->dl_dx_leaf_bh); in ocfs2_free_dir_lookup_result()
189 brelse(res->dl_prev_leaf_bh); in ocfs2_free_dir_lookup_result()
194 if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INDEXED_DIR_FL) in ocfs2_dir_indexed()
201 return dx_root->dr_flags & OCFS2_DX_FLAG_INLINE; in ocfs2_dx_root_inline()
220 } while (--n); in TEA_transform()
244 num--; in str2hashbuf()
247 if (--num >= 0) in str2hashbuf()
249 while (--num >= 0) in str2hashbuf()
256 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_dx_dir_name_hash()
273 * should never allow this to be selected without hand editing in ocfs2_dx_dir_name_hash()
280 memcpy(buf, osb->osb_dx_seed, sizeof(buf)); in ocfs2_dx_dir_name_hash()
286 len -= 16; in ocfs2_dx_dir_name_hash()
291 hinfo->major_hash = buf[0]; in ocfs2_dx_dir_name_hash()
292 hinfo->minor_hash = buf[1]; in ocfs2_dx_dir_name_hash()
296 * bh passed here can be an inode block or a dir data block, depending
300 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()
311 else if (unlikely(rlen < OCFS2_DIR_REC_LEN(de->name_len))) in ocfs2_check_dir_entry()
314 ((char *) de - bh->b_data) + rlen > dir->i_sb->s_blocksize)) in ocfs2_check_dir_entry()
318 mlog(ML_ERROR, "bad entry in directory #%llu: %s - " in ocfs2_check_dir_entry()
320 (unsigned long long)OCFS2_I(dir)->ip_blkno, error_msg, in ocfs2_check_dir_entry()
321 offset, (unsigned long long)le64_to_cpu(de->inode), rlen, in ocfs2_check_dir_entry()
322 de->name_len); in ocfs2_check_dir_entry()
329 struct ocfs2_dir_entry *de) in ocfs2_match() argument
331 if (len != de->name_len) in ocfs2_match()
333 if (!de->inode) in ocfs2_match()
335 return !memcmp(name, de->name, len); in ocfs2_match()
339 * Returns 0 if not found, -1 on failure, and 1 on success
349 struct ocfs2_dir_entry *de; in ocfs2_search_dirblock() local
361 de = (struct ocfs2_dir_entry *) de_buf; in ocfs2_search_dirblock()
364 ocfs2_match(namelen, name, de)) { in ocfs2_search_dirblock()
365 /* found a match - just to be sure, do a full check */ in ocfs2_search_dirblock()
366 if (!ocfs2_check_dir_entry(dir, de, bh, offset)) { in ocfs2_search_dirblock()
367 ret = -1; in ocfs2_search_dirblock()
370 *res_dir = de; in ocfs2_search_dirblock()
376 de_len = le16_to_cpu(de->rec_len); in ocfs2_search_dirblock()
378 ret = -1; in ocfs2_search_dirblock()
407 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_find_entry_id()
408 data = &di->id2.i_data; in ocfs2_find_entry_id()
411 data->id_data, i_size_read(dir), res_dir); in ocfs2_find_entry_id()
430 * in-place when the code walks them. in ocfs2_validate_dir_block()
432 trace_ocfs2_validate_dir_block((unsigned long long)bh->b_blocknr); in ocfs2_validate_dir_block()
445 rc = ocfs2_validate_meta_ecc(sb, bh->b_data, &trailer->db_check); in ocfs2_validate_dir_block()
448 (unsigned long long)bh->b_blocknr); in ocfs2_validate_dir_block()
464 trailer = ocfs2_trailer_from_bh(bh, dir->i_sb); in ocfs2_check_dir_trailer()
466 rc = ocfs2_error(dir->i_sb, in ocfs2_check_dir_trailer()
468 (unsigned long long)bh->b_blocknr, 7, in ocfs2_check_dir_trailer()
469 trailer->db_signature); in ocfs2_check_dir_trailer()
472 if (le64_to_cpu(trailer->db_blkno) != bh->b_blocknr) { in ocfs2_check_dir_trailer()
473 rc = ocfs2_error(dir->i_sb, in ocfs2_check_dir_trailer()
475 (unsigned long long)bh->b_blocknr, in ocfs2_check_dir_trailer()
476 (unsigned long long)le64_to_cpu(trailer->db_blkno)); in ocfs2_check_dir_trailer()
479 if (le64_to_cpu(trailer->db_parent_dinode) != in ocfs2_check_dir_trailer()
480 OCFS2_I(dir)->ip_blkno) { in ocfs2_check_dir_trailer()
481 rc = ocfs2_error(dir->i_sb, in ocfs2_check_dir_trailer()
483 (unsigned long long)bh->b_blocknr, in ocfs2_check_dir_trailer()
484 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_check_dir_trailer()
485 (unsigned long long)le64_to_cpu(trailer->db_blkno)); in ocfs2_check_dir_trailer()
493 * This function forces all errors to -EIO for consistency with its
527 return rc ? -EIO : 0; in ocfs2_read_dir_block()
532 * inode. This function does no virtual->physical block translation -
533 * what's passed in is assumed to be a valid directory block.
572 dx_root = (struct ocfs2_dx_root_block *) bh->b_data; in ocfs2_validate_dx_root()
574 ret = ocfs2_validate_meta_ecc(sb, bh->b_data, &dx_root->dr_check); in ocfs2_validate_dx_root()
578 (unsigned long long)bh->b_blocknr); in ocfs2_validate_dx_root()
585 (unsigned long long)le64_to_cpu(dx_root->dr_blkno), in ocfs2_validate_dx_root()
586 7, dx_root->dr_signature); in ocfs2_validate_dx_root()
596 u64 blkno = le64_to_cpu(di->i_dx_root); in ocfs2_read_dx_root()
613 struct ocfs2_dx_leaf *dx_leaf = (struct ocfs2_dx_leaf *)bh->b_data; in ocfs2_validate_dx_leaf()
617 ret = ocfs2_validate_meta_ecc(sb, bh->b_data, &dx_leaf->dl_check); in ocfs2_validate_dx_leaf()
621 (unsigned long long)bh->b_blocknr); in ocfs2_validate_dx_leaf()
627 7, dx_leaf->dl_signature); in ocfs2_validate_dx_leaf()
651 * pointers to be NULL on function entry.
681 sb = dir->i_sb; in ocfs2_find_entry_el()
683 nblocks = i_size_read(dir) >> sb->s_blocksize_bits; in ocfs2_find_entry_el()
684 start = OCFS2_I(dir)->ip_dir_start_lookup; in ocfs2_find_entry_el()
692 * We deal with the read-ahead logic here. in ocfs2_find_entry_el()
723 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_find_entry_el()
728 block << sb->s_blocksize_bits, in ocfs2_find_entry_el()
729 bh->b_data, sb->s_blocksize, in ocfs2_find_entry_el()
732 OCFS2_I(dir)->ip_dir_start_lookup = block; in ocfs2_find_entry_el()
750 nblocks = i_size_read(dir) >> sb->s_blocksize_bits; in ocfs2_find_entry_el()
757 /* Clean up the read-ahead blocks */ in ocfs2_find_entry_el()
777 if (el->l_tree_depth) { in ocfs2_dx_dir_lookup_rec()
785 eb = (struct ocfs2_extent_block *) eb_bh->b_data; in ocfs2_dx_dir_lookup_rec()
786 el = &eb->h_list; in ocfs2_dx_dir_lookup_rec()
788 if (el->l_tree_depth) { in ocfs2_dx_dir_lookup_rec()
789 ret = ocfs2_error(inode->i_sb, in ocfs2_dx_dir_lookup_rec()
791 inode->i_ino, in ocfs2_dx_dir_lookup_rec()
792 (unsigned long long)eb_bh->b_blocknr); in ocfs2_dx_dir_lookup_rec()
798 for (i = le16_to_cpu(el->l_next_free_rec) - 1; i >= 0; i--) { in ocfs2_dx_dir_lookup_rec()
799 rec = &el->l_recs[i]; in ocfs2_dx_dir_lookup_rec()
801 if (le32_to_cpu(rec->e_cpos) <= major_hash) { in ocfs2_dx_dir_lookup_rec()
808 ret = ocfs2_error(inode->i_sb, in ocfs2_dx_dir_lookup_rec()
810 inode->i_ino, in ocfs2_dx_dir_lookup_rec()
811 le32_to_cpu(rec->e_cpos), in ocfs2_dx_dir_lookup_rec()
817 *ret_phys_blkno = le64_to_cpu(rec->e_blkno); in ocfs2_dx_dir_lookup_rec()
819 *ret_cpos = le32_to_cpu(rec->e_cpos); in ocfs2_dx_dir_lookup_rec()
821 *ret_clen = le16_to_cpu(rec->e_leaf_clusters); in ocfs2_dx_dir_lookup_rec()
835 return minor_hash & osb->osb_dx_mask; in __ocfs2_dx_dir_hash_idx()
841 return __ocfs2_dx_dir_hash_idx(osb, hinfo->minor_hash); in ocfs2_dx_dir_hash_idx()
854 u32 name_hash = hinfo->major_hash; in ocfs2_dx_dir_lookup()
866 blkno += ocfs2_clusters_to_blocks(inode->i_sb, clen - 1); in ocfs2_dx_dir_lookup()
867 cpos += clen - 1; in ocfs2_dx_dir_lookup()
869 blkno += ocfs2_clusters_to_blocks(inode->i_sb, in ocfs2_dx_dir_lookup()
870 name_hash - cpos); in ocfs2_dx_dir_lookup()
879 blkno += ocfs2_dx_dir_hash_idx(OCFS2_SB(inode->i_sb), hinfo); in ocfs2_dx_dir_lookup()
903 struct ocfs2_dx_hinfo *hinfo = &res->dl_hinfo; in ocfs2_dx_dir_search()
907 ocfs2_dx_dir_name_hash(dir, name, namelen, &res->dl_hinfo); in ocfs2_dx_dir_search()
910 entry_list = &dx_root->dr_entries; in ocfs2_dx_dir_search()
914 dr_el = &dx_root->dr_list; in ocfs2_dx_dir_search()
922 trace_ocfs2_dx_dir_search((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_search()
923 namelen, name, hinfo->major_hash, in ocfs2_dx_dir_search()
924 hinfo->minor_hash, (unsigned long long)phys); in ocfs2_dx_dir_search()
932 dx_leaf = (struct ocfs2_dx_leaf *) dx_leaf_bh->b_data; in ocfs2_dx_dir_search()
935 le16_to_cpu(dx_leaf->dl_list.de_num_used), in ocfs2_dx_dir_search()
936 le16_to_cpu(dx_leaf->dl_list.de_count)); in ocfs2_dx_dir_search()
938 entry_list = &dx_leaf->dl_list; in ocfs2_dx_dir_search()
945 for (i = 0; i < le16_to_cpu(entry_list->de_num_used); i++) { in ocfs2_dx_dir_search()
946 dx_entry = &entry_list->de_entries[i]; in ocfs2_dx_dir_search()
948 if (hinfo->major_hash != le32_to_cpu(dx_entry->dx_major_hash) in ocfs2_dx_dir_search()
949 || hinfo->minor_hash != le32_to_cpu(dx_entry->dx_minor_hash)) in ocfs2_dx_dir_search()
957 le64_to_cpu(dx_entry->dx_dirent_blk), in ocfs2_dx_dir_search()
970 0, dir_ent_bh->b_data, in ocfs2_dx_dir_search()
971 dir->i_sb->s_blocksize, &dir_ent); in ocfs2_dx_dir_search()
975 if (found == -1) { in ocfs2_dx_dir_search()
977 ret = -EIO; in ocfs2_dx_dir_search()
987 ret = -ENOENT; in ocfs2_dx_dir_search()
991 res->dl_leaf_bh = dir_ent_bh; in ocfs2_dx_dir_search()
992 res->dl_entry = dir_ent; in ocfs2_dx_dir_search()
993 res->dl_dx_leaf_bh = dx_leaf_bh; in ocfs2_dx_dir_search()
994 res->dl_dx_entry = dx_entry; in ocfs2_dx_dir_search()
1021 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_find_entry_dx()
1028 dx_root = (struct ocfs2_dx_root_block *) dx_root_bh->b_data; in ocfs2_find_entry_dx()
1032 if (ret != -ENOENT) in ocfs2_find_entry_dx()
1037 lookup->dl_dx_root_bh = dx_root_bh; in ocfs2_find_entry_dx()
1048 * If nothing was found, -ENOENT is returned. Otherwise, zero is
1053 * buffer_heads - they are passed back only so that it can be passed
1056 * data block, in the inline-data case it actually points to an inode,
1073 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_find_entry()
1079 return -ENOENT; in ocfs2_find_entry()
1081 lookup->dl_leaf_bh = bh; in ocfs2_find_entry()
1082 lookup->dl_entry = res_dir; in ocfs2_find_entry()
1095 struct ocfs2_dir_entry *de = res->dl_entry; in ocfs2_update_entry() local
1096 struct buffer_head *de_bh = res->dl_leaf_bh; in ocfs2_update_entry()
1099 * The same code works fine for both inline-data and extent in ocfs2_update_entry()
1104 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_update_entry()
1114 de->inode = cpu_to_le64(OCFS2_I(new_entry_inode)->ip_blkno); in ocfs2_update_entry()
1115 ocfs2_set_de_type(de, new_entry_inode->i_mode); in ocfs2_update_entry()
1132 struct ocfs2_dir_entry *de, *pde; in __ocfs2_delete_entry() local
1133 int i, status = -ENOENT; in __ocfs2_delete_entry()
1136 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in __ocfs2_delete_entry()
1141 de = (struct ocfs2_dir_entry *) first_de; in __ocfs2_delete_entry()
1143 if (!ocfs2_check_dir_entry(dir, de, bh, i)) { in __ocfs2_delete_entry()
1144 status = -EIO; in __ocfs2_delete_entry()
1148 if (de == de_del) { in __ocfs2_delete_entry()
1152 status = -EIO; in __ocfs2_delete_entry()
1157 le16_add_cpu(&pde->rec_len, in __ocfs2_delete_entry()
1158 le16_to_cpu(de->rec_len)); in __ocfs2_delete_entry()
1159 de->inode = 0; in __ocfs2_delete_entry()
1164 i += le16_to_cpu(de->rec_len); in __ocfs2_delete_entry()
1165 pde = de; in __ocfs2_delete_entry()
1166 de = (struct ocfs2_dir_entry *)((char *)de + le16_to_cpu(de->rec_len)); in __ocfs2_delete_entry()
1172 static unsigned int ocfs2_figure_dirent_hole(struct ocfs2_dir_entry *de) in ocfs2_figure_dirent_hole() argument
1176 if (le64_to_cpu(de->inode) == 0) in ocfs2_figure_dirent_hole()
1177 hole = le16_to_cpu(de->rec_len); in ocfs2_figure_dirent_hole()
1179 hole = le16_to_cpu(de->rec_len) - in ocfs2_figure_dirent_hole()
1180 OCFS2_DIR_REC_LEN(de->name_len); in ocfs2_figure_dirent_hole()
1189 char *trailer, *de_buf, *limit, *start = dirblock_bh->b_data; in ocfs2_find_max_rec_len()
1190 struct ocfs2_dir_entry *de; in ocfs2_find_max_rec_len() local
1196 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_find_max_rec_len()
1199 this_hole = ocfs2_figure_dirent_hole(de); in ocfs2_find_max_rec_len()
1204 de_buf += le16_to_cpu(de->rec_len); in ocfs2_find_max_rec_len()
1205 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_find_max_rec_len()
1216 int num_used = le16_to_cpu(entry_list->de_num_used); in ocfs2_dx_list_remove_entry()
1218 if (num_used == 1 || index == (num_used - 1)) in ocfs2_dx_list_remove_entry()
1221 memmove(&entry_list->de_entries[index], in ocfs2_dx_list_remove_entry()
1222 &entry_list->de_entries[index + 1], in ocfs2_dx_list_remove_entry()
1223 (num_used - index - 1)*sizeof(struct ocfs2_dx_entry)); in ocfs2_dx_list_remove_entry()
1225 num_used--; in ocfs2_dx_list_remove_entry()
1226 memset(&entry_list->de_entries[num_used], 0, in ocfs2_dx_list_remove_entry()
1228 entry_list->de_num_used = cpu_to_le16(num_used); in ocfs2_dx_list_remove_entry()
1235 struct buffer_head *dx_root_bh = lookup->dl_dx_root_bh; in ocfs2_delete_entry_dx()
1236 struct buffer_head *leaf_bh = lookup->dl_leaf_bh; in ocfs2_delete_entry_dx()
1238 struct ocfs2_dx_entry *dx_entry = lookup->dl_dx_entry; in ocfs2_delete_entry_dx()
1254 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_delete_entry_dx()
1256 entry_list = &dx_root->dr_entries; in ocfs2_delete_entry_dx()
1258 dx_leaf = (struct ocfs2_dx_leaf *) lookup->dl_dx_leaf_bh->b_data; in ocfs2_delete_entry_dx()
1259 entry_list = &dx_leaf->dl_list; in ocfs2_delete_entry_dx()
1262 /* Neither of these are a disk corruption - that should have in ocfs2_delete_entry_dx()
1264 BUG_ON(le16_to_cpu(entry_list->de_count) <= 0); in ocfs2_delete_entry_dx()
1265 BUG_ON(le16_to_cpu(entry_list->de_num_used) <= 0); in ocfs2_delete_entry_dx()
1267 index = (char *)dx_entry - (char *)entry_list->de_entries; in ocfs2_delete_entry_dx()
1270 if (index >= le16_to_cpu(entry_list->de_num_used)) { in ocfs2_delete_entry_dx()
1272 (unsigned long long)OCFS2_I(dir)->ip_blkno, index, in ocfs2_delete_entry_dx()
1274 return -EIO; in ocfs2_delete_entry_dx()
1282 trailer = ocfs2_trailer_from_bh(leaf_bh, dir->i_sb); in ocfs2_delete_entry_dx()
1283 if (trailer->db_free_rec_len == 0) in ocfs2_delete_entry_dx()
1294 * the entry count needs to be updated. Also, we might be in ocfs2_delete_entry_dx()
1306 lookup->dl_dx_leaf_bh, in ocfs2_delete_entry_dx()
1314 trace_ocfs2_delete_entry_dx((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_delete_entry_dx()
1317 ret = __ocfs2_delete_entry(handle, dir, lookup->dl_entry, in ocfs2_delete_entry_dx()
1318 leaf_bh, leaf_bh->b_data, leaf_bh->b_size); in ocfs2_delete_entry_dx()
1324 max_rec_len = ocfs2_find_max_rec_len(dir->i_sb, leaf_bh); in ocfs2_delete_entry_dx()
1325 trailer->db_free_rec_len = cpu_to_le16(max_rec_len); in ocfs2_delete_entry_dx()
1327 trailer->db_free_next = dx_root->dr_free_blk; in ocfs2_delete_entry_dx()
1328 dx_root->dr_free_blk = cpu_to_le64(leaf_bh->b_blocknr); in ocfs2_delete_entry_dx()
1335 le32_add_cpu(&dx_root->dr_num_entries, -1); in ocfs2_delete_entry_dx()
1341 ocfs2_journal_dirty(handle, lookup->dl_dx_leaf_bh); in ocfs2_delete_entry_dx()
1363 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_delete_entry_id()
1364 data = &di->id2.i_data; in ocfs2_delete_entry_id()
1366 ret = __ocfs2_delete_entry(handle, dir, de_del, bh, data->id_data, in ocfs2_delete_entry_id()
1379 return __ocfs2_delete_entry(handle, dir, de_del, bh, bh->b_data, in ocfs2_delete_entry_el()
1380 bh->b_size); in ocfs2_delete_entry_el()
1394 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_delete_entry()
1395 return ocfs2_delete_entry_id(handle, dir, res->dl_entry, in ocfs2_delete_entry()
1396 res->dl_leaf_bh); in ocfs2_delete_entry()
1398 return ocfs2_delete_entry_el(handle, dir, res->dl_entry, in ocfs2_delete_entry()
1399 res->dl_leaf_bh); in ocfs2_delete_entry()
1403 * Check whether 'de' has enough room to hold an entry of
1406 static inline int ocfs2_dirent_would_fit(struct ocfs2_dir_entry *de, in ocfs2_dirent_would_fit() argument
1412 if (le64_to_cpu(de->inode) == 0 && in ocfs2_dirent_would_fit()
1413 le16_to_cpu(de->rec_len) >= new_rec_len) in ocfs2_dirent_would_fit()
1420 de_really_used = OCFS2_DIR_REC_LEN(de->name_len); in ocfs2_dirent_would_fit()
1421 if (le16_to_cpu(de->rec_len) >= (de_really_used + new_rec_len)) in ocfs2_dirent_would_fit()
1432 i = le16_to_cpu(dx_leaf->dl_list.de_num_used); in ocfs2_dx_dir_leaf_insert_tail()
1433 dx_leaf->dl_list.de_entries[i] = *dx_new_entry; in ocfs2_dx_dir_leaf_insert_tail()
1435 le16_add_cpu(&dx_leaf->dl_list.de_num_used, 1); in ocfs2_dx_dir_leaf_insert_tail()
1445 i = le16_to_cpu(entry_list->de_num_used); in ocfs2_dx_entry_list_insert()
1446 dx_entry = &entry_list->de_entries[i]; in ocfs2_dx_entry_list_insert()
1449 dx_entry->dx_major_hash = cpu_to_le32(hinfo->major_hash); in ocfs2_dx_entry_list_insert()
1450 dx_entry->dx_minor_hash = cpu_to_le32(hinfo->minor_hash); in ocfs2_dx_entry_list_insert()
1451 dx_entry->dx_dirent_blk = cpu_to_le64(dirent_blk); in ocfs2_dx_entry_list_insert()
1453 le16_add_cpu(&entry_list->de_num_used, 1); in ocfs2_dx_entry_list_insert()
1471 dx_leaf = (struct ocfs2_dx_leaf *)dx_leaf_bh->b_data; in __ocfs2_dx_dir_leaf_insert()
1472 ocfs2_dx_entry_list_insert(&dx_leaf->dl_list, hinfo, dirent_blk); in __ocfs2_dx_dir_leaf_insert()
1484 ocfs2_dx_entry_list_insert(&dx_root->dr_entries, hinfo, dirent_blk); in ocfs2_dx_inline_root_insert()
1492 struct buffer_head *dx_root_bh = lookup->dl_dx_root_bh; in ocfs2_dx_dir_insert()
1501 dx_root = (struct ocfs2_dx_root_block *)lookup->dl_dx_root_bh->b_data; in ocfs2_dx_dir_insert()
1504 &lookup->dl_hinfo, in ocfs2_dx_dir_insert()
1505 lookup->dl_leaf_bh->b_blocknr, in ocfs2_dx_dir_insert()
1508 ret = __ocfs2_dx_dir_leaf_insert(dir, handle, &lookup->dl_hinfo, in ocfs2_dx_dir_insert()
1509 lookup->dl_leaf_bh->b_blocknr, in ocfs2_dx_dir_insert()
1510 lookup->dl_dx_leaf_bh); in ocfs2_dx_dir_insert()
1515 le32_add_cpu(&dx_root->dr_num_entries, 1); in ocfs2_dx_dir_insert()
1530 trailer = ocfs2_trailer_from_bh(lookup->dl_leaf_bh, dir->i_sb); in ocfs2_remove_block_from_free_list()
1533 bh = lookup->dl_dx_root_bh; in ocfs2_remove_block_from_free_list()
1534 dx_root = (struct ocfs2_dx_root_block *)bh->b_data; in ocfs2_remove_block_from_free_list()
1535 dx_root->dr_free_blk = trailer->db_free_next; in ocfs2_remove_block_from_free_list()
1537 bh = lookup->dl_prev_leaf_bh; in ocfs2_remove_block_from_free_list()
1538 prev = ocfs2_trailer_from_bh(bh, dir->i_sb); in ocfs2_remove_block_from_free_list()
1539 prev->db_free_next = trailer->db_free_next; in ocfs2_remove_block_from_free_list()
1542 trailer->db_free_rec_len = cpu_to_le16(0); in ocfs2_remove_block_from_free_list()
1543 trailer->db_free_next = cpu_to_le64(0); in ocfs2_remove_block_from_free_list()
1546 ocfs2_journal_dirty(handle, lookup->dl_leaf_bh); in ocfs2_remove_block_from_free_list()
1551 * lookup->dl_prev_leaf_bh or lookup->dl_dx_root_bh
1560 max_rec_len = ocfs2_find_max_rec_len(dir->i_sb, lookup->dl_leaf_bh); in ocfs2_recalc_free_list()
1567 trailer = ocfs2_trailer_from_bh(lookup->dl_leaf_bh, dir->i_sb); in ocfs2_recalc_free_list()
1568 trailer->db_free_rec_len = cpu_to_le16(max_rec_len); in ocfs2_recalc_free_list()
1569 ocfs2_journal_dirty(handle, lookup->dl_leaf_bh); in ocfs2_recalc_free_list()
1590 struct ocfs2_dir_entry *de, *de1; in __ocfs2_add_entry() local
1591 struct ocfs2_dinode *di = (struct ocfs2_dinode *)parent_fe_bh->b_data; in __ocfs2_add_entry()
1592 struct super_block *sb = dir->i_sb; in __ocfs2_add_entry()
1594 unsigned int size = sb->s_blocksize; in __ocfs2_add_entry()
1595 struct buffer_head *insert_bh = lookup->dl_leaf_bh; in __ocfs2_add_entry()
1596 char *data_start = insert_bh->b_data; in __ocfs2_add_entry()
1599 return -EINVAL; in __ocfs2_add_entry()
1609 * XXX: This can be either a dx_root_block, or an unindexed in __ocfs2_add_entry()
1613 bh = lookup->dl_dx_root_bh; in __ocfs2_add_entry()
1618 bh = lookup->dl_prev_leaf_bh; in __ocfs2_add_entry()
1627 } else if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in __ocfs2_add_entry()
1628 data_start = di->id2.i_data.id_data; in __ocfs2_add_entry()
1636 de = (struct ocfs2_dir_entry *) data_start; in __ocfs2_add_entry()
1638 BUG_ON((char *)de >= (size + data_start)); in __ocfs2_add_entry()
1643 if (!ocfs2_check_dir_entry(dir, de, insert_bh, offset)) { in __ocfs2_add_entry()
1644 retval = -ENOENT; in __ocfs2_add_entry()
1647 if (ocfs2_match(namelen, name, de)) { in __ocfs2_add_entry()
1648 retval = -EEXIST; in __ocfs2_add_entry()
1654 mlog_bug_on_msg(ocfs2_skip_dir_trailer(dir, de, offset, size), in __ocfs2_add_entry()
1659 (unsigned long long)parent_fe_bh->b_blocknr, in __ocfs2_add_entry()
1660 offset, ocfs2_dir_trailer_blk_off(dir->i_sb)); in __ocfs2_add_entry()
1662 if (ocfs2_dirent_would_fit(de, rec_len)) { in __ocfs2_add_entry()
1663 dir->i_mtime = dir->i_ctime = current_time(dir); in __ocfs2_add_entry()
1693 offset += le16_to_cpu(de->rec_len); in __ocfs2_add_entry()
1694 if (le64_to_cpu(de->inode)) { in __ocfs2_add_entry()
1695 de1 = (struct ocfs2_dir_entry *)((char *) de + in __ocfs2_add_entry()
1696 OCFS2_DIR_REC_LEN(de->name_len)); in __ocfs2_add_entry()
1697 de1->rec_len = in __ocfs2_add_entry()
1698 cpu_to_le16(le16_to_cpu(de->rec_len) - in __ocfs2_add_entry()
1699 OCFS2_DIR_REC_LEN(de->name_len)); in __ocfs2_add_entry()
1700 de->rec_len = cpu_to_le16(OCFS2_DIR_REC_LEN(de->name_len)); in __ocfs2_add_entry()
1701 de = de1; in __ocfs2_add_entry()
1703 de->file_type = FT_UNKNOWN; in __ocfs2_add_entry()
1705 de->inode = cpu_to_le64(blkno); in __ocfs2_add_entry()
1706 ocfs2_set_de_type(de, inode->i_mode); in __ocfs2_add_entry()
1708 de->inode = 0; in __ocfs2_add_entry()
1709 de->name_len = namelen; in __ocfs2_add_entry()
1710 memcpy(de->name, name, namelen); in __ocfs2_add_entry()
1721 offset += le16_to_cpu(de->rec_len); in __ocfs2_add_entry()
1722 de = (struct ocfs2_dir_entry *) ((char *) de + le16_to_cpu(de->rec_len)); in __ocfs2_add_entry()
1727 retval = -ENOSPC; in __ocfs2_add_entry()
1740 unsigned long offset = ctx->pos; in ocfs2_dir_foreach_blk_id()
1744 struct ocfs2_dir_entry *de; in ocfs2_dir_foreach_blk_id() local
1749 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_dir_foreach_blk_id()
1753 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_dir_foreach_blk_id()
1754 data = &di->id2.i_data; in ocfs2_dir_foreach_blk_id()
1756 while (ctx->pos < i_size_read(inode)) { in ocfs2_dir_foreach_blk_id()
1758 * readdir(2), then we might be pointing to an invalid in ocfs2_dir_foreach_blk_id()
1763 de = (struct ocfs2_dir_entry *) in ocfs2_dir_foreach_blk_id()
1764 (data->id_data + i); in ocfs2_dir_foreach_blk_id()
1768 * least that it is non-zero. A in ocfs2_dir_foreach_blk_id()
1769 * failure will be detected in the in ocfs2_dir_foreach_blk_id()
1771 if (le16_to_cpu(de->rec_len) < in ocfs2_dir_foreach_blk_id()
1774 i += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_id()
1776 ctx->pos = offset = i; in ocfs2_dir_foreach_blk_id()
1780 de = (struct ocfs2_dir_entry *) (data->id_data + ctx->pos); in ocfs2_dir_foreach_blk_id()
1781 if (!ocfs2_check_dir_entry(inode, de, di_bh, ctx->pos)) { in ocfs2_dir_foreach_blk_id()
1783 ctx->pos = i_size_read(inode); in ocfs2_dir_foreach_blk_id()
1786 offset += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_id()
1787 if (le64_to_cpu(de->inode)) { in ocfs2_dir_foreach_blk_id()
1788 if (!dir_emit(ctx, de->name, de->name_len, in ocfs2_dir_foreach_blk_id()
1789 le64_to_cpu(de->inode), in ocfs2_dir_foreach_blk_id()
1790 fs_ftype_to_dtype(de->file_type))) in ocfs2_dir_foreach_blk_id()
1793 ctx->pos += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_id()
1801 * NOTE: This function can be called against unindexed directories,
1812 struct ocfs2_dir_entry * de; in ocfs2_dir_foreach_blk_el() local
1813 struct super_block * sb = inode->i_sb; in ocfs2_dir_foreach_blk_el()
1819 offset = ctx->pos & (sb->s_blocksize - 1); in ocfs2_dir_foreach_blk_el()
1821 while (ctx->pos < i_size_read(inode)) { in ocfs2_dir_foreach_blk_el()
1822 blk = ctx->pos >> sb->s_blocksize_bits; in ocfs2_dir_foreach_blk_el()
1825 ctx->pos += sb->s_blocksize - offset; in ocfs2_dir_foreach_blk_el()
1829 /* The idea here is to begin with 8k read-ahead and to stay in ocfs2_dir_foreach_blk_el()
1833 * make sure it's cluster-safe... */ in ocfs2_dir_foreach_blk_el()
1835 || (((last_ra_blk - blk) << 9) <= (ra_sectors / 2))) { in ocfs2_dir_foreach_blk_el()
1836 for (i = ra_sectors >> (sb->s_blocksize_bits - 9); in ocfs2_dir_foreach_blk_el()
1837 i > 0; i--) { in ocfs2_dir_foreach_blk_el()
1848 * readdir(2), then we might be pointing to an invalid in ocfs2_dir_foreach_blk_el()
1852 for (i = 0; i < sb->s_blocksize && i < offset; ) { in ocfs2_dir_foreach_blk_el()
1853 de = (struct ocfs2_dir_entry *) (bh->b_data + i); in ocfs2_dir_foreach_blk_el()
1857 * least that it is non-zero. A in ocfs2_dir_foreach_blk_el()
1858 * failure will be detected in the in ocfs2_dir_foreach_blk_el()
1860 if (le16_to_cpu(de->rec_len) < in ocfs2_dir_foreach_blk_el()
1863 i += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_el()
1866 ctx->pos = (ctx->pos & ~(sb->s_blocksize - 1)) in ocfs2_dir_foreach_blk_el()
1871 while (ctx->pos < i_size_read(inode) in ocfs2_dir_foreach_blk_el()
1872 && offset < sb->s_blocksize) { in ocfs2_dir_foreach_blk_el()
1873 de = (struct ocfs2_dir_entry *) (bh->b_data + offset); in ocfs2_dir_foreach_blk_el()
1874 if (!ocfs2_check_dir_entry(inode, de, bh, offset)) { in ocfs2_dir_foreach_blk_el()
1877 ctx->pos = (ctx->pos | (sb->s_blocksize - 1)) + 1; in ocfs2_dir_foreach_blk_el()
1880 if (le64_to_cpu(de->inode)) { in ocfs2_dir_foreach_blk_el()
1881 if (!dir_emit(ctx, de->name, in ocfs2_dir_foreach_blk_el()
1882 de->name_len, in ocfs2_dir_foreach_blk_el()
1883 le64_to_cpu(de->inode), in ocfs2_dir_foreach_blk_el()
1884 fs_ftype_to_dtype(de->file_type))) { in ocfs2_dir_foreach_blk_el()
1890 offset += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_el()
1891 ctx->pos += le16_to_cpu(de->rec_len); in ocfs2_dir_foreach_blk_el()
1906 if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_dir_foreach_blk()
1912 * This is intended to be called from inside other kernel functions,
1932 trace_ocfs2_readdir((unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_readdir()
1934 error = ocfs2_inode_lock_atime(inode, file->f_path.mnt, &lock_level, 1); in ocfs2_readdir()
1944 if (error != -ENOENT) in ocfs2_readdir()
1950 error = ocfs2_dir_foreach_blk(inode, &file->f_version, ctx, false); in ocfs2_readdir()
1962 * NOTE: this should always be called with parent dir i_mutex taken.
1970 int status = -ENOENT; in ocfs2_find_files_on_disk()
1973 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_find_files_on_disk()
1979 *blkno = le64_to_cpu(lookup->dl_entry->inode); in ocfs2_find_files_on_disk()
2006 * Return -EEXIST if the directory contains the name
2018 (unsigned long long)OCFS2_I(dir)->ip_blkno, namelen, name); in ocfs2_check_dir_for_entry()
2021 ret = -EEXIST; in ocfs2_check_dir_for_entry()
2045 * Check the positions of "." and ".." records to be sure in ocfs2_empty_dir_filldir()
2056 p->seen_dot = 1; in ocfs2_empty_dir_filldir()
2062 p->seen_dot_dot = 1; in ocfs2_empty_dir_filldir()
2064 if (p->dx_dir && p->seen_dot) in ocfs2_empty_dir_filldir()
2070 p->seen_other = 1; in ocfs2_empty_dir_filldir()
2083 priv->dx_dir = 1; in ocfs2_empty_dir_dx()
2090 di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_empty_dir_dx()
2097 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_empty_dir_dx()
2099 if (le32_to_cpu(dx_root->dr_num_entries) != 2) in ocfs2_empty_dir_dx()
2100 priv->seen_other = 1; in ocfs2_empty_dir_dx()
2137 mlog(ML_ERROR, "bad directory (dir #%llu) - no `.' or `..'\n", in ocfs2_empty_dir()
2138 (unsigned long long)OCFS2_I(inode)->ip_blkno); in ocfs2_empty_dir()
2150 * "..", which might be used during creation of a directory with a trailing
2158 struct ocfs2_dir_entry *de = (struct ocfs2_dir_entry *)start; in ocfs2_fill_initial_dirents() local
2160 de->inode = cpu_to_le64(OCFS2_I(inode)->ip_blkno); in ocfs2_fill_initial_dirents()
2161 de->name_len = 1; in ocfs2_fill_initial_dirents()
2162 de->rec_len = in ocfs2_fill_initial_dirents()
2163 cpu_to_le16(OCFS2_DIR_REC_LEN(de->name_len)); in ocfs2_fill_initial_dirents()
2164 strcpy(de->name, "."); in ocfs2_fill_initial_dirents()
2165 ocfs2_set_de_type(de, S_IFDIR); in ocfs2_fill_initial_dirents()
2167 de = (struct ocfs2_dir_entry *) ((char *)de + le16_to_cpu(de->rec_len)); in ocfs2_fill_initial_dirents()
2168 de->inode = cpu_to_le64(OCFS2_I(parent)->ip_blkno); in ocfs2_fill_initial_dirents()
2169 de->rec_len = cpu_to_le16(size - OCFS2_DIR_REC_LEN(1)); in ocfs2_fill_initial_dirents()
2170 de->name_len = 2; in ocfs2_fill_initial_dirents()
2171 strcpy(de->name, ".."); in ocfs2_fill_initial_dirents()
2172 ocfs2_set_de_type(de, S_IFDIR); in ocfs2_fill_initial_dirents()
2174 return de; in ocfs2_fill_initial_dirents()
2179 * the inline-data flag and initializes the inline-data section.
2188 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_fill_new_dir_id()
2189 struct ocfs2_inline_data *data = &di->id2.i_data; in ocfs2_fill_new_dir_id()
2190 unsigned int size = le16_to_cpu(data->id_count); in ocfs2_fill_new_dir_id()
2199 ocfs2_fill_initial_dirents(inode, parent, data->id_data, size); in ocfs2_fill_new_dir_id()
2204 inode->i_blocks = ocfs2_inode_sector_count(inode); in ocfs2_fill_new_dir_id()
2223 unsigned int size = osb->sb->s_blocksize; in ocfs2_fill_new_dir_el()
2225 struct ocfs2_dir_entry *de; in ocfs2_fill_new_dir_el() local
2228 size = ocfs2_dir_trailer_blk_off(parent->i_sb); in ocfs2_fill_new_dir_el()
2230 status = ocfs2_do_extend_dir(osb->sb, handle, inode, fe_bh, in ocfs2_fill_new_dir_el()
2245 memset(new_bh->b_data, 0, osb->sb->s_blocksize); in ocfs2_fill_new_dir_el()
2247 de = ocfs2_fill_initial_dirents(inode, parent, new_bh->b_data, size); in ocfs2_fill_new_dir_el()
2249 int size = le16_to_cpu(de->rec_len); in ocfs2_fill_new_dir_el()
2256 size -= OCFS2_DIR_REC_LEN(2); in ocfs2_fill_new_dir_el()
2257 size -= sizeof(struct ocfs2_dir_block_trailer); in ocfs2_fill_new_dir_el()
2264 i_size_write(inode, inode->i_sb->s_blocksize); in ocfs2_fill_new_dir_el()
2266 inode->i_blocks = ocfs2_inode_sector_count(inode); in ocfs2_fill_new_dir_el()
2293 struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data; in ocfs2_dx_dir_attach_index()
2300 ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb); in ocfs2_dx_dir_attach_index()
2310 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_attach_index()
2313 dx_root_bh = sb_getblk(osb->sb, dr_blkno); in ocfs2_dx_dir_attach_index()
2315 ret = -ENOMEM; in ocfs2_dx_dir_attach_index()
2327 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_dx_dir_attach_index()
2328 memset(dx_root, 0, osb->sb->s_blocksize); in ocfs2_dx_dir_attach_index()
2329 strcpy(dx_root->dr_signature, OCFS2_DX_ROOT_SIGNATURE); in ocfs2_dx_dir_attach_index()
2330 dx_root->dr_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); in ocfs2_dx_dir_attach_index()
2331 dx_root->dr_suballoc_loc = cpu_to_le64(suballoc_loc); in ocfs2_dx_dir_attach_index()
2332 dx_root->dr_suballoc_bit = cpu_to_le16(dr_suballoc_bit); in ocfs2_dx_dir_attach_index()
2333 dx_root->dr_fs_generation = cpu_to_le32(osb->fs_generation); in ocfs2_dx_dir_attach_index()
2334 dx_root->dr_blkno = cpu_to_le64(dr_blkno); in ocfs2_dx_dir_attach_index()
2335 dx_root->dr_dir_blkno = cpu_to_le64(OCFS2_I(dir)->ip_blkno); in ocfs2_dx_dir_attach_index()
2336 dx_root->dr_num_entries = cpu_to_le32(num_entries); in ocfs2_dx_dir_attach_index()
2337 if (le16_to_cpu(trailer->db_free_rec_len)) in ocfs2_dx_dir_attach_index()
2338 dx_root->dr_free_blk = cpu_to_le64(dirdata_bh->b_blocknr); in ocfs2_dx_dir_attach_index()
2340 dx_root->dr_free_blk = cpu_to_le64(0); in ocfs2_dx_dir_attach_index()
2343 dx_root->dr_flags |= OCFS2_DX_FLAG_INLINE; in ocfs2_dx_dir_attach_index()
2344 dx_root->dr_entries.de_count = in ocfs2_dx_dir_attach_index()
2345 cpu_to_le16(ocfs2_dx_entries_per_root(osb->sb)); in ocfs2_dx_dir_attach_index()
2347 dx_root->dr_list.l_count = in ocfs2_dx_dir_attach_index()
2348 cpu_to_le16(ocfs2_extent_recs_per_dx_root(osb->sb)); in ocfs2_dx_dir_attach_index()
2359 di->i_dx_root = cpu_to_le64(dr_blkno); in ocfs2_dx_dir_attach_index()
2361 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_attach_index()
2362 OCFS2_I(dir)->ip_dyn_features |= OCFS2_INDEXED_DIR_FL; in ocfs2_dx_dir_attach_index()
2363 di->i_dyn_features = cpu_to_le16(OCFS2_I(dir)->ip_dyn_features); in ocfs2_dx_dir_attach_index()
2364 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_attach_index()
2386 bh = sb_getblk(osb->sb, start_blk + i); in ocfs2_dx_dir_format_cluster()
2388 ret = -ENOMEM; in ocfs2_dx_dir_format_cluster()
2402 dx_leaf = (struct ocfs2_dx_leaf *) bh->b_data; in ocfs2_dx_dir_format_cluster()
2404 memset(dx_leaf, 0, osb->sb->s_blocksize); in ocfs2_dx_dir_format_cluster()
2405 strcpy(dx_leaf->dl_signature, OCFS2_DX_LEAF_SIGNATURE); in ocfs2_dx_dir_format_cluster()
2406 dx_leaf->dl_fs_generation = cpu_to_le32(osb->fs_generation); in ocfs2_dx_dir_format_cluster()
2407 dx_leaf->dl_blkno = cpu_to_le64(bh->b_blocknr); in ocfs2_dx_dir_format_cluster()
2408 dx_leaf->dl_list.de_count = in ocfs2_dx_dir_format_cluster()
2409 cpu_to_le16(ocfs2_dx_entries_per_leaf(osb->sb)); in ocfs2_dx_dir_format_cluster()
2412 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_format_cluster()
2413 (unsigned long long)bh->b_blocknr, in ocfs2_dx_dir_format_cluster()
2414 le16_to_cpu(dx_leaf->dl_list.de_count)); in ocfs2_dx_dir_format_cluster()
2426 * leaf. This version will not do the extent insert, so that it can be
2438 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in __ocfs2_dx_dir_new_cluster()
2456 phys_blkno = ocfs2_clusters_to_blocks(osb->sb, phys); in __ocfs2_dx_dir_new_cluster()
2548 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_fill_new_dir_dx()
2549 entry_list = &dx_root->dr_entries; in ocfs2_fill_new_dir_dx()
2553 ocfs2_dx_entry_list_insert(entry_list, &hinfo, leaf_bh->b_blocknr); in ocfs2_fill_new_dir_dx()
2556 ocfs2_dx_entry_list_insert(entry_list, &hinfo, leaf_bh->b_blocknr); in ocfs2_fill_new_dir_dx()
2575 if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_fill_new_dir()
2595 struct ocfs2_dir_entry *de; in ocfs2_dx_dir_index_block() local
2598 u64 dirent_blk = dirent_bh->b_blocknr; in ocfs2_dx_dir_index_block()
2600 de_buf = dirent_bh->b_data; in ocfs2_dx_dir_index_block()
2601 limit = de_buf + dir->i_sb->s_blocksize; in ocfs2_dx_dir_index_block()
2604 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_dx_dir_index_block()
2606 namelen = de->name_len; in ocfs2_dx_dir_index_block()
2607 if (!namelen || !de->inode) in ocfs2_dx_dir_index_block()
2610 ocfs2_dx_dir_name_hash(dir, de->name, namelen, &hinfo); in ocfs2_dx_dir_index_block()
2612 i = ocfs2_dx_dir_hash_idx(OCFS2_SB(dir->i_sb), &hinfo); in ocfs2_dx_dir_index_block()
2625 de_buf += le16_to_cpu(de->rec_len); in ocfs2_dx_dir_index_block()
2633 * XXX: This expects dx_root_bh to already be part of the transaction.
2641 struct ocfs2_dir_entry *de; in ocfs2_dx_dir_index_root_block() local
2643 u64 dirent_blk = dirent_bh->b_blocknr; in ocfs2_dx_dir_index_root_block()
2645 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_dx_dir_index_root_block()
2647 de_buf = dirent_bh->b_data; in ocfs2_dx_dir_index_root_block()
2648 limit = de_buf + dir->i_sb->s_blocksize; in ocfs2_dx_dir_index_root_block()
2651 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_dx_dir_index_root_block()
2653 if (!de->name_len || !de->inode) in ocfs2_dx_dir_index_root_block()
2656 ocfs2_dx_dir_name_hash(dir, de->name, de->name_len, &hinfo); in ocfs2_dx_dir_index_root_block()
2659 (unsigned long long)dir->i_ino, in ocfs2_dx_dir_index_root_block()
2661 de->name_len, de->name, in ocfs2_dx_dir_index_root_block()
2662 le16_to_cpu(dx_root->dr_entries.de_num_used)); in ocfs2_dx_dir_index_root_block()
2664 ocfs2_dx_entry_list_insert(&dx_root->dr_entries, &hinfo, in ocfs2_dx_dir_index_root_block()
2667 le32_add_cpu(&dx_root->dr_num_entries, 1); in ocfs2_dx_dir_index_root_block()
2669 de_buf += le16_to_cpu(de->rec_len); in ocfs2_dx_dir_index_root_block()
2683 struct ocfs2_dir_entry *de; in ocfs2_new_dx_should_be_inline() local
2684 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_new_dx_should_be_inline()
2686 de_buf = di->id2.i_data.id_data; in ocfs2_new_dx_should_be_inline()
2690 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_new_dx_should_be_inline()
2692 if (de->name_len && de->inode) in ocfs2_new_dx_should_be_inline()
2695 de_buf += le16_to_cpu(de->rec_len); in ocfs2_new_dx_should_be_inline()
2699 return dirent_count < ocfs2_dx_entries_per_root(dir->i_sb); in ocfs2_new_dx_should_be_inline()
2719 struct super_block *sb = dir->i_sb; in ocfs2_expand_last_dirent()
2720 struct ocfs2_dir_entry *de; in ocfs2_expand_last_dirent() local
2723 unsigned int new_size = sb->s_blocksize; in ocfs2_expand_last_dirent()
2730 bytes = new_size - old_size; in ocfs2_expand_last_dirent()
2734 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_expand_last_dirent()
2736 this_hole = ocfs2_figure_dirent_hole(de); in ocfs2_expand_last_dirent()
2740 prev_de = de; in ocfs2_expand_last_dirent()
2741 de_buf += le16_to_cpu(de->rec_len); in ocfs2_expand_last_dirent()
2742 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_expand_last_dirent()
2745 le16_add_cpu(&prev_de->rec_len, bytes); in ocfs2_expand_last_dirent()
2772 struct super_block *sb = dir->i_sb; in ocfs2_expand_inline_dir()
2776 bytes = blocks_wanted << sb->s_blocksize_bits; in ocfs2_expand_inline_dir()
2777 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_expand_inline_dir()
2784 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_expand_inline_dir()
2795 down_write(&oi->ip_alloc_sem); in ocfs2_expand_inline_dir()
2807 ret = -ENOMEM; in ocfs2_expand_inline_dir()
2823 * tree - maximum dirent size is far less than one block. In in ocfs2_expand_inline_dir()
2852 ocfs2_clusters_to_bytes(osb->sb, alloc + dx_alloc)); in ocfs2_expand_inline_dir()
2870 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1); in ocfs2_expand_inline_dir()
2876 * will be claimed after the conversion to extents. in ocfs2_expand_inline_dir()
2879 data_ac->ac_resv = &oi->ip_la_data_resv; in ocfs2_expand_inline_dir()
2885 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1); in ocfs2_expand_inline_dir()
2892 blkno = ocfs2_clusters_to_blocks(dir->i_sb, bit_off); in ocfs2_expand_inline_dir()
2895 ret = -ENOMEM; in ocfs2_expand_inline_dir()
2909 memcpy(dirdata_bh->b_data, di->id2.i_data.id_data, i_size_read(dir)); in ocfs2_expand_inline_dir()
2910 memset(dirdata_bh->b_data + i_size_read(dir), 0, in ocfs2_expand_inline_dir()
2911 sb->s_blocksize - i_size_read(dir)); in ocfs2_expand_inline_dir()
2912 i = ocfs2_expand_last_dirent(dirdata_bh->b_data, i_size_read(dir), dir); in ocfs2_expand_inline_dir()
2932 * be correctly set once the dx_root has been in ocfs2_expand_inline_dir()
2947 * be fully accessible from system calls. in ocfs2_expand_inline_dir()
2949 * We let the later dirent insert modify c/mtime - to the user in ocfs2_expand_inline_dir()
2959 spin_lock(&oi->ip_lock); in ocfs2_expand_inline_dir()
2960 oi->ip_dyn_features &= ~OCFS2_INLINE_DATA_FL; in ocfs2_expand_inline_dir()
2961 di->i_dyn_features = cpu_to_le16(oi->ip_dyn_features); in ocfs2_expand_inline_dir()
2962 spin_unlock(&oi->ip_lock); in ocfs2_expand_inline_dir()
2966 i_size_write(dir, sb->s_blocksize); in ocfs2_expand_inline_dir()
2967 dir->i_mtime = dir->i_ctime = current_time(dir); in ocfs2_expand_inline_dir()
2969 di->i_size = cpu_to_le64(sb->s_blocksize); in ocfs2_expand_inline_dir()
2970 di->i_ctime = di->i_mtime = cpu_to_le64(dir->i_ctime.tv_sec); in ocfs2_expand_inline_dir()
2971 di->i_ctime_nsec = di->i_mtime_nsec = cpu_to_le32(dir->i_ctime.tv_nsec); in ocfs2_expand_inline_dir()
2989 dir->i_blocks = ocfs2_inode_sector_count(dir); in ocfs2_expand_inline_dir()
3027 blkno = ocfs2_clusters_to_blocks(dir->i_sb, bit_off); in ocfs2_expand_inline_dir()
3035 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1); in ocfs2_expand_inline_dir()
3049 &lookup->dl_hinfo); in ocfs2_expand_inline_dir()
3051 lookup->dl_dx_leaf_bh = dx_leaves[off]; in ocfs2_expand_inline_dir()
3053 lookup->dl_dx_root_bh = dx_root_bh; in ocfs2_expand_inline_dir()
3064 up_write(&oi->ip_alloc_sem); in ocfs2_expand_inline_dir()
3095 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_do_extend_dir()
3096 extend = (i_size_read(dir) == ocfs2_clusters_to_bytes(sb, OCFS2_I(dir)->ip_clusters)); in ocfs2_do_extend_dir()
3097 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_do_extend_dir()
3100 u32 offset = OCFS2_I(dir)->ip_clusters; in ocfs2_do_extend_dir()
3111 BUG_ON(status == -EAGAIN); in ocfs2_do_extend_dir()
3127 status = -ENOMEM; in ocfs2_do_extend_dir()
3142 * is to be turned into an extent based one. The size of the dirent to
3143 * insert might be larger than the space gained by growing to just one
3146 * If the directory is already indexed, dx_root_bh must be provided.
3158 struct ocfs2_dinode *fe = (struct ocfs2_dinode *) parent_fe_bh->b_data; in ocfs2_extend_dir()
3159 struct ocfs2_extent_list *el = &fe->id2.i_list; in ocfs2_extend_dir()
3164 struct ocfs2_dir_entry * de; in ocfs2_extend_dir() local
3165 struct super_block *sb = osb->sb; in ocfs2_extend_dir()
3167 struct buffer_head *dx_root_bh = lookup->dl_dx_root_bh; in ocfs2_extend_dir()
3169 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in ocfs2_extend_dir()
3171 * This would be a code error as an inline directory should in ocfs2_extend_dir()
3186 dx_root_bh = lookup->dl_dx_root_bh; in ocfs2_extend_dir()
3201 * Get rid of 'new_bh' - we want to format the 2nd in ocfs2_extend_dir()
3207 down_write(&OCFS2_I(dir)->ip_alloc_sem); in ocfs2_extend_dir()
3214 down_write(&OCFS2_I(dir)->ip_alloc_sem); in ocfs2_extend_dir()
3217 trace_ocfs2_extend_dir((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_extend_dir()
3220 /* dir->i_size is always block aligned. */ in ocfs2_extend_dir()
3221 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_extend_dir()
3222 if (dir_i_size == ocfs2_clusters_to_bytes(sb, OCFS2_I(dir)->ip_clusters)) { in ocfs2_extend_dir()
3223 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_extend_dir()
3236 if (status != -ENOSPC) in ocfs2_extend_dir()
3244 if (status != -ENOSPC) in ocfs2_extend_dir()
3250 data_ac->ac_resv = &OCFS2_I(dir)->ip_la_data_resv; in ocfs2_extend_dir()
3254 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_extend_dir()
3271 status = ocfs2_do_extend_dir(osb->sb, handle, dir, parent_fe_bh, in ocfs2_extend_dir()
3286 memset(new_bh->b_data, 0, sb->s_blocksize); in ocfs2_extend_dir()
3288 de = (struct ocfs2_dir_entry *) new_bh->b_data; in ocfs2_extend_dir()
3289 de->inode = 0; in ocfs2_extend_dir()
3291 de->rec_len = cpu_to_le16(ocfs2_dir_trailer_blk_off(sb)); in ocfs2_extend_dir()
3293 ocfs2_init_dir_trailer(dir, new_bh, le16_to_cpu(de->rec_len)); in ocfs2_extend_dir()
3304 de->rec_len = cpu_to_le16(sb->s_blocksize); in ocfs2_extend_dir()
3309 dir_i_size += dir->i_sb->s_blocksize; in ocfs2_extend_dir()
3311 dir->i_blocks = ocfs2_inode_sector_count(dir); in ocfs2_extend_dir()
3325 up_write(&OCFS2_I(dir)->ip_alloc_sem); in ocfs2_extend_dir()
3343 struct super_block *sb = dir->i_sb; in ocfs2_find_dir_space_id()
3344 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_find_dir_space_id()
3345 struct ocfs2_dir_entry *de, *last_de = NULL; in ocfs2_find_dir_space_id() local
3348 unsigned int rec_len, new_rec_len, free_space = dir->i_sb->s_blocksize; in ocfs2_find_dir_space_id()
3355 free_space = ocfs2_dir_trailer_blk_off(sb) - i_size_read(dir); in ocfs2_find_dir_space_id()
3357 free_space = dir->i_sb->s_blocksize - i_size_read(dir); in ocfs2_find_dir_space_id()
3359 de_buf = di->id2.i_data.id_data; in ocfs2_find_dir_space_id()
3364 de = (struct ocfs2_dir_entry *)de_buf; in ocfs2_find_dir_space_id()
3366 if (!ocfs2_check_dir_entry(dir, de, di_bh, offset)) { in ocfs2_find_dir_space_id()
3367 ret = -ENOENT; in ocfs2_find_dir_space_id()
3370 if (ocfs2_match(namelen, name, de)) { in ocfs2_find_dir_space_id()
3371 ret = -EEXIST; in ocfs2_find_dir_space_id()
3379 if (ocfs2_dirent_would_fit(de, rec_len)) { in ocfs2_find_dir_space_id()
3388 last_de = de; in ocfs2_find_dir_space_id()
3389 de_buf += le16_to_cpu(de->rec_len); in ocfs2_find_dir_space_id()
3390 offset += le16_to_cpu(de->rec_len); in ocfs2_find_dir_space_id()
3394 * We're going to require expansion of the directory - figure in ocfs2_find_dir_space_id()
3396 * dirent can be found. in ocfs2_find_dir_space_id()
3399 new_rec_len = le16_to_cpu(last_de->rec_len) + free_space; in ocfs2_find_dir_space_id()
3400 if (new_rec_len < (rec_len + OCFS2_DIR_REC_LEN(last_de->name_len))) in ocfs2_find_dir_space_id()
3403 ret = -ENOSPC; in ocfs2_find_dir_space_id()
3414 struct ocfs2_dir_entry *de; in ocfs2_find_dir_space_el() local
3415 struct super_block *sb = dir->i_sb; in ocfs2_find_dir_space_el()
3417 int blocksize = dir->i_sb->s_blocksize; in ocfs2_find_dir_space_el()
3425 de = (struct ocfs2_dir_entry *) bh->b_data; in ocfs2_find_dir_space_el()
3427 if ((char *)de >= sb->s_blocksize + bh->b_data) { in ocfs2_find_dir_space_el()
3436 status = -ENOSPC; in ocfs2_find_dir_space_el()
3440 offset >> sb->s_blocksize_bits, in ocfs2_find_dir_space_el()
3446 de = (struct ocfs2_dir_entry *) bh->b_data; in ocfs2_find_dir_space_el()
3448 if (!ocfs2_check_dir_entry(dir, de, bh, offset)) { in ocfs2_find_dir_space_el()
3449 status = -ENOENT; in ocfs2_find_dir_space_el()
3452 if (ocfs2_match(namelen, name, de)) { in ocfs2_find_dir_space_el()
3453 status = -EEXIST; in ocfs2_find_dir_space_el()
3457 if (ocfs2_skip_dir_trailer(dir, de, offset % blocksize, in ocfs2_find_dir_space_el()
3461 if (ocfs2_dirent_would_fit(de, rec_len)) { in ocfs2_find_dir_space_el()
3470 offset += le16_to_cpu(de->rec_len); in ocfs2_find_dir_space_el()
3471 de = (struct ocfs2_dir_entry *)((char *) de + le16_to_cpu(de->rec_len)); in ocfs2_find_dir_space_el()
3486 u32 major_hash1 = le32_to_cpu(entry1->dx_major_hash); in dx_leaf_sort_cmp()
3487 u32 major_hash2 = le32_to_cpu(entry2->dx_major_hash); in dx_leaf_sort_cmp()
3488 u32 minor_hash1 = le32_to_cpu(entry1->dx_minor_hash); in dx_leaf_sort_cmp()
3489 u32 minor_hash2 = le32_to_cpu(entry2->dx_minor_hash); in dx_leaf_sort_cmp()
3494 return -1; in dx_leaf_sort_cmp()
3502 return -1; in dx_leaf_sort_cmp()
3518 struct ocfs2_dx_entry_list *dl_list = &dx_leaf->dl_list; in ocfs2_dx_leaf_same_major()
3519 int i, num = le16_to_cpu(dl_list->de_num_used); in ocfs2_dx_leaf_same_major()
3521 for (i = 0; i < (num - 1); i++) { in ocfs2_dx_leaf_same_major()
3522 if (le32_to_cpu(dl_list->de_entries[i].dx_major_hash) != in ocfs2_dx_leaf_same_major()
3523 le32_to_cpu(dl_list->de_entries[i + 1].dx_major_hash)) in ocfs2_dx_leaf_same_major()
3532 * entries to be in sorted order.
3537 * This function is only concerned with the major hash - that which
3544 struct ocfs2_dx_entry_list *dl_list = &dx_leaf->dl_list; in ocfs2_dx_dir_find_leaf_split()
3545 int i, num_used = le16_to_cpu(dl_list->de_num_used); in ocfs2_dx_dir_find_leaf_split()
3558 u32 val = le32_to_cpu(dl_list->de_entries[0].dx_major_hash); in ocfs2_dx_dir_find_leaf_split()
3566 * won't be space after the split. in ocfs2_dx_dir_find_leaf_split()
3568 return -ENOSPC; in ocfs2_dx_dir_find_leaf_split()
3576 * know that insert_hash *must* be larger than in ocfs2_dx_dir_find_leaf_split()
3579 * We also know then, that there cannot be an in ocfs2_dx_dir_find_leaf_split()
3580 * adjacent extent (otherwise we'd be looking in ocfs2_dx_dir_find_leaf_split()
3590 * val can not be the same as insert hash, and in ocfs2_dx_dir_find_leaf_split()
3591 * also must be larger than leaf_cpos. Also, in ocfs2_dx_dir_find_leaf_split()
3592 * we know that there can't be a leaf between in ocfs2_dx_dir_find_leaf_split()
3594 * hash 'val' would be there. in ocfs2_dx_dir_find_leaf_split()
3611 if (le32_to_cpu(dl_list->de_entries[i].dx_major_hash) > in ocfs2_dx_dir_find_leaf_split()
3615 BUG_ON(i == num_used); /* Should be impossible */ in ocfs2_dx_dir_find_leaf_split()
3616 *split_hash = le32_to_cpu(dl_list->de_entries[i].dx_major_hash); in ocfs2_dx_dir_find_leaf_split()
3626 * of minor_hash, we can optimize - an item at block offset X within
3627 * the original cluster, will be at offset X within the new cluster.
3642 tmp_list = &tmp_dx_leaf->dl_list; in ocfs2_dx_dir_transfer_leaf()
3645 orig_dx_leaf = (struct ocfs2_dx_leaf *) orig_dx_leaves[i]->b_data; in ocfs2_dx_dir_transfer_leaf()
3646 orig_list = &orig_dx_leaf->dl_list; in ocfs2_dx_dir_transfer_leaf()
3647 new_dx_leaf = (struct ocfs2_dx_leaf *) new_dx_leaves[i]->b_data; in ocfs2_dx_dir_transfer_leaf()
3649 num_used = le16_to_cpu(orig_list->de_num_used); in ocfs2_dx_dir_transfer_leaf()
3651 memcpy(tmp_dx_leaf, orig_dx_leaf, dir->i_sb->s_blocksize); in ocfs2_dx_dir_transfer_leaf()
3652 tmp_list->de_num_used = cpu_to_le16(0); in ocfs2_dx_dir_transfer_leaf()
3653 memset(&tmp_list->de_entries, 0, sizeof(*dx_entry)*num_used); in ocfs2_dx_dir_transfer_leaf()
3656 dx_entry = &orig_list->de_entries[j]; in ocfs2_dx_dir_transfer_leaf()
3657 major_hash = le32_to_cpu(dx_entry->dx_major_hash); in ocfs2_dx_dir_transfer_leaf()
3665 memcpy(orig_dx_leaf, tmp_dx_leaf, dir->i_sb->s_blocksize); in ocfs2_dx_dir_transfer_leaf()
3675 int credits = ocfs2_clusters_to_blocks(osb->sb, 3); in ocfs2_dx_dir_rebalance_credits()
3677 credits += ocfs2_calc_extend_credits(osb->sb, &dx_root->dr_list); in ocfs2_dx_dir_rebalance_credits()
3678 credits += ocfs2_quota_trans_credits(osb->sb); in ocfs2_dx_dir_rebalance_credits()
3692 struct ocfs2_dx_leaf *dx_leaf = (struct ocfs2_dx_leaf *)dx_leaf_bh->b_data; in ocfs2_dx_dir_rebalance()
3694 u32 cpos, split_hash, insert_hash = hinfo->major_hash; in ocfs2_dx_dir_rebalance()
3705 trace_ocfs2_dx_dir_rebalance((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_rebalance()
3711 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_dx_dir_rebalance()
3716 if (le32_to_cpu(dx_root->dr_clusters) == UINT_MAX) in ocfs2_dx_dir_rebalance()
3717 return -ENOSPC; in ocfs2_dx_dir_rebalance()
3719 num_used = le16_to_cpu(dx_leaf->dl_list.de_num_used); in ocfs2_dx_dir_rebalance()
3720 if (num_used < le16_to_cpu(dx_leaf->dl_list.de_count)) { in ocfs2_dx_dir_rebalance()
3722 "%llu, %d\n", (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_rebalance()
3724 ret = -EIO; in ocfs2_dx_dir_rebalance()
3728 orig_dx_leaves = ocfs2_dx_dir_kmalloc_leaves(osb->sb, &num_dx_leaves); in ocfs2_dx_dir_rebalance()
3730 ret = -ENOMEM; in ocfs2_dx_dir_rebalance()
3735 new_dx_leaves = ocfs2_dx_dir_kmalloc_leaves(osb->sb, NULL); in ocfs2_dx_dir_rebalance()
3737 ret = -ENOMEM; in ocfs2_dx_dir_rebalance()
3744 if (ret != -ENOSPC) in ocfs2_dx_dir_rebalance()
3759 ocfs2_clusters_to_bytes(dir->i_sb, 1)); in ocfs2_dx_dir_rebalance()
3774 sort(dx_leaf->dl_list.de_entries, num_used, in ocfs2_dx_dir_rebalance()
3791 * which want to be in the new cluster before insert, but in in ocfs2_dx_dir_rebalance()
3807 tmp_dx_leaf = kmalloc(osb->sb->s_blocksize, GFP_NOFS); in ocfs2_dx_dir_rebalance()
3809 ret = -ENOMEM; in ocfs2_dx_dir_rebalance()
3814 orig_leaves_start = ocfs2_block_to_cluster_start(dir->i_sb, leaf_blkno); in ocfs2_dx_dir_rebalance()
3855 ocfs2_clusters_to_bytes(dir->i_sb, 1)); in ocfs2_dx_dir_rebalance()
3894 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_find_dir_space_dx()
3897 ret = ocfs2_dx_dir_lookup(dir, &dx_root->dr_list, &lookup->dl_hinfo, in ocfs2_find_dir_space_dx()
3910 dx_leaf = (struct ocfs2_dx_leaf *)dx_leaf_bh->b_data; in ocfs2_find_dir_space_dx()
3912 if (le16_to_cpu(dx_leaf->dl_list.de_num_used) >= in ocfs2_find_dir_space_dx()
3913 le16_to_cpu(dx_leaf->dl_list.de_count)) { in ocfs2_find_dir_space_dx()
3922 ret = -ENOSPC; in ocfs2_find_dir_space_dx()
3927 &lookup->dl_hinfo, leaf_cpos, in ocfs2_find_dir_space_dx()
3930 if (ret != -ENOSPC) in ocfs2_find_dir_space_dx()
3946 lookup->dl_dx_leaf_bh = dx_leaf_bh; in ocfs2_find_dir_space_dx()
3959 int ret = -ENOSPC; in ocfs2_search_dx_free_list()
3966 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_search_dx_free_list()
3967 next_block = le64_to_cpu(dx_root->dr_free_blk); in ocfs2_search_dx_free_list()
3980 db = ocfs2_trailer_from_bh(leaf_bh, dir->i_sb); in ocfs2_search_dx_free_list()
3981 if (rec_len <= le16_to_cpu(db->db_free_rec_len)) { in ocfs2_search_dx_free_list()
3982 lookup->dl_leaf_bh = leaf_bh; in ocfs2_search_dx_free_list()
3983 lookup->dl_prev_leaf_bh = prev_leaf_bh; in ocfs2_search_dx_free_list()
3989 next_block = le64_to_cpu(db->db_free_next); in ocfs2_search_dx_free_list()
3993 ret = -ENOSPC; in ocfs2_search_dx_free_list()
4010 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_expand_inline_dx_root()
4023 dx_leaves = ocfs2_dx_dir_kmalloc_leaves(osb->sb, &num_dx_leaves); in ocfs2_expand_inline_dx_root()
4025 ret = -ENOMEM; in ocfs2_expand_inline_dx_root()
4030 handle = ocfs2_start_trans(osb, ocfs2_calc_dxi_expand_credits(osb->sb)); in ocfs2_expand_inline_dx_root()
4038 ocfs2_clusters_to_bytes(osb->sb, 1)); in ocfs2_expand_inline_dx_root()
4066 dx_root = (struct ocfs2_dx_root_block *) dx_root_bh->b_data; in ocfs2_expand_inline_dx_root()
4067 entry_list = &dx_root->dr_entries; in ocfs2_expand_inline_dx_root()
4069 for (i = 0; i < le16_to_cpu(entry_list->de_num_used); i++) { in ocfs2_expand_inline_dx_root()
4070 dx_entry = &entry_list->de_entries[i]; in ocfs2_expand_inline_dx_root()
4073 le32_to_cpu(dx_entry->dx_minor_hash)); in ocfs2_expand_inline_dx_root()
4074 target_leaf = (struct ocfs2_dx_leaf *)dx_leaves[j]->b_data; in ocfs2_expand_inline_dx_root()
4082 dx_root->dr_flags &= ~OCFS2_DX_FLAG_INLINE; in ocfs2_expand_inline_dx_root()
4083 memset(&dx_root->dr_list, 0, osb->sb->s_blocksize - in ocfs2_expand_inline_dx_root()
4085 dx_root->dr_list.l_count = in ocfs2_expand_inline_dx_root()
4086 cpu_to_le16(ocfs2_extent_recs_per_dx_root(osb->sb)); in ocfs2_expand_inline_dx_root()
4102 ocfs2_clusters_to_bytes(dir->i_sb, 1)); in ocfs2_expand_inline_dx_root()
4123 dx_root = (struct ocfs2_dx_root_block *) dx_root_bh->b_data; in ocfs2_inline_dx_has_space()
4124 entry_list = &dx_root->dr_entries; in ocfs2_inline_dx_has_space()
4126 if (le16_to_cpu(entry_list->de_num_used) >= in ocfs2_inline_dx_has_space()
4127 le16_to_cpu(entry_list->de_count)) in ocfs2_inline_dx_has_space()
4128 return -ENOSPC; in ocfs2_inline_dx_has_space()
4140 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_prepare_dx_dir_for_insert()
4143 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_prepare_dx_dir_for_insert()
4152 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_prepare_dx_dir_for_insert()
4153 if (le32_to_cpu(dx_root->dr_num_entries) == OCFS2_DX_ENTRIES_MAX) { in ocfs2_prepare_dx_dir_for_insert()
4154 ret = -ENOSPC; in ocfs2_prepare_dx_dir_for_insert()
4198 if (ret && ret != -ENOSPC) { in ocfs2_prepare_dx_dir_for_insert()
4203 /* Do this up here - ocfs2_extend_dir might need the dx_root */ in ocfs2_prepare_dx_dir_for_insert()
4204 lookup->dl_dx_root_bh = dx_root_bh; in ocfs2_prepare_dx_dir_for_insert()
4207 if (ret == -ENOSPC) { in ocfs2_prepare_dx_dir_for_insert()
4219 lookup->dl_prev_leaf_bh = NULL; in ocfs2_prepare_dx_dir_for_insert()
4220 lookup->dl_leaf_bh = leaf_bh; in ocfs2_prepare_dx_dir_for_insert()
4232 * lookup result that ocfs2_add_entry() will be able complete the task
4247 (unsigned long long)OCFS2_I(dir)->ip_blkno, namelen); in ocfs2_prepare_dir_for_insert()
4250 ret = -EINVAL; in ocfs2_prepare_dir_for_insert()
4258 * The directory might start inline, then be turned into an in ocfs2_prepare_dir_for_insert()
4267 ocfs2_dx_dir_name_hash(dir, name, namelen, &lookup->dl_hinfo); in ocfs2_prepare_dir_for_insert()
4277 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in ocfs2_prepare_dir_for_insert()
4283 if (ret && ret != -ENOSPC) { in ocfs2_prepare_dir_for_insert()
4288 if (ret == -ENOSPC) { in ocfs2_prepare_dir_for_insert()
4297 if (ret != -ENOSPC) in ocfs2_prepare_dir_for_insert()
4305 lookup->dl_leaf_bh = bh; in ocfs2_prepare_dir_for_insert()
4317 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_dx_dir_remove_index()
4318 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_dx_dir_remove_index()
4327 dx_root = (struct ocfs2_dx_root_block *) dx_root_bh->b_data; in ocfs2_dx_dir_remove_index()
4331 le16_to_cpu(dx_root->dr_suballoc_slot)); in ocfs2_dx_dir_remove_index()
4333 ret = -ENOMEM; in ocfs2_dx_dir_remove_index()
4359 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_remove_index()
4360 OCFS2_I(dir)->ip_dyn_features &= ~OCFS2_INDEXED_DIR_FL; in ocfs2_dx_dir_remove_index()
4361 di->i_dyn_features = cpu_to_le16(OCFS2_I(dir)->ip_dyn_features); in ocfs2_dx_dir_remove_index()
4362 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_remove_index()
4363 di->i_dx_root = cpu_to_le64(0ULL); in ocfs2_dx_dir_remove_index()
4368 blk = le64_to_cpu(dx_root->dr_blkno); in ocfs2_dx_dir_remove_index()
4369 bit = le16_to_cpu(dx_root->dr_suballoc_bit); in ocfs2_dx_dir_remove_index()
4370 if (dx_root->dr_suballoc_loc) in ocfs2_dx_dir_remove_index()
4371 bg_blkno = le64_to_cpu(dx_root->dr_suballoc_loc); in ocfs2_dx_dir_remove_index()
4399 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_dx_dir_truncate()
4402 struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; in ocfs2_dx_dir_truncate()
4416 dx_root = (struct ocfs2_dx_root_block *)dx_root_bh->b_data; in ocfs2_dx_dir_truncate()
4424 while (le32_to_cpu(dx_root->dr_clusters)) { in ocfs2_dx_dir_truncate()
4425 ret = ocfs2_dx_dir_lookup_rec(dir, &dx_root->dr_list, in ocfs2_dx_dir_truncate()
4432 p_cpos = ocfs2_blocks_to_clusters(dir->i_sb, blkno); in ocfs2_dx_dir_truncate()
4444 major_hash = cpos - 1; in ocfs2_dx_dir_truncate()