Message ID | 20200107194237.145694-6-josef@toxicpanda.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: fix hole corruption issue with !NO_HOLES | expand |
On Tue, Jan 7, 2020 at 7:43 PM Josef Bacik <josef@toxicpanda.com> wrote: > > Now that we have a safe way to update the isize, remove all of this code > as it's no longer needed. > > Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: Filipe Manana <fdmanana@suse.com> Looks good, thanks. > --- > fs/btrfs/ordered-data.c | 128 ----------------------------------- > fs/btrfs/ordered-data.h | 7 -- > include/trace/events/btrfs.h | 1 - > 3 files changed, 136 deletions(-) > > diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c > index 3a3c648bb9d3..b8de2aea36b3 100644 > --- a/fs/btrfs/ordered-data.c > +++ b/fs/btrfs/ordered-data.c > @@ -791,134 +791,6 @@ btrfs_lookup_first_ordered_extent(struct inode *inode, u64 file_offset) > return entry; > } > > -/* > - * After an extent is done, call this to conditionally update the on disk > - * i_size. i_size is updated to cover any fully written part of the file. > - */ > -int btrfs_ordered_update_i_size(struct inode *inode, u64 offset, > - struct btrfs_ordered_extent *ordered) > -{ > - struct btrfs_ordered_inode_tree *tree = &BTRFS_I(inode)->ordered_tree; > - u64 disk_i_size; > - u64 new_i_size; > - u64 i_size = i_size_read(inode); > - struct rb_node *node; > - struct rb_node *prev = NULL; > - struct btrfs_ordered_extent *test; > - int ret = 1; > - u64 orig_offset = offset; > - > - spin_lock_irq(&tree->lock); > - if (ordered) { > - offset = entry_end(ordered); > - if (test_bit(BTRFS_ORDERED_TRUNCATED, &ordered->flags)) > - offset = min(offset, > - ordered->file_offset + > - ordered->truncated_len); > - } else { > - offset = ALIGN(offset, btrfs_inode_sectorsize(inode)); > - } > - disk_i_size = BTRFS_I(inode)->disk_i_size; > - > - /* > - * truncate file. > - * If ordered is not NULL, then this is called from endio and > - * disk_i_size will be updated by either truncate itself or any > - * in-flight IOs which are inside the disk_i_size. > - * > - * Because btrfs_setsize() may set i_size with disk_i_size if truncate > - * fails somehow, we need to make sure we have a precise disk_i_size by > - * updating it as usual. > - * > - */ > - if (!ordered && disk_i_size > i_size) { > - BTRFS_I(inode)->disk_i_size = orig_offset; > - ret = 0; > - goto out; > - } > - > - /* > - * if the disk i_size is already at the inode->i_size, or > - * this ordered extent is inside the disk i_size, we're done > - */ > - if (disk_i_size == i_size) > - goto out; > - > - /* > - * We still need to update disk_i_size if outstanding_isize is greater > - * than disk_i_size. > - */ > - if (offset <= disk_i_size && > - (!ordered || ordered->outstanding_isize <= disk_i_size)) > - goto out; > - > - /* > - * walk backward from this ordered extent to disk_i_size. > - * if we find an ordered extent then we can't update disk i_size > - * yet > - */ > - if (ordered) { > - node = rb_prev(&ordered->rb_node); > - } else { > - prev = tree_search(tree, offset); > - /* > - * we insert file extents without involving ordered struct, > - * so there should be no ordered struct cover this offset > - */ > - if (prev) { > - test = rb_entry(prev, struct btrfs_ordered_extent, > - rb_node); > - BUG_ON(offset_in_entry(test, offset)); > - } > - node = prev; > - } > - for (; node; node = rb_prev(node)) { > - test = rb_entry(node, struct btrfs_ordered_extent, rb_node); > - > - /* We treat this entry as if it doesn't exist */ > - if (test_bit(BTRFS_ORDERED_UPDATED_ISIZE, &test->flags)) > - continue; > - > - if (entry_end(test) <= disk_i_size) > - break; > - if (test->file_offset >= i_size) > - break; > - > - /* > - * We don't update disk_i_size now, so record this undealt > - * i_size. Or we will not know the real i_size. > - */ > - if (test->outstanding_isize < offset) > - test->outstanding_isize = offset; > - if (ordered && > - ordered->outstanding_isize > test->outstanding_isize) > - test->outstanding_isize = ordered->outstanding_isize; > - goto out; > - } > - new_i_size = min_t(u64, offset, i_size); > - > - /* > - * Some ordered extents may completed before the current one, and > - * we hold the real i_size in ->outstanding_isize. > - */ > - if (ordered && ordered->outstanding_isize > new_i_size) > - new_i_size = min_t(u64, ordered->outstanding_isize, i_size); > - BTRFS_I(inode)->disk_i_size = new_i_size; > - ret = 0; > -out: > - /* > - * We need to do this because we can't remove ordered extents until > - * after the i_disk_size has been updated and then the inode has been > - * updated to reflect the change, so we need to tell anybody who finds > - * this ordered extent that we've already done all the real work, we > - * just haven't completed all the other work. > - */ > - if (ordered) > - set_bit(BTRFS_ORDERED_UPDATED_ISIZE, &ordered->flags); > - spin_unlock_irq(&tree->lock); > - return ret; > -} > - > /* > * search the ordered extents for one corresponding to 'offset' and > * try to find a checksum. This is used because we allow pages to > diff --git a/fs/btrfs/ordered-data.h b/fs/btrfs/ordered-data.h > index 5204171ea962..7f7f9ad091a6 100644 > --- a/fs/btrfs/ordered-data.h > +++ b/fs/btrfs/ordered-data.h > @@ -52,11 +52,6 @@ enum { > BTRFS_ORDERED_DIRECT, > /* We had an io error when writing this out */ > BTRFS_ORDERED_IOERR, > - /* > - * indicates whether this ordered extent has done its due diligence in > - * updating the isize > - */ > - BTRFS_ORDERED_UPDATED_ISIZE, > /* Set when we have to truncate an extent */ > BTRFS_ORDERED_TRUNCATED, > /* Regular IO for COW */ > @@ -180,8 +175,6 @@ struct btrfs_ordered_extent *btrfs_lookup_ordered_range( > struct btrfs_inode *inode, > u64 file_offset, > u64 len); > -int btrfs_ordered_update_i_size(struct inode *inode, u64 offset, > - struct btrfs_ordered_extent *ordered); > int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr, > u8 *sum, int len); > u64 btrfs_wait_ordered_extents(struct btrfs_root *root, u64 nr, > diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h > index 620bf1b38fba..02ac28f0e99e 100644 > --- a/include/trace/events/btrfs.h > +++ b/include/trace/events/btrfs.h > @@ -468,7 +468,6 @@ DEFINE_EVENT( > { (1 << BTRFS_ORDERED_PREALLOC), "PREALLOC" }, \ > { (1 << BTRFS_ORDERED_DIRECT), "DIRECT" }, \ > { (1 << BTRFS_ORDERED_IOERR), "IOERR" }, \ > - { (1 << BTRFS_ORDERED_UPDATED_ISIZE), "UPDATED_ISIZE" }, \ > { (1 << BTRFS_ORDERED_TRUNCATED), "TRUNCATED" }) > > > -- > 2.23.0 >
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 3a3c648bb9d3..b8de2aea36b3 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -791,134 +791,6 @@ btrfs_lookup_first_ordered_extent(struct inode *inode, u64 file_offset) return entry; } -/* - * After an extent is done, call this to conditionally update the on disk - * i_size. i_size is updated to cover any fully written part of the file. - */ -int btrfs_ordered_update_i_size(struct inode *inode, u64 offset, - struct btrfs_ordered_extent *ordered) -{ - struct btrfs_ordered_inode_tree *tree = &BTRFS_I(inode)->ordered_tree; - u64 disk_i_size; - u64 new_i_size; - u64 i_size = i_size_read(inode); - struct rb_node *node; - struct rb_node *prev = NULL; - struct btrfs_ordered_extent *test; - int ret = 1; - u64 orig_offset = offset; - - spin_lock_irq(&tree->lock); - if (ordered) { - offset = entry_end(ordered); - if (test_bit(BTRFS_ORDERED_TRUNCATED, &ordered->flags)) - offset = min(offset, - ordered->file_offset + - ordered->truncated_len); - } else { - offset = ALIGN(offset, btrfs_inode_sectorsize(inode)); - } - disk_i_size = BTRFS_I(inode)->disk_i_size; - - /* - * truncate file. - * If ordered is not NULL, then this is called from endio and - * disk_i_size will be updated by either truncate itself or any - * in-flight IOs which are inside the disk_i_size. - * - * Because btrfs_setsize() may set i_size with disk_i_size if truncate - * fails somehow, we need to make sure we have a precise disk_i_size by - * updating it as usual. - * - */ - if (!ordered && disk_i_size > i_size) { - BTRFS_I(inode)->disk_i_size = orig_offset; - ret = 0; - goto out; - } - - /* - * if the disk i_size is already at the inode->i_size, or - * this ordered extent is inside the disk i_size, we're done - */ - if (disk_i_size == i_size) - goto out; - - /* - * We still need to update disk_i_size if outstanding_isize is greater - * than disk_i_size. - */ - if (offset <= disk_i_size && - (!ordered || ordered->outstanding_isize <= disk_i_size)) - goto out; - - /* - * walk backward from this ordered extent to disk_i_size. - * if we find an ordered extent then we can't update disk i_size - * yet - */ - if (ordered) { - node = rb_prev(&ordered->rb_node); - } else { - prev = tree_search(tree, offset); - /* - * we insert file extents without involving ordered struct, - * so there should be no ordered struct cover this offset - */ - if (prev) { - test = rb_entry(prev, struct btrfs_ordered_extent, - rb_node); - BUG_ON(offset_in_entry(test, offset)); - } - node = prev; - } - for (; node; node = rb_prev(node)) { - test = rb_entry(node, struct btrfs_ordered_extent, rb_node); - - /* We treat this entry as if it doesn't exist */ - if (test_bit(BTRFS_ORDERED_UPDATED_ISIZE, &test->flags)) - continue; - - if (entry_end(test) <= disk_i_size) - break; - if (test->file_offset >= i_size) - break; - - /* - * We don't update disk_i_size now, so record this undealt - * i_size. Or we will not know the real i_size. - */ - if (test->outstanding_isize < offset) - test->outstanding_isize = offset; - if (ordered && - ordered->outstanding_isize > test->outstanding_isize) - test->outstanding_isize = ordered->outstanding_isize; - goto out; - } - new_i_size = min_t(u64, offset, i_size); - - /* - * Some ordered extents may completed before the current one, and - * we hold the real i_size in ->outstanding_isize. - */ - if (ordered && ordered->outstanding_isize > new_i_size) - new_i_size = min_t(u64, ordered->outstanding_isize, i_size); - BTRFS_I(inode)->disk_i_size = new_i_size; - ret = 0; -out: - /* - * We need to do this because we can't remove ordered extents until - * after the i_disk_size has been updated and then the inode has been - * updated to reflect the change, so we need to tell anybody who finds - * this ordered extent that we've already done all the real work, we - * just haven't completed all the other work. - */ - if (ordered) - set_bit(BTRFS_ORDERED_UPDATED_ISIZE, &ordered->flags); - spin_unlock_irq(&tree->lock); - return ret; -} - /* * search the ordered extents for one corresponding to 'offset' and * try to find a checksum. This is used because we allow pages to diff --git a/fs/btrfs/ordered-data.h b/fs/btrfs/ordered-data.h index 5204171ea962..7f7f9ad091a6 100644 --- a/fs/btrfs/ordered-data.h +++ b/fs/btrfs/ordered-data.h @@ -52,11 +52,6 @@ enum { BTRFS_ORDERED_DIRECT, /* We had an io error when writing this out */ BTRFS_ORDERED_IOERR, - /* - * indicates whether this ordered extent has done its due diligence in - * updating the isize - */ - BTRFS_ORDERED_UPDATED_ISIZE, /* Set when we have to truncate an extent */ BTRFS_ORDERED_TRUNCATED, /* Regular IO for COW */ @@ -180,8 +175,6 @@ struct btrfs_ordered_extent *btrfs_lookup_ordered_range( struct btrfs_inode *inode, u64 file_offset, u64 len); -int btrfs_ordered_update_i_size(struct inode *inode, u64 offset, - struct btrfs_ordered_extent *ordered); int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr, u8 *sum, int len); u64 btrfs_wait_ordered_extents(struct btrfs_root *root, u64 nr, diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h index 620bf1b38fba..02ac28f0e99e 100644 --- a/include/trace/events/btrfs.h +++ b/include/trace/events/btrfs.h @@ -468,7 +468,6 @@ DEFINE_EVENT( { (1 << BTRFS_ORDERED_PREALLOC), "PREALLOC" }, \ { (1 << BTRFS_ORDERED_DIRECT), "DIRECT" }, \ { (1 << BTRFS_ORDERED_IOERR), "IOERR" }, \ - { (1 << BTRFS_ORDERED_UPDATED_ISIZE), "UPDATED_ISIZE" }, \ { (1 << BTRFS_ORDERED_TRUNCATED), "TRUNCATED" })
Now that we have a safe way to update the isize, remove all of this code as it's no longer needed. Signed-off-by: Josef Bacik <josef@toxicpanda.com> --- fs/btrfs/ordered-data.c | 128 ----------------------------------- fs/btrfs/ordered-data.h | 7 -- include/trace/events/btrfs.h | 1 - 3 files changed, 136 deletions(-)