mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-11 15:40:50 +00:00
btrfs: delete the ordered isize update code
Now that we have a safe way to update the isize, remove all of this code as it's no longer needed. Reviewed-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
d923afe96d
commit
3f1c64ce04
@ -785,134 +785,6 @@ out:
|
||||
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
|
||||
|
@ -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 */
|
||||
@ -182,8 +177,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,
|
||||
|
@ -469,7 +469,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" })
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user