Signed-off-by: Marcin Slusarz <[EMAIL PROTECTED]>
---
 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 [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to