diff options
Diffstat (limited to 'fs/ocfs2/suballoc.c')
-rw-r--r-- | fs/ocfs2/suballoc.c | 248 |
1 files changed, 192 insertions, 56 deletions
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index d2d278fb9819..c5ff18b46b57 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
@@ -62,15 +62,18 @@ static int ocfs2_block_group_fill(handle_t *handle, | |||
62 | struct ocfs2_chain_list *cl); | 62 | struct ocfs2_chain_list *cl); |
63 | static int ocfs2_block_group_alloc(struct ocfs2_super *osb, | 63 | static int ocfs2_block_group_alloc(struct ocfs2_super *osb, |
64 | struct inode *alloc_inode, | 64 | struct inode *alloc_inode, |
65 | struct buffer_head *bh); | 65 | struct buffer_head *bh, |
66 | u64 max_block); | ||
66 | 67 | ||
67 | static int ocfs2_cluster_group_search(struct inode *inode, | 68 | static int ocfs2_cluster_group_search(struct inode *inode, |
68 | struct buffer_head *group_bh, | 69 | struct buffer_head *group_bh, |
69 | u32 bits_wanted, u32 min_bits, | 70 | u32 bits_wanted, u32 min_bits, |
71 | u64 max_block, | ||
70 | u16 *bit_off, u16 *bits_found); | 72 | u16 *bit_off, u16 *bits_found); |
71 | static int ocfs2_block_group_search(struct inode *inode, | 73 | static int ocfs2_block_group_search(struct inode *inode, |
72 | struct buffer_head *group_bh, | 74 | struct buffer_head *group_bh, |
73 | u32 bits_wanted, u32 min_bits, | 75 | u32 bits_wanted, u32 min_bits, |
76 | u64 max_block, | ||
74 | u16 *bit_off, u16 *bits_found); | 77 | u16 *bit_off, u16 *bits_found); |
75 | static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, | 78 | static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, |
76 | struct ocfs2_alloc_context *ac, | 79 | struct ocfs2_alloc_context *ac, |
@@ -110,8 +113,11 @@ static inline void ocfs2_block_to_cluster_group(struct inode *inode, | |||
110 | u64 data_blkno, | 113 | u64 data_blkno, |
111 | u64 *bg_blkno, | 114 | u64 *bg_blkno, |
112 | u16 *bg_bit_off); | 115 | u16 *bg_bit_off); |
116 | static int ocfs2_reserve_clusters_with_limit(struct ocfs2_super *osb, | ||
117 | u32 bits_wanted, u64 max_block, | ||
118 | struct ocfs2_alloc_context **ac); | ||
113 | 119 | ||
114 | static void ocfs2_free_ac_resource(struct ocfs2_alloc_context *ac) | 120 | void ocfs2_free_ac_resource(struct ocfs2_alloc_context *ac) |
115 | { | 121 | { |
116 | struct inode *inode = ac->ac_inode; | 122 | struct inode *inode = ac->ac_inode; |
117 | 123 | ||
@@ -124,10 +130,8 @@ static void ocfs2_free_ac_resource(struct ocfs2_alloc_context *ac) | |||
124 | iput(inode); | 130 | iput(inode); |
125 | ac->ac_inode = NULL; | 131 | ac->ac_inode = NULL; |
126 | } | 132 | } |
127 | if (ac->ac_bh) { | 133 | brelse(ac->ac_bh); |
128 | brelse(ac->ac_bh); | 134 | ac->ac_bh = NULL; |
129 | ac->ac_bh = NULL; | ||
130 | } | ||
131 | } | 135 | } |
132 | 136 | ||
133 | void ocfs2_free_alloc_context(struct ocfs2_alloc_context *ac) | 137 | void ocfs2_free_alloc_context(struct ocfs2_alloc_context *ac) |
@@ -276,7 +280,8 @@ static inline u16 ocfs2_find_smallest_chain(struct ocfs2_chain_list *cl) | |||
276 | */ | 280 | */ |
277 | static int ocfs2_block_group_alloc(struct ocfs2_super *osb, | 281 | static int ocfs2_block_group_alloc(struct ocfs2_super *osb, |
278 | struct inode *alloc_inode, | 282 | struct inode *alloc_inode, |
279 | struct buffer_head *bh) | 283 | struct buffer_head *bh, |
284 | u64 max_block) | ||
280 | { | 285 | { |
281 | int status, credits; | 286 | int status, credits; |
282 | struct ocfs2_dinode *fe = (struct ocfs2_dinode *) bh->b_data; | 287 | struct ocfs2_dinode *fe = (struct ocfs2_dinode *) bh->b_data; |
@@ -294,9 +299,9 @@ static int ocfs2_block_group_alloc(struct ocfs2_super *osb, | |||
294 | mlog_entry_void(); | 299 | mlog_entry_void(); |
295 | 300 | ||
296 | cl = &fe->id2.i_chain; | 301 | cl = &fe->id2.i_chain; |
297 | status = ocfs2_reserve_clusters(osb, | 302 | status = ocfs2_reserve_clusters_with_limit(osb, |
298 | le16_to_cpu(cl->cl_cpg), | 303 | le16_to_cpu(cl->cl_cpg), |
299 | &ac); | 304 | max_block, &ac); |
300 | if (status < 0) { | 305 | if (status < 0) { |
301 | if (status != -ENOSPC) | 306 | if (status != -ENOSPC) |
302 | mlog_errno(status); | 307 | mlog_errno(status); |
@@ -394,8 +399,7 @@ bail: | |||
394 | if (ac) | 399 | if (ac) |
395 | ocfs2_free_alloc_context(ac); | 400 | ocfs2_free_alloc_context(ac); |
396 | 401 | ||
397 | if (bg_bh) | 402 | brelse(bg_bh); |
398 | brelse(bg_bh); | ||
399 | 403 | ||
400 | mlog_exit(status); | 404 | mlog_exit(status); |
401 | return status; | 405 | return status; |
@@ -469,7 +473,8 @@ static int ocfs2_reserve_suballoc_bits(struct ocfs2_super *osb, | |||
469 | goto bail; | 473 | goto bail; |
470 | } | 474 | } |
471 | 475 | ||
472 | status = ocfs2_block_group_alloc(osb, alloc_inode, bh); | 476 | status = ocfs2_block_group_alloc(osb, alloc_inode, bh, |
477 | ac->ac_max_block); | ||
473 | if (status < 0) { | 478 | if (status < 0) { |
474 | if (status != -ENOSPC) | 479 | if (status != -ENOSPC) |
475 | mlog_errno(status); | 480 | mlog_errno(status); |
@@ -486,16 +491,15 @@ static int ocfs2_reserve_suballoc_bits(struct ocfs2_super *osb, | |||
486 | get_bh(bh); | 491 | get_bh(bh); |
487 | ac->ac_bh = bh; | 492 | ac->ac_bh = bh; |
488 | bail: | 493 | bail: |
489 | if (bh) | 494 | brelse(bh); |
490 | brelse(bh); | ||
491 | 495 | ||
492 | mlog_exit(status); | 496 | mlog_exit(status); |
493 | return status; | 497 | return status; |
494 | } | 498 | } |
495 | 499 | ||
496 | int ocfs2_reserve_new_metadata(struct ocfs2_super *osb, | 500 | int ocfs2_reserve_new_metadata_blocks(struct ocfs2_super *osb, |
497 | struct ocfs2_dinode *fe, | 501 | int blocks, |
498 | struct ocfs2_alloc_context **ac) | 502 | struct ocfs2_alloc_context **ac) |
499 | { | 503 | { |
500 | int status; | 504 | int status; |
501 | u32 slot; | 505 | u32 slot; |
@@ -507,7 +511,7 @@ int ocfs2_reserve_new_metadata(struct ocfs2_super *osb, | |||
507 | goto bail; | 511 | goto bail; |
508 | } | 512 | } |
509 | 513 | ||
510 | (*ac)->ac_bits_wanted = ocfs2_extend_meta_needed(fe); | 514 | (*ac)->ac_bits_wanted = blocks; |
511 | (*ac)->ac_which = OCFS2_AC_USE_META; | 515 | (*ac)->ac_which = OCFS2_AC_USE_META; |
512 | slot = osb->slot_num; | 516 | slot = osb->slot_num; |
513 | (*ac)->ac_group_search = ocfs2_block_group_search; | 517 | (*ac)->ac_group_search = ocfs2_block_group_search; |
@@ -532,6 +536,15 @@ bail: | |||
532 | return status; | 536 | return status; |
533 | } | 537 | } |
534 | 538 | ||
539 | int ocfs2_reserve_new_metadata(struct ocfs2_super *osb, | ||
540 | struct ocfs2_extent_list *root_el, | ||
541 | struct ocfs2_alloc_context **ac) | ||
542 | { | ||
543 | return ocfs2_reserve_new_metadata_blocks(osb, | ||
544 | ocfs2_extend_meta_needed(root_el), | ||
545 | ac); | ||
546 | } | ||
547 | |||
535 | static int ocfs2_steal_inode_from_other_nodes(struct ocfs2_super *osb, | 548 | static int ocfs2_steal_inode_from_other_nodes(struct ocfs2_super *osb, |
536 | struct ocfs2_alloc_context *ac) | 549 | struct ocfs2_alloc_context *ac) |
537 | { | 550 | { |
@@ -582,6 +595,14 @@ int ocfs2_reserve_new_inode(struct ocfs2_super *osb, | |||
582 | (*ac)->ac_group_search = ocfs2_block_group_search; | 595 | (*ac)->ac_group_search = ocfs2_block_group_search; |
583 | 596 | ||
584 | /* | 597 | /* |
598 | * stat(2) can't handle i_ino > 32bits, so we tell the | ||
599 | * lower levels not to allocate us a block group past that | ||
600 | * limit. The 'inode64' mount option avoids this behavior. | ||
601 | */ | ||
602 | if (!(osb->s_mount_opt & OCFS2_MOUNT_INODE64)) | ||
603 | (*ac)->ac_max_block = (u32)~0U; | ||
604 | |||
605 | /* | ||
585 | * slot is set when we successfully steal inode from other nodes. | 606 | * slot is set when we successfully steal inode from other nodes. |
586 | * It is reset in 3 places: | 607 | * It is reset in 3 places: |
587 | * 1. when we flush the truncate log | 608 | * 1. when we flush the truncate log |
@@ -661,9 +682,9 @@ bail: | |||
661 | /* Callers don't need to care which bitmap (local alloc or main) to | 682 | /* Callers don't need to care which bitmap (local alloc or main) to |
662 | * use so we figure it out for them, but unfortunately this clutters | 683 | * use so we figure it out for them, but unfortunately this clutters |
663 | * things a bit. */ | 684 | * things a bit. */ |
664 | int ocfs2_reserve_clusters(struct ocfs2_super *osb, | 685 | static int ocfs2_reserve_clusters_with_limit(struct ocfs2_super *osb, |
665 | u32 bits_wanted, | 686 | u32 bits_wanted, u64 max_block, |
666 | struct ocfs2_alloc_context **ac) | 687 | struct ocfs2_alloc_context **ac) |
667 | { | 688 | { |
668 | int status; | 689 | int status; |
669 | 690 | ||
@@ -677,24 +698,20 @@ int ocfs2_reserve_clusters(struct ocfs2_super *osb, | |||
677 | } | 698 | } |
678 | 699 | ||
679 | (*ac)->ac_bits_wanted = bits_wanted; | 700 | (*ac)->ac_bits_wanted = bits_wanted; |
701 | (*ac)->ac_max_block = max_block; | ||
680 | 702 | ||
681 | status = -ENOSPC; | 703 | status = -ENOSPC; |
682 | if (ocfs2_alloc_should_use_local(osb, bits_wanted)) { | 704 | if (ocfs2_alloc_should_use_local(osb, bits_wanted)) { |
683 | status = ocfs2_reserve_local_alloc_bits(osb, | 705 | status = ocfs2_reserve_local_alloc_bits(osb, |
684 | bits_wanted, | 706 | bits_wanted, |
685 | *ac); | 707 | *ac); |
686 | if ((status < 0) && (status != -ENOSPC)) { | 708 | if (status == -EFBIG) { |
709 | /* The local alloc window is outside ac_max_block. | ||
710 | * use the main bitmap. */ | ||
711 | status = -ENOSPC; | ||
712 | } else if ((status < 0) && (status != -ENOSPC)) { | ||
687 | mlog_errno(status); | 713 | mlog_errno(status); |
688 | goto bail; | 714 | goto bail; |
689 | } else if (status == -ENOSPC) { | ||
690 | /* reserve_local_bits will return enospc with | ||
691 | * the local alloc inode still locked, so we | ||
692 | * can change this safely here. */ | ||
693 | mlog(0, "Disabling local alloc\n"); | ||
694 | /* We set to OCFS2_LA_DISABLED so that umount | ||
695 | * can clean up what's left of the local | ||
696 | * allocation */ | ||
697 | osb->local_alloc_state = OCFS2_LA_DISABLED; | ||
698 | } | 715 | } |
699 | } | 716 | } |
700 | 717 | ||
@@ -718,6 +735,13 @@ bail: | |||
718 | return status; | 735 | return status; |
719 | } | 736 | } |
720 | 737 | ||
738 | int ocfs2_reserve_clusters(struct ocfs2_super *osb, | ||
739 | u32 bits_wanted, | ||
740 | struct ocfs2_alloc_context **ac) | ||
741 | { | ||
742 | return ocfs2_reserve_clusters_with_limit(osb, bits_wanted, 0, ac); | ||
743 | } | ||
744 | |||
721 | /* | 745 | /* |
722 | * More or less lifted from ext3. I'll leave their description below: | 746 | * More or less lifted from ext3. I'll leave their description below: |
723 | * | 747 | * |
@@ -1000,11 +1024,14 @@ static inline int ocfs2_block_group_reasonably_empty(struct ocfs2_group_desc *bg | |||
1000 | static int ocfs2_cluster_group_search(struct inode *inode, | 1024 | static int ocfs2_cluster_group_search(struct inode *inode, |
1001 | struct buffer_head *group_bh, | 1025 | struct buffer_head *group_bh, |
1002 | u32 bits_wanted, u32 min_bits, | 1026 | u32 bits_wanted, u32 min_bits, |
1027 | u64 max_block, | ||
1003 | u16 *bit_off, u16 *bits_found) | 1028 | u16 *bit_off, u16 *bits_found) |
1004 | { | 1029 | { |
1005 | int search = -ENOSPC; | 1030 | int search = -ENOSPC; |
1006 | int ret; | 1031 | int ret; |
1032 | u64 blkoff; | ||
1007 | struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *) group_bh->b_data; | 1033 | struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *) group_bh->b_data; |
1034 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
1008 | u16 tmp_off, tmp_found; | 1035 | u16 tmp_off, tmp_found; |
1009 | unsigned int max_bits, gd_cluster_off; | 1036 | unsigned int max_bits, gd_cluster_off; |
1010 | 1037 | ||
@@ -1037,6 +1064,17 @@ static int ocfs2_cluster_group_search(struct inode *inode, | |||
1037 | if (ret) | 1064 | if (ret) |
1038 | return ret; | 1065 | return ret; |
1039 | 1066 | ||
1067 | if (max_block) { | ||
1068 | blkoff = ocfs2_clusters_to_blocks(inode->i_sb, | ||
1069 | gd_cluster_off + | ||
1070 | tmp_off + tmp_found); | ||
1071 | mlog(0, "Checking %llu against %llu\n", | ||
1072 | (unsigned long long)blkoff, | ||
1073 | (unsigned long long)max_block); | ||
1074 | if (blkoff > max_block) | ||
1075 | return -ENOSPC; | ||
1076 | } | ||
1077 | |||
1040 | /* ocfs2_block_group_find_clear_bits() might | 1078 | /* ocfs2_block_group_find_clear_bits() might |
1041 | * return success, but we still want to return | 1079 | * return success, but we still want to return |
1042 | * -ENOSPC unless it found the minimum number | 1080 | * -ENOSPC unless it found the minimum number |
@@ -1045,6 +1083,12 @@ static int ocfs2_cluster_group_search(struct inode *inode, | |||
1045 | *bit_off = tmp_off; | 1083 | *bit_off = tmp_off; |
1046 | *bits_found = tmp_found; | 1084 | *bits_found = tmp_found; |
1047 | search = 0; /* success */ | 1085 | search = 0; /* success */ |
1086 | } else if (tmp_found) { | ||
1087 | /* | ||
1088 | * Don't show bits which we'll be returning | ||
1089 | * for allocation to the local alloc bitmap. | ||
1090 | */ | ||
1091 | ocfs2_local_alloc_seen_free_bits(osb, tmp_found); | ||
1048 | } | 1092 | } |
1049 | } | 1093 | } |
1050 | 1094 | ||
@@ -1054,19 +1098,31 @@ static int ocfs2_cluster_group_search(struct inode *inode, | |||
1054 | static int ocfs2_block_group_search(struct inode *inode, | 1098 | static int ocfs2_block_group_search(struct inode *inode, |
1055 | struct buffer_head *group_bh, | 1099 | struct buffer_head *group_bh, |
1056 | u32 bits_wanted, u32 min_bits, | 1100 | u32 bits_wanted, u32 min_bits, |
1101 | u64 max_block, | ||
1057 | u16 *bit_off, u16 *bits_found) | 1102 | u16 *bit_off, u16 *bits_found) |
1058 | { | 1103 | { |
1059 | int ret = -ENOSPC; | 1104 | int ret = -ENOSPC; |
1105 | u64 blkoff; | ||
1060 | struct ocfs2_group_desc *bg = (struct ocfs2_group_desc *) group_bh->b_data; | 1106 | struct ocfs2_group_desc *bg = (struct ocfs2_group_desc *) group_bh->b_data; |
1061 | 1107 | ||
1062 | BUG_ON(min_bits != 1); | 1108 | BUG_ON(min_bits != 1); |
1063 | BUG_ON(ocfs2_is_cluster_bitmap(inode)); | 1109 | BUG_ON(ocfs2_is_cluster_bitmap(inode)); |
1064 | 1110 | ||
1065 | if (bg->bg_free_bits_count) | 1111 | if (bg->bg_free_bits_count) { |
1066 | ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), | 1112 | ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), |
1067 | group_bh, bits_wanted, | 1113 | group_bh, bits_wanted, |
1068 | le16_to_cpu(bg->bg_bits), | 1114 | le16_to_cpu(bg->bg_bits), |
1069 | bit_off, bits_found); | 1115 | bit_off, bits_found); |
1116 | if (!ret && max_block) { | ||
1117 | blkoff = le64_to_cpu(bg->bg_blkno) + *bit_off + | ||
1118 | *bits_found; | ||
1119 | mlog(0, "Checking %llu against %llu\n", | ||
1120 | (unsigned long long)blkoff, | ||
1121 | (unsigned long long)max_block); | ||
1122 | if (blkoff > max_block) | ||
1123 | ret = -ENOSPC; | ||
1124 | } | ||
1125 | } | ||
1070 | 1126 | ||
1071 | return ret; | 1127 | return ret; |
1072 | } | 1128 | } |
@@ -1116,8 +1172,7 @@ static int ocfs2_search_one_group(struct ocfs2_alloc_context *ac, | |||
1116 | struct ocfs2_group_desc *gd; | 1172 | struct ocfs2_group_desc *gd; |
1117 | struct inode *alloc_inode = ac->ac_inode; | 1173 | struct inode *alloc_inode = ac->ac_inode; |
1118 | 1174 | ||
1119 | ret = ocfs2_read_block(OCFS2_SB(alloc_inode->i_sb), gd_blkno, | 1175 | ret = ocfs2_read_block(alloc_inode, gd_blkno, &group_bh); |
1120 | &group_bh, OCFS2_BH_CACHED, alloc_inode); | ||
1121 | if (ret < 0) { | 1176 | if (ret < 0) { |
1122 | mlog_errno(ret); | 1177 | mlog_errno(ret); |
1123 | return ret; | 1178 | return ret; |
@@ -1131,7 +1186,7 @@ static int ocfs2_search_one_group(struct ocfs2_alloc_context *ac, | |||
1131 | } | 1186 | } |
1132 | 1187 | ||
1133 | ret = ac->ac_group_search(alloc_inode, group_bh, bits_wanted, min_bits, | 1188 | ret = ac->ac_group_search(alloc_inode, group_bh, bits_wanted, min_bits, |
1134 | bit_off, &found); | 1189 | ac->ac_max_block, bit_off, &found); |
1135 | if (ret < 0) { | 1190 | if (ret < 0) { |
1136 | if (ret != -ENOSPC) | 1191 | if (ret != -ENOSPC) |
1137 | mlog_errno(ret); | 1192 | mlog_errno(ret); |
@@ -1186,9 +1241,9 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | |||
1186 | bits_wanted, chain, | 1241 | bits_wanted, chain, |
1187 | (unsigned long long)OCFS2_I(alloc_inode)->ip_blkno); | 1242 | (unsigned long long)OCFS2_I(alloc_inode)->ip_blkno); |
1188 | 1243 | ||
1189 | status = ocfs2_read_block(OCFS2_SB(alloc_inode->i_sb), | 1244 | status = ocfs2_read_block(alloc_inode, |
1190 | le64_to_cpu(cl->cl_recs[chain].c_blkno), | 1245 | le64_to_cpu(cl->cl_recs[chain].c_blkno), |
1191 | &group_bh, OCFS2_BH_CACHED, alloc_inode); | 1246 | &group_bh); |
1192 | if (status < 0) { | 1247 | if (status < 0) { |
1193 | mlog_errno(status); | 1248 | mlog_errno(status); |
1194 | goto bail; | 1249 | goto bail; |
@@ -1204,21 +1259,20 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | |||
1204 | /* for now, the chain search is a bit simplistic. We just use | 1259 | /* for now, the chain search is a bit simplistic. We just use |
1205 | * the 1st group with any empty bits. */ | 1260 | * the 1st group with any empty bits. */ |
1206 | while ((status = ac->ac_group_search(alloc_inode, group_bh, | 1261 | while ((status = ac->ac_group_search(alloc_inode, group_bh, |
1207 | bits_wanted, min_bits, bit_off, | 1262 | bits_wanted, min_bits, |
1263 | ac->ac_max_block, bit_off, | ||
1208 | &tmp_bits)) == -ENOSPC) { | 1264 | &tmp_bits)) == -ENOSPC) { |
1209 | if (!bg->bg_next_group) | 1265 | if (!bg->bg_next_group) |
1210 | break; | 1266 | break; |
1211 | 1267 | ||
1212 | if (prev_group_bh) { | 1268 | brelse(prev_group_bh); |
1213 | brelse(prev_group_bh); | 1269 | prev_group_bh = NULL; |
1214 | prev_group_bh = NULL; | 1270 | |
1215 | } | ||
1216 | next_group = le64_to_cpu(bg->bg_next_group); | 1271 | next_group = le64_to_cpu(bg->bg_next_group); |
1217 | prev_group_bh = group_bh; | 1272 | prev_group_bh = group_bh; |
1218 | group_bh = NULL; | 1273 | group_bh = NULL; |
1219 | status = ocfs2_read_block(OCFS2_SB(alloc_inode->i_sb), | 1274 | status = ocfs2_read_block(alloc_inode, |
1220 | next_group, &group_bh, | 1275 | next_group, &group_bh); |
1221 | OCFS2_BH_CACHED, alloc_inode); | ||
1222 | if (status < 0) { | 1276 | if (status < 0) { |
1223 | mlog_errno(status); | 1277 | mlog_errno(status); |
1224 | goto bail; | 1278 | goto bail; |
@@ -1307,10 +1361,8 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | |||
1307 | *bg_blkno = le64_to_cpu(bg->bg_blkno); | 1361 | *bg_blkno = le64_to_cpu(bg->bg_blkno); |
1308 | *bits_left = le16_to_cpu(bg->bg_free_bits_count); | 1362 | *bits_left = le16_to_cpu(bg->bg_free_bits_count); |
1309 | bail: | 1363 | bail: |
1310 | if (group_bh) | 1364 | brelse(group_bh); |
1311 | brelse(group_bh); | 1365 | brelse(prev_group_bh); |
1312 | if (prev_group_bh) | ||
1313 | brelse(prev_group_bh); | ||
1314 | 1366 | ||
1315 | mlog_exit(status); | 1367 | mlog_exit(status); |
1316 | return status; | 1368 | return status; |
@@ -1723,7 +1775,6 @@ int ocfs2_free_suballoc_bits(handle_t *handle, | |||
1723 | { | 1775 | { |
1724 | int status = 0; | 1776 | int status = 0; |
1725 | u32 tmp_used; | 1777 | u32 tmp_used; |
1726 | struct ocfs2_super *osb = OCFS2_SB(alloc_inode->i_sb); | ||
1727 | struct ocfs2_dinode *fe = (struct ocfs2_dinode *) alloc_bh->b_data; | 1778 | struct ocfs2_dinode *fe = (struct ocfs2_dinode *) alloc_bh->b_data; |
1728 | struct ocfs2_chain_list *cl = &fe->id2.i_chain; | 1779 | struct ocfs2_chain_list *cl = &fe->id2.i_chain; |
1729 | struct buffer_head *group_bh = NULL; | 1780 | struct buffer_head *group_bh = NULL; |
@@ -1742,8 +1793,7 @@ int ocfs2_free_suballoc_bits(handle_t *handle, | |||
1742 | (unsigned long long)OCFS2_I(alloc_inode)->ip_blkno, count, | 1793 | (unsigned long long)OCFS2_I(alloc_inode)->ip_blkno, count, |
1743 | (unsigned long long)bg_blkno, start_bit); | 1794 | (unsigned long long)bg_blkno, start_bit); |
1744 | 1795 | ||
1745 | status = ocfs2_read_block(osb, bg_blkno, &group_bh, OCFS2_BH_CACHED, | 1796 | status = ocfs2_read_block(alloc_inode, bg_blkno, &group_bh); |
1746 | alloc_inode); | ||
1747 | if (status < 0) { | 1797 | if (status < 0) { |
1748 | mlog_errno(status); | 1798 | mlog_errno(status); |
1749 | goto bail; | 1799 | goto bail; |
@@ -1784,8 +1834,7 @@ int ocfs2_free_suballoc_bits(handle_t *handle, | |||
1784 | } | 1834 | } |
1785 | 1835 | ||
1786 | bail: | 1836 | bail: |
1787 | if (group_bh) | 1837 | brelse(group_bh); |
1788 | brelse(group_bh); | ||
1789 | 1838 | ||
1790 | mlog_exit(status); | 1839 | mlog_exit(status); |
1791 | return status; | 1840 | return status; |
@@ -1838,9 +1887,15 @@ int ocfs2_free_clusters(handle_t *handle, | |||
1838 | status = ocfs2_free_suballoc_bits(handle, bitmap_inode, bitmap_bh, | 1887 | status = ocfs2_free_suballoc_bits(handle, bitmap_inode, bitmap_bh, |
1839 | bg_start_bit, bg_blkno, | 1888 | bg_start_bit, bg_blkno, |
1840 | num_clusters); | 1889 | num_clusters); |
1841 | if (status < 0) | 1890 | if (status < 0) { |
1842 | mlog_errno(status); | 1891 | mlog_errno(status); |
1892 | goto out; | ||
1893 | } | ||
1843 | 1894 | ||
1895 | ocfs2_local_alloc_seen_free_bits(OCFS2_SB(bitmap_inode->i_sb), | ||
1896 | num_clusters); | ||
1897 | |||
1898 | out: | ||
1844 | mlog_exit(status); | 1899 | mlog_exit(status); |
1845 | return status; | 1900 | return status; |
1846 | } | 1901 | } |
@@ -1891,3 +1946,84 @@ static inline void ocfs2_debug_suballoc_inode(struct ocfs2_dinode *fe) | |||
1891 | (unsigned long long)fe->id2.i_chain.cl_recs[i].c_blkno); | 1946 | (unsigned long long)fe->id2.i_chain.cl_recs[i].c_blkno); |
1892 | } | 1947 | } |
1893 | } | 1948 | } |
1949 | |||
1950 | /* | ||
1951 | * For a given allocation, determine which allocators will need to be | ||
1952 | * accessed, and lock them, reserving the appropriate number of bits. | ||
1953 | * | ||
1954 | * Sparse file systems call this from ocfs2_write_begin_nolock() | ||
1955 | * and ocfs2_allocate_unwritten_extents(). | ||
1956 | * | ||
1957 | * File systems which don't support holes call this from | ||
1958 | * ocfs2_extend_allocation(). | ||
1959 | */ | ||
1960 | int ocfs2_lock_allocators(struct inode *inode, | ||
1961 | struct ocfs2_extent_tree *et, | ||
1962 | u32 clusters_to_add, u32 extents_to_split, | ||
1963 | struct ocfs2_alloc_context **data_ac, | ||
1964 | struct ocfs2_alloc_context **meta_ac) | ||
1965 | { | ||
1966 | int ret = 0, num_free_extents; | ||
1967 | unsigned int max_recs_needed = clusters_to_add + 2 * extents_to_split; | ||
1968 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
1969 | |||
1970 | *meta_ac = NULL; | ||
1971 | if (data_ac) | ||
1972 | *data_ac = NULL; | ||
1973 | |||
1974 | BUG_ON(clusters_to_add != 0 && data_ac == NULL); | ||
1975 | |||
1976 | num_free_extents = ocfs2_num_free_extents(osb, inode, et); | ||
1977 | if (num_free_extents < 0) { | ||
1978 | ret = num_free_extents; | ||
1979 | mlog_errno(ret); | ||
1980 | goto out; | ||
1981 | } | ||
1982 | |||
1983 | /* | ||
1984 | * Sparse allocation file systems need to be more conservative | ||
1985 | * with reserving room for expansion - the actual allocation | ||
1986 | * happens while we've got a journal handle open so re-taking | ||
1987 | * a cluster lock (because we ran out of room for another | ||
1988 | * extent) will violate ordering rules. | ||
1989 | * | ||
1990 | * Most of the time we'll only be seeing this 1 cluster at a time | ||
1991 | * anyway. | ||
1992 | * | ||
1993 | * Always lock for any unwritten extents - we might want to | ||
1994 | * add blocks during a split. | ||
1995 | */ | ||
1996 | if (!num_free_extents || | ||
1997 | (ocfs2_sparse_alloc(osb) && num_free_extents < max_recs_needed)) { | ||
1998 | ret = ocfs2_reserve_new_metadata(osb, et->et_root_el, meta_ac); | ||
1999 | if (ret < 0) { | ||
2000 | if (ret != -ENOSPC) | ||
2001 | mlog_errno(ret); | ||
2002 | goto out; | ||
2003 | } | ||
2004 | } | ||
2005 | |||
2006 | if (clusters_to_add == 0) | ||
2007 | goto out; | ||
2008 | |||
2009 | ret = ocfs2_reserve_clusters(osb, clusters_to_add, data_ac); | ||
2010 | if (ret < 0) { | ||
2011 | if (ret != -ENOSPC) | ||
2012 | mlog_errno(ret); | ||
2013 | goto out; | ||
2014 | } | ||
2015 | |||
2016 | out: | ||
2017 | if (ret) { | ||
2018 | if (*meta_ac) { | ||
2019 | ocfs2_free_alloc_context(*meta_ac); | ||
2020 | *meta_ac = NULL; | ||
2021 | } | ||
2022 | |||
2023 | /* | ||
2024 | * We cannot have an error and a non null *data_ac. | ||
2025 | */ | ||
2026 | } | ||
2027 | |||
2028 | return ret; | ||
2029 | } | ||