aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2017-02-17Btrfs: add another missing end_page_writeback on submit_extent_page failureTakafumi Kubota1-2/+6
If btrfs_bio_alloc fails in submit_extent_page, submit_extent_page returns without clearing the writeback bit of the failed page. __extent_writepage_io, that is a caller of submit_extent_page, does not clear the remaining writeback bit anywhere. As a result, this will cause the hang at filemap_fdatawait_range, because it waits the writeback bit to be cleared from the failed page. So, we have to call end_page_writeback to clear the writeback bit. For reproducing the hang, we inject a fault like if (should_failtest()) { // I define should_failtest() bio = NULL; } else { bio = btrfs_bio_alloc(...); } in submit_extent_page. We should also check whether page has the bit before end_page_writeback, to avoid the conflict against the other end_page_writeback in bio_endio. Thus, we add PageWriteback checks not only in __extent_writepage_io, but also in write_one_eb too, because it misses the check. Signed-off-by: Takafumi Kubota <[email protected]> Reviewed-by: Liu Bo <[email protected]> Cc: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-17btrfs: remove unused ulist membersDavid Sterba1-7/+0
Commit "btrfs: ulist: Add ulist_del() function" (d4b804045924d7f8) removed some debugging code but left the structure defintions. Reviewed-by: Qu Wenruo <[email protected]> Reviewed-by: Liu Bo <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-17Btrfs: use helper to simplify lock/unlock pagesLiu Bo1-64/+10
Since we have a helper to set page bits, let lock_delalloc_pages and __unlock_for_delalloc use it. Signed-off-by: Liu Bo <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-17btrfs: teach __process_pages_contig about PAGE_LOCK operationLiu Bo2-7/+44
Signed-off-by: Liu Bo <[email protected]> Reviewed-by: David Sterba <[email protected]> [ changes to the helper separated from the following patch ] Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: create helper for processing bits on contiguous pagesLiu Bo1-15/+22
This introduces a new helper which can be used to process pages bits. Signed-off-by: Liu Bo <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: kill trans in run_delalloc_nocow and btrfs_cross_ref_existLiu Bo3-47/+16
run_delalloc_nocow has used trans in two places where they don't actually need @trans. For btrfs_lookup_file_extent, we search for file extents without COWing anything, and for btrfs_cross_ref_exist, the only place where we need @trans is deferencing it in order to get running_transaction which we could easily get from the global fs_info. Signed-off-by: Liu Bo <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: pass delayed_refs directly to btrfs_find_delayed_ref_headLiu Bo4-9/+7
All we need is @delayed_refs, all callers have get it ahead of calling btrfs_find_delayed_ref_head since lock needs to be acquired firstly, there is no reason to deference it again inside the function. Signed-off-by: Liu Bo <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: remove unused trans in read_block_for_searchLiu Bo1-9/+8
@trans is not used at all, this removes it. Signed-off-by: Liu Bo <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: cleanup unused cached_state in __extent_writepage_ioLiu Bo1-8/+1
@cached_state is no more required in __extent_writepage_io, also remove the goto label. Signed-off-by: Liu Bo <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: allow unlink to exceed subvolume quotaJeff Mahoney4-29/+45
Once a qgroup limit is exceeded, it's impossible to restore normal operation to the subvolume without modifying the limit or removing the subvolume. This is a surprising situation for many users used to the typical workflow with quotas on other file systems where it's possible to remove files until the used space is back under the limit. When we go to unlink a file and start the transaction, we'll hit the qgroup limit while trying to reserve space for the items we'll modify while removing the file. We discussed last month how best to handle this situation and agreed that there is no perfect solution. The best principle-of-least-surprise solution is to handle it similarly to how we already handle ENOSPC when unlinking, which is to allow the operation to succeed with the expectation that it will ultimately release space under most circumstances. This patch modifies the transaction start path to select whether to honor the qgroups limits. btrfs_start_transaction_fallback_global_rsv is the only caller that skips enforcement. The reservation and tracking still happens normally -- it just skips the enforcement step. Signed-off-by: Jeff Mahoney <[email protected]> Reviewed-by: Qu Wenruo <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: fix wrong argument for btrfs_lookup_ordered_rangeLiu Bo1-1/+1
Commit Btrfs: btrfs_page_mkwrite: Reserve space in sectorsized units" (d0b7da88) did this, but btrfs_lookup_ordered_range expects a 'length' rather than a 'page_end'. Signed-off-by: Liu Bo <[email protected]> Reviewed-by: Chandan Rajendra <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: raid56: Remove unused variable in lock_stripe_addQu Wenruo1-2/+0
Variable 'walk' in lock_stripe_add() is not used. Remove it. Signed-off-by: Qu Wenruo <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: refactor btrfs_extent_same() slightlyOmar Sandoval1-21/+12
This was originally a prep patch for changing the behavior on len=0, but we went another direction with that. This still makes the function slightly easier to follow. Reviewed-by: Qu Wenruo <[email protected]> Signed-off-by: Omar Sandoval <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: constify struct btrfs_{,disk_}key wherever possibleOmar Sandoval4-64/+69
In a lot of places, it's unclear when it's safe to reuse a struct btrfs_key after it has been passed to a helper function. Constify these arguments wherever possible to make it obvious. Signed-off-by: Omar Sandoval <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: fix another race between truncate and lockless dio writeLiu Bo1-1/+3
Dio writes can update i_size in btrfs_get_blocks_direct when it writes to offset beyond EOF so that endio can update disk_i_size correctly (because we don't udpate disk_i_size beyond i_size). However, when truncating down a file, we firstly update i_size and then wait for in-flight lockless dio reads/writes, according to the above, i_size may have been changed in dio writes, and file extents don't get truncated. For lockless dio writes are always overwrites, i_size is not supposed to be changed, so this adds a check to filter out this case. The race could be reproduced by fstests/generic/299 with patch "Btrfs: fix btrfs_ordered_update_i_size to update disk_i_size properly" applied. Signed-off-by: Liu Bo <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: clean up btrfs_ordered_update_i_sizeLiu Bo1-16/+13
Since we have a good helper entry_end, use it for ordered extent. Signed-off-by: Liu Bo <[email protected]> Reviewed-by: David Sterba <[email protected]> [ whitespace reformatting ] Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: fix comment in btrfs_page_mkwriteLiu Bo1-5/+5
The comment about "page_mkwrite gets called every time the page is dirtied" in btrfs_page_mkwrite is not correct, it only gets called the first time the page gets dirtied after the page faults in. However, we don't need to touch the code because it works well, although the proper logic is to check if delalloc bits has been set and if so, go free reserved space, if not, set the delalloc bits for dirty page range. Signed-off-by: Liu Bo <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14Btrfs: fix btrfs_ordered_update_i_size to update disk_i_size properlyLiu Bo2-2/+26
btrfs_ordered_update_i_size can be called by truncate and endio, but only endio takes ordered_extent which contains the completed IO. while truncating down a file, if there are some in-flight IOs, btrfs_ordered_update_i_size in endio will set disk_i_size to @orig_offset that is zero. If truncating-down fails somehow, we try to recover in memory isize with this zero'd disk_i_size. Fix it by only updating disk_i_size with @orig_offset when btrfs_ordered_update_i_size is not called from endio while truncating down and waiting for in-flight IOs completing their work before recover in-memory size. Besides fixing the above issue, add an assertion for last_size to double check we truncate down to the desired size. Signed-off-by: Liu Bo <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: fix over-80 lines introduced by previous cleanupsDavid Sterba9-63/+74
This goes as a separate patch because fixing that inside the patches caused too many many conflicts. Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make count_inode_refs take btrfs_inodeNikolay Borisov1-3/+3
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make count_inode_extrefs take btrfs_inodeNikolay Borisov1-3/+3
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_log_inode take btrfs_inodeNikolay Borisov1-49/+48
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make log_inode_item take btrfs_inodeNikolay Borisov1-5/+5
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make __add_inode_ref take btrfs_inodeNikolay Borisov1-12/+13
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make drop_one_dir_item take btrfs_inodeNikolay Borisov1-6/+6
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_unlink_inode take btrfs_inodeNikolay Borisov3-44/+50
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make log_new_dir_dentries take btrfs_inodeNikolay Borisov1-4/+4
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make log_directory_changes take btrfs_inodeNikolay Borisov1-6/+5
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make log_dir_items take btrfs_inodeNikolay Borisov1-3/+3
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_log_changed_extents take btrfs_inodeNikolay Borisov1-11/+11
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_get_logged_extents take btrfs_inodeNikolay Borisov3-4/+4
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_log_trailing_hole take btrfs_inodeNikolay Borisov1-4/+4
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_log_all_xattrs take btrfs_inodeNikolay Borisov1-5/+5
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make copy_items take btrfs_inodeNikolay Borisov1-21/+19
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_check_ref_name_override take btrfs_inodeNikolay Borisov1-5/+4
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make logged_inode_size take btrfs_inodeNikolay Borisov1-3/+3
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_del_inode_ref take btrfs_inodeNikolay Borisov3-7/+7
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_del_dir_entries_in_log take btrfs_inodeNikolay Borisov3-7/+7
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_log_new_name take btrfs_inodeNikolay Borisov3-15/+13
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_inode_in_log take btrfs_inodeNikolay Borisov4-20/+18
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_record_snapshot_destroy take btrfs_inodeNikolay Borisov3-6/+6
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_record_unlink_dir take btrfs_inodeNikolay Borisov3-14/+14
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_must_commit_transaction take btrfs_inodeNikolay Borisov1-9/+9
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_inode_delayed_dir_index_count take btrfs_inodeNikolay Borisov3-5/+5
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_commit_inode_delayed_items take btrfs_inodeNikolay Borisov3-4/+4
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_commit_inode_delayed_inode take btrfs_inodeNikolay Borisov4-6/+6
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_remove_delayed_node take btrfs_inodeNikolay Borisov3-5/+5
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_kill_delayed_inode_items take btrfs_inodeNikolay Borisov3-4/+4
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_delayed_delete_inode_ref take btrfs_inodeNikolay Borisov3-5/+5
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>
2017-02-14btrfs: Make btrfs_delete_delayed_dir_index take btrfs_inodeNikolay Borisov3-6/+6
Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: David Sterba <[email protected]>