--- /dev/null
+Description: debugfs: restore and tweak original error messaging
+ .
+ In response to reviewer comments, commit fe56188b07 included changes
+ that modified some of the code used to output error messages when
+ checking user-supplied block numbers. These changes converted calls
+ to parse_ulonglong() to calls to strtoblk(). Because strtoblk() calls
+ parse_ulonglong(), and both output error messages, two redundant and
+ relatively generic messages were output on each error.
+ .
+ Fix this by removing the error message output from strtoblk(), and
+ extending it to accept an optional error message argument that it
+ supplies in lieu of a default to parse_ulonglong(). Also, revert to
+ the more descriptive original error messages with mods per reviewer
+ comments, and fix an error message in do_replace_node().
+ .
+Author: Eric Whitney <enwlinux@gmail.com>
+Origin: upstream
+
+diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
+index cf7670b..998af33 100644
+--- a/debugfs/debugfs.c
++++ b/debugfs/debugfs.c
+@@ -181,7 +181,8 @@ void do_open_filesys(int argc, char **argv)
+ return;
+ break;
+ case 's':
+- err = strtoblk(argv[0], optarg, &superblock);
++ err = strtoblk(argv[0], optarg,
++ "superblock block number", &superblock);
+ if (err)
+ return;
+ break;
+@@ -284,7 +285,7 @@ void do_init_filesys(int argc, char **argv)
+ return;
+
+ memset(¶m, 0, sizeof(struct ext2_super_block));
+- err = strtoblk(argv[0], argv[2], &blocks);
++ err = strtoblk(argv[0], argv[2], "blocks count", &blocks);
+ if (err)
+ return;
+ ext2fs_blocks_count_set(¶m, blocks);
+@@ -2100,7 +2101,7 @@ void do_bmap(int argc, char *argv[])
+ ino = string_to_inode(argv[1]);
+ if (!ino)
+ return;
+- err = strtoblk(argv[0], argv[2], &blk);
++ err = strtoblk(argv[0], argv[2], "logical block", &blk);
+ if (err)
+ return;
+
+@@ -2247,11 +2248,11 @@ void do_punch(int argc, char *argv[])
+ ino = string_to_inode(argv[1]);
+ if (!ino)
+ return;
+- err = strtoblk(argv[0], argv[2], &start);
++ err = strtoblk(argv[0], argv[2], "logical block", &start);
+ if (err)
+ return;
+ if (argc == 4) {
+- err = strtoblk(argv[0], argv[3], &end);
++ err = strtoblk(argv[0], argv[3], "logical block", &end);
+ if (err)
+ return;
+ } else
+@@ -2457,7 +2458,9 @@ int main(int argc, char **argv)
+ "block size", 0);
+ break;
+ case 's':
+- retval = strtoblk(argv[0], optarg, &superblock);
++ retval = strtoblk(argv[0], optarg,
++ "superblock block number",
++ &superblock);
+ if (retval)
+ return 1;
+ break;
+diff --git a/debugfs/debugfs.h b/debugfs/debugfs.h
+index 6b4f6ef..33389fa 100644
+--- a/debugfs/debugfs.h
++++ b/debugfs/debugfs.h
+@@ -39,7 +39,8 @@ extern unsigned long parse_ulong(const char *str, const char *cmd,
+ const char *descr, int *err);
+ extern unsigned long long parse_ulonglong(const char *str, const char *cmd,
+ const char *descr, int *err);
+-extern int strtoblk(const char *cmd, const char *str, blk64_t *ret);
++extern int strtoblk(const char *cmd, const char *str, const char *errmsg,
++ blk64_t *ret);
+ extern int common_args_process(int argc, char *argv[], int min_argc,
+ int max_argc, const char *cmd,
+ const char *usage, int flags);
+diff --git a/debugfs/extent_inode.c b/debugfs/extent_inode.c
+index b3c55f9..8b22f5e 100644
+--- a/debugfs/extent_inode.c
++++ b/debugfs/extent_inode.c
+@@ -264,15 +264,15 @@ void do_replace_node(int argc, char *argv[])
+ return;
+ }
+
+- err = strtoblk(argv[0], argv[1], &extent.e_lblk);
++ err = strtoblk(argv[0], argv[1], "logical block", &extent.e_lblk);
+ if (err)
+ return;
+
+- extent.e_len = parse_ulong(argv[2], argv[0], "logical block", &err);
++ extent.e_len = parse_ulong(argv[2], argv[0], "length", &err);
+ if (err)
+ return;
+
+- err = strtoblk(argv[0], argv[3], &extent.e_pblk);
++ err = strtoblk(argv[0], argv[3], "physical block", &extent.e_pblk);
+ if (err)
+ return;
+
+@@ -338,16 +338,15 @@ void do_insert_node(int argc, char *argv[])
+ return;
+ }
+
+- err = strtoblk(cmd, argv[1], &extent.e_lblk);
++ err = strtoblk(cmd, argv[1], "logical block", &extent.e_lblk);
+ if (err)
+ return;
+
+- extent.e_len = parse_ulong(argv[2], cmd,
+- "length", &err);
++ extent.e_len = parse_ulong(argv[2], cmd, "length", &err);
+ if (err)
+ return;
+
+- err = strtoblk(cmd, argv[3], &extent.e_pblk);
++ err = strtoblk(cmd, argv[3], "physical block", &extent.e_pblk);
+ if (err)
+ return;
+
+@@ -385,11 +384,11 @@ void do_set_bmap(int argc, char **argv)
+ return;
+ }
+
+- err = strtoblk(cmd, argv[1], &logical);
++ err = strtoblk(cmd, argv[1], "logical block", &logical);
+ if (err)
+ return;
+
+- err = strtoblk(cmd, argv[2], &physical);
++ err = strtoblk(cmd, argv[2], "physical block", &physical);
+ if (err)
+ return;
+
+@@ -516,7 +515,7 @@ void do_goto_block(int argc, char **argv)
+ "block [level]", 0))
+ return;
+
+- if (strtoblk(argv[0], argv[1], &blk))
++ if (strtoblk(argv[0], argv[1], NULL, &blk))
+ return;
+
+ if (argc == 3) {
+diff --git a/debugfs/icheck.c b/debugfs/icheck.c
+index 48f432a..3b9bd14 100644
+--- a/debugfs/icheck.c
++++ b/debugfs/icheck.c
+@@ -86,7 +86,7 @@ void do_icheck(int argc, char **argv)
+ }
+
+ for (i=1; i < argc; i++) {
+- if (strtoblk(argv[0], argv[i], &bw.barray[i-1].blk))
++ if (strtoblk(argv[0], argv[i], NULL, &bw.barray[i-1].blk))
+ goto error_out;
+ }
+
+diff --git a/debugfs/util.c b/debugfs/util.c
+index aafbc56..21991cf 100644
+--- a/debugfs/util.c
++++ b/debugfs/util.c
+@@ -301,17 +301,20 @@ unsigned long long parse_ulonglong(const char *str, const char *cmd,
+
+ /*
+ * This function will convert a string to a block number. It returns
+- * 0 on success, 1 on failure.
++ * 0 on success, 1 on failure. On failure, it outputs either an optionally
++ * specified error message or a default.
+ */
+-int strtoblk(const char *cmd, const char *str, blk64_t *ret)
++int strtoblk(const char *cmd, const char *str, const char *errmsg,
++ blk64_t *ret)
+ {
+ blk64_t blk;
+ int err;
+
+- blk = parse_ulonglong(str, cmd, "block number", &err);
++ if (errmsg == NULL)
++ blk = parse_ulonglong(str, cmd, "block number", &err);
++ else
++ blk = parse_ulonglong(str, cmd, errmsg, &err);
+ *ret = blk;
+- if (err)
+- com_err(cmd, 0, "Invalid block number: %s", str);
+ return err;
+ }
+
+@@ -369,7 +372,7 @@ int common_block_args_process(int argc, char *argv[],
+ "<block> [count]", CHECK_FS_BITMAPS))
+ return 1;
+
+- if (strtoblk(argv[0], argv[1], block))
++ if (strtoblk(argv[0], argv[1], NULL, block))
+ return 1;
+ if (*block == 0) {
+ com_err(argv[0], 0, "Invalid block number 0");
+@@ -377,7 +380,7 @@ int common_block_args_process(int argc, char *argv[],
+ }
+
+ if (argc > 2) {
+- err = strtoblk(argv[0], argv[2], count);
++ err = strtoblk(argv[0], argv[2], "count", count);
+ if (err)
+ return 1;
+ }