diff options
Diffstat (limited to 'fs/ocfs2/dir.c')
| -rw-r--r-- | fs/ocfs2/dir.c | 75 |
1 files changed, 27 insertions, 48 deletions
diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index efd77d071c80..f04ebcfffc4a 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c | |||
| @@ -1194,7 +1194,7 @@ static int __ocfs2_delete_entry(handle_t *handle, struct inode *dir, | |||
| 1194 | else | 1194 | else |
| 1195 | de->inode = 0; | 1195 | de->inode = 0; |
| 1196 | dir->i_version++; | 1196 | dir->i_version++; |
| 1197 | status = ocfs2_journal_dirty(handle, bh); | 1197 | ocfs2_journal_dirty(handle, bh); |
| 1198 | goto bail; | 1198 | goto bail; |
| 1199 | } | 1199 | } |
| 1200 | i += le16_to_cpu(de->rec_len); | 1200 | i += le16_to_cpu(de->rec_len); |
| @@ -1752,7 +1752,7 @@ int __ocfs2_add_entry(handle_t *handle, | |||
| 1752 | ocfs2_recalc_free_list(dir, handle, lookup); | 1752 | ocfs2_recalc_free_list(dir, handle, lookup); |
| 1753 | 1753 | ||
| 1754 | dir->i_version++; | 1754 | dir->i_version++; |
| 1755 | status = ocfs2_journal_dirty(handle, insert_bh); | 1755 | ocfs2_journal_dirty(handle, insert_bh); |
| 1756 | retval = 0; | 1756 | retval = 0; |
| 1757 | goto bail; | 1757 | goto bail; |
| 1758 | } | 1758 | } |
| @@ -2297,12 +2297,7 @@ static int ocfs2_fill_new_dir_id(struct ocfs2_super *osb, | |||
| 2297 | } | 2297 | } |
| 2298 | 2298 | ||
| 2299 | ocfs2_fill_initial_dirents(inode, parent, data->id_data, size); | 2299 | ocfs2_fill_initial_dirents(inode, parent, data->id_data, size); |
| 2300 | |||
| 2301 | ocfs2_journal_dirty(handle, di_bh); | 2300 | ocfs2_journal_dirty(handle, di_bh); |
| 2302 | if (ret) { | ||
| 2303 | mlog_errno(ret); | ||
| 2304 | goto out; | ||
| 2305 | } | ||
| 2306 | 2301 | ||
| 2307 | i_size_write(inode, size); | 2302 | i_size_write(inode, size); |
| 2308 | inode->i_nlink = 2; | 2303 | inode->i_nlink = 2; |
| @@ -2366,11 +2361,7 @@ static int ocfs2_fill_new_dir_el(struct ocfs2_super *osb, | |||
| 2366 | ocfs2_init_dir_trailer(inode, new_bh, size); | 2361 | ocfs2_init_dir_trailer(inode, new_bh, size); |
| 2367 | } | 2362 | } |
| 2368 | 2363 | ||
| 2369 | status = ocfs2_journal_dirty(handle, new_bh); | 2364 | ocfs2_journal_dirty(handle, new_bh); |
| 2370 | if (status < 0) { | ||
| 2371 | mlog_errno(status); | ||
| 2372 | goto bail; | ||
| 2373 | } | ||
| 2374 | 2365 | ||
| 2375 | i_size_write(inode, inode->i_sb->s_blocksize); | 2366 | i_size_write(inode, inode->i_sb->s_blocksize); |
| 2376 | inode->i_nlink = 2; | 2367 | inode->i_nlink = 2; |
| @@ -2404,15 +2395,15 @@ static int ocfs2_dx_dir_attach_index(struct ocfs2_super *osb, | |||
| 2404 | int ret; | 2395 | int ret; |
| 2405 | struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data; | 2396 | struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data; |
| 2406 | u16 dr_suballoc_bit; | 2397 | u16 dr_suballoc_bit; |
| 2407 | u64 dr_blkno; | 2398 | u64 suballoc_loc, dr_blkno; |
| 2408 | unsigned int num_bits; | 2399 | unsigned int num_bits; |
| 2409 | struct buffer_head *dx_root_bh = NULL; | 2400 | struct buffer_head *dx_root_bh = NULL; |
| 2410 | struct ocfs2_dx_root_block *dx_root; | 2401 | struct ocfs2_dx_root_block *dx_root; |
| 2411 | struct ocfs2_dir_block_trailer *trailer = | 2402 | struct ocfs2_dir_block_trailer *trailer = |
| 2412 | ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb); | 2403 | ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb); |
| 2413 | 2404 | ||
| 2414 | ret = ocfs2_claim_metadata(osb, handle, meta_ac, 1, &dr_suballoc_bit, | 2405 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, &suballoc_loc, |
| 2415 | &num_bits, &dr_blkno); | 2406 | &dr_suballoc_bit, &num_bits, &dr_blkno); |
| 2416 | if (ret) { | 2407 | if (ret) { |
| 2417 | mlog_errno(ret); | 2408 | mlog_errno(ret); |
| 2418 | goto out; | 2409 | goto out; |
| @@ -2440,6 +2431,7 @@ static int ocfs2_dx_dir_attach_index(struct ocfs2_super *osb, | |||
| 2440 | memset(dx_root, 0, osb->sb->s_blocksize); | 2431 | memset(dx_root, 0, osb->sb->s_blocksize); |
| 2441 | strcpy(dx_root->dr_signature, OCFS2_DX_ROOT_SIGNATURE); | 2432 | strcpy(dx_root->dr_signature, OCFS2_DX_ROOT_SIGNATURE); |
| 2442 | dx_root->dr_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); | 2433 | dx_root->dr_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); |
| 2434 | dx_root->dr_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
| 2443 | dx_root->dr_suballoc_bit = cpu_to_le16(dr_suballoc_bit); | 2435 | dx_root->dr_suballoc_bit = cpu_to_le16(dr_suballoc_bit); |
| 2444 | dx_root->dr_fs_generation = cpu_to_le32(osb->fs_generation); | 2436 | dx_root->dr_fs_generation = cpu_to_le32(osb->fs_generation); |
| 2445 | dx_root->dr_blkno = cpu_to_le64(dr_blkno); | 2437 | dx_root->dr_blkno = cpu_to_le64(dr_blkno); |
| @@ -2458,10 +2450,7 @@ static int ocfs2_dx_dir_attach_index(struct ocfs2_super *osb, | |||
| 2458 | dx_root->dr_list.l_count = | 2450 | dx_root->dr_list.l_count = |
| 2459 | cpu_to_le16(ocfs2_extent_recs_per_dx_root(osb->sb)); | 2451 | cpu_to_le16(ocfs2_extent_recs_per_dx_root(osb->sb)); |
| 2460 | } | 2452 | } |
| 2461 | 2453 | ocfs2_journal_dirty(handle, dx_root_bh); | |
| 2462 | ret = ocfs2_journal_dirty(handle, dx_root_bh); | ||
| 2463 | if (ret) | ||
| 2464 | mlog_errno(ret); | ||
| 2465 | 2454 | ||
| 2466 | ret = ocfs2_journal_access_di(handle, INODE_CACHE(dir), di_bh, | 2455 | ret = ocfs2_journal_access_di(handle, INODE_CACHE(dir), di_bh, |
| 2467 | OCFS2_JOURNAL_ACCESS_CREATE); | 2456 | OCFS2_JOURNAL_ACCESS_CREATE); |
| @@ -2475,9 +2464,7 @@ static int ocfs2_dx_dir_attach_index(struct ocfs2_super *osb, | |||
| 2475 | OCFS2_I(dir)->ip_dyn_features |= OCFS2_INDEXED_DIR_FL; | 2464 | OCFS2_I(dir)->ip_dyn_features |= OCFS2_INDEXED_DIR_FL; |
| 2476 | di->i_dyn_features = cpu_to_le16(OCFS2_I(dir)->ip_dyn_features); | 2465 | di->i_dyn_features = cpu_to_le16(OCFS2_I(dir)->ip_dyn_features); |
| 2477 | 2466 | ||
| 2478 | ret = ocfs2_journal_dirty(handle, di_bh); | 2467 | ocfs2_journal_dirty(handle, di_bh); |
| 2479 | if (ret) | ||
| 2480 | mlog_errno(ret); | ||
| 2481 | 2468 | ||
| 2482 | *ret_dx_root_bh = dx_root_bh; | 2469 | *ret_dx_root_bh = dx_root_bh; |
| 2483 | dx_root_bh = NULL; | 2470 | dx_root_bh = NULL; |
| @@ -2558,7 +2545,7 @@ static int __ocfs2_dx_dir_new_cluster(struct inode *dir, | |||
| 2558 | * chance of contiguousness as the directory grows in number | 2545 | * chance of contiguousness as the directory grows in number |
| 2559 | * of entries. | 2546 | * of entries. |
| 2560 | */ | 2547 | */ |
| 2561 | ret = __ocfs2_claim_clusters(osb, handle, data_ac, 1, 1, &phys, &num); | 2548 | ret = __ocfs2_claim_clusters(handle, data_ac, 1, 1, &phys, &num); |
| 2562 | if (ret) { | 2549 | if (ret) { |
| 2563 | mlog_errno(ret); | 2550 | mlog_errno(ret); |
| 2564 | goto out; | 2551 | goto out; |
| @@ -2991,7 +2978,9 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, | |||
| 2991 | * if we only get one now, that's enough to continue. The rest | 2978 | * if we only get one now, that's enough to continue. The rest |
| 2992 | * will be claimed after the conversion to extents. | 2979 | * will be claimed after the conversion to extents. |
| 2993 | */ | 2980 | */ |
| 2994 | ret = ocfs2_claim_clusters(osb, handle, data_ac, 1, &bit_off, &len); | 2981 | if (ocfs2_dir_resv_allowed(osb)) |
| 2982 | data_ac->ac_resv = &oi->ip_la_data_resv; | ||
| 2983 | ret = ocfs2_claim_clusters(handle, data_ac, 1, &bit_off, &len); | ||
| 2995 | if (ret) { | 2984 | if (ret) { |
| 2996 | mlog_errno(ret); | 2985 | mlog_errno(ret); |
| 2997 | goto out_commit; | 2986 | goto out_commit; |
| @@ -3034,11 +3023,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, | |||
| 3034 | ocfs2_init_dir_trailer(dir, dirdata_bh, i); | 3023 | ocfs2_init_dir_trailer(dir, dirdata_bh, i); |
| 3035 | } | 3024 | } |
| 3036 | 3025 | ||
| 3037 | ret = ocfs2_journal_dirty(handle, dirdata_bh); | 3026 | ocfs2_journal_dirty(handle, dirdata_bh); |
| 3038 | if (ret) { | ||
| 3039 | mlog_errno(ret); | ||
| 3040 | goto out_commit; | ||
| 3041 | } | ||
| 3042 | 3027 | ||
| 3043 | if (ocfs2_supports_indexed_dirs(osb) && !dx_inline) { | 3028 | if (ocfs2_supports_indexed_dirs(osb) && !dx_inline) { |
| 3044 | /* | 3029 | /* |
| @@ -3104,11 +3089,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, | |||
| 3104 | */ | 3089 | */ |
| 3105 | dir->i_blocks = ocfs2_inode_sector_count(dir); | 3090 | dir->i_blocks = ocfs2_inode_sector_count(dir); |
| 3106 | 3091 | ||
| 3107 | ret = ocfs2_journal_dirty(handle, di_bh); | 3092 | ocfs2_journal_dirty(handle, di_bh); |
| 3108 | if (ret) { | ||
| 3109 | mlog_errno(ret); | ||
| 3110 | goto out_commit; | ||
| 3111 | } | ||
| 3112 | 3093 | ||
| 3113 | if (ocfs2_supports_indexed_dirs(osb)) { | 3094 | if (ocfs2_supports_indexed_dirs(osb)) { |
| 3114 | ret = ocfs2_dx_dir_attach_index(osb, handle, dir, di_bh, | 3095 | ret = ocfs2_dx_dir_attach_index(osb, handle, dir, di_bh, |
| @@ -3138,7 +3119,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, | |||
| 3138 | * pass. Claim the 2nd cluster as a separate extent. | 3119 | * pass. Claim the 2nd cluster as a separate extent. |
| 3139 | */ | 3120 | */ |
| 3140 | if (alloc > len) { | 3121 | if (alloc > len) { |
| 3141 | ret = ocfs2_claim_clusters(osb, handle, data_ac, 1, &bit_off, | 3122 | ret = ocfs2_claim_clusters(handle, data_ac, 1, &bit_off, |
| 3142 | &len); | 3123 | &len); |
| 3143 | if (ret) { | 3124 | if (ret) { |
| 3144 | mlog_errno(ret); | 3125 | mlog_errno(ret); |
| @@ -3369,6 +3350,9 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb, | |||
| 3369 | goto bail; | 3350 | goto bail; |
| 3370 | } | 3351 | } |
| 3371 | 3352 | ||
| 3353 | if (ocfs2_dir_resv_allowed(osb)) | ||
| 3354 | data_ac->ac_resv = &OCFS2_I(dir)->ip_la_data_resv; | ||
| 3355 | |||
| 3372 | credits = ocfs2_calc_extend_credits(sb, el, 1); | 3356 | credits = ocfs2_calc_extend_credits(sb, el, 1); |
| 3373 | } else { | 3357 | } else { |
| 3374 | spin_unlock(&OCFS2_I(dir)->ip_lock); | 3358 | spin_unlock(&OCFS2_I(dir)->ip_lock); |
| @@ -3423,11 +3407,7 @@ do_extend: | |||
| 3423 | } else { | 3407 | } else { |
| 3424 | de->rec_len = cpu_to_le16(sb->s_blocksize); | 3408 | de->rec_len = cpu_to_le16(sb->s_blocksize); |
| 3425 | } | 3409 | } |
| 3426 | status = ocfs2_journal_dirty(handle, new_bh); | 3410 | ocfs2_journal_dirty(handle, new_bh); |
| 3427 | if (status < 0) { | ||
| 3428 | mlog_errno(status); | ||
| 3429 | goto bail; | ||
| 3430 | } | ||
| 3431 | 3411 | ||
| 3432 | dir_i_size += dir->i_sb->s_blocksize; | 3412 | dir_i_size += dir->i_sb->s_blocksize; |
| 3433 | i_size_write(dir, dir_i_size); | 3413 | i_size_write(dir, dir_i_size); |
| @@ -3906,11 +3886,7 @@ static int ocfs2_dx_dir_rebalance(struct ocfs2_super *osb, struct inode *dir, | |||
| 3906 | sizeof(struct ocfs2_dx_entry), dx_leaf_sort_cmp, | 3886 | sizeof(struct ocfs2_dx_entry), dx_leaf_sort_cmp, |
| 3907 | dx_leaf_sort_swap); | 3887 | dx_leaf_sort_swap); |
| 3908 | 3888 | ||
| 3909 | ret = ocfs2_journal_dirty(handle, dx_leaf_bh); | 3889 | ocfs2_journal_dirty(handle, dx_leaf_bh); |
| 3910 | if (ret) { | ||
| 3911 | mlog_errno(ret); | ||
| 3912 | goto out_commit; | ||
| 3913 | } | ||
| 3914 | 3890 | ||
| 3915 | ret = ocfs2_dx_dir_find_leaf_split(dx_leaf, leaf_cpos, insert_hash, | 3891 | ret = ocfs2_dx_dir_find_leaf_split(dx_leaf, leaf_cpos, insert_hash, |
| 3916 | &split_hash); | 3892 | &split_hash); |
| @@ -4490,7 +4466,10 @@ static int ocfs2_dx_dir_remove_index(struct inode *dir, | |||
| 4490 | 4466 | ||
| 4491 | blk = le64_to_cpu(dx_root->dr_blkno); | 4467 | blk = le64_to_cpu(dx_root->dr_blkno); |
| 4492 | bit = le16_to_cpu(dx_root->dr_suballoc_bit); | 4468 | bit = le16_to_cpu(dx_root->dr_suballoc_bit); |
| 4493 | bg_blkno = ocfs2_which_suballoc_group(blk, bit); | 4469 | if (dx_root->dr_suballoc_loc) |
| 4470 | bg_blkno = le64_to_cpu(dx_root->dr_suballoc_loc); | ||
| 4471 | else | ||
| 4472 | bg_blkno = ocfs2_which_suballoc_group(blk, bit); | ||
| 4494 | ret = ocfs2_free_suballoc_bits(handle, dx_alloc_inode, dx_alloc_bh, | 4473 | ret = ocfs2_free_suballoc_bits(handle, dx_alloc_inode, dx_alloc_bh, |
| 4495 | bit, bg_blkno, 1); | 4474 | bit, bg_blkno, 1); |
| 4496 | if (ret) | 4475 | if (ret) |
| @@ -4551,8 +4530,8 @@ int ocfs2_dx_dir_truncate(struct inode *dir, struct buffer_head *di_bh) | |||
| 4551 | 4530 | ||
| 4552 | p_cpos = ocfs2_blocks_to_clusters(dir->i_sb, blkno); | 4531 | p_cpos = ocfs2_blocks_to_clusters(dir->i_sb, blkno); |
| 4553 | 4532 | ||
| 4554 | ret = ocfs2_remove_btree_range(dir, &et, cpos, p_cpos, clen, | 4533 | ret = ocfs2_remove_btree_range(dir, &et, cpos, p_cpos, clen, 0, |
| 4555 | &dealloc); | 4534 | &dealloc, 0); |
| 4556 | if (ret) { | 4535 | if (ret) { |
| 4557 | mlog_errno(ret); | 4536 | mlog_errno(ret); |
| 4558 | goto out; | 4537 | goto out; |
