diff options
Diffstat (limited to 'fs/ocfs2/suballoc.c')
-rw-r--r-- | fs/ocfs2/suballoc.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index d2d278fb9819..de7b93d76d12 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
@@ -111,7 +111,7 @@ static inline void ocfs2_block_to_cluster_group(struct inode *inode, | |||
111 | u64 *bg_blkno, | 111 | u64 *bg_blkno, |
112 | u16 *bg_bit_off); | 112 | u16 *bg_bit_off); |
113 | 113 | ||
114 | static void ocfs2_free_ac_resource(struct ocfs2_alloc_context *ac) | 114 | void ocfs2_free_ac_resource(struct ocfs2_alloc_context *ac) |
115 | { | 115 | { |
116 | struct inode *inode = ac->ac_inode; | 116 | struct inode *inode = ac->ac_inode; |
117 | 117 | ||
@@ -686,15 +686,6 @@ int ocfs2_reserve_clusters(struct ocfs2_super *osb, | |||
686 | if ((status < 0) && (status != -ENOSPC)) { | 686 | if ((status < 0) && (status != -ENOSPC)) { |
687 | mlog_errno(status); | 687 | mlog_errno(status); |
688 | goto bail; | 688 | 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 | } | 689 | } |
699 | } | 690 | } |
700 | 691 | ||
@@ -1005,6 +996,7 @@ static int ocfs2_cluster_group_search(struct inode *inode, | |||
1005 | int search = -ENOSPC; | 996 | int search = -ENOSPC; |
1006 | int ret; | 997 | int ret; |
1007 | struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *) group_bh->b_data; | 998 | struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *) group_bh->b_data; |
999 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
1008 | u16 tmp_off, tmp_found; | 1000 | u16 tmp_off, tmp_found; |
1009 | unsigned int max_bits, gd_cluster_off; | 1001 | unsigned int max_bits, gd_cluster_off; |
1010 | 1002 | ||
@@ -1045,6 +1037,12 @@ static int ocfs2_cluster_group_search(struct inode *inode, | |||
1045 | *bit_off = tmp_off; | 1037 | *bit_off = tmp_off; |
1046 | *bits_found = tmp_found; | 1038 | *bits_found = tmp_found; |
1047 | search = 0; /* success */ | 1039 | search = 0; /* success */ |
1040 | } else if (tmp_found) { | ||
1041 | /* | ||
1042 | * Don't show bits which we'll be returning | ||
1043 | * for allocation to the local alloc bitmap. | ||
1044 | */ | ||
1045 | ocfs2_local_alloc_seen_free_bits(osb, tmp_found); | ||
1048 | } | 1046 | } |
1049 | } | 1047 | } |
1050 | 1048 | ||
@@ -1203,9 +1201,8 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, | |||
1203 | status = -ENOSPC; | 1201 | status = -ENOSPC; |
1204 | /* for now, the chain search is a bit simplistic. We just use | 1202 | /* for now, the chain search is a bit simplistic. We just use |
1205 | * the 1st group with any empty bits. */ | 1203 | * the 1st group with any empty bits. */ |
1206 | while ((status = ac->ac_group_search(alloc_inode, group_bh, | 1204 | while ((status = ac->ac_group_search(alloc_inode, group_bh, bits_wanted, |
1207 | bits_wanted, min_bits, bit_off, | 1205 | min_bits, bit_off, &tmp_bits)) == -ENOSPC) { |
1208 | &tmp_bits)) == -ENOSPC) { | ||
1209 | if (!bg->bg_next_group) | 1206 | if (!bg->bg_next_group) |
1210 | break; | 1207 | break; |
1211 | 1208 | ||
@@ -1838,9 +1835,15 @@ int ocfs2_free_clusters(handle_t *handle, | |||
1838 | status = ocfs2_free_suballoc_bits(handle, bitmap_inode, bitmap_bh, | 1835 | status = ocfs2_free_suballoc_bits(handle, bitmap_inode, bitmap_bh, |
1839 | bg_start_bit, bg_blkno, | 1836 | bg_start_bit, bg_blkno, |
1840 | num_clusters); | 1837 | num_clusters); |
1841 | if (status < 0) | 1838 | if (status < 0) { |
1842 | mlog_errno(status); | 1839 | mlog_errno(status); |
1840 | goto out; | ||
1841 | } | ||
1842 | |||
1843 | ocfs2_local_alloc_seen_free_bits(OCFS2_SB(bitmap_inode->i_sb), | ||
1844 | num_clusters); | ||
1843 | 1845 | ||
1846 | out: | ||
1844 | mlog_exit(status); | 1847 | mlog_exit(status); |
1845 | return status; | 1848 | return status; |
1846 | } | 1849 | } |