diff mbox series

btrfs: Merge inode_can_compress in inode_need_compress

Message ID 20200818063056.9094-1-nborisov@suse.com (mailing list archive)
State New, archived
Headers show
Series btrfs: Merge inode_can_compress in inode_need_compress | expand

Commit Message

Nikolay Borisov Aug. 18, 2020, 6:30 a.m. UTC
The latter is the only caller of the former. Just open code can_compress
into need_compress and also remove the warning since it's made redundant
by this change.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
---
 fs/btrfs/inode.c | 21 +++------------------
 1 file changed, 3 insertions(+), 18 deletions(-)

Comments

Qu Wenruo Aug. 18, 2020, 7:50 a.m. UTC | #1
On 2020/8/18 下午2:30, Nikolay Borisov wrote:
> The latter is the only caller of the former. Just open code can_compress
> into need_compress and also remove the warning since it's made redundant
> by this change.
>
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>

Reviewed-by: Qu Wenruo <wqu@suse.com>

Thanks,
Qu


> ---
>  fs/btrfs/inode.c | 21 +++------------------
>  1 file changed, 3 insertions(+), 18 deletions(-)
>
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 15dc8b6871ac..19e1918bad5c 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -410,17 +410,6 @@ static noinline int add_async_extent(struct async_chunk *cow,
>  	return 0;
>  }
>
> -/*
> - * Check if the inode has flags compatible with compression
> - */
> -static inline bool inode_can_compress(struct btrfs_inode *inode)
> -{
> -	if (inode->flags & BTRFS_INODE_NODATACOW ||
> -	    inode->flags & BTRFS_INODE_NODATASUM)
> -		return false;
> -	return true;
> -}
> -
>  /*
>   * Check if the inode needs to be submitted to compression, based on mount
>   * options, defragmentation, properties or heuristics.
> @@ -430,12 +419,9 @@ static inline int inode_need_compress(struct btrfs_inode *inode, u64 start,
>  {
>  	struct btrfs_fs_info *fs_info = inode->root->fs_info;
>
> -	if (!inode_can_compress(inode)) {
> -		WARN(IS_ENABLED(CONFIG_BTRFS_DEBUG),
> -			KERN_ERR "BTRFS: unexpected compression for ino %llu\n",
> -			btrfs_ino(inode));
> +	if (inode->flags & BTRFS_INODE_NODATACOW ||
> +	    inode->flags & BTRFS_INODE_NODATASUM)
>  		return 0;
> -	}
>  	/* force compress */
>  	if (btrfs_test_opt(fs_info, FORCE_COMPRESS))
>  		return 1;
> @@ -1833,8 +1819,7 @@ int btrfs_run_delalloc_range(struct btrfs_inode *inode, struct page *locked_page
>  	} else if (inode->flags & BTRFS_INODE_PREALLOC && !force_cow) {
>  		ret = run_delalloc_nocow(inode, locked_page, start, end,
>  					 page_started, 0, nr_written);
> -	} else if (!inode_can_compress(inode) ||
> -		   !inode_need_compress(inode, start, end)) {
> +	} else if (!inode_need_compress(inode, start, end)) {
>  		ret = cow_file_range(inode, locked_page, start, end,
>  				     page_started, nr_written, 1);
>  	} else {
>
David Sterba Aug. 26, 2020, 11:13 a.m. UTC | #2
On Tue, Aug 18, 2020 at 09:30:56AM +0300, Nikolay Borisov wrote:
> The latter is the only caller of the former. Just open code can_compress
> into need_compress and also remove the warning since it's made redundant
> by this change.

We had discussions and some disagreements in the past regarding the
need/can compression helpers

(v1) https://lore.kernel.org/linux-btrfs/20180515073622.18732-1-wqu@suse.com/
(v2) https://lore.kernel.org/linux-btrfs/20190701051225.17957-1-wqu@suse.com/

The fix got merged as there was a pending user report and bug to fix,
but I remember there's more to do.

While this patch cleans up some of the code, I don't think it's going
the right way, we have 2 semantics for the compression decision and the
helpers codify that.

I haven't read the discussions yet again and will have to do that
before merging this patch.
David Sterba Aug. 31, 2020, 8:40 p.m. UTC | #3
On Tue, Aug 18, 2020 at 09:30:56AM +0300, Nikolay Borisov wrote:
> The latter is the only caller of the former. Just open code can_compress
> into need_compress and also remove the warning since it's made redundant
> by this change.
> 
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
> ---
>  fs/btrfs/inode.c | 21 +++------------------
>  1 file changed, 3 insertions(+), 18 deletions(-)
> 
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 15dc8b6871ac..19e1918bad5c 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -410,17 +410,6 @@ static noinline int add_async_extent(struct async_chunk *cow,
>  	return 0;
>  }
>  
> -/*
> - * Check if the inode has flags compatible with compression
> - */
> -static inline bool inode_can_compress(struct btrfs_inode *inode)
> -{
> -	if (inode->flags & BTRFS_INODE_NODATACOW ||
> -	    inode->flags & BTRFS_INODE_NODATASUM)
> -		return false;
> -	return true;
> -}
> -
>  /*
>   * Check if the inode needs to be submitted to compression, based on mount
>   * options, defragmentation, properties or heuristics.
> @@ -430,12 +419,9 @@ static inline int inode_need_compress(struct btrfs_inode *inode, u64 start,
>  {
>  	struct btrfs_fs_info *fs_info = inode->root->fs_info;
>  
> -	if (!inode_can_compress(inode)) {
> -		WARN(IS_ENABLED(CONFIG_BTRFS_DEBUG),
> -			KERN_ERR "BTRFS: unexpected compression for ino %llu\n",
> -			btrfs_ino(inode));
> +	if (inode->flags & BTRFS_INODE_NODATACOW ||
> +	    inode->flags & BTRFS_INODE_NODATASUM)
>  		return 0;

This serves as a runtime friendly assert, when inode_need_compress is
called from compress_file_range.

First call in btrfs_run_delalloc_range duplicates the
nodatacow/nodatasum which would be cleaned up by this patch but we'd
lose the warning in case compress_file_range detects the unexpected
flags.
Nikolay Borisov Aug. 31, 2020, 8:44 p.m. UTC | #4
On 31.08.20 г. 23:40 ч., David Sterba wrote:
> On Tue, Aug 18, 2020 at 09:30:56AM +0300, Nikolay Borisov wrote:
>> The latter is the only caller of the former. Just open code can_compress
>> into need_compress and also remove the warning since it's made redundant
>> by this change.
>>
>> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
>> ---
>>  fs/btrfs/inode.c | 21 +++------------------
>>  1 file changed, 3 insertions(+), 18 deletions(-)
>>
>> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
>> index 15dc8b6871ac..19e1918bad5c 100644
>> --- a/fs/btrfs/inode.c
>> +++ b/fs/btrfs/inode.c
>> @@ -410,17 +410,6 @@ static noinline int add_async_extent(struct async_chunk *cow,
>>  	return 0;
>>  }
>>  
>> -/*
>> - * Check if the inode has flags compatible with compression
>> - */
>> -static inline bool inode_can_compress(struct btrfs_inode *inode)
>> -{
>> -	if (inode->flags & BTRFS_INODE_NODATACOW ||
>> -	    inode->flags & BTRFS_INODE_NODATASUM)
>> -		return false;
>> -	return true;
>> -}
>> -
>>  /*
>>   * Check if the inode needs to be submitted to compression, based on mount
>>   * options, defragmentation, properties or heuristics.
>> @@ -430,12 +419,9 @@ static inline int inode_need_compress(struct btrfs_inode *inode, u64 start,
>>  {
>>  	struct btrfs_fs_info *fs_info = inode->root->fs_info;
>>  
>> -	if (!inode_can_compress(inode)) {
>> -		WARN(IS_ENABLED(CONFIG_BTRFS_DEBUG),
>> -			KERN_ERR "BTRFS: unexpected compression for ino %llu\n",
>> -			btrfs_ino(inode));
>> +	if (inode->flags & BTRFS_INODE_NODATACOW ||
>> +	    inode->flags & BTRFS_INODE_NODATASUM)
>>  		return 0;
> 
> This serves as a runtime friendly assert, when inode_need_compress is
> called from compress_file_range.
> 
> First call in btrfs_run_delalloc_range duplicates the
> nodatacow/nodatasum which would be cleaned up by this patch but we'd
> lose the warning in case compress_file_range detects the unexpected
> flags.
> 


I think we should simply come to an agreement at which stage of a write
shall we check for the presence of flags. IMO the less places we have
the  better. This will obviate the need for a run-time assert... Frankly
I think we should be checking only at the time of btrfs_run_delalloc_range
diff mbox series

Patch

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 15dc8b6871ac..19e1918bad5c 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -410,17 +410,6 @@  static noinline int add_async_extent(struct async_chunk *cow,
 	return 0;
 }
 
-/*
- * Check if the inode has flags compatible with compression
- */
-static inline bool inode_can_compress(struct btrfs_inode *inode)
-{
-	if (inode->flags & BTRFS_INODE_NODATACOW ||
-	    inode->flags & BTRFS_INODE_NODATASUM)
-		return false;
-	return true;
-}
-
 /*
  * Check if the inode needs to be submitted to compression, based on mount
  * options, defragmentation, properties or heuristics.
@@ -430,12 +419,9 @@  static inline int inode_need_compress(struct btrfs_inode *inode, u64 start,
 {
 	struct btrfs_fs_info *fs_info = inode->root->fs_info;
 
-	if (!inode_can_compress(inode)) {
-		WARN(IS_ENABLED(CONFIG_BTRFS_DEBUG),
-			KERN_ERR "BTRFS: unexpected compression for ino %llu\n",
-			btrfs_ino(inode));
+	if (inode->flags & BTRFS_INODE_NODATACOW ||
+	    inode->flags & BTRFS_INODE_NODATASUM)
 		return 0;
-	}
 	/* force compress */
 	if (btrfs_test_opt(fs_info, FORCE_COMPRESS))
 		return 1;
@@ -1833,8 +1819,7 @@  int btrfs_run_delalloc_range(struct btrfs_inode *inode, struct page *locked_page
 	} else if (inode->flags & BTRFS_INODE_PREALLOC && !force_cow) {
 		ret = run_delalloc_nocow(inode, locked_page, start, end,
 					 page_started, 0, nr_written);
-	} else if (!inode_can_compress(inode) ||
-		   !inode_need_compress(inode, start, end)) {
+	} else if (!inode_need_compress(inode, start, end)) {
 		ret = cow_file_range(inode, locked_page, start, end,
 				     page_started, nr_written, 1);
 	} else {