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}