extents_status.c (b6bf9171ef5c37b66d446378ba63af5339a56a97) | extents_status.c (f456767d3391e9f7d9d25a2e7241d75676dc19da) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/ext4/extents_status.c 4 * 5 * Written by Yongqiang Yang <xiaoqiangnk@gmail.com> 6 * Modified by 7 * Allison Henderson <achender@linux.vnet.ibm.com> 8 * Hugh Dickins <hughd@google.com> --- 1766 unchanged lines hidden (view full) --- 1775 l_del = __es_scan_range(inode, &ext4_es_is_delonly, 1776 end + 1, last); 1777 if (l_del) 1778 __insert_pending(inode, last); 1779 else 1780 __remove_pending(inode, last); 1781 } 1782} | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/ext4/extents_status.c 4 * 5 * Written by Yongqiang Yang <xiaoqiangnk@gmail.com> 6 * Modified by 7 * Allison Henderson <achender@linux.vnet.ibm.com> 8 * Hugh Dickins <hughd@google.com> --- 1766 unchanged lines hidden (view full) --- 1775 l_del = __es_scan_range(inode, &ext4_es_is_delonly, 1776 end + 1, last); 1777 if (l_del) 1778 __insert_pending(inode, last); 1779 else 1780 __remove_pending(inode, last); 1781 } 1782} |
1783 1784/* 1785 * ext4_es_remove_blks - remove block range from extents status tree and 1786 * reduce reservation count or cancel pending 1787 * reservation as needed 1788 * 1789 * @inode - file containing range 1790 * @lblk - first block in range 1791 * @len - number of blocks to remove 1792 * 1793 */ 1794void ext4_es_remove_blks(struct inode *inode, ext4_lblk_t lblk, 1795 ext4_lblk_t len) 1796{ 1797 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); 1798 unsigned int clu_size, reserved = 0; 1799 ext4_lblk_t last_lclu, first, length, remainder, last; 1800 bool delonly; 1801 int err = 0; 1802 struct pending_reservation *pr; 1803 struct ext4_pending_tree *tree; 1804 1805 /* 1806 * Process cluster by cluster for bigalloc - there may be up to 1807 * two clusters in a 4k page with a 1k block size and two blocks 1808 * per cluster. Also necessary for systems with larger page sizes 1809 * and potentially larger block sizes. 1810 */ 1811 clu_size = sbi->s_cluster_ratio; 1812 last_lclu = EXT4_B2C(sbi, lblk + len - 1); 1813 1814 write_lock(&EXT4_I(inode)->i_es_lock); 1815 1816 for (first = lblk, remainder = len; 1817 remainder > 0; 1818 first += length, remainder -= length) { 1819 1820 if (EXT4_B2C(sbi, first) == last_lclu) 1821 length = remainder; 1822 else 1823 length = clu_size - EXT4_LBLK_COFF(sbi, first); 1824 1825 /* 1826 * The BH_Delay flag, which triggers calls to this function, 1827 * and the contents of the extents status tree can be 1828 * inconsistent due to writepages activity. So, note whether 1829 * the blocks to be removed actually belong to an extent with 1830 * delayed only status. 1831 */ 1832 delonly = __es_scan_clu(inode, &ext4_es_is_delonly, first); 1833 1834 /* 1835 * because of the writepages effect, written and unwritten 1836 * blocks could be removed here 1837 */ 1838 last = first + length - 1; 1839 err = __es_remove_extent(inode, first, last); 1840 if (err) 1841 ext4_warning(inode->i_sb, 1842 "%s: couldn't remove page (err = %d)", 1843 __func__, err); 1844 1845 /* non-bigalloc case: simply count the cluster for release */ 1846 if (sbi->s_cluster_ratio == 1 && delonly) { 1847 reserved++; 1848 continue; 1849 } 1850 1851 /* 1852 * bigalloc case: if all delayed allocated only blocks have 1853 * just been removed from a cluster, either cancel a pending 1854 * reservation if it exists or count a cluster for release 1855 */ 1856 if (delonly && 1857 !__es_scan_clu(inode, &ext4_es_is_delonly, first)) { 1858 pr = __get_pending(inode, EXT4_B2C(sbi, first)); 1859 if (pr != NULL) { 1860 tree = &EXT4_I(inode)->i_pending_tree; 1861 rb_erase(&pr->rb_node, &tree->root); 1862 kmem_cache_free(ext4_pending_cachep, pr); 1863 } else { 1864 reserved++; 1865 } 1866 } 1867 } 1868 1869 write_unlock(&EXT4_I(inode)->i_es_lock); 1870 1871 ext4_da_release_space(inode, reserved); 1872} |
|