diff options
Diffstat (limited to 'fs/ocfs2/suballoc.c')
| -rw-r--r-- | fs/ocfs2/suballoc.c | 261 |
1 files changed, 228 insertions, 33 deletions
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 195523090c87..9d91e66f51a9 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
| @@ -70,12 +70,6 @@ static int ocfs2_block_group_search(struct inode *inode, | |||
| 70 | struct buffer_head *group_bh, | 70 | struct buffer_head *group_bh, |
| 71 | u32 bits_wanted, u32 min_bits, | 71 | u32 bits_wanted, u32 min_bits, |
| 72 | u16 *bit_off, u16 *bits_found); | 72 | u16 *bit_off, u16 *bits_found); |
| 73 | static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | ||
| 74 | u32 bits_wanted, | ||
| 75 | u32 min_bits, | ||
| 76 | u16 *bit_off, | ||
| 77 | unsigned int *num_bits, | ||
| 78 | u64 *bg_blkno); | ||
| 79 | static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | 73 | static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, |
| 80 | struct ocfs2_alloc_context *ac, | 74 | struct ocfs2_alloc_context *ac, |
| 81 | u32 bits_wanted, | 75 | u32 bits_wanted, |
| @@ -85,11 +79,6 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
| 85 | u64 *bg_blkno); | 79 | u64 *bg_blkno); |
| 86 | static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh, | 80 | static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh, |
| 87 | int nr); | 81 | int nr); |
| 88 | static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, | ||
| 89 | struct buffer_head *bg_bh, | ||
| 90 | unsigned int bits_wanted, | ||
| 91 | u16 *bit_off, | ||
| 92 | u16 *bits_found); | ||
| 93 | static inline int ocfs2_block_group_set_bits(struct ocfs2_journal_handle *handle, | 82 | static inline int ocfs2_block_group_set_bits(struct ocfs2_journal_handle *handle, |
| 94 | struct inode *alloc_inode, | 83 | struct inode *alloc_inode, |
| 95 | struct ocfs2_group_desc *bg, | 84 | struct ocfs2_group_desc *bg, |
| @@ -143,6 +132,64 @@ static u32 ocfs2_bits_per_group(struct ocfs2_chain_list *cl) | |||
| 143 | return (u32)le16_to_cpu(cl->cl_cpg) * (u32)le16_to_cpu(cl->cl_bpc); | 132 | return (u32)le16_to_cpu(cl->cl_cpg) * (u32)le16_to_cpu(cl->cl_bpc); |
| 144 | } | 133 | } |
| 145 | 134 | ||
| 135 | /* somewhat more expensive than our other checks, so use sparingly. */ | ||
| 136 | static int ocfs2_check_group_descriptor(struct super_block *sb, | ||
| 137 | struct ocfs2_dinode *di, | ||
| 138 | struct ocfs2_group_desc *gd) | ||
| 139 | { | ||
| 140 | unsigned int max_bits; | ||
| 141 | |||
| 142 | if (!OCFS2_IS_VALID_GROUP_DESC(gd)) { | ||
| 143 | OCFS2_RO_ON_INVALID_GROUP_DESC(sb, gd); | ||
| 144 | return -EIO; | ||
| 145 | } | ||
| 146 | |||
| 147 | if (di->i_blkno != gd->bg_parent_dinode) { | ||
| 148 | ocfs2_error(sb, "Group descriptor # %llu has bad parent " | ||
| 149 | "pointer (%llu, expected %llu)", | ||
| 150 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
| 151 | (unsigned long long)le64_to_cpu(gd->bg_parent_dinode), | ||
| 152 | (unsigned long long)le64_to_cpu(di->i_blkno)); | ||
| 153 | return -EIO; | ||
| 154 | } | ||
| 155 | |||
| 156 | max_bits = le16_to_cpu(di->id2.i_chain.cl_cpg) * le16_to_cpu(di->id2.i_chain.cl_bpc); | ||
| 157 | if (le16_to_cpu(gd->bg_bits) > max_bits) { | ||
| 158 | ocfs2_error(sb, "Group descriptor # %llu has bit count of %u", | ||
| 159 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
| 160 | le16_to_cpu(gd->bg_bits)); | ||
| 161 | return -EIO; | ||
| 162 | } | ||
| 163 | |||
| 164 | if (le16_to_cpu(gd->bg_chain) >= | ||
| 165 | le16_to_cpu(di->id2.i_chain.cl_next_free_rec)) { | ||
| 166 | ocfs2_error(sb, "Group descriptor # %llu has bad chain %u", | ||
| 167 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
| 168 | le16_to_cpu(gd->bg_chain)); | ||
| 169 | return -EIO; | ||
| 170 | } | ||
| 171 | |||
| 172 | if (le16_to_cpu(gd->bg_free_bits_count) > le16_to_cpu(gd->bg_bits)) { | ||
| 173 | ocfs2_error(sb, "Group descriptor # %llu has bit count %u but " | ||
| 174 | "claims that %u are free", | ||
| 175 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
| 176 | le16_to_cpu(gd->bg_bits), | ||
| 177 | le16_to_cpu(gd->bg_free_bits_count)); | ||
| 178 | return -EIO; | ||
| 179 | } | ||
| 180 | |||
| 181 | if (le16_to_cpu(gd->bg_bits) > (8 * le16_to_cpu(gd->bg_size))) { | ||
| 182 | ocfs2_error(sb, "Group descriptor # %llu has bit count %u but " | ||
| 183 | "max bitmap bits of %u", | ||
| 184 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
| 185 | le16_to_cpu(gd->bg_bits), | ||
| 186 | 8 * le16_to_cpu(gd->bg_size)); | ||
| 187 | return -EIO; | ||
| 188 | } | ||
| 189 | |||
| 190 | return 0; | ||
| 191 | } | ||
| 192 | |||
| 146 | static int ocfs2_block_group_fill(struct ocfs2_journal_handle *handle, | 193 | static int ocfs2_block_group_fill(struct ocfs2_journal_handle *handle, |
| 147 | struct inode *alloc_inode, | 194 | struct inode *alloc_inode, |
| 148 | struct buffer_head *bg_bh, | 195 | struct buffer_head *bg_bh, |
| @@ -663,6 +710,7 @@ static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh, | |||
| 663 | static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, | 710 | static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, |
| 664 | struct buffer_head *bg_bh, | 711 | struct buffer_head *bg_bh, |
| 665 | unsigned int bits_wanted, | 712 | unsigned int bits_wanted, |
| 713 | unsigned int total_bits, | ||
| 666 | u16 *bit_off, | 714 | u16 *bit_off, |
| 667 | u16 *bits_found) | 715 | u16 *bits_found) |
| 668 | { | 716 | { |
| @@ -679,10 +727,8 @@ static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, | |||
| 679 | found = start = best_offset = best_size = 0; | 727 | found = start = best_offset = best_size = 0; |
| 680 | bitmap = bg->bg_bitmap; | 728 | bitmap = bg->bg_bitmap; |
| 681 | 729 | ||
| 682 | while((offset = ocfs2_find_next_zero_bit(bitmap, | 730 | while((offset = ocfs2_find_next_zero_bit(bitmap, total_bits, start)) != -1) { |
| 683 | le16_to_cpu(bg->bg_bits), | 731 | if (offset == total_bits) |
| 684 | start)) != -1) { | ||
| 685 | if (offset == le16_to_cpu(bg->bg_bits)) | ||
| 686 | break; | 732 | break; |
| 687 | 733 | ||
| 688 | if (!ocfs2_test_bg_bit_allocatable(bg_bh, offset)) { | 734 | if (!ocfs2_test_bg_bit_allocatable(bg_bh, offset)) { |
| @@ -911,14 +957,35 @@ static int ocfs2_cluster_group_search(struct inode *inode, | |||
| 911 | { | 957 | { |
| 912 | int search = -ENOSPC; | 958 | int search = -ENOSPC; |
| 913 | int ret; | 959 | int ret; |
| 914 | struct ocfs2_group_desc *bg = (struct ocfs2_group_desc *) group_bh->b_data; | 960 | struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *) group_bh->b_data; |
| 915 | u16 tmp_off, tmp_found; | 961 | u16 tmp_off, tmp_found; |
| 962 | unsigned int max_bits, gd_cluster_off; | ||
| 916 | 963 | ||
| 917 | BUG_ON(!ocfs2_is_cluster_bitmap(inode)); | 964 | BUG_ON(!ocfs2_is_cluster_bitmap(inode)); |
| 918 | 965 | ||
| 919 | if (bg->bg_free_bits_count) { | 966 | if (gd->bg_free_bits_count) { |
| 967 | max_bits = le16_to_cpu(gd->bg_bits); | ||
| 968 | |||
| 969 | /* Tail groups in cluster bitmaps which aren't cpg | ||
| 970 | * aligned are prone to partial extention by a failed | ||
| 971 | * fs resize. If the file system resize never got to | ||
| 972 | * update the dinode cluster count, then we don't want | ||
| 973 | * to trust any clusters past it, regardless of what | ||
| 974 | * the group descriptor says. */ | ||
| 975 | gd_cluster_off = ocfs2_blocks_to_clusters(inode->i_sb, | ||
| 976 | le64_to_cpu(gd->bg_blkno)); | ||
| 977 | if ((gd_cluster_off + max_bits) > | ||
| 978 | OCFS2_I(inode)->ip_clusters) { | ||
| 979 | max_bits = OCFS2_I(inode)->ip_clusters - gd_cluster_off; | ||
| 980 | mlog(0, "Desc %llu, bg_bits %u, clusters %u, use %u\n", | ||
| 981 | (unsigned long long)le64_to_cpu(gd->bg_blkno), | ||
| 982 | le16_to_cpu(gd->bg_bits), | ||
| 983 | OCFS2_I(inode)->ip_clusters, max_bits); | ||
| 984 | } | ||
| 985 | |||
| 920 | ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), | 986 | ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), |
| 921 | group_bh, bits_wanted, | 987 | group_bh, bits_wanted, |
| 988 | max_bits, | ||
| 922 | &tmp_off, &tmp_found); | 989 | &tmp_off, &tmp_found); |
| 923 | if (ret) | 990 | if (ret) |
| 924 | return ret; | 991 | return ret; |
| @@ -951,17 +1018,109 @@ static int ocfs2_block_group_search(struct inode *inode, | |||
| 951 | if (bg->bg_free_bits_count) | 1018 | if (bg->bg_free_bits_count) |
| 952 | ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), | 1019 | ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), |
| 953 | group_bh, bits_wanted, | 1020 | group_bh, bits_wanted, |
| 1021 | le16_to_cpu(bg->bg_bits), | ||
| 954 | bit_off, bits_found); | 1022 | bit_off, bits_found); |
| 955 | 1023 | ||
| 956 | return ret; | 1024 | return ret; |
| 957 | } | 1025 | } |
| 958 | 1026 | ||
| 1027 | static int ocfs2_alloc_dinode_update_counts(struct inode *inode, | ||
| 1028 | struct ocfs2_journal_handle *handle, | ||
| 1029 | struct buffer_head *di_bh, | ||
| 1030 | u32 num_bits, | ||
| 1031 | u16 chain) | ||
| 1032 | { | ||
| 1033 | int ret; | ||
| 1034 | u32 tmp_used; | ||
| 1035 | struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data; | ||
| 1036 | struct ocfs2_chain_list *cl = (struct ocfs2_chain_list *) &di->id2.i_chain; | ||
| 1037 | |||
| 1038 | ret = ocfs2_journal_access(handle, inode, di_bh, | ||
| 1039 | OCFS2_JOURNAL_ACCESS_WRITE); | ||
| 1040 | if (ret < 0) { | ||
| 1041 | mlog_errno(ret); | ||
| 1042 | goto out; | ||
| 1043 | } | ||
| 1044 | |||
| 1045 | tmp_used = le32_to_cpu(di->id1.bitmap1.i_used); | ||
| 1046 | di->id1.bitmap1.i_used = cpu_to_le32(num_bits + tmp_used); | ||
| 1047 | le32_add_cpu(&cl->cl_recs[chain].c_free, -num_bits); | ||
| 1048 | |||
| 1049 | ret = ocfs2_journal_dirty(handle, di_bh); | ||
| 1050 | if (ret < 0) | ||
| 1051 | mlog_errno(ret); | ||
| 1052 | |||
| 1053 | out: | ||
| 1054 | return ret; | ||
| 1055 | } | ||
| 1056 | |||
| 1057 | static int ocfs2_search_one_group(struct ocfs2_alloc_context *ac, | ||
| 1058 | u32 bits_wanted, | ||
| 1059 | u32 min_bits, | ||
| 1060 | u16 *bit_off, | ||
| 1061 | unsigned int *num_bits, | ||
| 1062 | u64 gd_blkno, | ||
| 1063 | u16 *bits_left) | ||
| 1064 | { | ||
| 1065 | int ret; | ||
| 1066 | u16 found; | ||
| 1067 | struct buffer_head *group_bh = NULL; | ||
| 1068 | struct ocfs2_group_desc *gd; | ||
| 1069 | struct inode *alloc_inode = ac->ac_inode; | ||
| 1070 | struct ocfs2_journal_handle *handle = ac->ac_handle; | ||
| 1071 | |||
| 1072 | ret = ocfs2_read_block(OCFS2_SB(alloc_inode->i_sb), gd_blkno, | ||
| 1073 | &group_bh, OCFS2_BH_CACHED, alloc_inode); | ||
| 1074 | if (ret < 0) { | ||
| 1075 | mlog_errno(ret); | ||
| 1076 | return ret; | ||
| 1077 | } | ||
| 1078 | |||
| 1079 | gd = (struct ocfs2_group_desc *) group_bh->b_data; | ||
| 1080 | if (!OCFS2_IS_VALID_GROUP_DESC(gd)) { | ||
| 1081 | OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, gd); | ||
| 1082 | ret = -EIO; | ||
| 1083 | goto out; | ||
| 1084 | } | ||
| 1085 | |||
| 1086 | ret = ac->ac_group_search(alloc_inode, group_bh, bits_wanted, min_bits, | ||
| 1087 | bit_off, &found); | ||
| 1088 | if (ret < 0) { | ||
| 1089 | if (ret != -ENOSPC) | ||
| 1090 | mlog_errno(ret); | ||
| 1091 | goto out; | ||
| 1092 | } | ||
| 1093 | |||
| 1094 | *num_bits = found; | ||
| 1095 | |||
| 1096 | ret = ocfs2_alloc_dinode_update_counts(alloc_inode, handle, ac->ac_bh, | ||
| 1097 | *num_bits, | ||
| 1098 | le16_to_cpu(gd->bg_chain)); | ||
| 1099 | if (ret < 0) { | ||
| 1100 | mlog_errno(ret); | ||
| 1101 | goto out; | ||
| 1102 | } | ||
| 1103 | |||
| 1104 | ret = ocfs2_block_group_set_bits(handle, alloc_inode, gd, group_bh, | ||
| 1105 | *bit_off, *num_bits); | ||
| 1106 | if (ret < 0) | ||
| 1107 | mlog_errno(ret); | ||
| 1108 | |||
| 1109 | *bits_left = le16_to_cpu(gd->bg_free_bits_count); | ||
| 1110 | |||
| 1111 | out: | ||
| 1112 | brelse(group_bh); | ||
| 1113 | |||
| 1114 | return ret; | ||
| 1115 | } | ||
| 1116 | |||
| 959 | static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | 1117 | static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, |
| 960 | u32 bits_wanted, | 1118 | u32 bits_wanted, |
| 961 | u32 min_bits, | 1119 | u32 min_bits, |
| 962 | u16 *bit_off, | 1120 | u16 *bit_off, |
| 963 | unsigned int *num_bits, | 1121 | unsigned int *num_bits, |
| 964 | u64 *bg_blkno) | 1122 | u64 *bg_blkno, |
| 1123 | u16 *bits_left) | ||
| 965 | { | 1124 | { |
| 966 | int status; | 1125 | int status; |
| 967 | u16 chain, tmp_bits; | 1126 | u16 chain, tmp_bits; |
| @@ -988,9 +1147,9 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | |||
| 988 | goto bail; | 1147 | goto bail; |
| 989 | } | 1148 | } |
| 990 | bg = (struct ocfs2_group_desc *) group_bh->b_data; | 1149 | bg = (struct ocfs2_group_desc *) group_bh->b_data; |
| 991 | if (!OCFS2_IS_VALID_GROUP_DESC(bg)) { | 1150 | status = ocfs2_check_group_descriptor(alloc_inode->i_sb, fe, bg); |
| 992 | OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, bg); | 1151 | if (status) { |
| 993 | status = -EIO; | 1152 | mlog_errno(status); |
| 994 | goto bail; | 1153 | goto bail; |
| 995 | } | 1154 | } |
| 996 | 1155 | ||
| @@ -1018,9 +1177,9 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | |||
| 1018 | goto bail; | 1177 | goto bail; |
| 1019 | } | 1178 | } |
| 1020 | bg = (struct ocfs2_group_desc *) group_bh->b_data; | 1179 | bg = (struct ocfs2_group_desc *) group_bh->b_data; |
| 1021 | if (!OCFS2_IS_VALID_GROUP_DESC(bg)) { | 1180 | status = ocfs2_check_group_descriptor(alloc_inode->i_sb, fe, bg); |
| 1022 | OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, bg); | 1181 | if (status) { |
| 1023 | status = -EIO; | 1182 | mlog_errno(status); |
| 1024 | goto bail; | 1183 | goto bail; |
| 1025 | } | 1184 | } |
| 1026 | } | 1185 | } |
| @@ -1099,6 +1258,7 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | |||
| 1099 | (unsigned long long)fe->i_blkno); | 1258 | (unsigned long long)fe->i_blkno); |
| 1100 | 1259 | ||
| 1101 | *bg_blkno = le64_to_cpu(bg->bg_blkno); | 1260 | *bg_blkno = le64_to_cpu(bg->bg_blkno); |
| 1261 | *bits_left = le16_to_cpu(bg->bg_free_bits_count); | ||
| 1102 | bail: | 1262 | bail: |
| 1103 | if (group_bh) | 1263 | if (group_bh) |
| 1104 | brelse(group_bh); | 1264 | brelse(group_bh); |
| @@ -1120,6 +1280,8 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
| 1120 | { | 1280 | { |
| 1121 | int status; | 1281 | int status; |
| 1122 | u16 victim, i; | 1282 | u16 victim, i; |
| 1283 | u16 bits_left = 0; | ||
| 1284 | u64 hint_blkno = ac->ac_last_group; | ||
| 1123 | struct ocfs2_chain_list *cl; | 1285 | struct ocfs2_chain_list *cl; |
| 1124 | struct ocfs2_dinode *fe; | 1286 | struct ocfs2_dinode *fe; |
| 1125 | 1287 | ||
| @@ -1146,6 +1308,28 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
| 1146 | goto bail; | 1308 | goto bail; |
| 1147 | } | 1309 | } |
| 1148 | 1310 | ||
| 1311 | if (hint_blkno) { | ||
| 1312 | /* Attempt to short-circuit the usual search mechanism | ||
| 1313 | * by jumping straight to the most recently used | ||
| 1314 | * allocation group. This helps us mantain some | ||
| 1315 | * contiguousness across allocations. */ | ||
| 1316 | status = ocfs2_search_one_group(ac, bits_wanted, min_bits, | ||
| 1317 | bit_off, num_bits, | ||
| 1318 | hint_blkno, &bits_left); | ||
| 1319 | if (!status) { | ||
| 1320 | /* Be careful to update *bg_blkno here as the | ||
| 1321 | * caller is expecting it to be filled in, and | ||
| 1322 | * ocfs2_search_one_group() won't do that for | ||
| 1323 | * us. */ | ||
| 1324 | *bg_blkno = hint_blkno; | ||
| 1325 | goto set_hint; | ||
| 1326 | } | ||
| 1327 | if (status < 0 && status != -ENOSPC) { | ||
| 1328 | mlog_errno(status); | ||
| 1329 | goto bail; | ||
| 1330 | } | ||
| 1331 | } | ||
| 1332 | |||
| 1149 | cl = (struct ocfs2_chain_list *) &fe->id2.i_chain; | 1333 | cl = (struct ocfs2_chain_list *) &fe->id2.i_chain; |
| 1150 | 1334 | ||
| 1151 | victim = ocfs2_find_victim_chain(cl); | 1335 | victim = ocfs2_find_victim_chain(cl); |
| @@ -1153,9 +1337,9 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
| 1153 | ac->ac_allow_chain_relink = 1; | 1337 | ac->ac_allow_chain_relink = 1; |
| 1154 | 1338 | ||
| 1155 | status = ocfs2_search_chain(ac, bits_wanted, min_bits, bit_off, | 1339 | status = ocfs2_search_chain(ac, bits_wanted, min_bits, bit_off, |
| 1156 | num_bits, bg_blkno); | 1340 | num_bits, bg_blkno, &bits_left); |
| 1157 | if (!status) | 1341 | if (!status) |
| 1158 | goto bail; | 1342 | goto set_hint; |
| 1159 | if (status < 0 && status != -ENOSPC) { | 1343 | if (status < 0 && status != -ENOSPC) { |
| 1160 | mlog_errno(status); | 1344 | mlog_errno(status); |
| 1161 | goto bail; | 1345 | goto bail; |
| @@ -1177,8 +1361,8 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
| 1177 | 1361 | ||
| 1178 | ac->ac_chain = i; | 1362 | ac->ac_chain = i; |
| 1179 | status = ocfs2_search_chain(ac, bits_wanted, min_bits, | 1363 | status = ocfs2_search_chain(ac, bits_wanted, min_bits, |
| 1180 | bit_off, num_bits, | 1364 | bit_off, num_bits, bg_blkno, |
| 1181 | bg_blkno); | 1365 | &bits_left); |
| 1182 | if (!status) | 1366 | if (!status) |
| 1183 | break; | 1367 | break; |
| 1184 | if (status < 0 && status != -ENOSPC) { | 1368 | if (status < 0 && status != -ENOSPC) { |
| @@ -1186,8 +1370,19 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | |||
| 1186 | goto bail; | 1370 | goto bail; |
| 1187 | } | 1371 | } |
| 1188 | } | 1372 | } |
| 1189 | bail: | ||
| 1190 | 1373 | ||
| 1374 | set_hint: | ||
| 1375 | if (status != -ENOSPC) { | ||
| 1376 | /* If the next search of this group is not likely to | ||
| 1377 | * yield a suitable extent, then we reset the last | ||
| 1378 | * group hint so as to not waste a disk read */ | ||
| 1379 | if (bits_left < min_bits) | ||
| 1380 | ac->ac_last_group = 0; | ||
| 1381 | else | ||
| 1382 | ac->ac_last_group = *bg_blkno; | ||
| 1383 | } | ||
| 1384 | |||
| 1385 | bail: | ||
| 1191 | mlog_exit(status); | 1386 | mlog_exit(status); |
| 1192 | return status; | 1387 | return status; |
| 1193 | } | 1388 | } |
| @@ -1341,7 +1536,7 @@ int ocfs2_claim_clusters(struct ocfs2_super *osb, | |||
| 1341 | { | 1536 | { |
| 1342 | int status; | 1537 | int status; |
| 1343 | unsigned int bits_wanted = ac->ac_bits_wanted - ac->ac_bits_given; | 1538 | unsigned int bits_wanted = ac->ac_bits_wanted - ac->ac_bits_given; |
| 1344 | u64 bg_blkno; | 1539 | u64 bg_blkno = 0; |
| 1345 | u16 bg_bit_off; | 1540 | u16 bg_bit_off; |
| 1346 | 1541 | ||
| 1347 | mlog_entry_void(); | 1542 | mlog_entry_void(); |
| @@ -1494,9 +1689,9 @@ static int ocfs2_free_suballoc_bits(struct ocfs2_journal_handle *handle, | |||
| 1494 | } | 1689 | } |
| 1495 | 1690 | ||
| 1496 | group = (struct ocfs2_group_desc *) group_bh->b_data; | 1691 | group = (struct ocfs2_group_desc *) group_bh->b_data; |
| 1497 | if (!OCFS2_IS_VALID_GROUP_DESC(group)) { | 1692 | status = ocfs2_check_group_descriptor(alloc_inode->i_sb, fe, group); |
| 1498 | OCFS2_RO_ON_INVALID_GROUP_DESC(alloc_inode->i_sb, group); | 1693 | if (status) { |
| 1499 | status = -EIO; | 1694 | mlog_errno(status); |
| 1500 | goto bail; | 1695 | goto bail; |
| 1501 | } | 1696 | } |
| 1502 | BUG_ON((count + start_bit) > le16_to_cpu(group->bg_bits)); | 1697 | BUG_ON((count + start_bit) > le16_to_cpu(group->bg_bits)); |
