lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Sun,  6 Jan 2008 02:21:50 +0100
From:	marcin.slusarz@...il.com
To:	LKML <linux-kernel@...r.kernel.org>
Cc:	Ben Fennema <bfennema@...con.csc.calpoly.edu>,
	Jan Kara <jack@...e.cz>, Christoph Hellwig <hch@...radead.org>,
	Marcin Slusarz <marcin.slusarz@...il.com>
Subject: [PATCH 4/7] udf: replace loops coded with goto to real loops

Signed-off-by: Marcin Slusarz <marcin.slusarz@...il.com>
---
 fs/udf/balloc.c |  309 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 157 insertions(+), 152 deletions(-)

diff --git a/fs/udf/balloc.c b/fs/udf/balloc.c
index d1d4b8f..5ce7926 100644
--- a/fs/udf/balloc.c
+++ b/fs/udf/balloc.c
@@ -183,46 +183,46 @@ static void udf_bitmap_free_blocks(struct super_block *sb,
 	block = bloc.logicalBlockNum + offset +
 		(sizeof(struct spaceBitmapDesc) << 3);
 
-do_more:
-	overflow = 0;
-	block_group = block >> (sb->s_blocksize_bits + 3);
-	bit = block % (sb->s_blocksize << 3);
+	do {
+		overflow = 0;
+		block_group = block >> (sb->s_blocksize_bits + 3);
+		bit = block % (sb->s_blocksize << 3);
 
-	/*
-	 * Check to see if we are freeing blocks across a group boundary.
-	 */
-	if (bit + count > (sb->s_blocksize << 3)) {
-		overflow = bit + count - (sb->s_blocksize << 3);
-		count -= overflow;
-	}
-	bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
-	if (bitmap_nr < 0)
-		goto error_return;
+		/*
+		* Check to see if we are freeing blocks across a group boundary.
+		*/
+		if (bit + count > (sb->s_blocksize << 3)) {
+			overflow = bit + count - (sb->s_blocksize << 3);
+			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_inc_free_space(sbi, sbi->s_partition, 1);
+		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_inc_free_space(sbi, sbi->s_partition, 1);
+			}
 		}
-	}
-	mark_buffer_dirty(bh);
-	if (overflow) {
-		block += count;
-		count = overflow;
-		goto do_more;
-	}
+		mark_buffer_dirty(bh);
+		if (overflow) {
+			block += count;
+			count = overflow;
+		}
+	} while (overflow);
+
 error_return:
 	sb->s_dirt = 1;
 	if (sbi->s_lvid_bh)
 		mark_buffer_dirty(sbi->s_lvid_bh);
 	mutex_unlock(&sbi->s_alloc_mutex);
-	return;
 }
 
 static int udf_bitmap_prealloc_blocks(struct super_block *sb,
@@ -246,39 +246,40 @@ static int udf_bitmap_prealloc_blocks(struct super_block *sb,
 	if (first_block + block_count > part_len)
 		block_count = part_len - first_block;
 
-repeat:
-	nr_groups = (sbi->s_partmaps[partition].s_partition_len +
-		     (sizeof(struct spaceBitmapDesc) << 3) +
-		     (sb->s_blocksize * 8) - 1) / (sb->s_blocksize * 8);
-	block = first_block + (sizeof(struct spaceBitmapDesc) << 3);
-	block_group = block >> (sb->s_blocksize_bits + 3);
-	group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc);
+	do {
+		nr_groups = (sbi->s_partmaps[partition].s_partition_len +
+			(sizeof(struct spaceBitmapDesc) << 3) +
+			(sb->s_blocksize * 8) - 1) / (sb->s_blocksize * 8);
+		block = first_block + (sizeof(struct spaceBitmapDesc) << 3);
+		block_group = block >> (sb->s_blocksize_bits + 3);
+		group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc);
 
-	bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
-	if (bitmap_nr < 0)
-		goto out;
-	bh = bitmap->s_block_bitmap[bitmap_nr];
+		bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
+		if (bitmap_nr < 0)
+			goto out;
+		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) {
-		if (!udf_test_bit(bit, bh->b_data)) {
-			goto out;
-		} else if (DQUOT_PREALLOC_BLOCK(inode, 1)) {
-			goto out;
-		} else if (!udf_clear_bit(bit, bh->b_data)) {
-			udf_debug("bit already cleared for block %d\n", bit);
-			DQUOT_FREE_BLOCK(inode, 1);
-			goto out;
+		while (bit < (sb->s_blocksize << 3) && block_count > 0) {
+			if (!udf_test_bit(bit, bh->b_data))
+				goto out;
+			else if (DQUOT_PREALLOC_BLOCK(inode, 1))
+				goto out;
+			else if (!udf_clear_bit(bit, bh->b_data)) {
+				udf_debug("bit already cleared for block %d\n",
+					  bit);
+				DQUOT_FREE_BLOCK(inode, 1);
+				goto out;
+			}
+			block_count--;
+			alloc_count++;
+			bit++;
+			block++;
 		}
-		block_count--;
-		alloc_count++;
-		bit++;
-		block++;
-	}
-	mark_buffer_dirty(bh);
-	if (block_count > 0)
-		goto repeat;
+		mark_buffer_dirty(bh);
+	} while (block_count > 0);
+
 out:
 	if (udf_inc_free_space(sbi, partition, -alloc_count))
 		mark_buffer_dirty(sbi->s_lvid_bh);
@@ -298,117 +299,121 @@ static int udf_bitmap_new_block(struct super_block *sb,
 	struct buffer_head *bh = NULL;
 	char *ptr;
 	int newblock = 0;
+	bool bit_already_cleared;
 
 	*err = -ENOSPC;
 	mutex_lock(&sbi->s_alloc_mutex);
 
-repeat:
-	if (goal < 0 || goal >= sbi->s_partmaps[partition].s_partition_len)
-		goal = 0;
-
-	nr_groups = bitmap->s_nr_groups;
-	block = goal + (sizeof(struct spaceBitmapDesc) << 3);
-	block_group = block >> (sb->s_blocksize_bits + 3);
-	group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc);
-
-	bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
-	if (bitmap_nr < 0)
-		goto error_return;
-	bh = bitmap->s_block_bitmap[bitmap_nr];
-	ptr = memscan((char *)bh->b_data + group_start, 0xFF,
-		      sb->s_blocksize - group_start);
-
-	if ((ptr - ((char *)bh->b_data)) < sb->s_blocksize) {
-		bit = block % (sb->s_blocksize << 3);
-		if (udf_test_bit(bit, bh->b_data))
-			goto got_block;
-
-		end_goal = (bit + 63) & ~63;
-		bit = udf_find_next_one_bit(bh->b_data, end_goal, bit);
-		if (bit < end_goal)
-			goto got_block;
-
-		ptr = memscan((char *)bh->b_data + (bit >> 3), 0xFF,
-			      sb->s_blocksize - ((bit + 7) >> 3));
-		newbit = (ptr - ((char *)bh->b_data)) << 3;
-		if (newbit < sb->s_blocksize << 3) {
-			bit = newbit;
-			goto search_back;
-		}
-
-		newbit = udf_find_next_one_bit(bh->b_data,
-					       sb->s_blocksize << 3, bit);
-		if (newbit < sb->s_blocksize << 3) {
-			bit = newbit;
-			goto got_block;
-		}
-	}
+	do {
+		if (goal < 0 ||
+		    goal >= sbi->s_partmaps[partition].s_partition_len)
+			goal = 0;
 
-	for (i = 0; i < (nr_groups * 2); i++) {
-		block_group++;
-		if (block_group >= nr_groups)
-			block_group = 0;
+		nr_groups = bitmap->s_nr_groups;
+		block = goal + (sizeof(struct spaceBitmapDesc) << 3);
+		block_group = block >> (sb->s_blocksize_bits + 3);
 		group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc);
 
 		bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
 		if (bitmap_nr < 0)
 			goto error_return;
 		bh = bitmap->s_block_bitmap[bitmap_nr];
-		if (i < nr_groups) {
-			ptr = memscan((char *)bh->b_data + group_start, 0xFF,
-				      sb->s_blocksize - group_start);
-			if ((ptr - ((char *)bh->b_data)) < sb->s_blocksize) {
-				bit = (ptr - ((char *)bh->b_data)) << 3;
-				break;
+		ptr = memscan(bh->b_data + group_start, 0xFF,
+			sb->s_blocksize - group_start);
+
+		if ((ptr - bh->b_data) < sb->s_blocksize) {
+			bit = block % (sb->s_blocksize << 3);
+			if (udf_test_bit(bit, bh->b_data))
+				goto got_block;
+
+			end_goal = (bit + 63) & ~63;
+			bit = udf_find_next_one_bit(bh->b_data, end_goal, bit);
+			if (bit < end_goal)
+				goto got_block;
+
+			ptr = memscan(bh->b_data + (bit >> 3), 0xFF,
+				sb->s_blocksize - ((bit + 7) >> 3));
+			newbit = (ptr - bh->b_data) << 3;
+			if (newbit < sb->s_blocksize << 3) {
+				bit = newbit;
+				goto search_back;
+			}
+
+			newbit = udf_find_next_one_bit(bh->b_data,
+						sb->s_blocksize << 3, bit);
+			if (newbit < sb->s_blocksize << 3) {
+				bit = newbit;
+				goto got_block;
 			}
-		} else {
-			bit = udf_find_next_one_bit((char *)bh->b_data,
-						    sb->s_blocksize << 3,
-						    group_start << 3);
-			if (bit < sb->s_blocksize << 3)
-				break;
 		}
-	}
-	if (i >= (nr_groups * 2)) {
-		mutex_unlock(&sbi->s_alloc_mutex);
-		return newblock;
-	}
-	if (bit < sb->s_blocksize << 3)
-		goto search_back;
-	else
-		bit = udf_find_next_one_bit(bh->b_data, sb->s_blocksize << 3,
-					    group_start << 3);
-	if (bit >= sb->s_blocksize << 3) {
-		mutex_unlock(&sbi->s_alloc_mutex);
-		return 0;
-	}
+
+		for (i = 0; i < (nr_groups * 2); i++) {
+			block_group++;
+			if (block_group >= nr_groups)
+				block_group = 0;
+			group_start = block_group ?
+					0 : sizeof(struct spaceBitmapDesc);
+
+			bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
+			if (bitmap_nr < 0)
+				goto error_return;
+			bh = bitmap->s_block_bitmap[bitmap_nr];
+			if (i < nr_groups) {
+				ptr = memscan(bh->b_data + group_start,
+					0xFF, sb->s_blocksize - group_start);
+				if ((ptr - bh->b_data) < sb->s_blocksize) {
+					bit = (ptr - bh->b_data) << 3;
+					break;
+				}
+			} else {
+				bit = udf_find_next_one_bit(bh->b_data,
+							sb->s_blocksize << 3,
+							group_start << 3);
+				if (bit < sb->s_blocksize << 3)
+					break;
+			}
+		}
+		if (i >= (nr_groups * 2)) {
+			mutex_unlock(&sbi->s_alloc_mutex);
+			return newblock;
+		}
+		if (bit < sb->s_blocksize << 3)
+			goto search_back;
+		else
+			bit = udf_find_next_one_bit(bh->b_data,
+							sb->s_blocksize << 3,
+							group_start << 3);
+		if (bit >= sb->s_blocksize << 3) {
+			mutex_unlock(&sbi->s_alloc_mutex);
+			return 0;
+		}
 
 search_back:
-	i = 0;
-	while (i < 7 && bit > (group_start << 3) &&
-	       udf_test_bit(bit - 1, bh->b_data)) {
-		++i;
-		--bit;
-	}
+		i = 0;
+		while (i < 7 && bit > (group_start << 3) &&
+				udf_test_bit(bit - 1, bh->b_data)) {
+			++i;
+			--bit;
+		}
 
 got_block:
 
-	/*
-	 * Check quota for allocation of this block.
-	 */
-	if (inode && DQUOT_ALLOC_BLOCK(inode, 1)) {
-		mutex_unlock(&sbi->s_alloc_mutex);
-		*err = -EDQUOT;
-		return 0;
-	}
+		/*
+		* Check quota for allocation of this block.
+		*/
+		if (inode && DQUOT_ALLOC_BLOCK(inode, 1)) {
+			mutex_unlock(&sbi->s_alloc_mutex);
+			*err = -EDQUOT;
+			return 0;
+		}
 
-	newblock = bit + (block_group << (sb->s_blocksize_bits + 3)) -
-		(sizeof(struct spaceBitmapDesc) << 3);
+		newblock = bit + (block_group << (sb->s_blocksize_bits + 3)) -
+			(sizeof(struct spaceBitmapDesc) << 3);
 
-	if (!udf_clear_bit(bit, bh->b_data)) {
-		udf_debug("bit already cleared for block %d\n", bit);
-		goto repeat;
-	}
+		bit_already_cleared = !udf_clear_bit(bit, bh->b_data);
+		if (bit_already_cleared)
+			udf_debug("bit already cleared for block %d\n", bit);
+	} while (bit_already_cleared);
 
 	mark_buffer_dirty(bh);
 
-- 
1.5.3.7

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ