[PATCH v1 7/9] ext2: annotate block-mapping helpers as requiring truncate_mutex
From: Timothy Day
Date: Sun Jul 12 2026 - 13:00:37 EST
The indirect-block mapping helpers in inode.c all run under the
inode's truncate_mutex.
ext2_find_goal(), ext2_alloc_blocks(), ext2_alloc_branch() and
ext2_splice_branch() are reached only from ext2_get_blocks() while
it holds the mutex. ext2_find_shared(), ext2_free_data() and
ext2_free_branches() are called from __ext2_truncate_blocks() while
it holds the mutex.
Add __must_hold() annotations for the Clang's context analysis to reflect
this.
Signed-off-by: Timothy Day <timday@xxxxxxxxxxxxxxxxxxxxxxx>
---
fs/ext2/inode.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c
index 29808629cce56..f0be5236d04e0 100644
--- a/fs/ext2/inode.c
+++ b/fs/ext2/inode.c
@@ -329,6 +329,7 @@ static ext2_fsblk_t ext2_find_near(struct inode *inode, Indirect *ind)
static inline ext2_fsblk_t ext2_find_goal(struct inode *inode, long block,
Indirect *partial)
+ __must_hold(&EXT2_I(inode)->truncate_mutex)
{
struct ext2_block_alloc_info *block_i;
@@ -399,6 +400,7 @@ ext2_blks_to_allocate(Indirect * branch, int k, unsigned long blks,
static int ext2_alloc_blocks(struct inode *inode,
ext2_fsblk_t goal, int indirect_blks, int blks,
ext2_fsblk_t new_blocks[4], int *err)
+ __must_hold(&EXT2_I(inode)->truncate_mutex)
{
int target, i;
unsigned long count = 0;
@@ -479,6 +481,7 @@ static int ext2_alloc_blocks(struct inode *inode,
static int ext2_alloc_branch(struct inode *inode,
int indirect_blks, int *blks, ext2_fsblk_t goal,
int *offsets, Indirect *branch)
+ __must_hold(&EXT2_I(inode)->truncate_mutex)
{
int blocksize = inode->i_sb->s_blocksize;
int i, n = 0;
@@ -560,6 +563,7 @@ static int ext2_alloc_branch(struct inode *inode,
*/
static void ext2_splice_branch(struct inode *inode,
long block, Indirect *where, int num, int blks)
+ __must_hold(&EXT2_I(inode)->truncate_mutex)
{
int i;
struct ext2_block_alloc_info *block_i;
@@ -1002,6 +1006,7 @@ static Indirect *ext2_find_shared(struct inode *inode,
int offsets[4],
Indirect chain[4],
__le32 *top)
+ __must_hold(&EXT2_I(inode)->truncate_mutex)
{
Indirect *partial, *p;
int k, err;
@@ -1057,6 +1062,7 @@ static Indirect *ext2_find_shared(struct inode *inode,
* appropriately.
*/
static inline void ext2_free_data(struct inode *inode, __le32 *p, __le32 *q)
+ __must_hold(&EXT2_I(inode)->truncate_mutex)
{
ext2_fsblk_t block_to_free = 0, count = 0;
ext2_fsblk_t nr;
@@ -1097,6 +1103,7 @@ static inline void ext2_free_data(struct inode *inode, __le32 *p, __le32 *q)
* appropriately.
*/
static void ext2_free_branches(struct inode *inode, __le32 *p, __le32 *q, int depth)
+ __must_hold(&EXT2_I(inode)->truncate_mutex)
{
struct buffer_head * bh;
ext2_fsblk_t nr;
--
2.39.5