linux/fs/btrfs
Qu Wenruo 87b4d86baa btrfs: make Private2 lifespan more consistent
Currently we use page Private2 bit to indicate that we have ordered
extent for the page range.

But the lifespan of it is not consistent, during regular writeback path,
there are two locations to clear the same PagePrivate2:

    T ----- Page marked Dirty
    |
    + ----- Page marked Private2, through btrfs_run_dealloc_range()
    |
    + ----- Page cleared Private2, through btrfs_writepage_cow_fixup()
    |       in __extent_writepage_io()
    |       ^^^ Private2 cleared for the first time
    |
    + ----- Page marked Writeback, through btrfs_set_range_writeback()
    |       in __extent_writepage_io().
    |
    + ----- Page cleared Private2, through
    |       btrfs_writepage_endio_finish_ordered()
    |       ^^^ Private2 cleared for the second time.
    |
    + ----- Page cleared Writeback, through
            btrfs_writepage_endio_finish_ordered()

Currently PagePrivate2 is mostly to prevent ordered extent accounting
being executed for both endio and invalidatepage.
Thus only the one who cleared page Private2 is responsible for ordered
extent accounting.

But the fact is, in btrfs_writepage_endio_finish_ordered(), page
Private2 is cleared and ordered extent accounting is executed
unconditionally.

The race prevention only happens through btrfs_invalidatepage(), where
we wait for the page writeback first, before checking the Private2 bit.

This means, Private2 is also protected by Writeback bit, and there is no
need for btrfs_writepage_cow_fixup() to clear Priavte2.

This patch will change btrfs_writepage_cow_fixup() to just check
PagePrivate2, not to clear it.
The clearing will happen in either btrfs_invalidatepage() or
btrfs_writepage_endio_finish_ordered().

This makes the Private2 bit easier to understand, just meaning the page
has unfinished ordered extent attached to it.

And this patch is a hard requirement for the incoming refactoring for
how we finished ordered IO for endio context, as the coming patch will
check Private2 to determine if we need to do the ordered extent
accounting.  Thus this patch is definitely needed or we will hang due to
unfinished ordered extent.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2021-06-21 15:19:08 +02:00
..
tests idmapped-mounts-v5.12 2021-02-23 13:39:45 -08:00
acl.c fs: make helpers idmap mount aware 2021-01-24 14:27:20 +01:00
async-thread.c
async-thread.h
backref.c btrfs: move the tree mod log code into its own file 2021-04-19 17:25:16 +02:00
backref.h btrfs: add asserts for deleting backref cache nodes 2021-02-08 22:58:56 +01:00
block-group.c btrfs: make free space cache size consistent across different PAGE_SIZE 2021-06-21 15:19:08 +02:00
block-group.h btrfs: zoned: automatically reclaim zones 2021-04-20 20:46:31 +02:00
block-rsv.c
block-rsv.h
btrfs_inode.h btrfs: remove stale comment and logic from btrfs_inode_in_log() 2021-04-19 17:25:16 +02:00
check-integrity.c btrfs: integrity-checker: convert block context kmap's to kmap_local_page 2021-04-19 17:25:16 +02:00
check-integrity.h
compression.c btrfs: pass btrfs_inode to btrfs_writepage_endio_finish_ordered() 2021-06-21 15:19:08 +02:00
compression.h btrfs: optimize variables size in btrfs_submit_compressed_write 2021-06-21 15:19:07 +02:00
ctree.c btrfs: always abort the transaction if we abort a trans handle 2021-06-21 15:19:06 +02:00
ctree.h btrfs: pass btrfs_inode to btrfs_writepage_endio_finish_ordered() 2021-06-21 15:19:08 +02:00
delalloc-space.c btrfs: fix parameter description of btrfs_inode_rsv_release/btrfs_delalloc_release_space 2021-02-08 22:58:54 +01:00
delalloc-space.h
delayed-inode.c btrfs: abort transaction if we fail to update the delayed inode 2021-06-21 15:19:05 +02:00
delayed-inode.h
delayed-ref.c btrfs: update debug message when checking seq number of a delayed ref 2021-04-19 17:25:17 +02:00
delayed-ref.h btrfs: only let one thread pre-flush delayed refs in commit 2021-02-08 22:58:56 +01:00
dev-replace.c btrfs: do not initialize dev replace for bad dev root 2021-03-17 19:42:14 +01:00
dev-replace.h btrfs: zoned: mark block groups to copy for device-replace 2021-02-09 02:46:07 +01:00
dir-item.c
discard.c btrfs: document now parameter of peek_discard_list 2021-02-08 22:58:53 +01:00
discard.h
disk-io.c btrfs: add cancellable chunk relocation support 2021-06-21 15:19:07 +02:00
disk-io.h btrfs: split alloc_log_tree() 2021-02-09 02:46:07 +01:00
export.c
export.h
extent_io.c btrfs: pass btrfs_inode to btrfs_writepage_endio_finish_ordered() 2021-06-21 15:19:08 +02:00
extent_io.h btrfs: refactor submit_extent_page() to make bio and its flag tracing easier 2021-06-21 15:19:08 +02:00
extent_map.c btrfs: fix parameter description of btrfs_add_extent_mapping 2021-02-08 22:58:53 +01:00
extent_map.h
extent-io-tree.h
extent-tree.c btrfs: always abort the transaction if we abort a trans handle 2021-06-21 15:19:06 +02:00
file-item.c btrfs: fix fsync failure and transaction abort after writes to prealloc extents 2021-05-27 23:31:36 +02:00
file.c btrfs: use list_last_entry in add_falloc_range 2021-06-21 15:19:07 +02:00
free-space-cache.c btrfs: don't set the full sync flag when truncation does not touch extents 2021-06-21 15:19:05 +02:00
free-space-cache.h btrfs: zoned: track unusable bytes for zones 2021-02-09 02:46:03 +01:00
free-space-tree.c btrfs: fix possible free space tree corruption with online conversion 2021-01-25 18:44:37 +01:00
free-space-tree.h
inode-item.c
inode.c btrfs: make Private2 lifespan more consistent 2021-06-21 15:19:08 +02:00
ioctl.c btrfs: add device delete cancel 2021-06-21 15:19:07 +02:00
Kconfig
locking.c
locking.h
lzo.c btrfs: convert kmap to kmap_local_page, simple cases 2021-04-19 17:25:16 +02:00
Makefile btrfs: move the tree mod log code into its own file 2021-04-19 17:25:16 +02:00
misc.h
ordered-data.c btrfs: zoned: fix silent data loss after failure splitting ordered extent 2021-04-28 20:09:38 +02:00
ordered-data.h btrfs: fix comment for btrfs ordered extent flag bits 2021-04-19 17:25:14 +02:00
orphan.c
print-tree.c btrfs: print the actual offset in btrfs_root_name 2021-01-07 17:25:05 +01:00
print-tree.h btrfs: print the actual offset in btrfs_root_name 2021-01-07 17:25:05 +01:00
props.c
props.h
qgroup.c btrfs: fix deadlock when cloning inline extents and using qgroups 2021-04-28 20:09:47 +02:00
qgroup.h btrfs: export and rename qgroup_reserve_meta 2021-03-02 16:58:30 +01:00
raid56.c CFI on arm64 series for v5.13-rc1 2021-04-27 10:16:46 -07:00
raid56.h
rcu-string.h
reada.c btrfs: subpage: make readahead work properly 2021-03-16 11:06:21 +01:00
ref-verify.c btrfs: ref-verify: use 'inline void' keyword ordering 2021-03-02 16:55:40 +01:00
ref-verify.h
reflink.c for-5.13-rc4-tag 2021-06-03 11:37:14 -07:00
reflink.h
relocation.c btrfs: add cancellable chunk relocation support 2021-06-21 15:19:07 +02:00
root-tree.c
scrub.c btrfs: scrub: fix subpage repair error caused by hard coded PAGE_SIZE 2021-06-21 15:19:07 +02:00
send.c btrfs: fix deadlock when cloning inline extents and using qgroups 2021-04-28 20:09:47 +02:00
send.h
space-info.c btrfs: handle preemptive delalloc flushing slightly differently 2021-06-21 15:19:04 +02:00
space-info.h btrfs: zoned: track unusable bytes for zones 2021-02-09 02:46:03 +01:00
struct-funcs.c btrfs: handle sectorsize < PAGE_SIZE case for extent buffer accessors 2020-12-09 19:16:10 +01:00
subpage.c btrfs: subpage: add overview comments 2021-04-19 17:25:18 +02:00
subpage.h btrfs: subpage: introduce helpers for writeback status 2021-04-19 17:25:18 +02:00
super.c btrfs: always abort the transaction if we abort a trans handle 2021-06-21 15:19:06 +02:00
sysfs.c btrfs: sysfs: fix format string for some discard stats 2021-06-21 15:19:06 +02:00
sysfs.h
transaction.c btrfs: clear defrag status of a root if starting transaction fails 2021-06-21 15:19:06 +02:00
transaction.h btrfs: always abort the transaction if we abort a trans handle 2021-06-21 15:19:06 +02:00
tree-checker.c btrfs: tree-checker: check for BTRFS_BLOCK_FLAG_FULL_BACKREF being set improperly 2021-04-19 17:25:21 +02:00
tree-checker.h
tree-defrag.c
tree-log.c btrfs: avoid unnecessary logging of xattrs during fast fsyncs 2021-06-21 15:19:07 +02:00
tree-log.h
tree-mod-log.c btrfs: fix race when picking most recent mod log operation for an old root 2021-04-20 19:27:17 +02:00
tree-mod-log.h btrfs: add and use helper to get lowest sequence number for the tree mod log 2021-04-19 17:25:17 +02:00
ulist.c
ulist.h
uuid-tree.c
volumes.c btrfs: remove the unused parameter @len for btrfs_bio_fits_in_stripe() 2021-06-21 15:19:08 +02:00
volumes.h btrfs: remove the unused parameter @len for btrfs_bio_fits_in_stripe() 2021-06-21 15:19:08 +02:00
xattr.c for-5.12-rc1-tag 2021-03-05 12:21:14 -08:00
xattr.h
zlib.c btrfs: use memzero_page() instead of open coded kmap pattern 2021-05-05 11:27:27 -07:00
zoned.c btrfs: zoned: factor out zoned device lookup 2021-06-21 15:19:05 +02:00
zoned.h btrfs: zoned: factor out zoned device lookup 2021-06-21 15:19:05 +02:00
zstd.c btrfs: use memzero_page() instead of open coded kmap pattern 2021-05-05 11:27:27 -07:00