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