linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] btrfs-progs: GCC9 fixes
@ 2019-06-17  7:59 Qu Wenruo
  2019-06-17  7:59 ` [PATCH 1/4] btrfs-progs: constify extent buffer reader Qu Wenruo
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Qu Wenruo @ 2019-06-17  7:59 UTC (permalink / raw)
  To: linux-btrfs

This patchset will address the remaining warning when compiling
btrfs-progs devel branch with GCC9.

It's based on the following commit:
commit 9a1d86a9ac7384b332db498822585a2255f7d3e6 (david/devel)
Author: David Sterba <dsterba@suse.com>
Date:   Thu Jun 13 20:45:49 2019 +0200

    btrfs-progs: build: disable -Waddress-of-packed-member by default


Please note that the 2nd patch mostly replace commit 691656abdc9a
("btrfs-progs: fix gcc9 warning and potentially unaligned access to dev stats") by
backporing kernel btrfs_dev_stats_value() to btrfs-progs.
Thus the original fix can be removed.

The remaining warning is -Warray-boundary, but that one looks pretty
strange. The code looks good, and I backported an easy version:

  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <stddef.h>
  
  struct test_struct {
  	long long off_0_7;
  	int	offset_8_11;
  	unsigned char offset_12_12;
  } __attribute__ ((packed));
  
  void reset_values(struct test_struct *ptr)
  {
  	memset(&ptr->offset_8_11, 0, sizeof(struct test_struct) - offsetof(struct test_struct, offset_8_11));
  }
  
  int main()
  {
  	struct test_struct my_struct = { 0xffff, 0xff, 0xff};
  
  	printf("struct=0x%llx start=0x%llx len=0x%x\n",
  		&my_struct, &my_struct.offset_8_11, sizeof(struct test_struct) - offsetof(struct test_struct, offset_8_11));
  	reset_values(&my_struct);
  	printf("0x%lx 0x%x 0x%x\n", my_struct.off_0_7, my_struct.offset_8_11, my_struct.offset_12_12);
  	return 0;
  }

Which doesn't reproduce the warning.
Thus looks like a false warning and a bug in gcc.

Qu Wenruo (4):
  btrfs-progs: constify extent buffer reader
  btrfs-progs: Fix -Waddress-of-packed-member warning in
    btrfs_dev_stats_values callers
  btrfs-progs: Remove unnecessary fallthrough attribute in
    test_num_disk_vs_raid()
  btrfs-progs: Fix Wformat-overflow warning in cmds-receive.c

 cmds-receive.c |  4 ++--
 ctree.h        | 13 +++++++++++++
 extent_io.c    |  4 ++--
 extent_io.h    |  4 ++--
 print-tree.c   | 21 ++++++---------------
 utils.c        |  1 -
 6 files changed, 25 insertions(+), 22 deletions(-)

-- 
2.22.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/4] btrfs-progs: constify extent buffer reader
  2019-06-17  7:59 [PATCH 0/4] btrfs-progs: GCC9 fixes Qu Wenruo
@ 2019-06-17  7:59 ` Qu Wenruo
  2019-06-17  7:59 ` [PATCH 2/4] btrfs-progs: Fix -Waddress-of-packed-member warning in btrfs_dev_stats_values callers Qu Wenruo
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Qu Wenruo @ 2019-06-17  7:59 UTC (permalink / raw)
  To: linux-btrfs

Add const prefix for the following parameters:
- @eb of memcmp_extent_buffer()
- @eb of read_extent_buffer()

This backports kernel commit 1cbb1f454e53 ("btrfs: struct-funcs,
constify readers") to btrfs-progs.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 extent_io.c | 4 ++--
 extent_io.h | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/extent_io.c b/extent_io.c
index c57f62829bf7..a9ceff5111fb 100644
--- a/extent_io.c
+++ b/extent_io.c
@@ -963,13 +963,13 @@ int clear_extent_buffer_dirty(struct extent_buffer *eb)
 	return 0;
 }
 
-int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,
+int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,
 			 unsigned long start, unsigned long len)
 {
 	return memcmp(eb->data + start, ptrv, len);
 }
 
-void read_extent_buffer(struct extent_buffer *eb, void *dst,
+void read_extent_buffer(const struct extent_buffer *eb, void *dst,
 			unsigned long start, unsigned long len)
 {
 	memcpy(dst, eb->data + start, len);
diff --git a/extent_io.h b/extent_io.h
index 9587528bbefb..874cbca1d436 100644
--- a/extent_io.h
+++ b/extent_io.h
@@ -154,9 +154,9 @@ void free_extent_buffer_nocache(struct extent_buffer *eb);
 int read_extent_from_disk(struct extent_buffer *eb,
 			  unsigned long offset, unsigned long len);
 int write_extent_to_disk(struct extent_buffer *eb);
-int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,
+int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,
 			 unsigned long start, unsigned long len);
-void read_extent_buffer(struct extent_buffer *eb, void *dst,
+void read_extent_buffer(const struct extent_buffer *eb, void *dst,
 			unsigned long start, unsigned long len);
 void write_extent_buffer(struct extent_buffer *eb, const void *src,
 			 unsigned long start, unsigned long len);
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/4] btrfs-progs: Fix -Waddress-of-packed-member warning in btrfs_dev_stats_values callers
  2019-06-17  7:59 [PATCH 0/4] btrfs-progs: GCC9 fixes Qu Wenruo
  2019-06-17  7:59 ` [PATCH 1/4] btrfs-progs: constify extent buffer reader Qu Wenruo
@ 2019-06-17  7:59 ` Qu Wenruo
  2019-06-17  7:59 ` [PATCH 3/4] btrfs-progs: Remove unnecessary fallthrough attribute in test_num_disk_vs_raid() Qu Wenruo
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Qu Wenruo @ 2019-06-17  7:59 UTC (permalink / raw)
  To: linux-btrfs

[BUG]
GCC 9.1.0 will report the following error when compiling btrfs-progs:

  In file included from print-tree.c:24:
  ctree.h: In function 'btrfs_dev_stats_values':
  ctree.h:2408:9: warning: taking address of packed member of 'struct btrfs_dev_stats_item' may result in an unaligned pointer value [-Waddress-of-packed-member]
   2408 |  return p->values;
        |         ^

[FIX]
Follow the kernel way of accessing dev stats by using
btrfs_dev_stats_value(eb, ptr, index).
So that we don't need to bother accessing the packed member.

This also unifies the helper function in kernel and btrfs-progs.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 ctree.h      | 13 +++++++++++++
 print-tree.c | 21 ++++++---------------
 2 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/ctree.h b/ctree.h
index 8d710fcb5f72..d5ef1064a45a 100644
--- a/ctree.h
+++ b/ctree.h
@@ -2395,6 +2395,19 @@ static inline struct btrfs_disk_balance_args* btrfs_balance_item_sys(
 	return &p->sys;
 }
 
+static inline u64 btrfs_dev_stats_value(const struct extent_buffer *eb,
+					const struct btrfs_dev_stats_item *ptr,
+					int index)
+{
+	u64 val;
+
+	read_extent_buffer(eb, &val,
+			   offsetof(struct btrfs_dev_stats_item, values) +
+			    ((unsigned long)ptr) + (index * sizeof(u64)),
+			   sizeof(val));
+	return val;
+}
+
 /*
  * this returns the number of bytes used by the item on disk, minus the
  * size of any extent headers.  If a file is compressed on disk, this is
diff --git a/print-tree.c b/print-tree.c
index b5e0587d0b96..1ca683a61c35 100644
--- a/print-tree.c
+++ b/print-tree.c
@@ -953,32 +953,23 @@ static void print_balance_item(struct extent_buffer *eb,
 static void print_dev_stats(struct extent_buffer *eb,
 		struct btrfs_dev_stats_item *stats, u32 size)
 {
-	struct btrfs_dev_stats_item *item;
-	const unsigned long offset = (unsigned long)stats;
 	u32 known = BTRFS_DEV_STAT_VALUES_MAX * sizeof(__le64);
 	int i;
 
-	item = (struct btrfs_dev_stats_item *)(eb->data + offset);
-
 	printf("\t\tdevice stats\n");
 	printf("\t\twrite_errs %llu read_errs %llu flush_errs %llu corruption_errs %llu generation %llu\n",
-		(unsigned long long)get_unaligned_le64(
-				&item->values[BTRFS_DEV_STAT_WRITE_ERRS]),
-		(unsigned long long)get_unaligned_le64(
-				&item->values[BTRFS_DEV_STAT_READ_ERRS]),
-		(unsigned long long)get_unaligned_le64(
-				&item->values[BTRFS_DEV_STAT_FLUSH_ERRS]),
-		(unsigned long long)get_unaligned_le64(
-				&item->values[BTRFS_DEV_STAT_CORRUPTION_ERRS]),
-		(unsigned long long)get_unaligned_le64(
-				&item->values[BTRFS_DEV_STAT_GENERATION_ERRS]));
+	      btrfs_dev_stats_value(eb, stats, BTRFS_DEV_STAT_WRITE_ERRS),
+	      btrfs_dev_stats_value(eb, stats, BTRFS_DEV_STAT_READ_ERRS),
+	      btrfs_dev_stats_value(eb, stats, BTRFS_DEV_STAT_FLUSH_ERRS),
+	      btrfs_dev_stats_value(eb, stats, BTRFS_DEV_STAT_CORRUPTION_ERRS),
+	      btrfs_dev_stats_value(eb, stats, BTRFS_DEV_STAT_GENERATION_ERRS));
 
 	if (known < size) {
 		printf("\t\tunknown stats item bytes %u", size - known);
 		for (i = BTRFS_DEV_STAT_VALUES_MAX; i * sizeof(__le64) < size; i++) {
 			printf("\t\tunknown item %u offset %zu value %llu\n",
 				i, i * sizeof(__le64),
-				(unsigned long long)le64_to_cpu(&item->values[i]));
+				btrfs_dev_stats_value(eb, stats, i));
 		}
 	}
 }
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/4] btrfs-progs: Remove unnecessary fallthrough attribute in test_num_disk_vs_raid()
  2019-06-17  7:59 [PATCH 0/4] btrfs-progs: GCC9 fixes Qu Wenruo
  2019-06-17  7:59 ` [PATCH 1/4] btrfs-progs: constify extent buffer reader Qu Wenruo
  2019-06-17  7:59 ` [PATCH 2/4] btrfs-progs: Fix -Waddress-of-packed-member warning in btrfs_dev_stats_values callers Qu Wenruo
@ 2019-06-17  7:59 ` Qu Wenruo
  2019-06-18 13:14   ` David Sterba
  2019-06-17  7:59 ` [PATCH 4/4] btrfs-progs: Fix Wformat-overflow warning in cmds-receive.c Qu Wenruo
  2019-06-18 13:20 ` [PATCH 0/4] btrfs-progs: GCC9 fixes David Sterba
  4 siblings, 1 reply; 7+ messages in thread
From: Qu Wenruo @ 2019-06-17  7:59 UTC (permalink / raw)
  To: linux-btrfs

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 utils.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/utils.c b/utils.c
index 0b271517551b..2709ced97f97 100644
--- a/utils.c
+++ b/utils.c
@@ -1928,7 +1928,6 @@ int test_num_disk_vs_raid(u64 metadata_profile, u64 data_profile,
 		__attribute__ ((fallthrough));
 	case 1:
 		allowed |= BTRFS_BLOCK_GROUP_DUP;
-		__attribute__ ((fallthrough));
 	}
 
 	if (dev_cnt > 1 && profile & BTRFS_BLOCK_GROUP_DUP) {
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 4/4] btrfs-progs: Fix Wformat-overflow warning in cmds-receive.c
  2019-06-17  7:59 [PATCH 0/4] btrfs-progs: GCC9 fixes Qu Wenruo
                   ` (2 preceding siblings ...)
  2019-06-17  7:59 ` [PATCH 3/4] btrfs-progs: Remove unnecessary fallthrough attribute in test_num_disk_vs_raid() Qu Wenruo
@ 2019-06-17  7:59 ` Qu Wenruo
  2019-06-18 13:20 ` [PATCH 0/4] btrfs-progs: GCC9 fixes David Sterba
  4 siblings, 0 replies; 7+ messages in thread
From: Qu Wenruo @ 2019-06-17  7:59 UTC (permalink / raw)
  To: linux-btrfs

[BUG]
When compiling btrfs-progs with GCC 9 (9.1.0), we got the following
warnings:
  In file included from utils.h:30,
                   from cmds-receive.c:45:
  cmds-receive.c: In function 'process_subvol':
  messages.h:42:3: warning: '%s' directive argument is null [-Wformat-overflow=]
     42 |   __btrfs_error((fmt), ##__VA_ARGS__);   \
        |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  cmds-receive.c:178:3: note: in expansion of macro 'error'
    178 |   error("subvol: another one already started, path buf: %s",
        |   ^~~~~
      [CC]     cmds-inspect-tree-stats.o
  cmds-receive.c: In function 'process_snapshot':
  messages.h:42:3: warning: '%s' directive argument is null [-Wformat-overflow=]
     42 |   __btrfs_error((fmt), ##__VA_ARGS__);   \
        |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  cmds-receive.c:248:3: note: in expansion of macro 'error'
    248 |   error("snapshot: another one already started, path buf: %s",
        |   ^~~~~

[FIX]
We're using wrong member for the error output.
Fix the member to output.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 cmds-receive.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cmds-receive.c b/cmds-receive.c
index fe5c3a5b05c5..07f05101f921 100644
--- a/cmds-receive.c
+++ b/cmds-receive.c
@@ -176,7 +176,7 @@ static int process_subvol(const char *path, const u8 *uuid, u64 ctransid,
 	}
 	if (rctx->cur_subvol_path[0]) {
 		error("subvol: another one already started, path buf: %s",
-				rctx->cur_subvol.path);
+				rctx->cur_subvol_path);
 		ret = -EINVAL;
 		goto out;
 	}
@@ -246,7 +246,7 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid,
 	}
 	if (rctx->cur_subvol_path[0]) {
 		error("snapshot: another one already started, path buf: %s",
-				rctx->cur_subvol.path);
+				rctx->cur_subvol_path);
 		ret = -EINVAL;
 		goto out;
 	}
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 3/4] btrfs-progs: Remove unnecessary fallthrough attribute in test_num_disk_vs_raid()
  2019-06-17  7:59 ` [PATCH 3/4] btrfs-progs: Remove unnecessary fallthrough attribute in test_num_disk_vs_raid() Qu Wenruo
@ 2019-06-18 13:14   ` David Sterba
  0 siblings, 0 replies; 7+ messages in thread
From: David Sterba @ 2019-06-18 13:14 UTC (permalink / raw)
  To: Qu Wenruo; +Cc: linux-btrfs

Even though this is a simple fix, the warning should be here and the
versio that triggered it.

On Mon, Jun 17, 2019 at 03:59:35PM +0800, Qu Wenruo wrote:
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> ---
>  utils.c | 1 -
>  1 file changed, 1 deletion(-)
> 
> diff --git a/utils.c b/utils.c
> index 0b271517551b..2709ced97f97 100644
> --- a/utils.c
> +++ b/utils.c
> @@ -1928,7 +1928,6 @@ int test_num_disk_vs_raid(u64 metadata_profile, u64 data_profile,
>  		__attribute__ ((fallthrough));
>  	case 1:
>  		allowed |= BTRFS_BLOCK_GROUP_DUP;
> -		__attribute__ ((fallthrough));
>  	}
>  
>  	if (dev_cnt > 1 && profile & BTRFS_BLOCK_GROUP_DUP) {
> -- 
> 2.22.0

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 0/4] btrfs-progs: GCC9 fixes
  2019-06-17  7:59 [PATCH 0/4] btrfs-progs: GCC9 fixes Qu Wenruo
                   ` (3 preceding siblings ...)
  2019-06-17  7:59 ` [PATCH 4/4] btrfs-progs: Fix Wformat-overflow warning in cmds-receive.c Qu Wenruo
@ 2019-06-18 13:20 ` David Sterba
  4 siblings, 0 replies; 7+ messages in thread
From: David Sterba @ 2019-06-18 13:20 UTC (permalink / raw)
  To: Qu Wenruo; +Cc: linux-btrfs

On Mon, Jun 17, 2019 at 03:59:32PM +0800, Qu Wenruo wrote:
> This patchset will address the remaining warning when compiling
> btrfs-progs devel branch with GCC9.
> 
> It's based on the following commit:
> commit 9a1d86a9ac7384b332db498822585a2255f7d3e6 (david/devel)
> Author: David Sterba <dsterba@suse.com>
> Date:   Thu Jun 13 20:45:49 2019 +0200
> 
>     btrfs-progs: build: disable -Waddress-of-packed-member by default
> 
> 
> Please note that the 2nd patch mostly replace commit 691656abdc9a
> ("btrfs-progs: fix gcc9 warning and potentially unaligned access to dev stats") by
> backporing kernel btrfs_dev_stats_value() to btrfs-progs.
> Thus the original fix can be removed.

Yeah, the backport is better, patch replaced.

> The remaining warning is -Warray-boundary, but that one looks pretty
> strange. The code looks good, and I backported an easy version:
> 
>   #include <stdio.h>
>   #include <stdlib.h>
>   #include <string.h>
>   #include <stddef.h>
>   
>   struct test_struct {
>   	long long off_0_7;
>   	int	offset_8_11;
>   	unsigned char offset_12_12;
>   } __attribute__ ((packed));
>   
>   void reset_values(struct test_struct *ptr)
>   {
>   	memset(&ptr->offset_8_11, 0, sizeof(struct test_struct) - offsetof(struct test_struct, offset_8_11));
>   }
>   
>   int main()
>   {
>   	struct test_struct my_struct = { 0xffff, 0xff, 0xff};
>   
>   	printf("struct=0x%llx start=0x%llx len=0x%x\n",
>   		&my_struct, &my_struct.offset_8_11, sizeof(struct test_struct) - offsetof(struct test_struct, offset_8_11));
>   	reset_values(&my_struct);
>   	printf("0x%lx 0x%x 0x%x\n", my_struct.off_0_7, my_struct.offset_8_11, my_struct.offset_12_12);
>   	return 0;
>   }
> 
> Which doesn't reproduce the warning.
> Thus looks like a false warning and a bug in gcc.


> 
> Qu Wenruo (4):
>   btrfs-progs: constify extent buffer reader
>   btrfs-progs: Fix -Waddress-of-packed-member warning in
>     btrfs_dev_stats_values callers
>   btrfs-progs: Remove unnecessary fallthrough attribute in
>     test_num_disk_vs_raid()
>   btrfs-progs: Fix Wformat-overflow warning in cmds-receive.c

1-4 applied, thanks.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-06-18 13:19 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-17  7:59 [PATCH 0/4] btrfs-progs: GCC9 fixes Qu Wenruo
2019-06-17  7:59 ` [PATCH 1/4] btrfs-progs: constify extent buffer reader Qu Wenruo
2019-06-17  7:59 ` [PATCH 2/4] btrfs-progs: Fix -Waddress-of-packed-member warning in btrfs_dev_stats_values callers Qu Wenruo
2019-06-17  7:59 ` [PATCH 3/4] btrfs-progs: Remove unnecessary fallthrough attribute in test_num_disk_vs_raid() Qu Wenruo
2019-06-18 13:14   ` David Sterba
2019-06-17  7:59 ` [PATCH 4/4] btrfs-progs: Fix Wformat-overflow warning in cmds-receive.c Qu Wenruo
2019-06-18 13:20 ` [PATCH 0/4] btrfs-progs: GCC9 fixes David Sterba

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).