diff options
Diffstat (limited to 'fs/btrfs/ordered-data.c')
| -rw-r--r-- | fs/btrfs/ordered-data.c | 37 | 
1 files changed, 29 insertions, 8 deletions
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 760c4a5e096b..89656d799ff6 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -198,9 +198,6 @@ static int __btrfs_add_ordered_extent(struct inode *inode, u64 file_offset,  	entry->file_offset = file_offset;  	entry->start = start;  	entry->len = len; -	if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) && -	    !(type == BTRFS_ORDERED_NOCOW)) -		entry->csum_bytes_left = disk_len;  	entry->disk_len = disk_len;  	entry->bytes_left = len;  	entry->inode = igrab(inode); @@ -286,10 +283,6 @@ void btrfs_add_ordered_sum(struct inode *inode,  	tree = &BTRFS_I(inode)->ordered_tree;  	spin_lock_irq(&tree->lock);  	list_add_tail(&sum->list, &entry->list); -	WARN_ON(entry->csum_bytes_left < sum->len); -	entry->csum_bytes_left -= sum->len; -	if (entry->csum_bytes_left == 0) -		wake_up(&entry->wait);  	spin_unlock_irq(&tree->lock);  } @@ -509,7 +502,21 @@ void btrfs_wait_logged_extents(struct btrfs_trans_handle *trans,  		wait_event(ordered->wait, test_bit(BTRFS_ORDERED_IO_DONE,  						   &ordered->flags)); -		list_add_tail(&ordered->trans_list, &trans->ordered); +		/* +		 * If our ordered extent completed it means it updated the +		 * fs/subvol and csum trees already, so no need to make the +		 * current transaction's commit wait for it, as we end up +		 * holding memory unnecessarily and delaying the inode's iput +		 * until the transaction commit (we schedule an iput for the +		 * inode when the ordered extent's refcount drops to 0), which +		 * prevents it from being evictable until the transaction +		 * commits. +		 */ +		if (test_bit(BTRFS_ORDERED_COMPLETE, &ordered->flags)) +			btrfs_put_ordered_extent(ordered); +		else +			list_add_tail(&ordered->trans_list, &trans->ordered); +  		spin_lock_irq(&log->log_extents_lock[index]);  	}  	spin_unlock_irq(&log->log_extents_lock[index]); @@ -844,6 +851,20 @@ out:  	return entry;  } +bool btrfs_have_ordered_extents_in_range(struct inode *inode, +					 u64 file_offset, +					 u64 len) +{ +	struct btrfs_ordered_extent *oe; + +	oe = btrfs_lookup_ordered_range(inode, file_offset, len); +	if (oe) { +		btrfs_put_ordered_extent(oe); +		return true; +	} +	return false; +} +  /*   * lookup and return any extent before 'file_offset'.  NULL is returned   * if none is found  |