]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: stop clearing EXTENT_DIRTY in inode I/O tree
authorOmar Sandoval <osandov@fb.com>
Thu, 15 Aug 2019 21:04:04 +0000 (14:04 -0700)
committerDavid Sterba <dsterba@suse.com>
Mon, 9 Sep 2019 12:59:17 +0000 (14:59 +0200)
Since commit fee187d9d9dd ("Btrfs: do not set EXTENT_DIRTY along with
EXTENT_DELALLOC"), we never set EXTENT_DIRTY in inode->io_tree, so we
can simplify and stop trying to clear it.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c
fs/btrfs/file.c
fs/btrfs/free-space-cache.c
fs/btrfs/inode.c
fs/btrfs/ioctl.c
fs/btrfs/tests/inode-tests.c

index bac59d721b54cf13bbe6d2f07c69655bc6361232..4dc5e69398564f81da25fb31568e64e95270c81f 100644 (file)
@@ -4322,10 +4322,8 @@ int extent_invalidatepage(struct extent_io_tree *tree,
 
        lock_extent_bits(tree, start, end, &cached_state);
        wait_on_page_writeback(page);
-       clear_extent_bit(tree, start, end,
-                        EXTENT_LOCKED | EXTENT_DIRTY | EXTENT_DELALLOC |
-                        EXTENT_DO_ACCOUNTING,
-                        1, 1, &cached_state);
+       clear_extent_bit(tree, start, end, EXTENT_LOCKED | EXTENT_DELALLOC |
+                        EXTENT_DO_ACCOUNTING, 1, 1, &cached_state);
        return 0;
 }
 
index 702c30a28a43eae801a9a29ea3ad28c86dce2625..8fe4eb7e504527914965012b048c0b27a8736b03 100644 (file)
@@ -537,8 +537,8 @@ int btrfs_dirty_pages(struct inode *inode, struct page **pages,
         * we can set things up properly
         */
        clear_extent_bit(&BTRFS_I(inode)->io_tree, start_pos, end_of_last_block,
-                        EXTENT_DIRTY | EXTENT_DELALLOC |
-                        EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG, 0, 0, cached);
+                        EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG,
+                        0, 0, cached);
 
        if (!btrfs_is_free_space_inode(BTRFS_I(inode))) {
                if (start_pos >= isize &&
index ab806d82fe12a8f8b689dc79878793517a8f881f..d54dcd0ab23058cc8fad6ef093ac0a552f00577a 100644 (file)
@@ -1006,7 +1006,7 @@ update_cache_item(struct btrfs_trans_handle *trans,
        ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
        if (ret < 0) {
                clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, inode->i_size - 1,
-                                EXTENT_DIRTY | EXTENT_DELALLOC, 0, 0, NULL);
+                                EXTENT_DELALLOC, 0, 0, NULL);
                goto fail;
        }
        leaf = path->nodes[0];
@@ -1018,9 +1018,8 @@ update_cache_item(struct btrfs_trans_handle *trans,
                if (found_key.objectid != BTRFS_FREE_SPACE_OBJECTID ||
                    found_key.offset != offset) {
                        clear_extent_bit(&BTRFS_I(inode)->io_tree, 0,
-                                        inode->i_size - 1,
-                                        EXTENT_DIRTY | EXTENT_DELALLOC, 0, 0,
-                                        NULL);
+                                        inode->i_size - 1, EXTENT_DELALLOC, 0,
+                                        0, NULL);
                        btrfs_release_path(path);
                        goto fail;
                }
@@ -1116,7 +1115,7 @@ static int flush_dirty_cache(struct inode *inode)
        ret = btrfs_wait_ordered_range(inode, 0, (u64)-1);
        if (ret)
                clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, inode->i_size - 1,
-                                EXTENT_DIRTY | EXTENT_DELALLOC, 0, 0, NULL);
+                                EXTENT_DELALLOC, 0, 0, NULL);
 
        return ret;
 }
index e0e940fe01dfa1ab9c08ae9eb4ee4a709803170b..a0546401bc0ab849e4bef60e2ad4ccc7441be6c0 100644 (file)
@@ -4986,9 +4986,8 @@ again:
        }
 
        clear_extent_bit(&BTRFS_I(inode)->io_tree, block_start, block_end,
-                         EXTENT_DIRTY | EXTENT_DELALLOC |
-                         EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG,
-                         0, 0, &cached_state);
+                        EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG,
+                        0, 0, &cached_state);
 
        ret = btrfs_set_extent_delalloc(inode, block_start, block_end, 0,
                                        &cached_state);
@@ -5372,9 +5371,9 @@ static void evict_inode_truncate_pages(struct inode *inode)
                        btrfs_qgroup_free_data(inode, NULL, start, end - start + 1);
 
                clear_extent_bit(io_tree, start, end,
-                                EXTENT_LOCKED | EXTENT_DIRTY |
-                                EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING |
-                                EXTENT_DEFRAG, 1, 1, &cached_state);
+                                EXTENT_LOCKED | EXTENT_DELALLOC |
+                                EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG, 1, 1,
+                                &cached_state);
 
                cond_resched();
                spin_lock(&io_tree->lock);
@@ -7732,12 +7731,9 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
        u64 start = iblock << inode->i_blkbits;
        u64 lockstart, lockend;
        u64 len = bh_result->b_size;
-       int unlock_bits = EXTENT_LOCKED;
        int ret = 0;
 
-       if (create)
-               unlock_bits |= EXTENT_DIRTY;
-       else
+       if (!create)
                len = min_t(u64, len, fs_info->sectorsize);
 
        lockstart = start;
@@ -7796,9 +7792,8 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
                if (ret < 0)
                        goto unlock_err;
 
-               /* clear and unlock the entire range */
-               clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, lockend,
-                                unlock_bits, 1, 0, &cached_state);
+               unlock_extent_cached(&BTRFS_I(inode)->io_tree, lockstart,
+                                    lockend, &cached_state);
        } else {
                ret = btrfs_get_blocks_direct_read(em, bh_result, inode,
                                                   start, len);
@@ -7814,9 +7809,8 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
                 */
                lockstart = start + bh_result->b_size;
                if (lockstart < lockend) {
-                       clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart,
-                                        lockend, unlock_bits, 1, 0,
-                                        &cached_state);
+                       unlock_extent_cached(&BTRFS_I(inode)->io_tree,
+                                            lockstart, lockend, &cached_state);
                } else {
                        free_extent_state(cached_state);
                }
@@ -7827,8 +7821,8 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
        return 0;
 
 unlock_err:
-       clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, lockend,
-                        unlock_bits, 1, 0, &cached_state);
+       unlock_extent_cached(&BTRFS_I(inode)->io_tree, lockstart, lockend,
+                            &cached_state);
 err:
        if (dio_data)
                current->journal_info = dio_data;
@@ -8843,8 +8837,7 @@ again:
                 */
                if (!inode_evicting)
                        clear_extent_bit(tree, start, end,
-                                        EXTENT_DIRTY | EXTENT_DELALLOC |
-                                        EXTENT_DELALLOC_NEW |
+                                        EXTENT_DELALLOC | EXTENT_DELALLOC_NEW |
                                         EXTENT_LOCKED | EXTENT_DO_ACCOUNTING |
                                         EXTENT_DEFRAG, 1, 0, &cached_state);
                /*
@@ -8899,8 +8892,7 @@ again:
        if (PageDirty(page))
                btrfs_qgroup_free_data(inode, NULL, page_start, PAGE_SIZE);
        if (!inode_evicting) {
-               clear_extent_bit(tree, page_start, page_end,
-                                EXTENT_LOCKED | EXTENT_DIRTY |
+               clear_extent_bit(tree, page_start, page_end, EXTENT_LOCKED |
                                 EXTENT_DELALLOC | EXTENT_DELALLOC_NEW |
                                 EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG, 1, 1,
                                 &cached_state);
@@ -9028,9 +9020,8 @@ again:
         * reserve data&meta space before lock_page() (see above comments).
         */
        clear_extent_bit(&BTRFS_I(inode)->io_tree, page_start, end,
-                         EXTENT_DIRTY | EXTENT_DELALLOC |
-                         EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG,
-                         0, 0, &cached_state);
+                         EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING |
+                         EXTENT_DEFRAG, 0, 0, &cached_state);
 
        ret2 = btrfs_set_extent_delalloc(inode, page_start, end, 0,
                                        &cached_state);
index 5942615be39808e774b4ad61f0949a3e82d175b9..de730e56d3f5106ee97d7fa316ee5e855487d954 100644 (file)
@@ -1333,9 +1333,8 @@ again:
        lock_extent_bits(&BTRFS_I(inode)->io_tree,
                         page_start, page_end - 1, &cached_state);
        clear_extent_bit(&BTRFS_I(inode)->io_tree, page_start,
-                         page_end - 1, EXTENT_DIRTY | EXTENT_DELALLOC |
-                         EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG, 0, 0,
-                         &cached_state);
+                         page_end - 1, EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING |
+                         EXTENT_DEFRAG, 0, 0, &cached_state);
 
        if (i_done != page_cnt) {
                spin_lock(&BTRFS_I(inode)->lock);
index b363fb990ceccf64b72fad139fbbe825958e70ae..09ecf7dc7b0829b535b869f1350d76c75938bca0 100644 (file)
@@ -988,8 +988,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
        ret = clear_extent_bit(&BTRFS_I(inode)->io_tree,
                               BTRFS_MAX_EXTENT_SIZE >> 1,
                               (BTRFS_MAX_EXTENT_SIZE >> 1) + sectorsize - 1,
-                              EXTENT_DELALLOC | EXTENT_DIRTY |
-                              EXTENT_UPTODATE, 0, 0, NULL);
+                              EXTENT_DELALLOC | EXTENT_UPTODATE, 0, 0, NULL);
        if (ret) {
                test_err("clear_extent_bit returned %d", ret);
                goto out;
@@ -1056,8 +1055,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
        ret = clear_extent_bit(&BTRFS_I(inode)->io_tree,
                               BTRFS_MAX_EXTENT_SIZE + sectorsize,
                               BTRFS_MAX_EXTENT_SIZE + 2 * sectorsize - 1,
-                              EXTENT_DIRTY | EXTENT_DELALLOC |
-                              EXTENT_UPTODATE, 0, 0, NULL);
+                              EXTENT_DELALLOC | EXTENT_UPTODATE, 0, 0, NULL);
        if (ret) {
                test_err("clear_extent_bit returned %d", ret);
                goto out;
@@ -1089,8 +1087,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
 
        /* Empty */
        ret = clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, (u64)-1,
-                              EXTENT_DIRTY | EXTENT_DELALLOC |
-                              EXTENT_UPTODATE, 0, 0, NULL);
+                              EXTENT_DELALLOC | EXTENT_UPTODATE, 0, 0, NULL);
        if (ret) {
                test_err("clear_extent_bit returned %d", ret);
                goto out;
@@ -1105,8 +1102,7 @@ static int test_extent_accounting(u32 sectorsize, u32 nodesize)
 out:
        if (ret)
                clear_extent_bit(&BTRFS_I(inode)->io_tree, 0, (u64)-1,
-                                EXTENT_DIRTY | EXTENT_DELALLOC |
-                                EXTENT_UPTODATE, 0, 0, NULL);
+                                EXTENT_DELALLOC | EXTENT_UPTODATE, 0, 0, NULL);
        iput(inode);
        btrfs_free_dummy_root(root);
        btrfs_free_dummy_fs_info(fs_info);