@@ -1649,6 +1649,35 @@ static void ext4_print_free_blocks(struct inode *inode)
1649
1649
return ;
1650
1650
}
1651
1651
1652
+ /*
1653
+ * Check whether the cluster containing lblk has been allocated or has
1654
+ * delalloc reservation.
1655
+ *
1656
+ * Returns 0 if the cluster doesn't have either, 1 if it has delalloc
1657
+ * reservation, 2 if it's already been allocated, negative error code on
1658
+ * failure.
1659
+ */
1660
+ static int ext4_clu_alloc_state (struct inode * inode , ext4_lblk_t lblk )
1661
+ {
1662
+ struct ext4_sb_info * sbi = EXT4_SB (inode -> i_sb );
1663
+ int ret ;
1664
+
1665
+ /* Has delalloc reservation? */
1666
+ if (ext4_es_scan_clu (inode , & ext4_es_is_delonly , lblk ))
1667
+ return 1 ;
1668
+
1669
+ /* Already been allocated? */
1670
+ if (ext4_es_scan_clu (inode , & ext4_es_is_mapped , lblk ))
1671
+ return 2 ;
1672
+ ret = ext4_clu_mapped (inode , EXT4_B2C (sbi , lblk ));
1673
+ if (ret < 0 )
1674
+ return ret ;
1675
+ if (ret > 0 )
1676
+ return 2 ;
1677
+
1678
+ return 0 ;
1679
+ }
1680
+
1652
1681
/*
1653
1682
* ext4_insert_delayed_block - adds a delayed block to the extents status
1654
1683
* tree, incrementing the reserved cluster/block
@@ -1682,23 +1711,15 @@ static int ext4_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk)
1682
1711
if (ret != 0 ) /* ENOSPC */
1683
1712
return ret ;
1684
1713
} else { /* bigalloc */
1685
- if (!ext4_es_scan_clu (inode , & ext4_es_is_delonly , lblk )) {
1686
- if (!ext4_es_scan_clu (inode ,
1687
- & ext4_es_is_mapped , lblk )) {
1688
- ret = ext4_clu_mapped (inode ,
1689
- EXT4_B2C (sbi , lblk ));
1690
- if (ret < 0 )
1691
- return ret ;
1692
- if (ret == 0 ) {
1693
- ret = ext4_da_reserve_space (inode , 1 );
1694
- if (ret != 0 ) /* ENOSPC */
1695
- return ret ;
1696
- } else {
1697
- allocated = true;
1698
- }
1699
- } else {
1700
- allocated = true;
1701
- }
1714
+ ret = ext4_clu_alloc_state (inode , lblk );
1715
+ if (ret < 0 )
1716
+ return ret ;
1717
+ if (ret == 2 )
1718
+ allocated = true;
1719
+ if (ret == 0 ) {
1720
+ ret = ext4_da_reserve_space (inode , 1 );
1721
+ if (ret != 0 ) /* ENOSPC */
1722
+ return ret ;
1702
1723
}
1703
1724
}
1704
1725
0 commit comments