udf: replace loops coded with goto to real loops
Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com> Acked-by: Jan Kara <jack@suse.cz> Cc: Christoph Hellwig <hch@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
742ba02a51
commit
4daa1b8799
120
fs/udf/balloc.c
120
fs/udf/balloc.c
@@ -183,46 +183,46 @@ static void udf_bitmap_free_blocks(struct super_block *sb,
|
|||||||
block = bloc.logicalBlockNum + offset +
|
block = bloc.logicalBlockNum + offset +
|
||||||
(sizeof(struct spaceBitmapDesc) << 3);
|
(sizeof(struct spaceBitmapDesc) << 3);
|
||||||
|
|
||||||
do_more:
|
do {
|
||||||
overflow = 0;
|
overflow = 0;
|
||||||
block_group = block >> (sb->s_blocksize_bits + 3);
|
block_group = block >> (sb->s_blocksize_bits + 3);
|
||||||
bit = block % (sb->s_blocksize << 3);
|
bit = block % (sb->s_blocksize << 3);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check to see if we are freeing blocks across a group boundary.
|
* Check to see if we are freeing blocks across a group boundary.
|
||||||
*/
|
*/
|
||||||
if (bit + count > (sb->s_blocksize << 3)) {
|
if (bit + count > (sb->s_blocksize << 3)) {
|
||||||
overflow = bit + count - (sb->s_blocksize << 3);
|
overflow = bit + count - (sb->s_blocksize << 3);
|
||||||
count -= overflow;
|
count -= overflow;
|
||||||
}
|
|
||||||
bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
|
|
||||||
if (bitmap_nr < 0)
|
|
||||||
goto error_return;
|
|
||||||
|
|
||||||
bh = bitmap->s_block_bitmap[bitmap_nr];
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
if (udf_set_bit(bit + i, bh->b_data)) {
|
|
||||||
udf_debug("bit %ld already set\n", bit + i);
|
|
||||||
udf_debug("byte=%2x\n",
|
|
||||||
((char *)bh->b_data)[(bit + i) >> 3]);
|
|
||||||
} else {
|
|
||||||
if (inode)
|
|
||||||
DQUOT_FREE_BLOCK(inode, 1);
|
|
||||||
udf_add_free_space(sbi, sbi->s_partition, 1);
|
|
||||||
}
|
}
|
||||||
}
|
bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
|
||||||
mark_buffer_dirty(bh);
|
if (bitmap_nr < 0)
|
||||||
if (overflow) {
|
goto error_return;
|
||||||
block += count;
|
|
||||||
count = overflow;
|
bh = bitmap->s_block_bitmap[bitmap_nr];
|
||||||
goto do_more;
|
for (i = 0; i < count; i++) {
|
||||||
}
|
if (udf_set_bit(bit + i, bh->b_data)) {
|
||||||
|
udf_debug("bit %ld already set\n", bit + i);
|
||||||
|
udf_debug("byte=%2x\n",
|
||||||
|
((char *)bh->b_data)[(bit + i) >> 3]);
|
||||||
|
} else {
|
||||||
|
if (inode)
|
||||||
|
DQUOT_FREE_BLOCK(inode, 1);
|
||||||
|
udf_add_free_space(sbi, sbi->s_partition, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mark_buffer_dirty(bh);
|
||||||
|
if (overflow) {
|
||||||
|
block += count;
|
||||||
|
count = overflow;
|
||||||
|
}
|
||||||
|
} while (overflow);
|
||||||
|
|
||||||
error_return:
|
error_return:
|
||||||
sb->s_dirt = 1;
|
sb->s_dirt = 1;
|
||||||
if (sbi->s_lvid_bh)
|
if (sbi->s_lvid_bh)
|
||||||
mark_buffer_dirty(sbi->s_lvid_bh);
|
mark_buffer_dirty(sbi->s_lvid_bh);
|
||||||
mutex_unlock(&sbi->s_alloc_mutex);
|
mutex_unlock(&sbi->s_alloc_mutex);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int udf_bitmap_prealloc_blocks(struct super_block *sb,
|
static int udf_bitmap_prealloc_blocks(struct super_block *sb,
|
||||||
@@ -246,37 +246,37 @@ static int udf_bitmap_prealloc_blocks(struct super_block *sb,
|
|||||||
if (first_block + block_count > part_len)
|
if (first_block + block_count > part_len)
|
||||||
block_count = part_len - first_block;
|
block_count = part_len - first_block;
|
||||||
|
|
||||||
repeat:
|
do {
|
||||||
nr_groups = udf_compute_nr_groups(sb, partition);
|
nr_groups = udf_compute_nr_groups(sb, partition);
|
||||||
block = first_block + (sizeof(struct spaceBitmapDesc) << 3);
|
block = first_block + (sizeof(struct spaceBitmapDesc) << 3);
|
||||||
block_group = block >> (sb->s_blocksize_bits + 3);
|
block_group = block >> (sb->s_blocksize_bits + 3);
|
||||||
group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc);
|
group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc);
|
||||||
|
|
||||||
bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
|
bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
|
||||||
if (bitmap_nr < 0)
|
if (bitmap_nr < 0)
|
||||||
goto out;
|
goto out;
|
||||||
bh = bitmap->s_block_bitmap[bitmap_nr];
|
bh = bitmap->s_block_bitmap[bitmap_nr];
|
||||||
|
|
||||||
bit = block % (sb->s_blocksize << 3);
|
bit = block % (sb->s_blocksize << 3);
|
||||||
|
|
||||||
while (bit < (sb->s_blocksize << 3) && block_count > 0) {
|
while (bit < (sb->s_blocksize << 3) && block_count > 0) {
|
||||||
if (!udf_test_bit(bit, bh->b_data)) {
|
if (!udf_test_bit(bit, bh->b_data))
|
||||||
goto out;
|
goto out;
|
||||||
} else if (DQUOT_PREALLOC_BLOCK(inode, 1)) {
|
else if (DQUOT_PREALLOC_BLOCK(inode, 1))
|
||||||
goto out;
|
goto out;
|
||||||
} else if (!udf_clear_bit(bit, bh->b_data)) {
|
else if (!udf_clear_bit(bit, bh->b_data)) {
|
||||||
udf_debug("bit already cleared for block %d\n", bit);
|
udf_debug("bit already cleared for block %d\n", bit);
|
||||||
DQUOT_FREE_BLOCK(inode, 1);
|
DQUOT_FREE_BLOCK(inode, 1);
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
|
block_count--;
|
||||||
|
alloc_count++;
|
||||||
|
bit++;
|
||||||
|
block++;
|
||||||
}
|
}
|
||||||
block_count--;
|
mark_buffer_dirty(bh);
|
||||||
alloc_count++;
|
} while (block_count > 0);
|
||||||
bit++;
|
|
||||||
block++;
|
|
||||||
}
|
|
||||||
mark_buffer_dirty(bh);
|
|
||||||
if (block_count > 0)
|
|
||||||
goto repeat;
|
|
||||||
out:
|
out:
|
||||||
if (udf_add_free_space(sbi, partition, -alloc_count))
|
if (udf_add_free_space(sbi, partition, -alloc_count))
|
||||||
mark_buffer_dirty(sbi->s_lvid_bh);
|
mark_buffer_dirty(sbi->s_lvid_bh);
|
||||||
|
Reference in New Issue
Block a user