Lines Matching refs:dir

77 			       struct inode *dir,
88 static int ocfs2_supports_dir_trailer(struct inode *dir) in ocfs2_supports_dir_trailer() argument
90 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_supports_dir_trailer()
92 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_supports_dir_trailer()
95 return ocfs2_meta_ecc(osb) || ocfs2_dir_indexed(dir); in ocfs2_supports_dir_trailer()
106 static int ocfs2_new_dir_wants_trailer(struct inode *dir) in ocfs2_new_dir_wants_trailer() argument
108 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_new_dir_wants_trailer()
136 static int ocfs2_skip_dir_trailer(struct inode *dir, in ocfs2_skip_dir_trailer() argument
143 if (!ocfs2_supports_dir_trailer(dir)) in ocfs2_skip_dir_trailer()
170 static int ocfs2_dx_dir_link_trailer(struct inode *dir, handle_t *handle, in ocfs2_dx_dir_link_trailer() argument
178 ret = ocfs2_journal_access_dr(handle, INODE_CACHE(dir), dx_root_bh, in ocfs2_dx_dir_link_trailer()
184 trailer = ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb); in ocfs2_dx_dir_link_trailer()
270 static void ocfs2_dx_dir_name_hash(struct inode *dir, const char *name, int len, in ocfs2_dx_dir_name_hash() argument
273 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_dx_dir_name_hash()
316 static int ocfs2_check_dir_entry(struct inode * dir, in ocfs2_check_dir_entry() argument
331 ((char *) de - bh->b_data) + rlen > dir->i_sb->s_blocksize)) in ocfs2_check_dir_entry()
337 (unsigned long long)OCFS2_I(dir)->ip_blkno, error_msg, in ocfs2_check_dir_entry()
359 struct inode *dir, in ocfs2_search_dirblock() argument
383 if (!ocfs2_check_dir_entry(dir, de, bh, offset)) { in ocfs2_search_dirblock()
410 struct inode *dir, in ocfs2_find_entry_id() argument
418 ret = ocfs2_read_inode_block(dir, &di_bh); in ocfs2_find_entry_id()
427 found = ocfs2_search_dirblock(di_bh, dir, name, namelen, 0, in ocfs2_find_entry_id()
428 data->id_data, i_size_read(dir), res_dir); in ocfs2_find_entry_id()
476 static int ocfs2_check_dir_trailer(struct inode *dir, struct buffer_head *bh) in ocfs2_check_dir_trailer() argument
481 trailer = ocfs2_trailer_from_bh(bh, dir->i_sb); in ocfs2_check_dir_trailer()
484 ocfs2_error(dir->i_sb, in ocfs2_check_dir_trailer()
493 ocfs2_error(dir->i_sb, in ocfs2_check_dir_trailer()
501 OCFS2_I(dir)->ip_blkno) { in ocfs2_check_dir_trailer()
503 ocfs2_error(dir->i_sb, in ocfs2_check_dir_trailer()
508 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_check_dir_trailer()
559 static int ocfs2_read_dir_block_direct(struct inode *dir, u64 phys, in ocfs2_read_dir_block_direct() argument
565 ret = ocfs2_read_block(INODE_CACHE(dir), phys, &tmp, in ocfs2_read_dir_block_direct()
572 if (ocfs2_supports_dir_trailer(dir)) { in ocfs2_read_dir_block_direct()
573 ret = ocfs2_check_dir_trailer(dir, tmp); in ocfs2_read_dir_block_direct()
617 static int ocfs2_read_dx_root(struct inode *dir, struct ocfs2_dinode *di, in ocfs2_read_dx_root() argument
624 ret = ocfs2_read_block(INODE_CACHE(dir), blkno, &tmp, in ocfs2_read_dx_root()
659 static int ocfs2_read_dx_leaf(struct inode *dir, u64 blkno, in ocfs2_read_dx_leaf() argument
665 ret = ocfs2_read_block(INODE_CACHE(dir), blkno, &tmp, in ocfs2_read_dx_leaf()
679 static int ocfs2_read_dx_leaves(struct inode *dir, u64 start, int num, in ocfs2_read_dx_leaves() argument
684 ret = ocfs2_read_blocks(INODE_CACHE(dir), start, num, dx_leaf_bhs, 0, in ocfs2_read_dx_leaves()
693 struct inode *dir, in ocfs2_find_entry_el() argument
707 sb = dir->i_sb; in ocfs2_find_entry_el()
709 nblocks = i_size_read(dir) >> sb->s_blocksize_bits; in ocfs2_find_entry_el()
710 start = OCFS2_I(dir)->ip_dir_start_lookup; in ocfs2_find_entry_el()
737 err = ocfs2_read_dir_block(dir, b++, &bh, in ocfs2_find_entry_el()
744 if (ocfs2_read_dir_block(dir, block, &bh, 0)) { in ocfs2_find_entry_el()
749 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_find_entry_el()
753 i = ocfs2_search_dirblock(bh, dir, name, namelen, in ocfs2_find_entry_el()
758 OCFS2_I(dir)->ip_dir_start_lookup = block; in ocfs2_find_entry_el()
776 nblocks = i_size_read(dir) >> sb->s_blocksize_bits; in ocfs2_find_entry_el()
919 struct inode *dir, in ocfs2_dx_dir_search() argument
934 ocfs2_dx_dir_name_hash(dir, name, namelen, &res->dl_hinfo); in ocfs2_dx_dir_search()
943 ret = ocfs2_dx_dir_lookup(dir, dr_el, hinfo, NULL, &phys); in ocfs2_dx_dir_search()
949 trace_ocfs2_dx_dir_search((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_search()
953 ret = ocfs2_read_dx_leaf(dir, phys, &dx_leaf_bh); in ocfs2_dx_dir_search()
983 ret = ocfs2_read_dir_block_direct(dir, in ocfs2_dx_dir_search()
996 found = ocfs2_search_dirblock(dir_ent_bh, dir, name, namelen, in ocfs2_dx_dir_search()
998 dir->i_sb->s_blocksize, &dir_ent); in ocfs2_dx_dir_search()
1033 struct inode *dir, in ocfs2_find_entry_dx() argument
1042 ret = ocfs2_read_inode_block(dir, &di_bh); in ocfs2_find_entry_dx()
1050 ret = ocfs2_read_dx_root(dir, di, &dx_root_bh); in ocfs2_find_entry_dx()
1057 ret = ocfs2_dx_dir_search(name, namelen, dir, dx_root, lookup); in ocfs2_find_entry_dx()
1087 struct inode *dir, struct ocfs2_dir_lookup_result *lookup) in ocfs2_find_entry() argument
1092 if (ocfs2_dir_indexed(dir)) in ocfs2_find_entry()
1093 return ocfs2_find_entry_dx(name, namelen, dir, lookup); in ocfs2_find_entry()
1100 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_find_entry()
1101 bh = ocfs2_find_entry_id(name, namelen, dir, &res_dir); in ocfs2_find_entry()
1103 bh = ocfs2_find_entry_el(name, namelen, dir, &res_dir); in ocfs2_find_entry()
1116 int ocfs2_update_entry(struct inode *dir, handle_t *handle, in ocfs2_update_entry() argument
1131 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_update_entry()
1134 ret = access(handle, INODE_CACHE(dir), de_bh, in ocfs2_update_entry()
1154 static int __ocfs2_delete_entry(handle_t *handle, struct inode *dir, in __ocfs2_delete_entry() argument
1163 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in __ocfs2_delete_entry()
1170 if (!ocfs2_check_dir_entry(dir, de, bh, i)) { in __ocfs2_delete_entry()
1176 status = access(handle, INODE_CACHE(dir), bh, in __ocfs2_delete_entry()
1187 dir->i_version++; in __ocfs2_delete_entry()
1258 static int ocfs2_delete_entry_dx(handle_t *handle, struct inode *dir, in ocfs2_delete_entry_dx() argument
1299 (unsigned long long)OCFS2_I(dir)->ip_blkno, index, in ocfs2_delete_entry_dx()
1309 trailer = ocfs2_trailer_from_bh(leaf_bh, dir->i_sb); in ocfs2_delete_entry_dx()
1324 ret = ocfs2_journal_access_dr(handle, INODE_CACHE(dir), dx_root_bh, in ocfs2_delete_entry_dx()
1332 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), in ocfs2_delete_entry_dx()
1341 trace_ocfs2_delete_entry_dx((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_delete_entry_dx()
1344 ret = __ocfs2_delete_entry(handle, dir, lookup->dl_entry, in ocfs2_delete_entry_dx()
1351 max_rec_len = ocfs2_find_max_rec_len(dir->i_sb, leaf_bh); in ocfs2_delete_entry_dx()
1375 struct inode *dir, in ocfs2_delete_entry_id() argument
1384 ret = ocfs2_read_inode_block(dir, &di_bh); in ocfs2_delete_entry_id()
1393 ret = __ocfs2_delete_entry(handle, dir, de_del, bh, data->id_data, in ocfs2_delete_entry_id()
1394 i_size_read(dir)); in ocfs2_delete_entry_id()
1402 struct inode *dir, in ocfs2_delete_entry_el() argument
1406 return __ocfs2_delete_entry(handle, dir, de_del, bh, bh->b_data, in ocfs2_delete_entry_el()
1415 struct inode *dir, in ocfs2_delete_entry() argument
1418 if (ocfs2_dir_indexed(dir)) in ocfs2_delete_entry()
1419 return ocfs2_delete_entry_dx(handle, dir, res); in ocfs2_delete_entry()
1421 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) in ocfs2_delete_entry()
1422 return ocfs2_delete_entry_id(handle, dir, res->dl_entry, in ocfs2_delete_entry()
1425 return ocfs2_delete_entry_el(handle, dir, res->dl_entry, in ocfs2_delete_entry()
1483 static int __ocfs2_dx_dir_leaf_insert(struct inode *dir, handle_t *handle, in __ocfs2_dx_dir_leaf_insert() argument
1491 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), dx_leaf_bh, in __ocfs2_dx_dir_leaf_insert()
1506 static void ocfs2_dx_inline_root_insert(struct inode *dir, handle_t *handle, in ocfs2_dx_inline_root_insert() argument
1514 static int ocfs2_dx_dir_insert(struct inode *dir, handle_t *handle, in ocfs2_dx_dir_insert() argument
1521 ret = ocfs2_journal_access_dr(handle, INODE_CACHE(dir), dx_root_bh, in ocfs2_dx_dir_insert()
1530 ocfs2_dx_inline_root_insert(dir, handle, in ocfs2_dx_dir_insert()
1535 ret = __ocfs2_dx_dir_leaf_insert(dir, handle, &lookup->dl_hinfo, in ocfs2_dx_dir_insert()
1549 static void ocfs2_remove_block_from_free_list(struct inode *dir, in ocfs2_remove_block_from_free_list() argument
1557 trailer = ocfs2_trailer_from_bh(lookup->dl_leaf_bh, dir->i_sb); in ocfs2_remove_block_from_free_list()
1565 prev = ocfs2_trailer_from_bh(bh, dir->i_sb); in ocfs2_remove_block_from_free_list()
1580 static void ocfs2_recalc_free_list(struct inode *dir, handle_t *handle, in ocfs2_recalc_free_list() argument
1587 max_rec_len = ocfs2_find_max_rec_len(dir->i_sb, lookup->dl_leaf_bh); in ocfs2_recalc_free_list()
1594 trailer = ocfs2_trailer_from_bh(lookup->dl_leaf_bh, dir->i_sb); in ocfs2_recalc_free_list()
1598 ocfs2_remove_block_from_free_list(dir, handle, lookup); in ocfs2_recalc_free_list()
1609 struct inode *dir, in __ocfs2_add_entry() argument
1619 struct super_block *sb = dir->i_sb; in __ocfs2_add_entry()
1628 if (ocfs2_dir_indexed(dir)) { in __ocfs2_add_entry()
1642 INODE_CACHE(dir), bh, in __ocfs2_add_entry()
1647 INODE_CACHE(dir), bh, in __ocfs2_add_entry()
1654 } else if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in __ocfs2_add_entry()
1656 size = i_size_read(dir); in __ocfs2_add_entry()
1670 if (!ocfs2_check_dir_entry(dir, de, insert_bh, offset)) { in __ocfs2_add_entry()
1681 mlog_bug_on_msg(ocfs2_skip_dir_trailer(dir, de, offset, size), in __ocfs2_add_entry()
1687 offset, ocfs2_dir_trailer_blk_off(dir->i_sb)); in __ocfs2_add_entry()
1690 dir->i_mtime = dir->i_ctime = CURRENT_TIME; in __ocfs2_add_entry()
1691 retval = ocfs2_mark_inode_dirty(handle, dir, parent_fe_bh); in __ocfs2_add_entry()
1699 INODE_CACHE(dir), in __ocfs2_add_entry()
1704 INODE_CACHE(dir), in __ocfs2_add_entry()
1708 if (ocfs2_dir_indexed(dir)) { in __ocfs2_add_entry()
1709 status = ocfs2_dx_dir_insert(dir, in __ocfs2_add_entry()
1739 if (ocfs2_dir_indexed(dir)) in __ocfs2_add_entry()
1740 ocfs2_recalc_free_list(dir, handle, lookup); in __ocfs2_add_entry()
1742 dir->i_version++; in __ocfs2_add_entry()
2027 int ocfs2_lookup_ino_from_name(struct inode *dir, const char *name, in ocfs2_lookup_ino_from_name() argument
2033 ret = ocfs2_find_files_on_disk(name, namelen, blkno, dir, &lookup); in ocfs2_lookup_ino_from_name()
2046 int ocfs2_check_dir_for_entry(struct inode *dir, in ocfs2_check_dir_for_entry() argument
2054 (unsigned long long)OCFS2_I(dir)->ip_blkno, namelen, name); in ocfs2_check_dir_for_entry()
2056 if (ocfs2_find_entry(name, namelen, dir, &lookup) == 0) { in ocfs2_check_dir_for_entry()
2321 handle_t *handle, struct inode *dir, in ocfs2_dx_dir_attach_index() argument
2336 ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb); in ocfs2_dx_dir_attach_index()
2346 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_attach_index()
2354 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), dx_root_bh); in ocfs2_dx_dir_attach_index()
2356 ret = ocfs2_journal_access_dr(handle, INODE_CACHE(dir), dx_root_bh, in ocfs2_dx_dir_attach_index()
2371 dx_root->dr_dir_blkno = cpu_to_le64(OCFS2_I(dir)->ip_blkno); in ocfs2_dx_dir_attach_index()
2388 ret = ocfs2_journal_access_di(handle, INODE_CACHE(dir), di_bh, in ocfs2_dx_dir_attach_index()
2397 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_attach_index()
2398 OCFS2_I(dir)->ip_dyn_features |= OCFS2_INDEXED_DIR_FL; in ocfs2_dx_dir_attach_index()
2399 di->i_dyn_features = cpu_to_le16(OCFS2_I(dir)->ip_dyn_features); in ocfs2_dx_dir_attach_index()
2400 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_attach_index()
2413 handle_t *handle, struct inode *dir, in ocfs2_dx_dir_format_cluster() argument
2429 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), bh); in ocfs2_dx_dir_format_cluster()
2431 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), bh, in ocfs2_dx_dir_format_cluster()
2448 (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_format_cluster()
2465 static int __ocfs2_dx_dir_new_cluster(struct inode *dir, in __ocfs2_dx_dir_new_cluster() argument
2474 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in __ocfs2_dx_dir_new_cluster()
2493 ret = ocfs2_dx_dir_format_cluster(osb, handle, dir, dx_leaves, in __ocfs2_dx_dir_new_cluster()
2505 static int ocfs2_dx_dir_new_cluster(struct inode *dir, in ocfs2_dx_dir_new_cluster() argument
2516 ret = __ocfs2_dx_dir_new_cluster(dir, cpos, handle, data_ac, dx_leaves, in ocfs2_dx_dir_new_cluster()
2622 static int ocfs2_dx_dir_index_block(struct inode *dir, in ocfs2_dx_dir_index_block() argument
2637 limit = de_buf + dir->i_sb->s_blocksize; in ocfs2_dx_dir_index_block()
2646 ocfs2_dx_dir_name_hash(dir, de->name, namelen, &hinfo); in ocfs2_dx_dir_index_block()
2648 i = ocfs2_dx_dir_hash_idx(OCFS2_SB(dir->i_sb), &hinfo); in ocfs2_dx_dir_index_block()
2651 ret = __ocfs2_dx_dir_leaf_insert(dir, handle, &hinfo, in ocfs2_dx_dir_index_block()
2671 static void ocfs2_dx_dir_index_root_block(struct inode *dir, in ocfs2_dx_dir_index_root_block() argument
2684 limit = de_buf + dir->i_sb->s_blocksize; in ocfs2_dx_dir_index_root_block()
2692 ocfs2_dx_dir_name_hash(dir, de->name, de->name_len, &hinfo); in ocfs2_dx_dir_index_root_block()
2695 (unsigned long long)dir->i_ino, in ocfs2_dx_dir_index_root_block()
2714 static int ocfs2_new_dx_should_be_inline(struct inode *dir, in ocfs2_new_dx_should_be_inline() argument
2723 limit = de_buf + i_size_read(dir); in ocfs2_new_dx_should_be_inline()
2735 return dirent_count < ocfs2_dx_entries_per_root(dir->i_sb); in ocfs2_new_dx_should_be_inline()
2753 struct inode *dir) in ocfs2_expand_last_dirent() argument
2755 struct super_block *sb = dir->i_sb; in ocfs2_expand_last_dirent()
2763 if (ocfs2_new_dir_wants_trailer(dir)) in ocfs2_expand_last_dirent()
2802 static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, in ocfs2_expand_inline_dir() argument
2808 struct super_block *sb = dir->i_sb; in ocfs2_expand_inline_dir()
2813 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_expand_inline_dir()
2814 struct ocfs2_inode_info *oi = OCFS2_I(dir); in ocfs2_expand_inline_dir()
2826 ocfs2_init_dinode_extent_tree(&et, INODE_CACHE(dir), di_bh); in ocfs2_expand_inline_dir()
2836 dx_inline = ocfs2_new_dx_should_be_inline(dir, di_bh); in ocfs2_expand_inline_dir()
2887 ret = dquot_alloc_space_nodirty(dir, in ocfs2_expand_inline_dir()
2899 ret = __ocfs2_dx_dir_new_cluster(dir, 0, handle, data_ac, in ocfs2_expand_inline_dir()
2906 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1); in ocfs2_expand_inline_dir()
2921 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1); in ocfs2_expand_inline_dir()
2928 blkno = ocfs2_clusters_to_blocks(dir->i_sb, bit_off); in ocfs2_expand_inline_dir()
2936 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), dirdata_bh); in ocfs2_expand_inline_dir()
2938 ret = ocfs2_journal_access_db(handle, INODE_CACHE(dir), dirdata_bh, in ocfs2_expand_inline_dir()
2945 memcpy(dirdata_bh->b_data, di->id2.i_data.id_data, i_size_read(dir)); in ocfs2_expand_inline_dir()
2946 memset(dirdata_bh->b_data + i_size_read(dir), 0, in ocfs2_expand_inline_dir()
2947 sb->s_blocksize - i_size_read(dir)); in ocfs2_expand_inline_dir()
2948 i = ocfs2_expand_last_dirent(dirdata_bh->b_data, i_size_read(dir), dir); in ocfs2_expand_inline_dir()
2949 if (ocfs2_new_dir_wants_trailer(dir)) { in ocfs2_expand_inline_dir()
2956 ocfs2_init_dir_trailer(dir, dirdata_bh, i); in ocfs2_expand_inline_dir()
2959 ocfs2_update_inode_fsync_trans(handle, dir, 1); in ocfs2_expand_inline_dir()
2971 ret = ocfs2_dx_dir_index_block(dir, handle, dx_leaves, in ocfs2_expand_inline_dir()
2988 ret = ocfs2_journal_access_di(handle, INODE_CACHE(dir), di_bh, in ocfs2_expand_inline_dir()
3000 ocfs2_dinode_new_extent_list(dir, di); in ocfs2_expand_inline_dir()
3002 i_size_write(dir, sb->s_blocksize); in ocfs2_expand_inline_dir()
3003 dir->i_mtime = dir->i_ctime = CURRENT_TIME; in ocfs2_expand_inline_dir()
3006 di->i_ctime = di->i_mtime = cpu_to_le64(dir->i_ctime.tv_sec); in ocfs2_expand_inline_dir()
3007 di->i_ctime_nsec = di->i_mtime_nsec = cpu_to_le32(dir->i_ctime.tv_nsec); in ocfs2_expand_inline_dir()
3008 ocfs2_update_inode_fsync_trans(handle, dir, 1); in ocfs2_expand_inline_dir()
3025 dir->i_blocks = ocfs2_inode_sector_count(dir); in ocfs2_expand_inline_dir()
3030 ret = ocfs2_dx_dir_attach_index(osb, handle, dir, di_bh, in ocfs2_expand_inline_dir()
3039 ocfs2_dx_dir_index_root_block(dir, dx_root_bh, in ocfs2_expand_inline_dir()
3043 INODE_CACHE(dir), in ocfs2_expand_inline_dir()
3063 blkno = ocfs2_clusters_to_blocks(dir->i_sb, bit_off); in ocfs2_expand_inline_dir()
3071 bytes_allocated += ocfs2_clusters_to_bytes(dir->i_sb, 1); in ocfs2_expand_inline_dir()
3084 off = ocfs2_dx_dir_hash_idx(OCFS2_SB(dir->i_sb), in ocfs2_expand_inline_dir()
3095 dquot_free_space_nodirty(dir, bytes_allocated); in ocfs2_expand_inline_dir()
3121 struct inode *dir, in ocfs2_do_extend_dir() argument
3131 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_do_extend_dir()
3132 extend = (i_size_read(dir) == ocfs2_clusters_to_bytes(sb, OCFS2_I(dir)->ip_clusters)); in ocfs2_do_extend_dir()
3133 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_do_extend_dir()
3136 u32 offset = OCFS2_I(dir)->ip_clusters; in ocfs2_do_extend_dir()
3138 status = dquot_alloc_space_nodirty(dir, in ocfs2_do_extend_dir()
3144 status = ocfs2_add_inode_data(OCFS2_SB(sb), dir, &offset, in ocfs2_do_extend_dir()
3154 v_blkno = ocfs2_blocks_for_bytes(sb, i_size_read(dir)); in ocfs2_do_extend_dir()
3155 status = ocfs2_extent_map_get_blocks(dir, v_blkno, &p_blkno, NULL, NULL); in ocfs2_do_extend_dir()
3170 dquot_free_space_nodirty(dir, ocfs2_clusters_to_bytes(sb, 1)); in ocfs2_do_extend_dir()
3185 struct inode *dir, in ocfs2_extend_dir() argument
3205 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in ocfs2_extend_dir()
3212 status = ocfs2_expand_inline_dir(dir, parent_fe_bh, in ocfs2_extend_dir()
3243 down_write(&OCFS2_I(dir)->ip_alloc_sem); in ocfs2_extend_dir()
3245 dir_i_size = i_size_read(dir); in ocfs2_extend_dir()
3250 down_write(&OCFS2_I(dir)->ip_alloc_sem); in ocfs2_extend_dir()
3252 dir_i_size = i_size_read(dir); in ocfs2_extend_dir()
3253 trace_ocfs2_extend_dir((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_extend_dir()
3257 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_extend_dir()
3258 if (dir_i_size == ocfs2_clusters_to_bytes(sb, OCFS2_I(dir)->ip_clusters)) { in ocfs2_extend_dir()
3259 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_extend_dir()
3260 ocfs2_init_dinode_extent_tree(&et, INODE_CACHE(dir), in ocfs2_extend_dir()
3286 data_ac->ac_resv = &OCFS2_I(dir)->ip_la_data_resv; in ocfs2_extend_dir()
3290 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_extend_dir()
3295 if (ocfs2_dir_indexed(dir)) in ocfs2_extend_dir()
3307 status = ocfs2_do_extend_dir(osb->sb, handle, dir, parent_fe_bh, in ocfs2_extend_dir()
3314 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), new_bh); in ocfs2_extend_dir()
3316 status = ocfs2_journal_access_db(handle, INODE_CACHE(dir), new_bh, in ocfs2_extend_dir()
3326 if (ocfs2_supports_dir_trailer(dir)) { in ocfs2_extend_dir()
3329 ocfs2_init_dir_trailer(dir, new_bh, le16_to_cpu(de->rec_len)); in ocfs2_extend_dir()
3331 if (ocfs2_dir_indexed(dir)) { in ocfs2_extend_dir()
3332 status = ocfs2_dx_dir_link_trailer(dir, handle, in ocfs2_extend_dir()
3342 ocfs2_update_inode_fsync_trans(handle, dir, 1); in ocfs2_extend_dir()
3345 dir_i_size += dir->i_sb->s_blocksize; in ocfs2_extend_dir()
3346 i_size_write(dir, dir_i_size); in ocfs2_extend_dir()
3347 dir->i_blocks = ocfs2_inode_sector_count(dir); in ocfs2_extend_dir()
3348 status = ocfs2_mark_inode_dirty(handle, dir, parent_fe_bh); in ocfs2_extend_dir()
3361 up_write(&OCFS2_I(dir)->ip_alloc_sem); in ocfs2_extend_dir()
3373 static int ocfs2_find_dir_space_id(struct inode *dir, struct buffer_head *di_bh, in ocfs2_find_dir_space_id() argument
3379 struct super_block *sb = dir->i_sb; in ocfs2_find_dir_space_id()
3384 unsigned int rec_len, new_rec_len, free_space = dir->i_sb->s_blocksize; in ocfs2_find_dir_space_id()
3390 if (ocfs2_new_dir_wants_trailer(dir)) in ocfs2_find_dir_space_id()
3391 free_space = ocfs2_dir_trailer_blk_off(sb) - i_size_read(dir); in ocfs2_find_dir_space_id()
3393 free_space = dir->i_sb->s_blocksize - i_size_read(dir); in ocfs2_find_dir_space_id()
3396 limit = de_buf + i_size_read(dir); in ocfs2_find_dir_space_id()
3402 if (!ocfs2_check_dir_entry(dir, de, di_bh, offset)) { in ocfs2_find_dir_space_id()
3444 static int ocfs2_find_dir_space_el(struct inode *dir, const char *name, in ocfs2_find_dir_space_el() argument
3451 struct super_block *sb = dir->i_sb; in ocfs2_find_dir_space_el()
3453 int blocksize = dir->i_sb->s_blocksize; in ocfs2_find_dir_space_el()
3455 status = ocfs2_read_dir_block(dir, 0, &bh, 0); in ocfs2_find_dir_space_el()
3467 if (i_size_read(dir) <= offset) { in ocfs2_find_dir_space_el()
3475 status = ocfs2_read_dir_block(dir, in ocfs2_find_dir_space_el()
3484 if (!ocfs2_check_dir_entry(dir, de, bh, offset)) { in ocfs2_find_dir_space_el()
3493 if (ocfs2_skip_dir_trailer(dir, de, offset % blocksize, in ocfs2_find_dir_space_el()
3668 static void ocfs2_dx_dir_transfer_leaf(struct inode *dir, u32 split_hash, in ocfs2_dx_dir_transfer_leaf() argument
3691 memcpy(tmp_dx_leaf, orig_dx_leaf, dir->i_sb->s_blocksize); in ocfs2_dx_dir_transfer_leaf()
3705 memcpy(orig_dx_leaf, tmp_dx_leaf, dir->i_sb->s_blocksize); in ocfs2_dx_dir_transfer_leaf()
3726 static int ocfs2_dx_dir_rebalance(struct ocfs2_super *osb, struct inode *dir, in ocfs2_dx_dir_rebalance() argument
3745 trace_ocfs2_dx_dir_rebalance((unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_rebalance()
3749 ocfs2_init_dx_root_extent_tree(&et, INODE_CACHE(dir), dx_root_bh); in ocfs2_dx_dir_rebalance()
3762 "%llu, %d\n", (unsigned long long)OCFS2_I(dir)->ip_blkno, in ocfs2_dx_dir_rebalance()
3782 ret = ocfs2_lock_allocators(dir, &et, 1, 0, &data_ac, &meta_ac); in ocfs2_dx_dir_rebalance()
3798 ret = dquot_alloc_space_nodirty(dir, in ocfs2_dx_dir_rebalance()
3799 ocfs2_clusters_to_bytes(dir->i_sb, 1)); in ocfs2_dx_dir_rebalance()
3804 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), dx_leaf_bh, in ocfs2_dx_dir_rebalance()
3854 orig_leaves_start = ocfs2_block_to_cluster_start(dir->i_sb, leaf_blkno); in ocfs2_dx_dir_rebalance()
3855 ret = ocfs2_read_dx_leaves(dir, orig_leaves_start, num_dx_leaves, in ocfs2_dx_dir_rebalance()
3863 ret = ocfs2_dx_dir_new_cluster(dir, &et, cpos, handle, in ocfs2_dx_dir_rebalance()
3872 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), in ocfs2_dx_dir_rebalance()
3880 ret = ocfs2_journal_access_dl(handle, INODE_CACHE(dir), in ocfs2_dx_dir_rebalance()
3889 ocfs2_dx_dir_transfer_leaf(dir, split_hash, handle, tmp_dx_leaf, in ocfs2_dx_dir_rebalance()
3894 dquot_free_space_nodirty(dir, in ocfs2_dx_dir_rebalance()
3895 ocfs2_clusters_to_bytes(dir->i_sb, 1)); in ocfs2_dx_dir_rebalance()
3897 ocfs2_update_inode_fsync_trans(handle, dir, 1); in ocfs2_dx_dir_rebalance()
3921 static int ocfs2_find_dir_space_dx(struct ocfs2_super *osb, struct inode *dir, in ocfs2_find_dir_space_dx() argument
3937 ret = ocfs2_dx_dir_lookup(dir, &dx_root->dr_list, &lookup->dl_hinfo, in ocfs2_find_dir_space_dx()
3944 ret = ocfs2_read_dx_leaf(dir, blkno, &dx_leaf_bh); in ocfs2_find_dir_space_dx()
3966 ret = ocfs2_dx_dir_rebalance(osb, dir, dx_root_bh, dx_leaf_bh, in ocfs2_find_dir_space_dx()
3994 static int ocfs2_search_dx_free_list(struct inode *dir, in ocfs2_search_dx_free_list() argument
4014 ret = ocfs2_read_dir_block_direct(dir, next_block, &leaf_bh); in ocfs2_search_dx_free_list()
4020 db = ocfs2_trailer_from_bh(leaf_bh, dir->i_sb); in ocfs2_search_dx_free_list()
4042 static int ocfs2_expand_inline_dx_root(struct inode *dir, in ocfs2_expand_inline_dx_root() argument
4050 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_expand_inline_dx_root()
4077 ret = dquot_alloc_space_nodirty(dir, in ocfs2_expand_inline_dx_root()
4088 ret = ocfs2_journal_access_dr(handle, INODE_CACHE(dir), dx_root_bh, in ocfs2_expand_inline_dx_root()
4095 ret = __ocfs2_dx_dir_new_cluster(dir, 0, handle, data_ac, dx_leaves, in ocfs2_expand_inline_dx_root()
4130 ocfs2_init_dx_root_extent_tree(&et, INODE_CACHE(dir), dx_root_bh); in ocfs2_expand_inline_dx_root()
4136 ocfs2_update_inode_fsync_trans(handle, dir, 1); in ocfs2_expand_inline_dx_root()
4141 dquot_free_space_nodirty(dir, in ocfs2_expand_inline_dx_root()
4142 ocfs2_clusters_to_bytes(dir->i_sb, 1)); in ocfs2_expand_inline_dx_root()
4173 static int ocfs2_prepare_dx_dir_for_insert(struct inode *dir, in ocfs2_prepare_dx_dir_for_insert() argument
4180 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_prepare_dx_dir_for_insert()
4186 ret = ocfs2_read_dx_root(dir, di, &dx_root_bh); in ocfs2_prepare_dx_dir_for_insert()
4210 ret = ocfs2_expand_inline_dx_root(dir, dx_root_bh); in ocfs2_prepare_dx_dir_for_insert()
4223 ret = ocfs2_find_dir_space_dx(osb, dir, di_bh, dx_root_bh, name, in ocfs2_prepare_dx_dir_for_insert()
4237 ret = ocfs2_search_dx_free_list(dir, dx_root_bh, namelen, lookup); in ocfs2_prepare_dx_dir_for_insert()
4248 ret = ocfs2_extend_dir(osb, dir, di_bh, 1, lookup, &leaf_bh); in ocfs2_prepare_dx_dir_for_insert()
4276 struct inode *dir, in ocfs2_prepare_dir_for_insert() argument
4287 (unsigned long long)OCFS2_I(dir)->ip_blkno, namelen); in ocfs2_prepare_dir_for_insert()
4307 ocfs2_dx_dir_name_hash(dir, name, namelen, &lookup->dl_hinfo); in ocfs2_prepare_dir_for_insert()
4309 if (ocfs2_dir_indexed(dir)) { in ocfs2_prepare_dir_for_insert()
4310 ret = ocfs2_prepare_dx_dir_for_insert(dir, parent_fe_bh, in ocfs2_prepare_dir_for_insert()
4317 if (OCFS2_I(dir)->ip_dyn_features & OCFS2_INLINE_DATA_FL) { in ocfs2_prepare_dir_for_insert()
4318 ret = ocfs2_find_dir_space_id(dir, parent_fe_bh, name, in ocfs2_prepare_dir_for_insert()
4321 ret = ocfs2_find_dir_space_el(dir, name, namelen, &bh); in ocfs2_prepare_dir_for_insert()
4334 ret = ocfs2_extend_dir(osb, dir, parent_fe_bh, blocks_wanted, in ocfs2_prepare_dir_for_insert()
4352 static int ocfs2_dx_dir_remove_index(struct inode *dir, in ocfs2_dx_dir_remove_index() argument
4357 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_dx_dir_remove_index()
4392 ret = ocfs2_journal_access_di(handle, INODE_CACHE(dir), di_bh, in ocfs2_dx_dir_remove_index()
4399 spin_lock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_remove_index()
4400 OCFS2_I(dir)->ip_dyn_features &= ~OCFS2_INDEXED_DIR_FL; in ocfs2_dx_dir_remove_index()
4401 di->i_dyn_features = cpu_to_le16(OCFS2_I(dir)->ip_dyn_features); in ocfs2_dx_dir_remove_index()
4402 spin_unlock(&OCFS2_I(dir)->ip_lock); in ocfs2_dx_dir_remove_index()
4404 ocfs2_update_inode_fsync_trans(handle, dir, 1); in ocfs2_dx_dir_remove_index()
4433 int ocfs2_dx_dir_truncate(struct inode *dir, struct buffer_head *di_bh) in ocfs2_dx_dir_truncate() argument
4439 struct ocfs2_super *osb = OCFS2_SB(dir->i_sb); in ocfs2_dx_dir_truncate()
4448 if (!ocfs2_dir_indexed(dir)) in ocfs2_dx_dir_truncate()
4451 ret = ocfs2_read_dx_root(dir, di, &dx_root_bh); in ocfs2_dx_dir_truncate()
4461 ocfs2_init_dx_root_extent_tree(&et, INODE_CACHE(dir), dx_root_bh); in ocfs2_dx_dir_truncate()
4465 ret = ocfs2_dx_dir_lookup_rec(dir, &dx_root->dr_list, in ocfs2_dx_dir_truncate()
4472 p_cpos = ocfs2_blocks_to_clusters(dir->i_sb, blkno); in ocfs2_dx_dir_truncate()
4474 ret = ocfs2_remove_btree_range(dir, &et, cpos, p_cpos, clen, 0, in ocfs2_dx_dir_truncate()
4488 ret = ocfs2_dx_dir_remove_index(dir, di_bh, dx_root_bh); in ocfs2_dx_dir_truncate()
4494 ocfs2_remove_from_cache(INODE_CACHE(dir), dx_root_bh); in ocfs2_dx_dir_truncate()