diff options
Diffstat (limited to 'fs/ext3/xattr.c')
| -rw-r--r-- | fs/ext3/xattr.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c index 32e6cc23bd9..d565759d82e 100644 --- a/fs/ext3/xattr.c +++ b/fs/ext3/xattr.c @@ -803,8 +803,16 @@ inserted:  			/* We need to allocate a new block */  			ext3_fsblk_t goal = ext3_group_first_block_no(sb,  						EXT3_I(inode)->i_block_group); -			ext3_fsblk_t block = ext3_new_block(handle, inode, -							goal, &error); +			ext3_fsblk_t block; + +			/* +			 * Protect us agaist concurrent allocations to the +			 * same inode from ext3_..._writepage(). Reservation +			 * code does not expect racing allocations. +			 */ +			mutex_lock(&EXT3_I(inode)->truncate_mutex); +			block = ext3_new_block(handle, inode, goal, &error); +			mutex_unlock(&EXT3_I(inode)->truncate_mutex);  			if (error)  				goto cleanup;  			ea_idebug(inode, "creating block %d", block);  |