Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 96810
b: refs/heads/master
c: 519deca
h: refs/heads/master
v: v3
  • Loading branch information
Aneesh Kumar K.V authored and Theodore Ts'o committed May 15, 2008
1 parent c1c1a82 commit 19fbffc
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1930479c4b6bbcb6f164a5b3498e0d98329967f4
refs/heads/master: 519deca0496a4df07d15acf3181ca5d573bffdec
17 changes: 11 additions & 6 deletions trunk/fs/ext4/balloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -287,11 +287,11 @@ read_block_bitmap(struct super_block *sb, ext4_group_t block_group)
(int)block_group, (unsigned long long)bitmap_blk);
return NULL;
}
if (!ext4_valid_block_bitmap(sb, desc, block_group, bh)) {
put_bh(bh);
return NULL;
}

ext4_valid_block_bitmap(sb, desc, block_group, bh);
/*
* file system mounted not to panic on error,
* continue with corrupt bitmap
*/
return bh;
}
/*
Expand Down Expand Up @@ -1770,7 +1770,12 @@ ext4_fsblk_t ext4_new_blocks_old(handle_t *handle, struct inode *inode,
"Allocating block in system zone - "
"blocks from %llu, length %lu",
ret_block, num);
goto out;
/*
* claim_block marked the blocks we allocated
* as in use. So we may want to selectively
* mark some of the blocks as free
*/
goto retry_alloc;
}

performed_allocation = 1;
Expand Down
47 changes: 36 additions & 11 deletions trunk/fs/ext4/mballoc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2736,7 +2736,7 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
struct ext4_sb_info *sbi;
struct super_block *sb;
ext4_fsblk_t block;
int err;
int err, len;

BUG_ON(ac->ac_status != AC_STATUS_FOUND);
BUG_ON(ac->ac_b_ex.fe_len <= 0);
Expand Down Expand Up @@ -2770,14 +2770,27 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
+ ac->ac_b_ex.fe_start
+ le32_to_cpu(es->s_first_data_block);

if (block == ext4_block_bitmap(sb, gdp) ||
block == ext4_inode_bitmap(sb, gdp) ||
in_range(block, ext4_inode_table(sb, gdp),
EXT4_SB(sb)->s_itb_per_group)) {

len = ac->ac_b_ex.fe_len;
if (in_range(ext4_block_bitmap(sb, gdp), block, len) ||
in_range(ext4_inode_bitmap(sb, gdp), block, len) ||
in_range(block, ext4_inode_table(sb, gdp),
EXT4_SB(sb)->s_itb_per_group) ||
in_range(block + len - 1, ext4_inode_table(sb, gdp),
EXT4_SB(sb)->s_itb_per_group)) {
ext4_error(sb, __func__,
"Allocating block in system zone - block = %llu",
block);
/* File system mounted not to panic on error
* Fix the bitmap and repeat the block allocation
* We leak some of the blocks here.
*/
mb_set_bits(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group),
bitmap_bh->b_data, ac->ac_b_ex.fe_start,
ac->ac_b_ex.fe_len);
err = ext4_journal_dirty_metadata(handle, bitmap_bh);
if (!err)
err = -EAGAIN;
goto out_err;
}
#ifdef AGGRESSIVE_CHECK
{
Expand Down Expand Up @@ -4032,7 +4045,6 @@ ext4_fsblk_t ext4_mb_new_blocks(handle_t *handle,

ac->ac_op = EXT4_MB_HISTORY_ALLOC;
ext4_mb_normalize_request(ac, ar);

repeat:
/* allocate space in core */
ext4_mb_regular_allocator(ac);
Expand All @@ -4046,10 +4058,21 @@ ext4_fsblk_t ext4_mb_new_blocks(handle_t *handle,
}

if (likely(ac->ac_status == AC_STATUS_FOUND)) {
ext4_mb_mark_diskspace_used(ac, handle);
*errp = 0;
block = ext4_grp_offs_to_block(sb, &ac->ac_b_ex);
ar->len = ac->ac_b_ex.fe_len;
*errp = ext4_mb_mark_diskspace_used(ac, handle);
if (*errp == -EAGAIN) {
ac->ac_b_ex.fe_group = 0;
ac->ac_b_ex.fe_start = 0;
ac->ac_b_ex.fe_len = 0;
ac->ac_status = AC_STATUS_CONTINUE;
goto repeat;
} else if (*errp) {
ac->ac_b_ex.fe_len = 0;
ar->len = 0;
ext4_mb_show_ac(ac);
} else {
block = ext4_grp_offs_to_block(sb, &ac->ac_b_ex);
ar->len = ac->ac_b_ex.fe_len;
}
} else {
freed = ext4_mb_discard_preallocations(sb, ac->ac_o_ex.fe_len);
if (freed)
Expand Down Expand Up @@ -4236,6 +4259,8 @@ void ext4_mb_free_blocks(handle_t *handle, struct inode *inode,
ext4_error(sb, __func__,
"Freeing blocks in system zone - "
"Block = %lu, count = %lu", block, count);
/* err = 0. ext4_std_error should be a no op */
goto error_return;
}

BUFFER_TRACE(bitmap_bh, "getting write access");
Expand Down

0 comments on commit 19fbffc

Please sign in to comment.