diff mbox

[V2] Btrfs: fix output of compression message in btrfs_parse_options()

Message ID 201601060803.AA00000@WIN-5MHF4RKU941.jp.fujitsu.com (mailing list archive)
State Accepted
Headers show

Commit Message

Tsutomu Itoh Jan. 6, 2016, 8:03 a.m. UTC
The compression message might not be correctly output.
Fix it.

[[before fix]]

# mount -o compress /dev/sdb3 /test3
[  996.874264] BTRFS info (device sdb3): disk space caching is enabled
[  996.874268] BTRFS: has skinny extents
# mount | grep /test3
/dev/sdb3 on /test3 type btrfs (rw,relatime,compress=zlib,space_cache,subvolid=5,subvol=/)

# mount -o remount,compress-force /dev/sdb3 /test3
[ 1035.075017] BTRFS info (device sdb3): force zlib compression
[ 1035.075021] BTRFS info (device sdb3): disk space caching is enabled
# mount | grep /test3
/dev/sdb3 on /test3 type btrfs (rw,relatime,compress-force=zlib,space_cache,subvolid=5,subvol=/)

# mount -o remount,compress /dev/sdb3 /test3
[ 1053.679092] BTRFS info (device sdb3): disk space caching is enabled
# mount | grep /test3
/dev/sdb3 on /test3 type btrfs (rw,relatime,compress=zlib,space_cache,subvolid=5,subvol=/)

[[after fix]]

# mount -o compress /dev/sdb3 /test3
[  401.021753] BTRFS info (device sdb3): use zlib compression
[  401.021758] BTRFS info (device sdb3): disk space caching is enabled
[  401.021760] BTRFS: has skinny extents
# mount | grep /test3
/dev/sdb3 on /test3 type btrfs (rw,relatime,compress=zlib,space_cache,subvolid=5,subvol=/)

# mount -o remount,compress-force /dev/sdb3 /test3
[  439.824624] BTRFS info (device sdb3): force zlib compression
[  439.824629] BTRFS info (device sdb3): disk space caching is enabled
# mount | grep /test3
/dev/sdb3 on /test3 type btrfs (rw,relatime,compress-force=zlib,space_cache,subvolid=5,subvol=/)

# mount -o remount,compress /dev/sdb3 /test3
[  459.918430] BTRFS info (device sdb3): use zlib compression
[  459.918434] BTRFS info (device sdb3): disk space caching is enabled
# mount | grep /test3
/dev/sdb3 on /test3 type btrfs (rw,relatime,compress=zlib,space_cache,subvolid=5,subvol=/)

Signed-off-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
---
V1->V2: It is corrected that API doesn't change.

 fs/btrfs/super.c | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

Comments

David Sterba Jan. 13, 2016, 12:33 p.m. UTC | #1
On Wed, Jan 06, 2016 at 05:03:40PM +0900, Tsutomu Itoh wrote:
>  			} else if (strncmp(args[0].from, "no", 2) == 0) {
>  				compress_type = "no";
>  				btrfs_clear_opt(info->mount_opt, COMPRESS);
>  				btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
>  				compress_force = false;
> +				no_compress++;
>  			} else {
...
> +			if ((btrfs_test_opt(root, COMPRESS) &&
> +			     (info->compress_type != saved_compress_type ||
> +			      compress_force != saved_compress_force)) ||
> +			    (!btrfs_test_opt(root, COMPRESS) &&
> +			     no_compress == 1)) {

If there are more than one 'compress=no' then the message won't be
printed. I don't see a reason for doing no_compress++ above.

> +				btrfs_info(root->fs_info,
> +					   "%s %s compression",
> +					   (compress_force) ? "force" : "use",
> +					   compress_type);
> +			}
> +			compress_force = false;
>  			break;
>  		case Opt_ssd:
>  			btrfs_set_and_info(root, SSD,
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tsutomu Itoh Jan. 14, 2016, 12:09 a.m. UTC | #2
On 2016/01/13 21:33, David Sterba wrote:
> On Wed, Jan 06, 2016 at 05:03:40PM +0900, Tsutomu Itoh wrote:
>>   			} else if (strncmp(args[0].from, "no", 2) == 0) {
>>   				compress_type = "no";
>>   				btrfs_clear_opt(info->mount_opt, COMPRESS);
>>   				btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
>>   				compress_force = false;
>> +				no_compress++;
>>   			} else {
> ...
>> +			if ((btrfs_test_opt(root, COMPRESS) &&
>> +			     (info->compress_type != saved_compress_type ||
>> +			      compress_force != saved_compress_force)) ||
>> +			    (!btrfs_test_opt(root, COMPRESS) &&
>> +			     no_compress == 1)) {
>
> If there are more than one 'compress=no' then the message won't be
> printed. I don't see a reason for doing no_compress++ above.

I want to output message as follows. Therefore, no_compress++ is necessary.

# mount -o compress,compress,compress=no,compress=no,compress,compress=no <dev> <path>

[  162.048033] BTRFS: device fsid a7f6e96e-653e-42d0-8469-13025396caa2 devid 1 transid 3 <dev>
[  185.349034] BTRFS info (device <dev>): use zlib compression
[  185.349041] BTRFS info (device <dev>): use no compression
[  185.349045] BTRFS info (device <dev>): use zlib compression
[  185.349048] BTRFS info (device <dev>): use no compression
[  185.349050] BTRFS info (device <dev>): disk space caching is enabled

Thanks,
Tsutomu

>
>> +				btrfs_info(root->fs_info,
>> +					   "%s %s compression",
>> +					   (compress_force) ? "force" : "use",
>> +					   compress_type);
>> +			}
>> +			compress_force = false;
>>   			break;
>>   		case Opt_ssd:
>>   			btrfs_set_and_info(root, SSD,
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Sterba Jan. 14, 2016, 2:20 p.m. UTC | #3
On Thu, Jan 14, 2016 at 09:09:14AM +0900, Tsutomu Itoh wrote:
> On 2016/01/13 21:33, David Sterba wrote:
> > On Wed, Jan 06, 2016 at 05:03:40PM +0900, Tsutomu Itoh wrote:
> >>   			} else if (strncmp(args[0].from, "no", 2) == 0) {
> >>   				compress_type = "no";
> >>   				btrfs_clear_opt(info->mount_opt, COMPRESS);
> >>   				btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
> >>   				compress_force = false;
> >> +				no_compress++;
> >>   			} else {
> > ...
> >> +			if ((btrfs_test_opt(root, COMPRESS) &&
> >> +			     (info->compress_type != saved_compress_type ||
> >> +			      compress_force != saved_compress_force)) ||
> >> +			    (!btrfs_test_opt(root, COMPRESS) &&
> >> +			     no_compress == 1)) {
> >
> > If there are more than one 'compress=no' then the message won't be
> > printed. I don't see a reason for doing no_compress++ above.
> 
> I want to output message as follows. Therefore, no_compress++ is necessary.
> 
> # mount -o compress,compress,compress=no,compress=no,compress,compress=no <dev> <path>
> 
> [  162.048033] BTRFS: device fsid a7f6e96e-653e-42d0-8469-13025396caa2 devid 1 transid 3 <dev>
> [  185.349034] BTRFS info (device <dev>): use zlib compression
> [  185.349041] BTRFS info (device <dev>): use no compression
> [  185.349045] BTRFS info (device <dev>): use zlib compression
> [  185.349048] BTRFS info (device <dev>): use no compression
> [  185.349050] BTRFS info (device <dev>): disk space caching is enabled

I don't think it's necessary ty print all the options. Only the last one
is applied so I'd expect to see only "... use no compression".
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Sterba Jan. 14, 2016, 2:21 p.m. UTC | #4
On Thu, Jan 14, 2016 at 03:20:43PM +0100, David Sterba wrote:
> On Thu, Jan 14, 2016 at 09:09:14AM +0900, Tsutomu Itoh wrote:
> > On 2016/01/13 21:33, David Sterba wrote:
> > > On Wed, Jan 06, 2016 at 05:03:40PM +0900, Tsutomu Itoh wrote:
> > >>   			} else if (strncmp(args[0].from, "no", 2) == 0) {
> > >>   				compress_type = "no";
> > >>   				btrfs_clear_opt(info->mount_opt, COMPRESS);
> > >>   				btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
> > >>   				compress_force = false;
> > >> +				no_compress++;
> > >>   			} else {
> > > ...
> > >> +			if ((btrfs_test_opt(root, COMPRESS) &&
> > >> +			     (info->compress_type != saved_compress_type ||
> > >> +			      compress_force != saved_compress_force)) ||
> > >> +			    (!btrfs_test_opt(root, COMPRESS) &&
> > >> +			     no_compress == 1)) {
> > >
> > > If there are more than one 'compress=no' then the message won't be
> > > printed. I don't see a reason for doing no_compress++ above.
> > 
> > I want to output message as follows. Therefore, no_compress++ is necessary.
> > 
> > # mount -o compress,compress,compress=no,compress=no,compress,compress=no <dev> <path>
> > 
> > [  162.048033] BTRFS: device fsid a7f6e96e-653e-42d0-8469-13025396caa2 devid 1 transid 3 <dev>
> > [  185.349034] BTRFS info (device <dev>): use zlib compression
> > [  185.349041] BTRFS info (device <dev>): use no compression
> > [  185.349045] BTRFS info (device <dev>): use zlib compression
> > [  185.349048] BTRFS info (device <dev>): use no compression
> > [  185.349050] BTRFS info (device <dev>): disk space caching is enabled
> 
> I don't think it's necessary ty print all the options. Only the last one
> is applied so I'd expect to see only "... use no compression".

... but we do print all the options as we find them already, never mind.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tsutomu Itoh Jan. 15, 2016, 12:14 a.m. UTC | #5
On 2016/01/14 23:20, David Sterba wrote:
> On Thu, Jan 14, 2016 at 09:09:14AM +0900, Tsutomu Itoh wrote:
>> On 2016/01/13 21:33, David Sterba wrote:
>>> On Wed, Jan 06, 2016 at 05:03:40PM +0900, Tsutomu Itoh wrote:
>>>>    			} else if (strncmp(args[0].from, "no", 2) == 0) {
>>>>    				compress_type = "no";
>>>>    				btrfs_clear_opt(info->mount_opt, COMPRESS);
>>>>    				btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
>>>>    				compress_force = false;
>>>> +				no_compress++;
>>>>    			} else {
>>> ...
>>>> +			if ((btrfs_test_opt(root, COMPRESS) &&
>>>> +			     (info->compress_type != saved_compress_type ||
>>>> +			      compress_force != saved_compress_force)) ||
>>>> +			    (!btrfs_test_opt(root, COMPRESS) &&
>>>> +			     no_compress == 1)) {
>>>
>>> If there are more than one 'compress=no' then the message won't be
>>> printed. I don't see a reason for doing no_compress++ above.
>>
>> I want to output message as follows. Therefore, no_compress++ is necessary.
>>
>> # mount -o compress,compress,compress=no,compress=no,compress,compress=no <dev> <path>
>>
>> [  162.048033] BTRFS: device fsid a7f6e96e-653e-42d0-8469-13025396caa2 devid 1 transid 3 <dev>
>> [  185.349034] BTRFS info (device <dev>): use zlib compression
>> [  185.349041] BTRFS info (device <dev>): use no compression
>> [  185.349045] BTRFS info (device <dev>): use zlib compression
>> [  185.349048] BTRFS info (device <dev>): use no compression
>> [  185.349050] BTRFS info (device <dev>): disk space caching is enabled
>
> I don't think it's necessary ty print all the options. Only the last one
> is applied so I'd expect to see only "... use no compression".

I see.
However, the output of other options are also the same as the above-mentioned.

e.g.
# mount -o discard,nodiscard,discard <dev> <path>

[56714.781948] BTRFS: device fsid 22f3af7e-0f1c-40fe-8eb1-091df7bd1da2 devid 1 transid 3 <dev>
[56736.296779] BTRFS info (device <dev>): turning on discard
[56736.296785] BTRFS info (device <dev>): turning off discard
[56736.296789] BTRFS info (device <dev>): turning on discard
[56736.296792] BTRFS info (device <dev>): disk space caching is enabled

Thanks,
Tsutomu

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 24154e4..12d04c9 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -381,6 +381,9 @@  int btrfs_parse_options(struct btrfs_root *root, char *options)
 	int ret = 0;
 	char *compress_type;
 	bool compress_force = false;
+	enum btrfs_compression_type saved_compress_type;
+	bool saved_compress_force;
+	int no_compress = 0;
 
 	cache_gen = btrfs_super_cache_generation(root->fs_info->super_copy);
 	if (cache_gen)
@@ -458,6 +461,10 @@  int btrfs_parse_options(struct btrfs_root *root, char *options)
 			/* Fallthrough */
 		case Opt_compress:
 		case Opt_compress_type:
+			saved_compress_type = btrfs_test_opt(root, COMPRESS) ?
+				info->compress_type : BTRFS_COMPRESS_NONE;
+			saved_compress_force =
+				btrfs_test_opt(root, FORCE_COMPRESS);
 			if (token == Opt_compress ||
 			    token == Opt_compress_force ||
 			    strcmp(args[0].from, "zlib") == 0) {
@@ -466,6 +473,7 @@  int btrfs_parse_options(struct btrfs_root *root, char *options)
 				btrfs_set_opt(info->mount_opt, COMPRESS);
 				btrfs_clear_opt(info->mount_opt, NODATACOW);
 				btrfs_clear_opt(info->mount_opt, NODATASUM);
+				no_compress = 0;
 			} else if (strcmp(args[0].from, "lzo") == 0) {
 				compress_type = "lzo";
 				info->compress_type = BTRFS_COMPRESS_LZO;
@@ -473,25 +481,21 @@  int btrfs_parse_options(struct btrfs_root *root, char *options)
 				btrfs_clear_opt(info->mount_opt, NODATACOW);
 				btrfs_clear_opt(info->mount_opt, NODATASUM);
 				btrfs_set_fs_incompat(info, COMPRESS_LZO);
+				no_compress = 0;
 			} else if (strncmp(args[0].from, "no", 2) == 0) {
 				compress_type = "no";
 				btrfs_clear_opt(info->mount_opt, COMPRESS);
 				btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
 				compress_force = false;
+				no_compress++;
 			} else {
 				ret = -EINVAL;
 				goto out;
 			}
 
 			if (compress_force) {
-				btrfs_set_and_info(root, FORCE_COMPRESS,
-						   "force %s compression",
-						   compress_type);
+				btrfs_set_opt(info->mount_opt, FORCE_COMPRESS);
 			} else {
-				if (!btrfs_test_opt(root, COMPRESS))
-					btrfs_info(root->fs_info,
-						   "btrfs: use %s compression",
-						   compress_type);
 				/*
 				 * If we remount from compress-force=xxx to
 				 * compress=xxx, we need clear FORCE_COMPRESS
@@ -500,6 +504,17 @@  int btrfs_parse_options(struct btrfs_root *root, char *options)
 				 */
 				btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
 			}
+			if ((btrfs_test_opt(root, COMPRESS) &&
+			     (info->compress_type != saved_compress_type ||
+			      compress_force != saved_compress_force)) ||
+			    (!btrfs_test_opt(root, COMPRESS) &&
+			     no_compress == 1)) {
+				btrfs_info(root->fs_info,
+					   "%s %s compression",
+					   (compress_force) ? "force" : "use",
+					   compress_type);
+			}
+			compress_force = false;
 			break;
 		case Opt_ssd:
 			btrfs_set_and_info(root, SSD,