All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/6] btrfs-progs: fix btrfs-image old_restore fsck failure
@ 2014-06-26  2:53 Gui Hecheng
  2014-06-26  2:53 ` [PATCH 2/6] btrfs-progs: deal with malloc failure in btrfs-image Gui Hecheng
                   ` (4 more replies)
  0 siblings, 5 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-06-26  2:53 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Gui Hecheng

Steps to reproduce:
	# mkfs.btrfs -f <dev1>
	# btrfs-image <dev1> <image_file>
	# btrfs-image -r -o <image_file> <dev2>
	# btrfs check <dev2>

btrfs check output:
	: read block failed check_tree_block
	: Couldn't read tree root
	: Couldn't open file system

The btrfs-image should not mess with the chunk tree under the old_restore way.

The new restore way was introduced by:
	commit d6f7e3da0dae7b60cb7565f8a47c3b9045c52d1d
	Btrfs-progs: make btrfs-image restore with a valid chunk tree V2
	...
And the following commit enhanced the new restore on the valid chunk tree
building stuff:
	commit ef2a8889ef813ba77061f6a92f4954d047a78932
	Btrfs-progs: make image restore with the original device offsets
	...

But the second commit should not effect the old_restore way since the
old_restore way doesn't try to build a valid chunk tree at all.
---
 btrfs-image.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/btrfs-image.c b/btrfs-image.c
index 02ae5d6..c90bca8 100644
--- a/btrfs-image.c
+++ b/btrfs-image.c
@@ -1668,7 +1668,7 @@ static void *restore_worker(void *data)
 		if (!mdres->fixup_offset) {
 			while (size) {
 				u64 chunk_size = size;
-				if (!mdres->multi_devices)
+				if (!mdres->multi_devices && !mdres->old_restore)
 					bytenr = logical_to_physical(mdres,
 								     async->start + offset,
 								     &chunk_size);
@@ -2282,7 +2282,7 @@ static int __restore_metadump(const char *input, FILE *out, int old_restore,
 		goto failed_cluster;
 	}
 
-	if (!multi_devices) {
+	if (!multi_devices && !old_restore) {
 		ret = build_chunk_tree(&mdrestore, cluster);
 		if (ret)
 			goto out;
-- 
1.8.1.4


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

* [PATCH 2/6] btrfs-progs: deal with malloc failure in btrfs-image
  2014-06-26  2:53 [PATCH 1/6] btrfs-progs: fix btrfs-image old_restore fsck failure Gui Hecheng
@ 2014-06-26  2:53 ` Gui Hecheng
  2014-06-26  2:53 ` [PATCH 3/6] btrfs-progs: cleanup unnecessary free if malloc fails " Gui Hecheng
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-06-26  2:53 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Gui Hecheng

Handle the malloc failure for dump_worker in the same way as
the restore worker.

Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
---
 btrfs-image.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/btrfs-image.c b/btrfs-image.c
index c90bca8..7131001 100644
--- a/btrfs-image.c
+++ b/btrfs-image.c
@@ -107,6 +107,8 @@ struct metadump_struct {
 	int done;
 	int data;
 	int sanitize_names;
+
+	int error;
 };
 
 struct name {
@@ -602,6 +604,14 @@ static void *dump_worker(void *data)
 
 			async->bufsize = compressBound(async->size);
 			async->buffer = malloc(async->bufsize);
+			if (!async->buffer) {
+				fprintf(stderr, "Error allocing buffer\n");
+				pthread_mutex_lock(&md->mutex);
+				if (!md->error)
+					md->error = -ENOMEM;
+				pthread_mutex_unlock(&md->mutex);
+				pthread_exit(NULL);
+			}
 
 			ret = compress2(async->buffer,
 					 (unsigned long *)&async->bufsize,
@@ -736,7 +746,7 @@ static int write_buffers(struct metadump_struct *md, u64 *next)
 		goto out;
 
 	/* wait until all buffers are compressed */
-	while (md->num_items > md->num_ready) {
+	while (!err && md->num_items > md->num_ready) {
 		struct timespec ts = {
 			.tv_sec = 0,
 			.tv_nsec = 10000000,
@@ -744,6 +754,13 @@ static int write_buffers(struct metadump_struct *md, u64 *next)
 		pthread_mutex_unlock(&md->mutex);
 		nanosleep(&ts, NULL);
 		pthread_mutex_lock(&md->mutex);
+		err = md->error;
+	}
+
+	if (err) {
+		fprintf(stderr, "One of the threads errored out %s\n",
+				strerror(err));
+		goto out;
 	}
 
 	/* setup and write index block */
-- 
1.8.1.4


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

* [PATCH 3/6] btrfs-progs: cleanup unnecessary free if malloc fails in btrfs-image
  2014-06-26  2:53 [PATCH 1/6] btrfs-progs: fix btrfs-image old_restore fsck failure Gui Hecheng
  2014-06-26  2:53 ` [PATCH 2/6] btrfs-progs: deal with malloc failure in btrfs-image Gui Hecheng
@ 2014-06-26  2:53 ` Gui Hecheng
  2014-06-26  2:53 ` [PATCH 4/6] btrfs-progs: cleanup possible silent failure " Gui Hecheng
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-06-26  2:53 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Gui Hecheng

Don't bother free the buffer if the malloc failed.

Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
---
 btrfs-image.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/btrfs-image.c b/btrfs-image.c
index 7131001..2d482c3 100644
--- a/btrfs-image.c
+++ b/btrfs-image.c
@@ -1631,7 +1631,7 @@ static void *restore_worker(void *data)
 		if (!mdres->error)
 			mdres->error = -ENOMEM;
 		pthread_mutex_unlock(&mdres->mutex);
-		goto out;
+		pthread_exit(NULL);
 	}
 
 	while (1) {
-- 
1.8.1.4


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

* [PATCH 4/6] btrfs-progs: cleanup possible silent failure in btrfs-image
  2014-06-26  2:53 [PATCH 1/6] btrfs-progs: fix btrfs-image old_restore fsck failure Gui Hecheng
  2014-06-26  2:53 ` [PATCH 2/6] btrfs-progs: deal with malloc failure in btrfs-image Gui Hecheng
  2014-06-26  2:53 ` [PATCH 3/6] btrfs-progs: cleanup unnecessary free if malloc fails " Gui Hecheng
@ 2014-06-26  2:53 ` Gui Hecheng
  2014-06-26  2:53 ` [PATCH 5/6] btrfs-progs: limit minimal num of args for btrfs-image Gui Hecheng
  2014-06-26  2:53 ` [PATCH 6/6] btrfs-progs: use BTRFS_SUPER_INFO_SIZE to replace raw 4096 in btrfs-image Gui Hecheng
  4 siblings, 0 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-06-26  2:53 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Gui Hecheng

If the malloc above fails, the btrfs-image will exit directly
without any error messages.
Now just return the ENOMEM errno and let the caller prompt the
error message.

Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
---
 btrfs-image.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/btrfs-image.c b/btrfs-image.c
index 2d482c3..e0aabfd 100644
--- a/btrfs-image.c
+++ b/btrfs-image.c
@@ -2421,7 +2421,8 @@ static int update_disk_super_on_device(struct btrfs_fs_info *info,
 	buf = malloc(BTRFS_SUPER_INFO_SIZE);
 	if (!buf) {
 		ret = -ENOMEM;
-		exit(1);
+		close(fp);
+		return ret;
 	}
 
 	memcpy(buf, info->super_copy, BTRFS_SUPER_INFO_SIZE);
-- 
1.8.1.4


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

* [PATCH 5/6] btrfs-progs: limit minimal num of args for btrfs-image
  2014-06-26  2:53 [PATCH 1/6] btrfs-progs: fix btrfs-image old_restore fsck failure Gui Hecheng
                   ` (2 preceding siblings ...)
  2014-06-26  2:53 ` [PATCH 4/6] btrfs-progs: cleanup possible silent failure " Gui Hecheng
@ 2014-06-26  2:53 ` Gui Hecheng
  2014-06-27 12:35   ` David Sterba
  2014-06-26  2:53 ` [PATCH 6/6] btrfs-progs: use BTRFS_SUPER_INFO_SIZE to replace raw 4096 in btrfs-image Gui Hecheng
  4 siblings, 1 reply; 19+ messages in thread
From: Gui Hecheng @ 2014-06-26  2:53 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Gui Hecheng

The btrfs-image requires at least 2 args to run,
one for the source dev/file, the other for the target dev/file.

Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
---
 btrfs-image.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/btrfs-image.c b/btrfs-image.c
index e0aabfd..b13f236 100644
--- a/btrfs-image.c
+++ b/btrfs-image.c
@@ -2521,6 +2521,9 @@ int main(int argc, char *argv[])
 	}
 
 	argc = argc - optind;
+	if (argc < 2)
+		print_usage();
+
 	dev_cnt = argc - 1;
 
 	if (create) {
-- 
1.8.1.4


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

* [PATCH 6/6] btrfs-progs: use BTRFS_SUPER_INFO_SIZE to replace raw 4096 in btrfs-image
  2014-06-26  2:53 [PATCH 1/6] btrfs-progs: fix btrfs-image old_restore fsck failure Gui Hecheng
                   ` (3 preceding siblings ...)
  2014-06-26  2:53 ` [PATCH 5/6] btrfs-progs: limit minimal num of args for btrfs-image Gui Hecheng
@ 2014-06-26  2:53 ` Gui Hecheng
  4 siblings, 0 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-06-26  2:53 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Gui Hecheng

Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
---
 btrfs-image.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/btrfs-image.c b/btrfs-image.c
index b13f236..ed0b6ec 100644
--- a/btrfs-image.c
+++ b/btrfs-image.c
@@ -1163,7 +1163,7 @@ static int copy_from_extent_tree(struct metadump_struct *metadump,
 	int ret;
 
 	extent_root = metadump->root->fs_info->extent_root;
-	bytenr = BTRFS_SUPER_INFO_OFFSET + 4096;
+	bytenr = BTRFS_SUPER_INFO_OFFSET + BTRFS_SUPER_INFO_SIZE;
 	key.objectid = bytenr;
 	key.type = BTRFS_EXTENT_ITEM_KEY;
 	key.offset = 0;
@@ -1278,7 +1278,8 @@ static int create_metadump(const char *input, FILE *out, int num_threads,
 		return ret;
 	}
 
-	ret = add_extent(BTRFS_SUPER_INFO_OFFSET, 4096, &metadump, 0);
+	ret = add_extent(BTRFS_SUPER_INFO_OFFSET, BTRFS_SUPER_INFO_SIZE,
+			&metadump, 0);
 	if (ret) {
 		fprintf(stderr, "Error adding metadata %d\n", ret);
 		err = ret;
@@ -1368,7 +1369,7 @@ static void update_super_old(u8 *buffer)
 	btrfs_set_stack_stripe_offset(&chunk->stripe, 0);
 	memcpy(chunk->stripe.dev_uuid, super->dev_item.uuid, BTRFS_UUID_SIZE);
 	btrfs_set_super_sys_array_size(super, sizeof(*key) + sizeof(*chunk));
-	csum_block(buffer, 4096);
+	csum_block(buffer, BTRFS_SUPER_INFO_SIZE);
 }
 
 static int update_super(u8 *buffer)
@@ -1422,7 +1423,7 @@ static int update_super(u8 *buffer)
 	}
 
 	btrfs_set_super_sys_array_size(super, new_array_size);
-	csum_block(buffer, 4096);
+	csum_block(buffer, BTRFS_SUPER_INFO_SIZE);
 
 	return 0;
 }
@@ -1569,12 +1570,12 @@ static void write_backup_supers(int fd, u8 *buf)
 
 	for (i = 1; i < BTRFS_SUPER_MIRROR_MAX; i++) {
 		bytenr = btrfs_sb_offset(i);
-		if (bytenr + 4096 > size)
+		if (bytenr + BTRFS_SUPER_INFO_SIZE > size)
 			break;
 		btrfs_set_super_bytenr(super, bytenr);
-		csum_block(buf, 4096);
-		ret = pwrite64(fd, buf, 4096, bytenr);
-		if (ret < 4096) {
+		csum_block(buf, BTRFS_SUPER_INFO_SIZE);
+		ret = pwrite64(fd, buf, BTRFS_SUPER_INFO_SIZE, bytenr);
+		if (ret < BTRFS_SUPER_INFO_SIZE) {
 			if (ret < 0)
 				fprintf(stderr, "Problem writing out backup "
 					"super block %d, err %d\n", i, errno);
-- 
1.8.1.4


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

* Re: [PATCH 5/6] btrfs-progs: limit minimal num of args for btrfs-image
  2014-06-26  2:53 ` [PATCH 5/6] btrfs-progs: limit minimal num of args for btrfs-image Gui Hecheng
@ 2014-06-27 12:35   ` David Sterba
  2014-06-30  1:47     ` Gui Hecheng
  2014-06-30  3:54     ` [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c Gui Hecheng
  0 siblings, 2 replies; 19+ messages in thread
From: David Sterba @ 2014-06-27 12:35 UTC (permalink / raw)
  To: Gui Hecheng; +Cc: linux-btrfs

On Thu, Jun 26, 2014 at 10:53:05AM +0800, Gui Hecheng wrote:
> @@ -2521,6 +2521,9 @@ int main(int argc, char *argv[])
>  	}
>  
>  	argc = argc - optind;
> +	if (argc < 2)

Please use the check_argc_min helper instead. Thanks.

> +		print_usage();
> +
>  	dev_cnt = argc - 1;
>  
>  	if (create) {

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

* Re: [PATCH 5/6] btrfs-progs: limit minimal num of args for btrfs-image
  2014-06-27 12:35   ` David Sterba
@ 2014-06-30  1:47     ` Gui Hecheng
  2014-06-30  3:54     ` [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c Gui Hecheng
  1 sibling, 0 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-06-30  1:47 UTC (permalink / raw)
  To: dsterba; +Cc: linux-btrfs

On Fri, 2014-06-27 at 14:35 +0200, David Sterba wrote:
> On Thu, Jun 26, 2014 at 10:53:05AM +0800, Gui Hecheng wrote:
> > @@ -2521,6 +2521,9 @@ int main(int argc, char *argv[])
> >  	}
> >  
> >  	argc = argc - optind;
> > +	if (argc < 2)
> 
> Please use the check_argc_min helper instead. Thanks.

Yes, actually I just wanted to prevent including "btrfs.c" in
btrfs-image.c.
I will move the check_argc_* functions into utils.c and resend. Thanks,
David.

-Gui
> 
> > +		print_usage();
> > +
> >  	dev_cnt = argc - 1;
> >  
> >  	if (create) {



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

* [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c
  2014-06-27 12:35   ` David Sterba
  2014-06-30  1:47     ` Gui Hecheng
@ 2014-06-30  3:54     ` Gui Hecheng
  2014-06-30  3:54       ` [PATCH v2 2/2] btrfs-progs: limit minimal num of args for btrfs-image Gui Hecheng
  2014-07-01 23:11       ` [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c David Sterba
  1 sibling, 2 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-06-30  3:54 UTC (permalink / raw)
  To: dsterba; +Cc: linux-btrfs, Gui Hecheng

To let the independent tools(e.g. btrfs-image, btrfs-convert, etc.)
share the convenience of check_argc_* functions, just move it into
utils.c.
Also add a new function "set_argv0" to set the correct tool name:
	*btrfs-image*: too few arguments

The original btrfs* tools work as before.

Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
---
 btrfs.c | 41 +----------------------------------------
 utils.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 utils.h |  7 +++++++
 3 files changed, 55 insertions(+), 40 deletions(-)

diff --git a/btrfs.c b/btrfs.c
index 25257b6..685455f 100644
--- a/btrfs.c
+++ b/btrfs.c
@@ -22,6 +22,7 @@
 #include "crc32c.h"
 #include "commands.h"
 #include "version.h"
+#include "utils.h"
 
 static const char * const btrfs_cmd_group_usage[] = {
 	"btrfs [--help] [--version] <group> [<group>...] <command> [<args>]",
@@ -31,8 +32,6 @@ static const char * const btrfs_cmd_group_usage[] = {
 static const char btrfs_cmd_group_info[] =
 	"Use --help as an argument for information on a specific group or command.";
 
-static char argv0_buf[ARGV0_BUF_SIZE] = "btrfs";
-
 static inline const char *skip_prefix(const char *str, const char *prefix)
 {
 	size_t len = strlen(prefix);
@@ -125,14 +124,6 @@ static void handle_help_options_next_level(const struct cmd_struct *cmd,
 	}
 }
 
-static void fixup_argv0(char **argv, const char *token)
-{
-	int len = strlen(argv0_buf);
-
-	snprintf(argv0_buf + len, sizeof(argv0_buf) - len, " %s", token);
-	argv[0] = argv0_buf;
-}
-
 int handle_command_group(const struct cmd_group *grp, int argc,
 			 char **argv)
 
@@ -154,36 +145,6 @@ int handle_command_group(const struct cmd_group *grp, int argc,
 	return cmd->fn(argc, argv);
 }
 
-int check_argc_exact(int nargs, int expected)
-{
-	if (nargs < expected)
-		fprintf(stderr, "%s: too few arguments\n", argv0_buf);
-	if (nargs > expected)
-		fprintf(stderr, "%s: too many arguments\n", argv0_buf);
-
-	return nargs != expected;
-}
-
-int check_argc_min(int nargs, int expected)
-{
-	if (nargs < expected) {
-		fprintf(stderr, "%s: too few arguments\n", argv0_buf);
-		return 1;
-	}
-
-	return 0;
-}
-
-int check_argc_max(int nargs, int expected)
-{
-	if (nargs > expected) {
-		fprintf(stderr, "%s: too many arguments\n", argv0_buf);
-		return 1;
-	}
-
-	return 0;
-}
-
 static const struct cmd_group btrfs_cmd_group;
 
 static const char * const cmd_help_usage[] = {
diff --git a/utils.c b/utils.c
index 8ce3be9..fd59f58 100644
--- a/utils.c
+++ b/utils.c
@@ -50,11 +50,58 @@
 #include "volumes.h"
 #include "ioctl.h"
 #include "btrfs-list.h"
+#include "commands.h"
 
 #ifndef BLKDISCARD
 #define BLKDISCARD	_IO(0x12,119)
 #endif
 
+static char argv0_buf[ARGV0_BUF_SIZE] = "btrfs";
+
+void fixup_argv0(char **argv, const char *token)
+{
+	int len = strlen(argv0_buf);
+
+	snprintf(argv0_buf + len, sizeof(argv0_buf) - len, " %s", token);
+	argv[0] = argv0_buf;
+}
+
+void set_argv0(char **argv)
+{
+	sprintf(argv0_buf, "%s", argv[0]);
+}
+
+int check_argc_exact(int nargs, int expected)
+{
+	if (nargs < expected)
+		fprintf(stderr, "%s: too few arguments\n", argv0_buf);
+	if (nargs > expected)
+		fprintf(stderr, "%s: too many arguments\n", argv0_buf);
+
+	return nargs != expected;
+}
+
+int check_argc_min(int nargs, int expected)
+{
+	if (nargs < expected) {
+		fprintf(stderr, "%s: too few arguments\n", argv0_buf);
+		return 1;
+	}
+
+	return 0;
+}
+
+int check_argc_max(int nargs, int expected)
+{
+	if (nargs > expected) {
+		fprintf(stderr, "%s: too many arguments\n", argv0_buf);
+		return 1;
+	}
+
+	return 0;
+}
+
+
 /*
  * Discard the given range in one go
  */
diff --git a/utils.h b/utils.h
index ad772c2..f05477a 100644
--- a/utils.h
+++ b/utils.h
@@ -47,6 +47,13 @@
 #define UNITS_DECIMAL			(3)
 #define UNITS_HUMAN			UNITS_BINARY
 
+int check_argc_exact(int nargs, int expected);
+int check_argc_min(int nargs, int expected);
+int check_argc_max(int nargs, int expected);
+
+void fixup_argv0(char **argv, const char *token);
+void set_argv0(char **argv);
+
 int make_btrfs(int fd, const char *device, const char *label,
 	       char *fs_uuid, u64 blocks[6], u64 num_bytes, u32 nodesize,
 	       u32 leafsize, u32 sectorsize, u32 stripesize, u64 features);
-- 
1.8.1.4


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

* [PATCH v2 2/2] btrfs-progs: limit minimal num of args for btrfs-image
  2014-06-30  3:54     ` [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c Gui Hecheng
@ 2014-06-30  3:54       ` Gui Hecheng
  2014-07-01 23:11       ` [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c David Sterba
  1 sibling, 0 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-06-30  3:54 UTC (permalink / raw)
  To: dsterba; +Cc: linux-btrfs, Gui Hecheng

The btrfs-image requires at least 2 args to run,
one for the source dev/file, the other for the target dev/file.

This patch depends on patch:
	btrfs-progs: move the check_argc_* functions into utils.c

Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
---
changelog
	v1->v2: use check_argc_min instead
---
 btrfs-image.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/btrfs-image.c b/btrfs-image.c
index e0aabfd..3b27155 100644
--- a/btrfs-image.c
+++ b/btrfs-image.c
@@ -2521,6 +2521,10 @@ int main(int argc, char *argv[])
 	}
 
 	argc = argc - optind;
+	set_argv0(argv);
+	if (check_argc_min(argc, 2))
+		print_usage();
+
 	dev_cnt = argc - 1;
 
 	if (create) {
-- 
1.8.1.4


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

* Re: [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c
  2014-06-30  3:54     ` [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c Gui Hecheng
  2014-06-30  3:54       ` [PATCH v2 2/2] btrfs-progs: limit minimal num of args for btrfs-image Gui Hecheng
@ 2014-07-01 23:11       ` David Sterba
  2014-07-02  0:20         ` WorMzy Tykashi
                           ` (2 more replies)
  1 sibling, 3 replies; 19+ messages in thread
From: David Sterba @ 2014-07-01 23:11 UTC (permalink / raw)
  To: Gui Hecheng; +Cc: dsterba, linux-btrfs

On Mon, Jun 30, 2014 at 11:54:11AM +0800, Gui Hecheng wrote:
> To let the independent tools(e.g. btrfs-image, btrfs-convert, etc.)
> share the convenience of check_argc_* functions, just move it into
> utils.c.
> Also add a new function "set_argv0" to set the correct tool name:
> 	*btrfs-image*: too few arguments
> 
> The original btrfs* tools work as before.

Good cleanup, but I don't like to see the utils.c pull the commands.h,
the argv0 or argument helpers are selfcontained, so the relevant
definitions shloud be moved to utils.h .

Moved ARGV0_BUF_SIZE -> utils.h
Removed check_argc_* protoypes from command.h

Trivial changes, I made them myself, no need to resend the patch.

The diff:
--- a/commands.h
+++ b/commands.h
@@ -14,8 +14,6 @@
  * Boston, MA 021110-1307, USA.
  */

-#define ARGV0_BUF_SIZE 64
-
 struct cmd_struct {
        const char *token;
        int (*fn)(int, char **);
@@ -62,10 +60,6 @@ struct cmd_group {
 /* btrfs.c */
 int prefixcmp(const char *str, const char *prefix);

-int check_argc_exact(int nargs, int expected);
-int check_argc_min(int nargs, int expected);
-int check_argc_max(int nargs, int expected);
-
 int handle_command_group(const struct cmd_group *grp, int argc,
                         char **argv);

diff --git a/utils.h b/utils.h
index 20e5a2200052..e29ab936cd81 100644
--- a/utils.h
+++ b/utils.h
@@ -39,6 +39,8 @@

 #define BTRFS_UUID_UNPARSED_SIZE       37

+#define ARGV0_BUF_SIZE 64
+
 int check_argc_exact(int nargs, int expected);
 int check_argc_min(int nargs, int expected);
 int check_argc_max(int nargs, int expected);
---

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

* Re: [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c
  2014-07-01 23:11       ` [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c David Sterba
@ 2014-07-02  0:20         ` WorMzy Tykashi
  2014-07-02  9:34           ` David Sterba
  2014-07-02  1:13         ` Gui Hecheng
  2014-07-10  1:06         ` [PATCH] btrfs-progs: use check_argc_* to check arg number for all tools Gui Hecheng
  2 siblings, 1 reply; 19+ messages in thread
From: WorMzy Tykashi @ 2014-07-02  0:20 UTC (permalink / raw)
  To: dsterba, Gui Hecheng, linux-btrfs

On 2 July 2014 00:11, David Sterba <dsterba@suse.cz> wrote:
> On Mon, Jun 30, 2014 at 11:54:11AM +0800, Gui Hecheng wrote:
>> To let the independent tools(e.g. btrfs-image, btrfs-convert, etc.)
>> share the convenience of check_argc_* functions, just move it into
>> utils.c.
>> Also add a new function "set_argv0" to set the correct tool name:
>>       *btrfs-image*: too few arguments
>>
>> The original btrfs* tools work as before.
>
> Good cleanup, but I don't like to see the utils.c pull the commands.h,
> the argv0 or argument helpers are selfcontained, so the relevant
> definitions shloud be moved to utils.h .
>
> Moved ARGV0_BUF_SIZE -> utils.h
> Removed check_argc_* protoypes from command.h
>
> Trivial changes, I made them myself, no need to resend the patch.
>
> The diff:
> --- a/commands.h
> +++ b/commands.h
> @@ -14,8 +14,6 @@
>   * Boston, MA 021110-1307, USA.
>   */
>
> -#define ARGV0_BUF_SIZE 64
> -
>  struct cmd_struct {
>         const char *token;
>         int (*fn)(int, char **);
> @@ -62,10 +60,6 @@ struct cmd_group {
>  /* btrfs.c */
>  int prefixcmp(const char *str, const char *prefix);
>
> -int check_argc_exact(int nargs, int expected);
> -int check_argc_min(int nargs, int expected);
> -int check_argc_max(int nargs, int expected);
> -
>  int handle_command_group(const struct cmd_group *grp, int argc,
>                          char **argv);
>
> diff --git a/utils.h b/utils.h
> index 20e5a2200052..e29ab936cd81 100644
> --- a/utils.h
> +++ b/utils.h
> @@ -39,6 +39,8 @@
>
>  #define BTRFS_UUID_UNPARSED_SIZE       37
>
> +#define ARGV0_BUF_SIZE 64
> +
>  int check_argc_exact(int nargs, int expected);
>  int check_argc_min(int nargs, int expected);
>  int check_argc_max(int nargs, int expected);
> ---
> --
> 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

Hi David,

I'm getting a build failure in integration-20140701 in regard to these changes:

---------
    [CC]     help.o
help.c:23:23: error: 'ARGV0_BUF_SIZE' undeclared here (not in a function)
 static char argv0_buf[ARGV0_BUF_SIZE];
                       ^
help.c:23:13: warning: 'argv0_buf' defined but not used [-Wunused-variable]
 static char argv0_buf[ARGV0_BUF_SIZE];
             ^
Makefile:114: recipe for target 'help.o' failed
make: *** [help.o] Error 1
---------

Looks like help.c just need to include utils.h now too. I tested with
the following patch, and it builds again.

--- a/help.c    2014-07-02 01:14:02.365340224 +0100
+++ b/help.c    2014-07-02 01:13:49.995276342 +0100
@@ -19,6 +19,7 @@
 #include <string.h>

 #include "commands.h"
+#include "utils.h"

 static char argv0_buf[ARGV0_BUF_SIZE];


Cheers,


WorMzy

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

* Re: [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c
  2014-07-01 23:11       ` [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c David Sterba
  2014-07-02  0:20         ` WorMzy Tykashi
@ 2014-07-02  1:13         ` Gui Hecheng
  2014-07-10  1:06         ` [PATCH] btrfs-progs: use check_argc_* to check arg number for all tools Gui Hecheng
  2 siblings, 0 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-07-02  1:13 UTC (permalink / raw)
  To: dsterba; +Cc: linux-btrfs

On Wed, 2014-07-02 at 01:11 +0200, David Sterba wrote:
> On Mon, Jun 30, 2014 at 11:54:11AM +0800, Gui Hecheng wrote:
> > To let the independent tools(e.g. btrfs-image, btrfs-convert, etc.)
> > share the convenience of check_argc_* functions, just move it into
> > utils.c.
> > Also add a new function "set_argv0" to set the correct tool name:
> > 	*btrfs-image*: too few arguments
> > 
> > The original btrfs* tools work as before.
> 
> Good cleanup, but I don't like to see the utils.c pull the commands.h,
> the argv0 or argument helpers are selfcontained, so the relevant
> definitions shloud be moved to utils.h .
> 
> Moved ARGV0_BUF_SIZE -> utils.h
> Removed check_argc_* protoypes from command.h
> 
> Trivial changes, I made them myself, no need to resend the patch.

Thanks very much David.

> The diff:
> --- a/commands.h
> +++ b/commands.h
> @@ -14,8 +14,6 @@
>   * Boston, MA 021110-1307, USA.
>   */
> 
> -#define ARGV0_BUF_SIZE 64
> -
>  struct cmd_struct {
>         const char *token;
>         int (*fn)(int, char **);
> @@ -62,10 +60,6 @@ struct cmd_group {
>  /* btrfs.c */
>  int prefixcmp(const char *str, const char *prefix);
> 
> -int check_argc_exact(int nargs, int expected);
> -int check_argc_min(int nargs, int expected);
> -int check_argc_max(int nargs, int expected);
> -
>  int handle_command_group(const struct cmd_group *grp, int argc,
>                          char **argv);
> 
> diff --git a/utils.h b/utils.h
> index 20e5a2200052..e29ab936cd81 100644
> --- a/utils.h
> +++ b/utils.h
> @@ -39,6 +39,8 @@
> 
>  #define BTRFS_UUID_UNPARSED_SIZE       37
> 
> +#define ARGV0_BUF_SIZE 64
> +
>  int check_argc_exact(int nargs, int expected);
>  int check_argc_min(int nargs, int expected);
>  int check_argc_max(int nargs, int expected);
> ---



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

* Re: [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c
  2014-07-02  0:20         ` WorMzy Tykashi
@ 2014-07-02  9:34           ` David Sterba
  2014-07-02 10:50             ` WorMzy Tykashi
  0 siblings, 1 reply; 19+ messages in thread
From: David Sterba @ 2014-07-02  9:34 UTC (permalink / raw)
  To: WorMzy Tykashi; +Cc: Gui Hecheng, linux-btrfs

On Wed, Jul 02, 2014 at 01:20:41AM +0100, WorMzy Tykashi wrote:
> I'm getting a build failure in integration-20140701 in regard to these changes:
> 
> ---------
>     [CC]     help.o
> help.c:23:23: error: 'ARGV0_BUF_SIZE' undeclared here (not in a function)
>  static char argv0_buf[ARGV0_BUF_SIZE];
>                        ^
> help.c:23:13: warning: 'argv0_buf' defined but not used [-Wunused-variable]
>  static char argv0_buf[ARGV0_BUF_SIZE];
>              ^
> Makefile:114: recipe for target 'help.o' failed
> make: *** [help.o] Error 1
> ---------

Oh sorry, fixed branch pushed. I've added the utils.h inlucde into
cmds-property.c as well, fixes "implicit declaration of function"
warnings.

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

* Re: [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c
  2014-07-02  9:34           ` David Sterba
@ 2014-07-02 10:50             ` WorMzy Tykashi
  0 siblings, 0 replies; 19+ messages in thread
From: WorMzy Tykashi @ 2014-07-02 10:50 UTC (permalink / raw)
  To: dsterba, WorMzy Tykashi, Gui Hecheng, linux-btrfs

On 2 July 2014 10:34, David Sterba <dsterba@suse.cz> wrote:
>
> Oh sorry, fixed branch pushed. I've added the utils.h inlucde into
> cmds-property.c as well, fixes "implicit declaration of function"
> warnings.

Great stuff, thanks.


WorMzy

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

* [PATCH] btrfs-progs: use check_argc_* to check arg number for all tools
  2014-07-01 23:11       ` [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c David Sterba
  2014-07-02  0:20         ` WorMzy Tykashi
  2014-07-02  1:13         ` Gui Hecheng
@ 2014-07-10  1:06         ` Gui Hecheng
  2014-07-16  3:44           ` [PATCH v2] " Gui Hecheng
  2014-07-16  3:59           ` Gui Hecheng
  2 siblings, 2 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-07-10  1:06 UTC (permalink / raw)
  To: dsterba; +Cc: linux-btrfs, Gui Hecheng

Since this patch:
	btrfs-progs: move the check_argc_* functions into utils.c

All tools including the independent tools(e.g. btrfs-image, btrfs-convert)
can share the convenience of the check_argc_* functions, so this patch
adopt the argc check functions globally.

Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
---
 btrfs-calc-size.c     | 4 +++-
 btrfs-convert.c       | 3 ++-
 btrfs-corrupt-block.c | 3 ++-
 btrfs-crc.c           | 7 ++++---
 btrfs-debug-tree.c    | 3 ++-
 btrfs-find-root.c     | 4 +++-
 btrfs-fragments.c     | 8 +++++---
 btrfs-map-logical.c   | 3 ++-
 btrfs-select-super.c  | 3 ++-
 btrfs-show-super.c    | 4 +++-
 btrfs-zero-log.c      | 3 ++-
 btrfstune.c           | 3 ++-
 cmds-check.c          | 3 ++-
 cmds-restore.c        | 5 +++--
 cmds-send.c           | 4 +++-
 15 files changed, 40 insertions(+), 20 deletions(-)

diff --git a/btrfs-calc-size.c b/btrfs-calc-size.c
index 5eabdfc..501111c 100644
--- a/btrfs-calc-size.c
+++ b/btrfs-calc-size.c
@@ -452,7 +452,9 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (optind >= argc) {
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1)) {
 		usage();
 		exit(1);
 	}
diff --git a/btrfs-convert.c b/btrfs-convert.c
index d62d4f8..952e3e6 100644
--- a/btrfs-convert.c
+++ b/btrfs-convert.c
@@ -2723,7 +2723,8 @@ int main(int argc, char *argv[])
 		}
 	}
 	argc = argc - optind;
-	if (argc != 1) {
+	set_argv0(argv);
+	if (check_argc_exact(argc, 1)) {
 		print_usage();
 		return 1;
 	}
diff --git a/btrfs-corrupt-block.c b/btrfs-corrupt-block.c
index 6ecbe47..1a3ac35 100644
--- a/btrfs-corrupt-block.c
+++ b/btrfs-corrupt-block.c
@@ -865,8 +865,9 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
-	if (ac == 0)
+	if (check_argc_min(ac, 1))
 		print_usage();
 	dev = av[optind];
 
diff --git a/btrfs-crc.c b/btrfs-crc.c
index 1990534..723e0b7 100644
--- a/btrfs-crc.c
+++ b/btrfs-crc.c
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include "crc32c.h"
+#include "utils.h"
 
 void usage(void)
 {
@@ -62,13 +63,13 @@ int main(int argc, char **argv)
 		}
 	}
 
+	set_argv0(argv);
 	str = argv[optind];
 
 	if (!loop) {
-		if (optind >= argc) {
-			fprintf(stderr, "not enough arguments\n");
+		if (check_argc_min(argc - optind, 1))
 			return 255;
-		}
+
 		printf("%12u - %s\n", crc32c(~1, str, strlen(str)), str);
 		return 0;
 	}
diff --git a/btrfs-debug-tree.c b/btrfs-debug-tree.c
index 36e1115..e46500d 100644
--- a/btrfs-debug-tree.c
+++ b/btrfs-debug-tree.c
@@ -174,8 +174,9 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
-	if (ac != 1)
+	if (check_argc_exact(ac, 1))
 		print_usage();
 
 	info = open_ctree_fs_info(av[optind], 0, 0, OPEN_CTREE_PARTIAL);
diff --git a/btrfs-find-root.c b/btrfs-find-root.c
index 7932308..6fe4b7b 100644
--- a/btrfs-find-root.c
+++ b/btrfs-find-root.c
@@ -305,7 +305,9 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (optind >= argc) {
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1)) {
 		usage();
 		exit(1);
 	}
diff --git a/btrfs-fragments.c b/btrfs-fragments.c
index 160429a..d03c2c3 100644
--- a/btrfs-fragments.c
+++ b/btrfs-fragments.c
@@ -425,13 +425,15 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (optind < argc) {
-		path = argv[optind++];
-	} else {
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1)) {
 		usage();
 		exit(1);
 	}
 
+	path = argv[optind++];
+
 	fd = open_file_or_dir(path, &dirstream);
 	if (fd < 0) {
 		fprintf(stderr, "ERROR: can't access '%s'\n", path);
diff --git a/btrfs-map-logical.c b/btrfs-map-logical.c
index e47a1ae..6b475fc 100644
--- a/btrfs-map-logical.c
+++ b/btrfs-map-logical.c
@@ -148,8 +148,9 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
-	if (ac == 0)
+	if (check_argc_min(ac, 1))
 		print_usage();
 	if (logical == 0)
 		print_usage();
diff --git a/btrfs-select-super.c b/btrfs-select-super.c
index d7cd187..6231d42 100644
--- a/btrfs-select-super.c
+++ b/btrfs-select-super.c
@@ -66,9 +66,10 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
 
-	if (ac != 1)
+	if (check_argc_exact(ac, 1))
 		print_usage();
 
 	if (bytenr == 0) {
diff --git a/btrfs-show-super.c b/btrfs-show-super.c
index ed0311f..0401344 100644
--- a/btrfs-show-super.c
+++ b/btrfs-show-super.c
@@ -95,7 +95,9 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (argc < optind + 1) {
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1)) {
 		print_usage();
 		exit(1);
 	}
diff --git a/btrfs-zero-log.c b/btrfs-zero-log.c
index ab7f418..88998e9 100644
--- a/btrfs-zero-log.c
+++ b/btrfs-zero-log.c
@@ -46,7 +46,8 @@ int main(int ac, char **av)
 	struct btrfs_trans_handle *trans;
 	int ret;
 
-	if (ac != 2)
+	set_argv0(av);
+	if (check_argc_exact(ac, 2))
 		print_usage();
 
 	radix_tree_init();
diff --git a/btrfstune.c b/btrfstune.c
index 3f2f0cd..b43c2f0 100644
--- a/btrfstune.c
+++ b/btrfstune.c
@@ -137,9 +137,10 @@ int main(int argc, char *argv[])
 		}
 	}
 
+	set_argv0(argv);
 	argc = argc - optind;
 	device = argv[optind];
-	if (argc != 1) {
+	if (check_argc_exact(argc, 1)) {
 		print_usage();
 		return 1;
 	}
diff --git a/cmds-check.c b/cmds-check.c
index 6d3388f..18bebb0 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -7018,9 +7018,10 @@ int cmd_check(int argc, char **argv)
 			check_data_csum = 1;
 		}
 	}
+	set_argv0(argv);
 	argc = argc - optind;
 
-	if (argc != 1)
+	if (check_argc_exact(argc, 1))
 		usage(cmd_check_usage);
 
 	radix_tree_init();
diff --git a/cmds-restore.c b/cmds-restore.c
index 3465f84..8e8afc5 100644
--- a/cmds-restore.c
+++ b/cmds-restore.c
@@ -1214,9 +1214,10 @@ int cmd_restore(int argc, char **argv)
 		}
 	}
 
-	if (!list_roots && optind + 1 >= argc)
+	set_argv0(argv);
+	if (!list_roots && check_argc_min(argc - optind, 2))
 		usage(cmd_restore_usage);
-	else if (list_roots && optind >= argc)
+	else if (list_roots && check_argc_min(argc - optind, 1))
 		usage(cmd_restore_usage);
 
 	if (fs_location && root_objectid) {
diff --git a/cmds-send.c b/cmds-send.c
index 9a73b32..8263f72 100644
--- a/cmds-send.c
+++ b/cmds-send.c
@@ -556,7 +556,9 @@ int cmd_send(int argc, char **argv)
 		}
 	}
 
-	if (optind == argc)
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1))
 		usage(cmd_send_usage);
 
 	if (g_total_data_size &&
-- 
1.8.1.4


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

* [PATCH v2] btrfs-progs: use check_argc_* to check arg number for all tools
  2014-07-10  1:06         ` [PATCH] btrfs-progs: use check_argc_* to check arg number for all tools Gui Hecheng
@ 2014-07-16  3:44           ` Gui Hecheng
  2014-07-16  3:58             ` Gui Hecheng
  2014-07-16  3:59           ` Gui Hecheng
  1 sibling, 1 reply; 19+ messages in thread
From: Gui Hecheng @ 2014-07-16  3:44 UTC (permalink / raw)
  To: dsterba; +Cc: linux-btrfs, Gui Hecheng

Since this patch:
	btrfs-progs: move the check_argc_* functions into utils.c

All tools including the independent tools(e.g. btrfs-image, btrfs-convert)
can share the convenience of the check_argc_* functions, so this patch
adopt the argc check functions globally.

Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
---
changelog
	v1->v2: make show-super, check and send cmds work correctly
---
 btrfs-calc-size.c     | 4 +++-
 btrfs-convert.c       | 3 ++-
 btrfs-corrupt-block.c | 3 ++-
 btrfs-crc.c           | 7 ++++---
 btrfs-debug-tree.c    | 3 ++-
 btrfs-find-root.c     | 4 +++-
 btrfs-fragments.c     | 8 +++++---
 btrfs-map-logical.c   | 3 ++-
 btrfs-select-super.c  | 3 ++-
 btrfs-show-super.c    | 4 +++-
 btrfs-zero-log.c      | 3 ++-
 btrfstune.c           | 3 ++-
 cmds-check.c          | 3 ++-
 cmds-restore.c        | 5 +++--
 cmds-send.c           | 4 +++-
 15 files changed, 40 insertions(+), 20 deletions(-)

diff --git a/btrfs-calc-size.c b/btrfs-calc-size.c
index 5eabdfc..501111c 100644
--- a/btrfs-calc-size.c
+++ b/btrfs-calc-size.c
@@ -452,7 +452,9 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (optind >= argc) {
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1)) {
 		usage();
 		exit(1);
 	}
diff --git a/btrfs-convert.c b/btrfs-convert.c
index d62d4f8..952e3e6 100644
--- a/btrfs-convert.c
+++ b/btrfs-convert.c
@@ -2723,7 +2723,8 @@ int main(int argc, char *argv[])
 		}
 	}
 	argc = argc - optind;
-	if (argc != 1) {
+	set_argv0(argv);
+	if (check_argc_exact(argc, 1)) {
 		print_usage();
 		return 1;
 	}
diff --git a/btrfs-corrupt-block.c b/btrfs-corrupt-block.c
index 6ecbe47..1a3ac35 100644
--- a/btrfs-corrupt-block.c
+++ b/btrfs-corrupt-block.c
@@ -865,8 +865,9 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
-	if (ac == 0)
+	if (check_argc_min(ac, 1))
 		print_usage();
 	dev = av[optind];
 
diff --git a/btrfs-crc.c b/btrfs-crc.c
index 1990534..723e0b7 100644
--- a/btrfs-crc.c
+++ b/btrfs-crc.c
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include "crc32c.h"
+#include "utils.h"
 
 void usage(void)
 {
@@ -62,13 +63,13 @@ int main(int argc, char **argv)
 		}
 	}
 
+	set_argv0(argv);
 	str = argv[optind];
 
 	if (!loop) {
-		if (optind >= argc) {
-			fprintf(stderr, "not enough arguments\n");
+		if (check_argc_min(argc - optind, 1))
 			return 255;
-		}
+
 		printf("%12u - %s\n", crc32c(~1, str, strlen(str)), str);
 		return 0;
 	}
diff --git a/btrfs-debug-tree.c b/btrfs-debug-tree.c
index 36e1115..e46500d 100644
--- a/btrfs-debug-tree.c
+++ b/btrfs-debug-tree.c
@@ -174,8 +174,9 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
-	if (ac != 1)
+	if (check_argc_exact(ac, 1))
 		print_usage();
 
 	info = open_ctree_fs_info(av[optind], 0, 0, OPEN_CTREE_PARTIAL);
diff --git a/btrfs-find-root.c b/btrfs-find-root.c
index 7932308..6fe4b7b 100644
--- a/btrfs-find-root.c
+++ b/btrfs-find-root.c
@@ -305,7 +305,9 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (optind >= argc) {
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1)) {
 		usage();
 		exit(1);
 	}
diff --git a/btrfs-fragments.c b/btrfs-fragments.c
index 160429a..d03c2c3 100644
--- a/btrfs-fragments.c
+++ b/btrfs-fragments.c
@@ -425,13 +425,15 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (optind < argc) {
-		path = argv[optind++];
-	} else {
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1)) {
 		usage();
 		exit(1);
 	}
 
+	path = argv[optind++];
+
 	fd = open_file_or_dir(path, &dirstream);
 	if (fd < 0) {
 		fprintf(stderr, "ERROR: can't access '%s'\n", path);
diff --git a/btrfs-map-logical.c b/btrfs-map-logical.c
index e47a1ae..6b475fc 100644
--- a/btrfs-map-logical.c
+++ b/btrfs-map-logical.c
@@ -148,8 +148,9 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
-	if (ac == 0)
+	if (check_argc_min(ac, 1))
 		print_usage();
 	if (logical == 0)
 		print_usage();
diff --git a/btrfs-select-super.c b/btrfs-select-super.c
index d7cd187..6231d42 100644
--- a/btrfs-select-super.c
+++ b/btrfs-select-super.c
@@ -66,9 +66,10 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
 
-	if (ac != 1)
+	if (check_argc_exact(ac, 1))
 		print_usage();
 
 	if (bytenr == 0) {
diff --git a/btrfs-show-super.c b/btrfs-show-super.c
index ed0311f..0401344 100644
--- a/btrfs-show-super.c
+++ b/btrfs-show-super.c
@@ -95,7 +95,9 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (argc < optind + 1) {
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1)) {
 		print_usage();
 		exit(1);
 	}
diff --git a/btrfs-zero-log.c b/btrfs-zero-log.c
index ab7f418..88998e9 100644
--- a/btrfs-zero-log.c
+++ b/btrfs-zero-log.c
@@ -46,7 +46,8 @@ int main(int ac, char **av)
 	struct btrfs_trans_handle *trans;
 	int ret;
 
-	if (ac != 2)
+	set_argv0(av);
+	if (check_argc_exact(ac, 2))
 		print_usage();
 
 	radix_tree_init();
diff --git a/btrfstune.c b/btrfstune.c
index 3f2f0cd..b43c2f0 100644
--- a/btrfstune.c
+++ b/btrfstune.c
@@ -137,9 +137,10 @@ int main(int argc, char *argv[])
 		}
 	}
 
+	set_argv0(argv);
 	argc = argc - optind;
 	device = argv[optind];
-	if (argc != 1) {
+	if (check_argc_exact(argc, 1)) {
 		print_usage();
 		return 1;
 	}
diff --git a/cmds-check.c b/cmds-check.c
index 6d3388f..18bebb0 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -7018,9 +7018,10 @@ int cmd_check(int argc, char **argv)
 			check_data_csum = 1;
 		}
 	}
+	set_argv0(argv);
 	argc = argc - optind;
 
-	if (argc != 1)
+	if (check_argc_exact(argc, 1))
 		usage(cmd_check_usage);
 
 	radix_tree_init();
diff --git a/cmds-restore.c b/cmds-restore.c
index 3465f84..8e8afc5 100644
--- a/cmds-restore.c
+++ b/cmds-restore.c
@@ -1214,9 +1214,10 @@ int cmd_restore(int argc, char **argv)
 		}
 	}
 
-	if (!list_roots && optind + 1 >= argc)
+	set_argv0(argv);
+	if (!list_roots && check_argc_min(argc - optind, 2))
 		usage(cmd_restore_usage);
-	else if (list_roots && optind >= argc)
+	else if (list_roots && check_argc_min(argc - optind, 1))
 		usage(cmd_restore_usage);
 
 	if (fs_location && root_objectid) {
diff --git a/cmds-send.c b/cmds-send.c
index 9a73b32..8263f72 100644
--- a/cmds-send.c
+++ b/cmds-send.c
@@ -556,7 +556,9 @@ int cmd_send(int argc, char **argv)
 		}
 	}
 
-	if (optind == argc)
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1))
 		usage(cmd_send_usage);
 
 	if (g_total_data_size &&
-- 
1.8.1.4


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

* Re: [PATCH v2] btrfs-progs: use check_argc_* to check arg number for all tools
  2014-07-16  3:44           ` [PATCH v2] " Gui Hecheng
@ 2014-07-16  3:58             ` Gui Hecheng
  0 siblings, 0 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-07-16  3:58 UTC (permalink / raw)
  To: dsterba; +Cc: linux-btrfs

On Wed, 2014-07-16 at 11:44 +0800, Gui Hecheng wrote:

Oh, very sorry for the noise, this is not the new one, please *ignore*
this one.

And also, for you to check, the v1 patch makes 2 mistakes:
	o mistakenly change the value of argc, which influence the following
procedures.
	o mistakenly use set_argv0 for send & check cmd, which is not
neccessary.

> Since this patch:
> 	btrfs-progs: move the check_argc_* functions into utils.c
> 
> All tools including the independent tools(e.g. btrfs-image, btrfs-convert)
> can share the convenience of the check_argc_* functions, so this patch
> adopt the argc check functions globally.
> 
> Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
> ---
> changelog
> 	v1->v2: make show-super, check and send cmds work correctly
> ---
>  btrfs-calc-size.c     | 4 +++-
>  btrfs-convert.c       | 3 ++-
>  btrfs-corrupt-block.c | 3 ++-
>  btrfs-crc.c           | 7 ++++---
>  btrfs-debug-tree.c    | 3 ++-
>  btrfs-find-root.c     | 4 +++-
>  btrfs-fragments.c     | 8 +++++---
>  btrfs-map-logical.c   | 3 ++-
>  btrfs-select-super.c  | 3 ++-
>  btrfs-show-super.c    | 4 +++-
>  btrfs-zero-log.c      | 3 ++-
>  btrfstune.c           | 3 ++-
>  cmds-check.c          | 3 ++-
>  cmds-restore.c        | 5 +++--
>  cmds-send.c           | 4 +++-
>  15 files changed, 40 insertions(+), 20 deletions(-)
> 
> diff --git a/btrfs-calc-size.c b/btrfs-calc-size.c
> index 5eabdfc..501111c 100644
> --- a/btrfs-calc-size.c
> +++ b/btrfs-calc-size.c
> @@ -452,7 +452,9 @@ int main(int argc, char **argv)
>  		}
>  	}
>  
> -	if (optind >= argc) {
> +	set_argv0(argv);
> +	argc = argc - optind;
> +	if (check_argc_min(argc, 1)) {
>  		usage();
>  		exit(1);
>  	}
> diff --git a/btrfs-convert.c b/btrfs-convert.c
> index d62d4f8..952e3e6 100644
> --- a/btrfs-convert.c
> +++ b/btrfs-convert.c
> @@ -2723,7 +2723,8 @@ int main(int argc, char *argv[])
>  		}
>  	}
>  	argc = argc - optind;
> -	if (argc != 1) {
> +	set_argv0(argv);
> +	if (check_argc_exact(argc, 1)) {
>  		print_usage();
>  		return 1;
>  	}
> diff --git a/btrfs-corrupt-block.c b/btrfs-corrupt-block.c
> index 6ecbe47..1a3ac35 100644
> --- a/btrfs-corrupt-block.c
> +++ b/btrfs-corrupt-block.c
> @@ -865,8 +865,9 @@ int main(int ac, char **av)
>  				print_usage();
>  		}
>  	}
> +	set_argv0(av);
>  	ac = ac - optind;
> -	if (ac == 0)
> +	if (check_argc_min(ac, 1))
>  		print_usage();
>  	dev = av[optind];
>  
> diff --git a/btrfs-crc.c b/btrfs-crc.c
> index 1990534..723e0b7 100644
> --- a/btrfs-crc.c
> +++ b/btrfs-crc.c
> @@ -20,6 +20,7 @@
>  #include <stdlib.h>
>  #include <unistd.h>
>  #include "crc32c.h"
> +#include "utils.h"
>  
>  void usage(void)
>  {
> @@ -62,13 +63,13 @@ int main(int argc, char **argv)
>  		}
>  	}
>  
> +	set_argv0(argv);
>  	str = argv[optind];
>  
>  	if (!loop) {
> -		if (optind >= argc) {
> -			fprintf(stderr, "not enough arguments\n");
> +		if (check_argc_min(argc - optind, 1))
>  			return 255;
> -		}
> +
>  		printf("%12u - %s\n", crc32c(~1, str, strlen(str)), str);
>  		return 0;
>  	}
> diff --git a/btrfs-debug-tree.c b/btrfs-debug-tree.c
> index 36e1115..e46500d 100644
> --- a/btrfs-debug-tree.c
> +++ b/btrfs-debug-tree.c
> @@ -174,8 +174,9 @@ int main(int ac, char **av)
>  				print_usage();
>  		}
>  	}
> +	set_argv0(av);
>  	ac = ac - optind;
> -	if (ac != 1)
> +	if (check_argc_exact(ac, 1))
>  		print_usage();
>  
>  	info = open_ctree_fs_info(av[optind], 0, 0, OPEN_CTREE_PARTIAL);
> diff --git a/btrfs-find-root.c b/btrfs-find-root.c
> index 7932308..6fe4b7b 100644
> --- a/btrfs-find-root.c
> +++ b/btrfs-find-root.c
> @@ -305,7 +305,9 @@ int main(int argc, char **argv)
>  		}
>  	}
>  
> -	if (optind >= argc) {
> +	set_argv0(argv);
> +	argc = argc - optind;
> +	if (check_argc_min(argc, 1)) {
>  		usage();
>  		exit(1);
>  	}
> diff --git a/btrfs-fragments.c b/btrfs-fragments.c
> index 160429a..d03c2c3 100644
> --- a/btrfs-fragments.c
> +++ b/btrfs-fragments.c
> @@ -425,13 +425,15 @@ int main(int argc, char **argv)
>  		}
>  	}
>  
> -	if (optind < argc) {
> -		path = argv[optind++];
> -	} else {
> +	set_argv0(argv);
> +	argc = argc - optind;
> +	if (check_argc_min(argc, 1)) {
>  		usage();
>  		exit(1);
>  	}
>  
> +	path = argv[optind++];
> +
>  	fd = open_file_or_dir(path, &dirstream);
>  	if (fd < 0) {
>  		fprintf(stderr, "ERROR: can't access '%s'\n", path);
> diff --git a/btrfs-map-logical.c b/btrfs-map-logical.c
> index e47a1ae..6b475fc 100644
> --- a/btrfs-map-logical.c
> +++ b/btrfs-map-logical.c
> @@ -148,8 +148,9 @@ int main(int ac, char **av)
>  				print_usage();
>  		}
>  	}
> +	set_argv0(av);
>  	ac = ac - optind;
> -	if (ac == 0)
> +	if (check_argc_min(ac, 1))
>  		print_usage();
>  	if (logical == 0)
>  		print_usage();
> diff --git a/btrfs-select-super.c b/btrfs-select-super.c
> index d7cd187..6231d42 100644
> --- a/btrfs-select-super.c
> +++ b/btrfs-select-super.c
> @@ -66,9 +66,10 @@ int main(int ac, char **av)
>  				print_usage();
>  		}
>  	}
> +	set_argv0(av);
>  	ac = ac - optind;
>  
> -	if (ac != 1)
> +	if (check_argc_exact(ac, 1))
>  		print_usage();
>  
>  	if (bytenr == 0) {
> diff --git a/btrfs-show-super.c b/btrfs-show-super.c
> index ed0311f..0401344 100644
> --- a/btrfs-show-super.c
> +++ b/btrfs-show-super.c
> @@ -95,7 +95,9 @@ int main(int argc, char **argv)
>  		}
>  	}
>  
> -	if (argc < optind + 1) {
> +	set_argv0(argv);
> +	argc = argc - optind;
> +	if (check_argc_min(argc, 1)) {
>  		print_usage();
>  		exit(1);
>  	}
> diff --git a/btrfs-zero-log.c b/btrfs-zero-log.c
> index ab7f418..88998e9 100644
> --- a/btrfs-zero-log.c
> +++ b/btrfs-zero-log.c
> @@ -46,7 +46,8 @@ int main(int ac, char **av)
>  	struct btrfs_trans_handle *trans;
>  	int ret;
>  
> -	if (ac != 2)
> +	set_argv0(av);
> +	if (check_argc_exact(ac, 2))
>  		print_usage();
>  
>  	radix_tree_init();
> diff --git a/btrfstune.c b/btrfstune.c
> index 3f2f0cd..b43c2f0 100644
> --- a/btrfstune.c
> +++ b/btrfstune.c
> @@ -137,9 +137,10 @@ int main(int argc, char *argv[])
>  		}
>  	}
>  
> +	set_argv0(argv);
>  	argc = argc - optind;
>  	device = argv[optind];
> -	if (argc != 1) {
> +	if (check_argc_exact(argc, 1)) {
>  		print_usage();
>  		return 1;
>  	}
> diff --git a/cmds-check.c b/cmds-check.c
> index 6d3388f..18bebb0 100644
> --- a/cmds-check.c
> +++ b/cmds-check.c
> @@ -7018,9 +7018,10 @@ int cmd_check(int argc, char **argv)
>  			check_data_csum = 1;
>  		}
>  	}
> +	set_argv0(argv);
>  	argc = argc - optind;
>  
> -	if (argc != 1)
> +	if (check_argc_exact(argc, 1))
>  		usage(cmd_check_usage);
>  
>  	radix_tree_init();
> diff --git a/cmds-restore.c b/cmds-restore.c
> index 3465f84..8e8afc5 100644
> --- a/cmds-restore.c
> +++ b/cmds-restore.c
> @@ -1214,9 +1214,10 @@ int cmd_restore(int argc, char **argv)
>  		}
>  	}
>  
> -	if (!list_roots && optind + 1 >= argc)
> +	set_argv0(argv);
> +	if (!list_roots && check_argc_min(argc - optind, 2))
>  		usage(cmd_restore_usage);
> -	else if (list_roots && optind >= argc)
> +	else if (list_roots && check_argc_min(argc - optind, 1))
>  		usage(cmd_restore_usage);
>  
>  	if (fs_location && root_objectid) {
> diff --git a/cmds-send.c b/cmds-send.c
> index 9a73b32..8263f72 100644
> --- a/cmds-send.c
> +++ b/cmds-send.c
> @@ -556,7 +556,9 @@ int cmd_send(int argc, char **argv)
>  		}
>  	}
>  
> -	if (optind == argc)
> +	set_argv0(argv);
> +	argc = argc - optind;
> +	if (check_argc_min(argc, 1))
>  		usage(cmd_send_usage);
>  
>  	if (g_total_data_size &&



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

* [PATCH v2] btrfs-progs: use check_argc_* to check arg number for all tools
  2014-07-10  1:06         ` [PATCH] btrfs-progs: use check_argc_* to check arg number for all tools Gui Hecheng
  2014-07-16  3:44           ` [PATCH v2] " Gui Hecheng
@ 2014-07-16  3:59           ` Gui Hecheng
  1 sibling, 0 replies; 19+ messages in thread
From: Gui Hecheng @ 2014-07-16  3:59 UTC (permalink / raw)
  To: dsterba; +Cc: linux-btrfs, Gui Hecheng

Since this patch:
	btrfs-progs: move the check_argc_* functions into utils.c

All tools including the independent tools(e.g. btrfs-image, btrfs-convert)
can share the convenience of the check_argc_* functions, so this patch
adopt the argc check functions globally.

Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
---
changelog
        v1->v2: make show-super, check and send cmds work correctly
---
 btrfs-calc-size.c     | 4 +++-
 btrfs-convert.c       | 3 ++-
 btrfs-corrupt-block.c | 3 ++-
 btrfs-crc.c           | 7 ++++---
 btrfs-debug-tree.c    | 3 ++-
 btrfs-find-root.c     | 4 +++-
 btrfs-fragments.c     | 8 +++++---
 btrfs-map-logical.c   | 3 ++-
 btrfs-select-super.c  | 3 ++-
 btrfs-show-super.c    | 3 ++-
 btrfs-zero-log.c      | 3 ++-
 btrfstune.c           | 3 ++-
 cmds-check.c          | 2 +-
 cmds-restore.c        | 5 +++--
 cmds-send.c           | 2 +-
 15 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/btrfs-calc-size.c b/btrfs-calc-size.c
index 5eabdfc..501111c 100644
--- a/btrfs-calc-size.c
+++ b/btrfs-calc-size.c
@@ -452,7 +452,9 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (optind >= argc) {
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1)) {
 		usage();
 		exit(1);
 	}
diff --git a/btrfs-convert.c b/btrfs-convert.c
index d62d4f8..952e3e6 100644
--- a/btrfs-convert.c
+++ b/btrfs-convert.c
@@ -2723,7 +2723,8 @@ int main(int argc, char *argv[])
 		}
 	}
 	argc = argc - optind;
-	if (argc != 1) {
+	set_argv0(argv);
+	if (check_argc_exact(argc, 1)) {
 		print_usage();
 		return 1;
 	}
diff --git a/btrfs-corrupt-block.c b/btrfs-corrupt-block.c
index 6ecbe47..1a3ac35 100644
--- a/btrfs-corrupt-block.c
+++ b/btrfs-corrupt-block.c
@@ -865,8 +865,9 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
-	if (ac == 0)
+	if (check_argc_min(ac, 1))
 		print_usage();
 	dev = av[optind];
 
diff --git a/btrfs-crc.c b/btrfs-crc.c
index 1990534..723e0b7 100644
--- a/btrfs-crc.c
+++ b/btrfs-crc.c
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include "crc32c.h"
+#include "utils.h"
 
 void usage(void)
 {
@@ -62,13 +63,13 @@ int main(int argc, char **argv)
 		}
 	}
 
+	set_argv0(argv);
 	str = argv[optind];
 
 	if (!loop) {
-		if (optind >= argc) {
-			fprintf(stderr, "not enough arguments\n");
+		if (check_argc_min(argc - optind, 1))
 			return 255;
-		}
+
 		printf("%12u - %s\n", crc32c(~1, str, strlen(str)), str);
 		return 0;
 	}
diff --git a/btrfs-debug-tree.c b/btrfs-debug-tree.c
index 36e1115..e46500d 100644
--- a/btrfs-debug-tree.c
+++ b/btrfs-debug-tree.c
@@ -174,8 +174,9 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
-	if (ac != 1)
+	if (check_argc_exact(ac, 1))
 		print_usage();
 
 	info = open_ctree_fs_info(av[optind], 0, 0, OPEN_CTREE_PARTIAL);
diff --git a/btrfs-find-root.c b/btrfs-find-root.c
index 7932308..6fe4b7b 100644
--- a/btrfs-find-root.c
+++ b/btrfs-find-root.c
@@ -305,7 +305,9 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (optind >= argc) {
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1)) {
 		usage();
 		exit(1);
 	}
diff --git a/btrfs-fragments.c b/btrfs-fragments.c
index 160429a..d03c2c3 100644
--- a/btrfs-fragments.c
+++ b/btrfs-fragments.c
@@ -425,13 +425,15 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (optind < argc) {
-		path = argv[optind++];
-	} else {
+	set_argv0(argv);
+	argc = argc - optind;
+	if (check_argc_min(argc, 1)) {
 		usage();
 		exit(1);
 	}
 
+	path = argv[optind++];
+
 	fd = open_file_or_dir(path, &dirstream);
 	if (fd < 0) {
 		fprintf(stderr, "ERROR: can't access '%s'\n", path);
diff --git a/btrfs-map-logical.c b/btrfs-map-logical.c
index e47a1ae..6b475fc 100644
--- a/btrfs-map-logical.c
+++ b/btrfs-map-logical.c
@@ -148,8 +148,9 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
-	if (ac == 0)
+	if (check_argc_min(ac, 1))
 		print_usage();
 	if (logical == 0)
 		print_usage();
diff --git a/btrfs-select-super.c b/btrfs-select-super.c
index d7cd187..6231d42 100644
--- a/btrfs-select-super.c
+++ b/btrfs-select-super.c
@@ -66,9 +66,10 @@ int main(int ac, char **av)
 				print_usage();
 		}
 	}
+	set_argv0(av);
 	ac = ac - optind;
 
-	if (ac != 1)
+	if (check_argc_exact(ac, 1))
 		print_usage();
 
 	if (bytenr == 0) {
diff --git a/btrfs-show-super.c b/btrfs-show-super.c
index ed0311f..38c5d26 100644
--- a/btrfs-show-super.c
+++ b/btrfs-show-super.c
@@ -95,7 +95,8 @@ int main(int argc, char **argv)
 		}
 	}
 
-	if (argc < optind + 1) {
+	set_argv0(argv);
+	if (check_argc_min(argc - optind, 1)) {
 		print_usage();
 		exit(1);
 	}
diff --git a/btrfs-zero-log.c b/btrfs-zero-log.c
index ab7f418..88998e9 100644
--- a/btrfs-zero-log.c
+++ b/btrfs-zero-log.c
@@ -46,7 +46,8 @@ int main(int ac, char **av)
 	struct btrfs_trans_handle *trans;
 	int ret;
 
-	if (ac != 2)
+	set_argv0(av);
+	if (check_argc_exact(ac, 2))
 		print_usage();
 
 	radix_tree_init();
diff --git a/btrfstune.c b/btrfstune.c
index 3f2f0cd..b43c2f0 100644
--- a/btrfstune.c
+++ b/btrfstune.c
@@ -137,9 +137,10 @@ int main(int argc, char *argv[])
 		}
 	}
 
+	set_argv0(argv);
 	argc = argc - optind;
 	device = argv[optind];
-	if (argc != 1) {
+	if (check_argc_exact(argc, 1)) {
 		print_usage();
 		return 1;
 	}
diff --git a/cmds-check.c b/cmds-check.c
index 6d3388f..078882b 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -7020,7 +7020,7 @@ int cmd_check(int argc, char **argv)
 	}
 	argc = argc - optind;
 
-	if (argc != 1)
+	if (check_argc_exact(argc, 1))
 		usage(cmd_check_usage);
 
 	radix_tree_init();
diff --git a/cmds-restore.c b/cmds-restore.c
index 3465f84..8e8afc5 100644
--- a/cmds-restore.c
+++ b/cmds-restore.c
@@ -1214,9 +1214,10 @@ int cmd_restore(int argc, char **argv)
 		}
 	}
 
-	if (!list_roots && optind + 1 >= argc)
+	set_argv0(argv);
+	if (!list_roots && check_argc_min(argc - optind, 2))
 		usage(cmd_restore_usage);
-	else if (list_roots && optind >= argc)
+	else if (list_roots && check_argc_min(argc - optind, 1))
 		usage(cmd_restore_usage);
 
 	if (fs_location && root_objectid) {
diff --git a/cmds-send.c b/cmds-send.c
index 9a73b32..cbc21f8 100644
--- a/cmds-send.c
+++ b/cmds-send.c
@@ -556,7 +556,7 @@ int cmd_send(int argc, char **argv)
 		}
 	}
 
-	if (optind == argc)
+	if (check_argc_min(argc - optind, 1))
 		usage(cmd_send_usage);
 
 	if (g_total_data_size &&
-- 
1.8.1.4


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

end of thread, other threads:[~2014-07-16  4:05 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-26  2:53 [PATCH 1/6] btrfs-progs: fix btrfs-image old_restore fsck failure Gui Hecheng
2014-06-26  2:53 ` [PATCH 2/6] btrfs-progs: deal with malloc failure in btrfs-image Gui Hecheng
2014-06-26  2:53 ` [PATCH 3/6] btrfs-progs: cleanup unnecessary free if malloc fails " Gui Hecheng
2014-06-26  2:53 ` [PATCH 4/6] btrfs-progs: cleanup possible silent failure " Gui Hecheng
2014-06-26  2:53 ` [PATCH 5/6] btrfs-progs: limit minimal num of args for btrfs-image Gui Hecheng
2014-06-27 12:35   ` David Sterba
2014-06-30  1:47     ` Gui Hecheng
2014-06-30  3:54     ` [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c Gui Hecheng
2014-06-30  3:54       ` [PATCH v2 2/2] btrfs-progs: limit minimal num of args for btrfs-image Gui Hecheng
2014-07-01 23:11       ` [PATCH 1/2] btrfs-progs: move the check_argc_* functions into utils.c David Sterba
2014-07-02  0:20         ` WorMzy Tykashi
2014-07-02  9:34           ` David Sterba
2014-07-02 10:50             ` WorMzy Tykashi
2014-07-02  1:13         ` Gui Hecheng
2014-07-10  1:06         ` [PATCH] btrfs-progs: use check_argc_* to check arg number for all tools Gui Hecheng
2014-07-16  3:44           ` [PATCH v2] " Gui Hecheng
2014-07-16  3:58             ` Gui Hecheng
2014-07-16  3:59           ` Gui Hecheng
2014-06-26  2:53 ` [PATCH 6/6] btrfs-progs: use BTRFS_SUPER_INFO_SIZE to replace raw 4096 in btrfs-image Gui Hecheng

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.