All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] erofs-utils: dump: fix format errors on some architectures
@ 2021-11-21 22:23 David Michael
  2021-11-21 23:48 ` [PATCH] erofs-utils: dump: fix de->nid issues Gao Xiang
  0 siblings, 1 reply; 2+ messages in thread
From: David Michael @ 2021-11-21 22:23 UTC (permalink / raw)
  To: linux-erofs

This applies the same type casting to nid values as is done in the
other formatting function calls to avoid this error:

    In file included from main.c:11:
    main.c: In function 'erofs_checkdirent':
    ../include/erofs/print.h:68:25: error: format '%llu' expects argument of type 'long long unsigned int', but argument 3 has type '__le64' {aka 'long unsigned int'} [-Werror=format=]
       68 |                         "<E> " PR_FMT_FUNC_LINE(fmt),   \
          |                         ^~~~~~
    main.c:264:17: note: in expansion of macro 'erofs_err'
      264 |                 erofs_err("invalid file type %llu", de->nid);
          |                 ^~~~~~~~~
    main.c: In function 'erofs_read_dirent':
    ../include/erofs/print.h:68:25: error: format '%llu' expects argument of type 'long long unsigned int', but argument 3 has type '__le64' {aka 'long unsigned int'} [-Werror=format=]
       68 |                         "<E> " PR_FMT_FUNC_LINE(fmt),   \
          |                         ^~~~~~
    main.c:303:25: note: in expansion of macro 'erofs_err'
      303 |                         erofs_err("parse dir nid %llu error occurred\n",
          |                         ^~~~~~~~~
    cc1: all warnings being treated as errors

Signed-off-by: David Michael <fedora.dm0@gmail.com>
---

Hi,

I hit this build failure on powerpc64le when trying the 1.4 release.
Can something like this be applied to get around it?

Thanks.

David

 dump/main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/dump/main.c b/dump/main.c
index b7560ec..6f5b9e7 100644
--- a/dump/main.c
+++ b/dump/main.c
@@ -261,7 +261,7 @@ static inline int erofs_checkdirent(struct erofs_dirent *de,
 		return -EFSCORRUPTED;
 	}
 	if (de->file_type >= EROFS_FT_MAX) {
-		erofs_err("invalid file type %llu", de->nid);
+		erofs_err("invalid file type %llu", de->nid | 0ULL);
 		return -EFSCORRUPTED;
 	}
 	return dname_len;
@@ -301,7 +301,7 @@ static int erofs_read_dirent(struct erofs_dirent *de,
 		err = erofs_read_dir(de->nid, nid);
 		if (err) {
 			erofs_err("parse dir nid %llu error occurred\n",
-					de->nid);
+					de->nid | 0ULL);
 			return err;
 		}
 	}
-- 
2.31.1


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

* [PATCH] erofs-utils: dump: fix de->nid issues
  2021-11-21 22:23 [PATCH] erofs-utils: dump: fix format errors on some architectures David Michael
@ 2021-11-21 23:48 ` Gao Xiang
  0 siblings, 0 replies; 2+ messages in thread
From: Gao Xiang @ 2021-11-21 23:48 UTC (permalink / raw)
  To: linux-erofs, David Michael, Guo Xuenan; +Cc: Wang Qi

As David Michael reported, "
    In file included from main.c:11:
    main.c: In function 'erofs_checkdirent':
    ../include/erofs/print.h:68:25: error: format '%llu' expects argument of type 'long long unsigned int', but argument 3 has type '__le64' {aka 'long unsigned int'} [-Werror=format=]
       68 |                         "<E> " PR_FMT_FUNC_LINE(fmt),   \
          |                         ^~~~~~
    main.c:264:17: note: in expansion of macro 'erofs_err'
      264 |                 erofs_err("invalid file type %llu", de->nid);
          |                 ^~~~~~~~~
    main.c: In function 'erofs_read_dirent':
    ../include/erofs/print.h:68:25: error: format '%llu' expects argument of type 'long long unsigned int', but argument 3 has type '__le64' {aka 'long unsigned int'} [-Werror=format=]
       68 |                         "<E> " PR_FMT_FUNC_LINE(fmt),   \
          |                         ^~~~~~
    main.c:303:25: note: in expansion of macro 'erofs_err'
      303 |                         erofs_err("parse dir nid %llu error occurred\n",
          |                         ^~~~~~~~~
    cc1: all warnings being treated as errors
"

Also there are many de->nid lacking of endianness handling.
Should fix them together.

Reported-by: David Michael <fedora.dm0@gmail.com>
Fixes: cf8be8a4352a ("erofs-utils: dump: add feature for collecting filesystem statistics")
Cc: Wang Qi <mpiglet@outlook.com>
Cc: Guo Xuenan <guoxuenan@huawei.com>
Signed-off-by: Gao Xiang <xiang@kernel.org>
---
Hi David,
Thanks for your report! Please help apply this patch instead.

Hi Xuenan,
Do you have some time cleaning up this part of code? that seems
quite messy to me..

Thanks,
Gao Xiang

 dump/main.c | 31 ++++++++++++++++---------------
 1 file changed, 16 insertions(+), 15 deletions(-)

diff --git a/dump/main.c b/dump/main.c
index b7560eca1080..f85903b059d2 100644
--- a/dump/main.c
+++ b/dump/main.c
@@ -242,11 +242,12 @@ static inline int erofs_checkdirent(struct erofs_dirent *de,
 {
 	int dname_len;
 	unsigned int nameoff = le16_to_cpu(de->nameoff);
+	erofs_nid_t nid = le64_to_cpu(de->nid);
 
 	if (nameoff < sizeof(struct erofs_dirent) ||
 			nameoff >= PAGE_SIZE) {
 		erofs_err("invalid de[0].nameoff %u @ nid %llu",
-				nameoff, de->nid | 0ULL);
+				nameoff, nid | 0ULL);
 		return -EFSCORRUPTED;
 	}
 
@@ -255,13 +256,12 @@ static inline int erofs_checkdirent(struct erofs_dirent *de,
 	/* a corrupted entry is found */
 	if (nameoff + dname_len > maxsize ||
 			dname_len > EROFS_NAME_LEN) {
-		erofs_err("bogus dirent @ nid %llu",
-				le64_to_cpu(de->nid) | 0ULL);
+		erofs_err("bogus dirent @ nid %llu", nid | 0ULL);
 		DBG_BUGON(1);
 		return -EFSCORRUPTED;
 	}
 	if (de->file_type >= EROFS_FT_MAX) {
-		erofs_err("invalid file type %llu", de->nid);
+		erofs_err("invalid file type %llu", nid | 0ULL);
 		return -EFSCORRUPTED;
 	}
 	return dname_len;
@@ -273,7 +273,7 @@ static int erofs_read_dirent(struct erofs_dirent *de,
 {
 	int err;
 	erofs_off_t occupied_size = 0;
-	struct erofs_inode inode = { .nid = de->nid };
+	struct erofs_inode inode = { .nid = le64_to_cpu(de->nid) };
 
 	stats.files++;
 	stats.file_category_stat[de->file_type]++;
@@ -296,12 +296,12 @@ static int erofs_read_dirent(struct erofs_dirent *de,
 		update_file_size_statatics(occupied_size, inode.i_size);
 	}
 
-	if ((de->file_type == EROFS_FT_DIR)
-			&& de->nid != nid && de->nid != parent_nid) {
-		err = erofs_read_dir(de->nid, nid);
+	if (de->file_type == EROFS_FT_DIR && inode.nid != nid &&
+	    inode.nid != parent_nid) {
+		err = erofs_read_dir(inode.nid, nid);
 		if (err) {
 			erofs_err("parse dir nid %llu error occurred\n",
-					de->nid);
+				  inode.nid | 0ULL);
 			return err;
 		}
 	}
@@ -338,7 +338,8 @@ static int erofs_read_dir(erofs_nid_t nid, erofs_nid_t parent_nid)
 			int ret;
 
 			/* skip "." and ".." dentry */
-			if (de->nid == nid || de->nid == parent_nid) {
+			if (le64_to_cpu(de->nid) == nid ||
+			    le64_to_cpu(de->nid) == parent_nid) {
 				de++;
 				continue;
 			}
@@ -399,18 +400,18 @@ static int erofs_get_pathname(erofs_nid_t nid, erofs_nid_t parent_nid,
 			if (len < 0)
 				return len;
 
-			if (de->nid == target) {
+			if (le64_to_cpu(de->nid) == target) {
 				memcpy(path + pos, dname, len);
 				path[pos + len] = '\0';
 				return 0;
 			}
 
 			if (de->file_type == EROFS_FT_DIR &&
-					de->nid != parent_nid &&
-					de->nid != nid) {
+			    le64_to_cpu(de->nid) != parent_nid &&
+			    le64_to_cpu(de->nid) != nid) {
 				memcpy(path + pos, dname, len);
-				err = erofs_get_pathname(de->nid, nid,
-						target, path, pos + len);
+				err = erofs_get_pathname(le64_to_cpu(de->nid),
+						nid, target, path, pos + len);
 				if (!err)
 					return 0;
 				memset(path + pos, 0, len);
-- 
2.20.1


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

end of thread, other threads:[~2021-11-21 23:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-21 22:23 [PATCH] erofs-utils: dump: fix format errors on some architectures David Michael
2021-11-21 23:48 ` [PATCH] erofs-utils: dump: fix de->nid issues Gao Xiang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.