Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1668fe3 authored by Jan Kara's avatar Jan Kara
Browse files

udf: Remove BKL from free space counting functions



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: default avatarJan Kara <jack@suse.cz>
parent 7abc2e45
Loading
Loading
Loading
Loading
+2 −9
Original line number Diff line number Diff line
@@ -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;
}