inode.c (f12fbb9599e2ecca734d194e502fc1ac6822c85e) inode.c (df7363307ead980c9cd659b2f7adf9b6c265b7f3)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * linux/fs/ext4/inode.c
4 *
5 * Copyright (C) 1992, 1993, 1994, 1995
6 * Remy Card (card@masi.ibp.fr)
7 * Laboratoire MASI - Institut Blaise Pascal
8 * Universite Pierre et Marie Curie (Paris VI)

--- 1723 unchanged lines hidden (view full) ---

1732 ext_debug(inode, "max_blocks %u, logical block %lu\n", map->m_len,
1733 (unsigned long) map->m_lblk);
1734
1735 /* Lookup extent status tree firstly */
1736 if (ext4_es_lookup_extent(inode, iblock, NULL, &es)) {
1737 if (ext4_es_is_hole(&es))
1738 goto add_delayed;
1739
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * linux/fs/ext4/inode.c
4 *
5 * Copyright (C) 1992, 1993, 1994, 1995
6 * Remy Card (card@masi.ibp.fr)
7 * Laboratoire MASI - Institut Blaise Pascal
8 * Universite Pierre et Marie Curie (Paris VI)

--- 1723 unchanged lines hidden (view full) ---

1732 ext_debug(inode, "max_blocks %u, logical block %lu\n", map->m_len,
1733 (unsigned long) map->m_lblk);
1734
1735 /* Lookup extent status tree firstly */
1736 if (ext4_es_lookup_extent(inode, iblock, NULL, &es)) {
1737 if (ext4_es_is_hole(&es))
1738 goto add_delayed;
1739
1740found:
1740 /*
1741 * Delayed extent could be allocated by fallocate.
1742 * So we need to check it.
1743 */
1744 if (ext4_es_is_delayed(&es) && !ext4_es_is_unwritten(&es)) {
1745 map_bh(bh, inode->i_sb, invalid_block);
1746 set_buffer_new(bh);
1747 set_buffer_delay(bh);

--- 28 unchanged lines hidden (view full) ---

1776 else
1777 retval = ext4_map_query_blocks(NULL, inode, map);
1778 up_read(&EXT4_I(inode)->i_data_sem);
1779 if (retval)
1780 return retval;
1781
1782add_delayed:
1783 down_write(&EXT4_I(inode)->i_data_sem);
1741 /*
1742 * Delayed extent could be allocated by fallocate.
1743 * So we need to check it.
1744 */
1745 if (ext4_es_is_delayed(&es) && !ext4_es_is_unwritten(&es)) {
1746 map_bh(bh, inode->i_sb, invalid_block);
1747 set_buffer_new(bh);
1748 set_buffer_delay(bh);

--- 28 unchanged lines hidden (view full) ---

1777 else
1778 retval = ext4_map_query_blocks(NULL, inode, map);
1779 up_read(&EXT4_I(inode)->i_data_sem);
1780 if (retval)
1781 return retval;
1782
1783add_delayed:
1784 down_write(&EXT4_I(inode)->i_data_sem);
1785 /*
1786 * Page fault path (ext4_page_mkwrite does not take i_rwsem)
1787 * and fallocate path (no folio lock) can race. Make sure we
1788 * lookup the extent status tree here again while i_data_sem
1789 * is held in write mode, before inserting a new da entry in
1790 * the extent status tree.
1791 */
1792 if (ext4_es_lookup_extent(inode, iblock, NULL, &es)) {
1793 if (!ext4_es_is_hole(&es)) {
1794 up_write(&EXT4_I(inode)->i_data_sem);
1795 goto found;
1796 }
1797 } else if (!ext4_has_inline_data(inode)) {
1798 retval = ext4_map_query_blocks(NULL, inode, map);
1799 if (retval) {
1800 up_write(&EXT4_I(inode)->i_data_sem);
1801 return retval;
1802 }
1803 }
1804
1784 retval = ext4_insert_delayed_block(inode, map->m_lblk);
1785 up_write(&EXT4_I(inode)->i_data_sem);
1786 if (retval)
1787 return retval;
1788
1789 map_bh(bh, inode->i_sb, invalid_block);
1790 set_buffer_new(bh);
1791 set_buffer_delay(bh);

--- 4403 unchanged lines hidden ---
1805 retval = ext4_insert_delayed_block(inode, map->m_lblk);
1806 up_write(&EXT4_I(inode)->i_data_sem);
1807 if (retval)
1808 return retval;
1809
1810 map_bh(bh, inode->i_sb, invalid_block);
1811 set_buffer_new(bh);
1812 set_buffer_delay(bh);

--- 4403 unchanged lines hidden ---