Lines Matching refs:dir
5 * dir.c
11 * Portions of this code from linux/fs/ext3/dir.c
20 * linux/fs/minix/dir.c
39 #include "dir.h"
60 struct inode *dir,
71 static int ocfs2_supports_dir_trailer(struct inode *dir)
73 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
75 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL)
78 return ocfs2_meta_ecc(osb) || ocfs2_dir_indexed(dir);
89 static int ocfs2_new_dir_wants_trailer(struct inode *dir)
91 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
119 static int ocfs2_skip_dir_trailer(struct inode *dir,
126 if (!ocfs2_supports_dir_trailer(dir))
149 * Link an unindexed block with a dir trailer structure into the index free
153 static int ocfs2_dx_dir_link_trailer(struct inode *dir, handle_t *handle,
161 ret = ocfs2_journal_access_dr(handle, INODE_CACHE(dir), dx_root_bh,
167 trailer = ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb);
253 static void ocfs2_dx_dir_name_hash(struct inode *dir, const char *name, int len,
256 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
296 * bh passed here can be an inode block or a dir data block, depending
299 static int ocfs2_check_dir_entry(struct inode *dir,
325 (unsigned long long)OCFS2_I(dir)->ip_blkno, error_msg,
347 struct inode *dir,
371 if (!ocfs2_check_dir_entry(dir, de, bh, first_de,
399 struct inode *dir,
407 ret = ocfs2_read_inode_block(dir, &di_bh);
416 found = ocfs2_search_dirblock(di_bh, dir, name, namelen, 0,
417 data->id_data, i_size_read(dir), res_dir);
465 static int ocfs2_check_dir_trailer(struct inode *dir, struct buffer_head *bh)
470 trailer = ocfs2_trailer_from_bh(bh, dir->i_sb);
472 rc = ocfs2_error(dir->i_sb,
479 rc = ocfs2_error(dir->i_sb,
486 OCFS2_I(dir)->ip_blkno) {
487 rc = ocfs2_error(dir->i_sb,
490 (unsigned long long)OCFS2_I(dir)->ip_blkno,
541 static int ocfs2_read_dir_block_direct(struct inode *dir, u64 phys,
547 ret = ocfs2_read_block(INODE_CACHE(dir), phys, &tmp,
554 if (ocfs2_supports_dir_trailer(dir)) {
555 ret = ocfs2_check_dir_trailer(dir, tmp);
583 "Checksum failed for dir index root block %llu\n",
598 static int ocfs2_read_dx_root(struct inode *dir, struct ocfs2_dinode *di,
605 ret = ocfs2_read_block(INODE_CACHE(dir), blkno, &tmp,
626 "Checksum failed for dir index leaf block %llu\n",
639 static int ocfs2_read_dx_leaf(struct inode *dir, u64 blkno,
645 ret = ocfs2_read_block(INODE_CACHE(dir), blkno, &tmp,
659 static int ocfs2_read_dx_leaves(struct inode *dir, u64 start, int num,
664 ret = ocfs2_read_blocks(INODE_CACHE(dir), start, num, dx_leaf_bhs, 0,
673 struct inode *dir,
687 sb = dir->i_sb;
689 nblocks = i_size_read(dir) >> sb->s_blocksize_bits;
690 start = OCFS2_I(dir)->ip_dir_start_lookup;
717 ocfs2_read_dir_block(dir, b++, &bh,
724 if (ocfs2_read_dir_block(dir, block, &bh, 0)) {
729 (unsigned long long)OCFS2_I(dir)->ip_blkno,
733 i = ocfs2_search_dirblock(bh, dir, name, namelen,
738 OCFS2_I(dir)->ip_dir_start_lookup = block;
756 nblocks = i_size_read(dir) >> sb->s_blocksize_bits;
898 struct inode *dir,
913 ocfs2_dx_dir_name_hash(dir, name, namelen, &res->dl_hinfo);
922 ret = ocfs2_dx_dir_lookup(dir, dr_el, hinfo, NULL, &phys);
928 trace_ocfs2_dx_dir_search((unsigned long long)OCFS2_I(dir)->ip_blkno,
932 ret = ocfs2_read_dx_leaf(dir, phys, &dx_leaf_bh);
962 ret = ocfs2_read_dir_block_direct(dir,
975 found = ocfs2_search_dirblock(dir_ent_bh, dir, name, namelen,
977 dir->i_sb->s_blocksize, &dir_ent);
1012 struct inode *dir,
1021 ret = ocfs2_read_inode_block(dir, &di_bh);
1029 ret = ocfs2_read_dx_root(dir, di, &dx_root_bh);
1036 ret = ocfs2_dx_dir_search(name, namelen, dir, dx_root, lookup);
1052 * Try to find an entry of the provided name within 'dir'.
1066 struct inode *dir, struct ocfs2_dir_lookup_result *lookup)
1071 if (ocfs2_dir_indexed(dir))
1072 return ocfs2_find_entry_dx(name, namelen, dir, lookup);
1075 * The unindexed dir code only uses part of the lookup
1079 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL)
1080 bh = ocfs2_find_entry_id(name, namelen, dir, &res_dir);
1082 bh = ocfs2_find_entry_el(name, namelen, dir, &res_dir);
1095 int ocfs2_update_entry(struct inode *dir, handle_t *handle,
1110 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL)
1113 ret = access(handle, INODE_CACHE(dir), de_bh,
1133 static int __ocfs2_delete_entry(handle_t *handle, struct inode *dir,
1142 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL)
1149 if (!ocfs2_check_dir_entry(dir, de, bh, first_de, bytes, i)) {
1155 status = access(handle, INODE_CACHE(dir), bh,
1166 inode_inc_iversion(dir);
1237 static int ocfs2_delete_entry_dx(handle_t *handle, struct inode *dir,
1278 (unsigned long long)OCFS2_I(dir)->ip_blkno, index,
1288 trailer = ocfs2_trailer_from_bh(leaf_bh, dir->i_sb);
1303 ret = ocfs2_journal_access_dr(handle, INODE_CACHE(dir), dx_root_bh,
1311 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir),
1320 trace_ocfs2_delete_entry_dx((unsigned long long)OCFS2_I(dir)->ip_blkno,
1323 ret = __ocfs2_delete_entry(handle, dir, lookup->dl_entry,
1330 max_rec_len = ocfs2_find_max_rec_len(dir->i_sb, leaf_bh);
1354 struct inode *dir,
1363 ret = ocfs2_read_inode_block(dir, &di_bh);
1372 ret = __ocfs2_delete_entry(handle, dir, de_del, bh, data->id_data,
1373 i_size_read(dir));
1381 struct inode *dir,
1385 return __ocfs2_delete_entry(handle, dir, de_del, bh, bh->b_data,
1394 struct inode *dir,
1397 if (ocfs2_dir_indexed(dir))
1398 return ocfs2_delete_entry_dx(handle, dir, res);
1400 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL)
1401 return ocfs2_delete_entry_id(handle, dir, res->dl_entry,
1404 return ocfs2_delete_entry_el(handle, dir, res->dl_entry,
1462 static int __ocfs2_dx_dir_leaf_insert(struct inode *dir, handle_t *handle,
1470 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), dx_leaf_bh,
1485 static void ocfs2_dx_inline_root_insert(struct inode *dir, handle_t *handle,
1493 static int ocfs2_dx_dir_insert(struct inode *dir, handle_t *handle,
1500 ret = ocfs2_journal_access_dr(handle, INODE_CACHE(dir), dx_root_bh,
1509 ocfs2_dx_inline_root_insert(dir, handle,
1514 ret = __ocfs2_dx_dir_leaf_insert(dir, handle, &lookup->dl_hinfo,
1528 static void ocfs2_remove_block_from_free_list(struct inode *dir,
1536 trailer = ocfs2_trailer_from_bh(lookup->dl_leaf_bh, dir->i_sb);
1544 prev = ocfs2_trailer_from_bh(bh, dir->i_sb);
1559 static void ocfs2_recalc_free_list(struct inode *dir, handle_t *handle,
1566 max_rec_len = ocfs2_find_max_rec_len(dir->i_sb, lookup->dl_leaf_bh);
1573 trailer = ocfs2_trailer_from_bh(lookup->dl_leaf_bh, dir->i_sb);
1577 ocfs2_remove_block_from_free_list(dir, handle, lookup);
1582 * like orphan dir can call this instead.
1588 struct inode *dir,
1598 struct super_block *sb = dir->i_sb;
1607 if (ocfs2_dir_indexed(dir)) {
1611 * An indexed dir may require that we update the free space
1621 INODE_CACHE(dir), bh,
1626 INODE_CACHE(dir), bh,
1633 } else if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
1635 size = i_size_read(dir);
1649 if (!ocfs2_check_dir_entry(dir, de, insert_bh, data_start,
1661 mlog_bug_on_msg(ocfs2_skip_dir_trailer(dir, de, offset, size),
1662 "Hit dir trailer trying to insert %.*s "
1667 offset, ocfs2_dir_trailer_blk_off(dir->i_sb));
1670 dir->i_mtime = dir->i_ctime = current_time(dir);
1671 retval = ocfs2_mark_inode_dirty(handle, dir, parent_fe_bh);
1679 INODE_CACHE(dir),
1684 INODE_CACHE(dir),
1688 if (!retval && ocfs2_dir_indexed(dir))
1689 retval = ocfs2_dx_dir_insert(dir,
1719 if (ocfs2_dir_indexed(dir))
1720 ocfs2_recalc_free_list(dir, handle, lookup);
1722 inode_inc_iversion(dir);
1755 mlog(ML_ERROR, "Unable to read inode block for dir %llu\n",
1764 /* If the dir block has changed since the last call to
1855 /* If the dir block has changed since the last call to
1971 * NOTE: this should always be called with parent dir i_mutex taken.
2000 int ocfs2_lookup_ino_from_name(struct inode *dir, const char *name,
2006 ret = ocfs2_find_files_on_disk(name, namelen, blkno, dir, &lookup);
2017 * Callers should have i_mutex + a cluster lock on dir
2019 int ocfs2_check_dir_for_entry(struct inode *dir,
2027 (unsigned long long)OCFS2_I(dir)->ip_blkno, namelen, name);
2029 if (ocfs2_find_entry(name, namelen, dir, &lookup) == 0) {
2120 * Returns 1 if dir is empty, zero otherwise.
2146 mlog(ML_ERROR, "bad directory (dir #%llu) - no `.' or `..'\n",
2294 handle_t *handle, struct inode *dir,
2309 ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb);
2319 (unsigned long long)OCFS2_I(dir)->ip_blkno,
2327 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), dx_root_bh);
2329 ret = ocfs2_journal_access_dr(handle, INODE_CACHE(dir), dx_root_bh,
2344 dx_root->dr_dir_blkno = cpu_to_le64(OCFS2_I(dir)->ip_blkno);
2361 ret = ocfs2_journal_access_di(handle, INODE_CACHE(dir), di_bh,
2370 spin_lock(&OCFS2_I(dir)->ip_lock);
2371 OCFS2_I(dir)->ip_dyn_features |= OCFS2_INDEXED_DIR_FL;
2372 di->i_dyn_features = cpu_to_le16(OCFS2_I(dir)->ip_dyn_features);
2373 spin_unlock(&OCFS2_I(dir)->ip_lock);
2386 handle_t *handle, struct inode *dir,
2402 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), bh);
2404 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), bh,
2421 (unsigned long long)OCFS2_I(dir)->ip_blkno,
2434 * Allocates and formats a new cluster for use in an indexed dir
2438 static int __ocfs2_dx_dir_new_cluster(struct inode *dir,
2447 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
2466 ret = ocfs2_dx_dir_format_cluster(osb, handle, dir, dx_leaves,
2478 static int ocfs2_dx_dir_new_cluster(struct inode *dir,
2489 ret = __ocfs2_dx_dir_new_cluster(dir, cpos, handle, data_ac, dx_leaves,
2595 static int ocfs2_dx_dir_index_block(struct inode *dir,
2610 limit = de_buf + dir->i_sb->s_blocksize;
2619 ocfs2_dx_dir_name_hash(dir, de->name, namelen, &hinfo);
2621 i = ocfs2_dx_dir_hash_idx(OCFS2_SB(dir->i_sb), &hinfo);
2624 ret = __ocfs2_dx_dir_leaf_insert(dir, handle, &hinfo,
2644 static void ocfs2_dx_dir_index_root_block(struct inode *dir,
2657 limit = de_buf + dir->i_sb->s_blocksize;
2665 ocfs2_dx_dir_name_hash(dir, de->name, de->name_len, &hinfo);
2668 (unsigned long long)dir->i_ino,
2687 static int ocfs2_new_dx_should_be_inline(struct inode *dir,
2696 limit = de_buf + i_size_read(dir);
2708 return dirent_count < ocfs2_dx_entries_per_root(dir->i_sb);
2714 * expansion from an inline directory to one with extents. The first dir block
2720 * accounting. We do this here since we're already walking the entire dir
2723 * We add the dir trailer if this filesystem wants it.
2726 struct inode *dir)
2728 struct super_block *sb = dir->i_sb;
2736 if (ocfs2_new_dir_wants_trailer(dir))
2775 static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh,
2781 struct super_block *sb = dir->i_sb;
2786 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
2787 struct ocfs2_inode_info *oi = OCFS2_I(dir);
2799 ocfs2_init_dinode_extent_tree(&et, INODE_CACHE(dir), di_bh);
2809 dx_inline = ocfs2_new_dx_should_be_inline(dir, di_bh);
2860 ret = dquot_alloc_space_nodirty(dir,
2872 ret = __ocfs2_dx_dir_new_cluster(dir, 0, handle, data_ac,
2879 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1);
2894 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1);
2901 blkno = ocfs2_clusters_to_blocks(dir->i_sb, bit_off);
2909 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), dirdata_bh);
2911 ret = ocfs2_journal_access_db(handle, INODE_CACHE(dir), dirdata_bh,
2918 memcpy(dirdata_bh->b_data, di->id2.i_data.id_data, i_size_read(dir));
2919 memset(dirdata_bh->b_data + i_size_read(dir), 0,
2920 sb->s_blocksize - i_size_read(dir));
2921 i = ocfs2_expand_last_dirent(dirdata_bh->b_data, i_size_read(dir), dir);
2922 if (ocfs2_new_dir_wants_trailer(dir)) {
2924 * Prepare the dir trailer up front. It will otherwise look
2926 * (unlikely), then all we'll have done is given first dir
2929 ocfs2_init_dir_trailer(dir, dirdata_bh, i);
2932 ocfs2_update_inode_fsync_trans(handle, dir, 1);
2944 ret = ocfs2_dx_dir_index_block(dir, handle, dx_leaves,
2961 ret = ocfs2_journal_access_di(handle, INODE_CACHE(dir), di_bh,
2973 ocfs2_dinode_new_extent_list(dir, di);
2975 i_size_write(dir, sb->s_blocksize);
2976 dir->i_mtime = dir->i_ctime = current_time(dir);
2979 di->i_ctime = di->i_mtime = cpu_to_le64(dir->i_ctime.tv_sec);
2980 di->i_ctime_nsec = di->i_mtime_nsec = cpu_to_le32(dir->i_ctime.tv_nsec);
2981 ocfs2_update_inode_fsync_trans(handle, dir, 1);
2998 dir->i_blocks = ocfs2_inode_sector_count(dir);
3003 ret = ocfs2_dx_dir_attach_index(osb, handle, dir, di_bh,
3012 ocfs2_dx_dir_index_root_block(dir, dx_root_bh,
3016 INODE_CACHE(dir),
3036 blkno = ocfs2_clusters_to_blocks(dir->i_sb, bit_off);
3044 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1);
3068 dquot_free_space_nodirty(dir, bytes_allocated);
3094 struct inode *dir,
3104 spin_lock(&OCFS2_I(dir)->ip_lock);
3105 extend = (i_size_read(dir) == ocfs2_clusters_to_bytes(sb, OCFS2_I(dir)->ip_clusters));
3106 spin_unlock(&OCFS2_I(dir)->ip_lock);
3109 u32 offset = OCFS2_I(dir)->ip_clusters;
3111 status = dquot_alloc_space_nodirty(dir,
3117 status = ocfs2_add_inode_data(OCFS2_SB(sb), dir, &offset,
3127 v_blkno = ocfs2_blocks_for_bytes(sb, i_size_read(dir));
3128 status = ocfs2_extent_map_get_blocks(dir, v_blkno, &p_blkno, NULL, NULL);
3143 dquot_free_space_nodirty(dir, ocfs2_clusters_to_bytes(sb, 1));
3158 struct inode *dir,
3178 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
3185 status = ocfs2_expand_inline_dir(dir, parent_fe_bh,
3216 down_write(&OCFS2_I(dir)->ip_alloc_sem);
3218 dir_i_size = i_size_read(dir);
3223 down_write(&OCFS2_I(dir)->ip_alloc_sem);
3225 dir_i_size = i_size_read(dir);
3226 trace_ocfs2_extend_dir((unsigned long long)OCFS2_I(dir)->ip_blkno,
3229 /* dir->i_size is always block aligned. */
3230 spin_lock(&OCFS2_I(dir)->ip_lock);
3231 if (dir_i_size == ocfs2_clusters_to_bytes(sb, OCFS2_I(dir)->ip_clusters)) {
3232 spin_unlock(&OCFS2_I(dir)->ip_lock);
3233 ocfs2_init_dinode_extent_tree(&et, INODE_CACHE(dir),
3259 data_ac->ac_resv = &OCFS2_I(dir)->ip_la_data_resv;
3263 spin_unlock(&OCFS2_I(dir)->ip_lock);
3268 if (ocfs2_dir_indexed(dir))
3280 status = ocfs2_do_extend_dir(osb->sb, handle, dir, parent_fe_bh,
3287 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), new_bh);
3289 status = ocfs2_journal_access_db(handle, INODE_CACHE(dir), new_bh,
3299 if (ocfs2_supports_dir_trailer(dir)) {
3302 ocfs2_init_dir_trailer(dir, new_bh, le16_to_cpu(de->rec_len));
3304 if (ocfs2_dir_indexed(dir)) {
3305 status = ocfs2_dx_dir_link_trailer(dir, handle,
3315 ocfs2_update_inode_fsync_trans(handle, dir, 1);
3318 dir_i_size += dir->i_sb->s_blocksize;
3319 i_size_write(dir, dir_i_size);
3320 dir->i_blocks = ocfs2_inode_sector_count(dir);
3321 status = ocfs2_mark_inode_dirty(handle, dir, parent_fe_bh);
3334 up_write(&OCFS2_I(dir)->ip_alloc_sem);
3346 static int ocfs2_find_dir_space_id(struct inode *dir, struct buffer_head *di_bh,
3352 struct super_block *sb = dir->i_sb;
3357 unsigned int rec_len, new_rec_len, free_space = dir->i_sb->s_blocksize;
3363 if (ocfs2_new_dir_wants_trailer(dir))
3364 free_space = ocfs2_dir_trailer_blk_off(sb) - i_size_read(dir);
3366 free_space = dir->i_sb->s_blocksize - i_size_read(dir);
3370 limit = de_buf + i_size_read(dir);
3376 if (!ocfs2_check_dir_entry(dir, de, di_bh, first_de,
3377 i_size_read(dir), offset)) {
3419 static int ocfs2_find_dir_space_el(struct inode *dir, const char *name,
3426 struct super_block *sb = dir->i_sb;
3428 int blocksize = dir->i_sb->s_blocksize;
3430 status = ocfs2_read_dir_block(dir, 0, &bh, 0);
3442 if (i_size_read(dir) <= offset) {
3450 status = ocfs2_read_dir_block(dir,
3459 if (!ocfs2_check_dir_entry(dir, de, bh, bh->b_data, blocksize,
3469 if (ocfs2_skip_dir_trailer(dir, de, offset % blocksize,
3641 static void ocfs2_dx_dir_transfer_leaf(struct inode *dir, u32 split_hash,
3663 memcpy(tmp_dx_leaf, orig_dx_leaf, dir->i_sb->s_blocksize);
3677 memcpy(orig_dx_leaf, tmp_dx_leaf, dir->i_sb->s_blocksize);
3698 static int ocfs2_dx_dir_rebalance(struct ocfs2_super *osb, struct inode *dir,
3717 trace_ocfs2_dx_dir_rebalance((unsigned long long)OCFS2_I(dir)->ip_blkno,
3721 ocfs2_init_dx_root_extent_tree(&et, INODE_CACHE(dir), dx_root_bh);
3734 "%llu, %d\n", (unsigned long long)OCFS2_I(dir)->ip_blkno,
3754 ret = ocfs2_lock_allocators(dir, &et, 1, 0, &data_ac, &meta_ac);
3770 ret = dquot_alloc_space_nodirty(dir,
3771 ocfs2_clusters_to_bytes(dir->i_sb, 1));
3776 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), dx_leaf_bh,
3826 orig_leaves_start = ocfs2_block_to_cluster_start(dir->i_sb, leaf_blkno);
3827 ret = ocfs2_read_dx_leaves(dir, orig_leaves_start, num_dx_leaves,
3835 ret = ocfs2_dx_dir_new_cluster(dir, &et, cpos, handle,
3844 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir),
3852 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir),
3861 ocfs2_dx_dir_transfer_leaf(dir, split_hash, handle, tmp_dx_leaf,
3866 dquot_free_space_nodirty(dir,
3867 ocfs2_clusters_to_bytes(dir->i_sb, 1));
3869 ocfs2_update_inode_fsync_trans(handle, dir, 1);
3893 static int ocfs2_find_dir_space_dx(struct ocfs2_super *osb, struct inode *dir,
3909 ret = ocfs2_dx_dir_lookup(dir, &dx_root->dr_list, &lookup->dl_hinfo,
3916 ret = ocfs2_read_dx_leaf(dir, blkno, &dx_leaf_bh);
3938 ret = ocfs2_dx_dir_rebalance(osb, dir, dx_root_bh, dx_leaf_bh,
3966 static int ocfs2_search_dx_free_list(struct inode *dir,
3986 ret = ocfs2_read_dir_block_direct(dir, next_block, &leaf_bh);
3992 db = ocfs2_trailer_from_bh(leaf_bh, dir->i_sb);
4014 static int ocfs2_expand_inline_dx_root(struct inode *dir,
4022 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
4049 ret = dquot_alloc_space_nodirty(dir,
4060 ret = ocfs2_journal_access_dr(handle, INODE_CACHE(dir), dx_root_bh,
4067 ret = __ocfs2_dx_dir_new_cluster(dir, 0, handle, data_ac, dx_leaves,
4102 ocfs2_init_dx_root_extent_tree(&et, INODE_CACHE(dir), dx_root_bh);
4108 ocfs2_update_inode_fsync_trans(handle, dir, 1);
4113 dquot_free_space_nodirty(dir,
4114 ocfs2_clusters_to_bytes(dir->i_sb, 1));
4145 static int ocfs2_prepare_dx_dir_for_insert(struct inode *dir,
4152 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
4158 ret = ocfs2_read_dx_root(dir, di, &dx_root_bh);
4182 ret = ocfs2_expand_inline_dx_root(dir, dx_root_bh);
4195 ret = ocfs2_find_dir_space_dx(osb, dir, di_bh, dx_root_bh, name,
4209 ret = ocfs2_search_dx_free_list(dir, dx_root_bh, namelen, lookup);
4220 ret = ocfs2_extend_dir(osb, dir, di_bh, 1, lookup, &leaf_bh);
4243 * happens here. Success returns zero, and enough context in the dir
4248 struct inode *dir,
4259 (unsigned long long)OCFS2_I(dir)->ip_blkno, namelen);
4279 ocfs2_dx_dir_name_hash(dir, name, namelen, &lookup->dl_hinfo);
4281 if (ocfs2_dir_indexed(dir)) {
4282 ret = ocfs2_prepare_dx_dir_for_insert(dir, parent_fe_bh,
4289 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
4290 ret = ocfs2_find_dir_space_id(dir, parent_fe_bh, name,
4293 ret = ocfs2_find_dir_space_el(dir, name, namelen, &bh);
4306 ret = ocfs2_extend_dir(osb, dir, parent_fe_bh, blocks_wanted,
4324 static int ocfs2_dx_dir_remove_index(struct inode *dir,
4329 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
4364 ret = ocfs2_journal_access_di(handle, INODE_CACHE(dir), di_bh,
4371 spin_lock(&OCFS2_I(dir)->ip_lock);
4372 OCFS2_I(dir)->ip_dyn_features &= ~OCFS2_INDEXED_DIR_FL;
4373 di->i_dyn_features = cpu_to_le16(OCFS2_I(dir)->ip_dyn_features);
4374 spin_unlock(&OCFS2_I(dir)->ip_lock);
4376 ocfs2_update_inode_fsync_trans(handle, dir, 1);
4405 int ocfs2_dx_dir_truncate(struct inode *dir, struct buffer_head *di_bh)
4411 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
4420 if (!ocfs2_dir_indexed(dir))
4423 ret = ocfs2_read_dx_root(dir, di, &dx_root_bh);
4433 ocfs2_init_dx_root_extent_tree(&et, INODE_CACHE(dir), dx_root_bh);
4437 ret = ocfs2_dx_dir_lookup_rec(dir, &dx_root->dr_list,
4444 p_cpos = ocfs2_blocks_to_clusters(dir->i_sb, blkno);
4446 ret = ocfs2_remove_btree_range(dir, &et, cpos, p_cpos, clen, 0,
4460 ret = ocfs2_dx_dir_remove_index(dir, di_bh, dx_root_bh);
4466 ocfs2_remove_from_cache(INODE_CACHE(dir), dx_root_bh);