diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 9a4125a5da57ddb49de276ab3d73f6f2385f1a52..ce88148cdc4adcd5a33db5fa3714b98637ec43aa 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1729,7 +1729,14 @@ static void mpage_release_unused_pages(struct mpage_da_data *mpd,
 		ext4_lblk_t start, last;
 		start = index << (PAGE_SHIFT - inode->i_blkbits);
 		last = end << (PAGE_SHIFT - inode->i_blkbits);
+
+		/*
+		 * avoid racing with extent status tree scans made by
+		 * ext4_insert_delayed_block()
+		 */
+		down_write(&EXT4_I(inode)->i_data_sem);
 		ext4_es_remove_extent(inode, start, last - start + 1);
+		up_write(&EXT4_I(inode)->i_data_sem);
 	}
 
 	pagevec_init(&pvec);