udf: Remove BKL from free space counting functions
authorJan Kara <jack@suse.cz>
Wed, 20 Oct 2010 21:24:12 +0000 (23:24 +0200)
committerJan Kara <jack@suse.cz>
Thu, 6 Jan 2011 16:03:56 +0000 (17:03 +0100)
udf_count_free_bitmap() does not need BKL because bitmaps are in a fixed
place on disk and so we can count set bits without serialization.
udf_count_free_table() is now protected by s_alloc_mutex instead of BKL
to get a consistent view of free space extents.

Signed-off-by: Jan Kara <jack@suse.cz>
fs/udf/super.c

index 4cf6121..d2ec9f3 100644 (file)
@@ -2207,8 +2207,6 @@ static unsigned int udf_count_free_bitmap(struct super_block *sb,
        uint16_t ident;
        struct spaceBitmapDesc *bm;
 
-       lock_kernel();
-
        loc.logicalBlockNum = bitmap->s_extPosition;
        loc.partitionReferenceNum = UDF_SB(sb)->s_partition;
        bh = udf_read_ptagged(sb, &loc, 0, &ident);
@@ -2245,10 +2243,7 @@ static unsigned int udf_count_free_bitmap(struct super_block *sb,
                }
        }
        brelse(bh);
-
 out:
-       unlock_kernel();
-
        return accum;
 }
 
@@ -2261,8 +2256,7 @@ static unsigned int udf_count_free_table(struct super_block *sb,
        int8_t etype;
        struct extent_position epos;
 
-       lock_kernel();
-
+       mutex_lock(&UDF_SB(sb)->s_alloc_mutex);
        epos.block = UDF_I(table)->i_location;
        epos.offset = sizeof(struct unallocSpaceEntry);
        epos.bh = NULL;
@@ -2271,8 +2265,7 @@ static unsigned int udf_count_free_table(struct super_block *sb,
                accum += (elen >> table->i_sb->s_blocksize_bits);
 
        brelse(epos.bh);
-
-       unlock_kernel();
+       mutex_unlock(&UDF_SB(sb)->s_alloc_mutex);
 
        return accum;
 }