Re: [PATCH 5/5] xfs_io: set exitcode on failure appropriately

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Mar 24, 2020 at 11:19:28AM +1100, Dave Chinner wrote:
> From: Dave Chinner <dchinner@xxxxxxxxxx>
> 
> Many operations don't set the exitcode when they fail, resulting
> in xfs_io exiting with a zero (no failure) exit code despite the
> command failing and returning an error. The command return code is
> really a boolean to tell the libxcmd command loop whether to
> continue processing or not, while exitcode is the actual xfs_io exit
> code returned to the parent on exit.
> 
> This patchset just makes the code do the right thing. It's not the
> nicest code, but it's a start at producing correct behaviour.
> 
> Signed-Off-By: Dave Chinner <dchinner@xxxxxxxxxx>

Looks fine to me, but we're also going to need to audit db, quota, and
spaceman too, right?

Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>

--D

> ---
>  io/attr.c            | 24 +++++++++---
>  io/copy_file_range.c | 16 +++++++-
>  io/cowextsize.c      |  5 +++
>  io/encrypt.c         | 29 +++++++++++---
>  io/fadvise.c         |  9 ++++-
>  io/fiemap.c          |  3 ++
>  io/file.c            |  1 +
>  io/fsmap.c           |  9 ++++-
>  io/fsync.c           |  2 +
>  io/getrusage.c       |  1 +
>  io/imap.c            |  1 +
>  io/inject.c          |  1 +
>  io/link.c            |  1 +
>  io/log_writes.c      | 28 +++++++-------
>  io/madvise.c         | 10 ++++-
>  io/mincore.c         | 10 ++++-
>  io/mmap.c            | 62 ++++++++++++++++++++++++------
>  io/open.c            | 91 +++++++++++++++++++++++++++++++++-----------
>  io/parent.c          |  1 +
>  io/pread.c           | 19 +++++++--
>  io/prealloc.c        | 55 ++++++++++++++++++++------
>  io/pwrite.c          | 31 ++++++++++++---
>  io/readdir.c         | 10 +++--
>  io/reflink.c         | 30 ++++++++++++---
>  io/resblks.c         |  3 ++
>  io/seek.c            | 12 ++++--
>  io/sendfile.c        | 18 +++++++--
>  io/shutdown.c        |  2 +
>  io/stat.c            | 13 ++++++-
>  io/sync_file_range.c |  8 +++-
>  io/truncate.c        |  2 +
>  io/utimes.c          |  3 ++
>  32 files changed, 411 insertions(+), 99 deletions(-)
> 
> diff --git a/io/attr.c b/io/attr.c
> index 69b32956ab88..80e285147acb 100644
> --- a/io/attr.c
> +++ b/io/attr.c
> @@ -162,13 +162,15 @@ lsattr_callback(
>  	if (recurse_dir && !S_ISDIR(stat->st_mode))
>  		return 0;
>  
> -	if ((fd = open(path, O_RDONLY)) == -1)
> +	if ((fd = open(path, O_RDONLY)) == -1) {
>  		fprintf(stderr, _("%s: cannot open %s: %s\n"),
>  			progname, path, strerror(errno));
> -	else if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0)
> +		exitcode = 1;
> +	} else if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) {
>  		fprintf(stderr, _("%s: cannot get flags on %s: %s\n"),
>  			progname, path, strerror(errno));
> -	else
> +		exitcode = 1;
> +	} else
>  		printxattr(fsx.fsx_xflags, 0, 1, path, 0, 1);
>  
>  	if (fd != -1)
> @@ -205,6 +207,7 @@ lsattr_f(
>  			vflag = 1;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&lsattr_cmd);
>  		}
>  	}
> @@ -215,6 +218,7 @@ lsattr_f(
>  	} else if ((xfsctl(name, file->fd, FS_IOC_FSGETXATTR, &fsx)) < 0) {
>  		fprintf(stderr, _("%s: cannot get flags on %s: %s\n"),
>  			progname, name, strerror(errno));
> +		exitcode = 1;
>  	} else {
>  		printxattr(fsx.fsx_xflags, vflag, !aflag, name, vflag, !aflag);
>  		if (aflag) {
> @@ -241,15 +245,19 @@ chattr_callback(
>  	if ((fd = open(path, O_RDONLY)) == -1) {
>  		fprintf(stderr, _("%s: cannot open %s: %s\n"),
>  			progname, path, strerror(errno));
> +		exitcode = 1;
>  	} else if (xfsctl(path, fd, FS_IOC_FSGETXATTR, &attr) < 0) {
>  		fprintf(stderr, _("%s: cannot get flags on %s: %s\n"),
>  			progname, path, strerror(errno));
> +		exitcode = 1;
>  	} else {
>  		attr.fsx_xflags |= orflags;
>  		attr.fsx_xflags &= ~andflags;
> -		if (xfsctl(path, fd, FS_IOC_FSSETXATTR, &attr) < 0)
> +		if (xfsctl(path, fd, FS_IOC_FSSETXATTR, &attr) < 0) {
>  			fprintf(stderr, _("%s: cannot set flags on %s: %s\n"),
>  				progname, path, strerror(errno));
> +			exitcode = 1;
> +		}
>  	}
>  
>  	if (fd != -1)
> @@ -285,6 +293,7 @@ chattr_f(
>  				if (!p->flag) {
>  					fprintf(stderr, _("%s: unknown flag\n"),
>  						progname);
> +					exitcode = 1;
>  					return 0;
>  				}
>  			}
> @@ -299,12 +308,14 @@ chattr_f(
>  				if (!p->flag) {
>  					fprintf(stderr, _("%s: unknown flag\n"),
>  						progname);
> +					exitcode = 1;
>  					return 0;
>  				}
>  			}
>  		} else {
>  			fprintf(stderr, _("%s: bad chattr command, not +/-X\n"),
>  				progname);
> +			exitcode = 1;
>  			return 0;
>  		}
>  	}
> @@ -315,12 +326,15 @@ chattr_f(
>  	} else if (xfsctl(name, file->fd, FS_IOC_FSGETXATTR, &attr) < 0) {
>  		fprintf(stderr, _("%s: cannot get flags on %s: %s\n"),
>  			progname, name, strerror(errno));
> +		exitcode = 1;
>  	} else {
>  		attr.fsx_xflags |= orflags;
>  		attr.fsx_xflags &= ~andflags;
> -		if (xfsctl(name, file->fd, FS_IOC_FSSETXATTR, &attr) < 0)
> +		if (xfsctl(name, file->fd, FS_IOC_FSSETXATTR, &attr) < 0) {
>  			fprintf(stderr, _("%s: cannot set flags on %s: %s\n"),
>  				progname, name, strerror(errno));
> +			exitcode = 1;
> +		}
>  	}
>  	return 0;
>  }
> diff --git a/io/copy_file_range.c b/io/copy_file_range.c
> index 4c4332c6e5ec..685250471020 100644
> --- a/io/copy_file_range.c
> +++ b/io/copy_file_range.c
> @@ -89,6 +89,7 @@ copy_range_f(int argc, char **argv)
>  			src_off = cvtnum(fsblocksize, fssectsize, optarg);
>  			if (src_off < 0) {
>  				printf(_("invalid source offset -- %s\n"), optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
> @@ -96,6 +97,7 @@ copy_range_f(int argc, char **argv)
>  			dst_off = cvtnum(fsblocksize, fssectsize, optarg);
>  			if (dst_off < 0) {
>  				printf(_("invalid destination offset -- %s\n"), optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
> @@ -103,6 +105,7 @@ copy_range_f(int argc, char **argv)
>  			llen = cvtnum(fsblocksize, fssectsize, optarg);
>  			if (llen == -1LL) {
>  				printf(_("invalid length -- %s\n"), optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			/*
> @@ -112,6 +115,7 @@ copy_range_f(int argc, char **argv)
>  			if ((size_t)llen != llen) {
>  				errno = EOVERFLOW;
>  				perror("copy_range");
> +				exitcode = 1;
>  				return 0;
>  			}
>  			len = llen;
> @@ -122,23 +126,29 @@ copy_range_f(int argc, char **argv)
>  			if (src_file_nr < 0 || src_file_nr >= filecount) {
>  				printf(_("file value %d is out of range (0-%d)\n"),
>  					src_file_nr, filecount - 1);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			/* Expect no src_path arg */
>  			src_path_arg = 0;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&copy_range_cmd);
>  		}
>  	}
>  
> -	if (optind != argc - src_path_arg)
> +	if (optind != argc - src_path_arg) {
> +		exitcode = 1;
>  		return command_usage(&copy_range_cmd);
> +	}
>  
>  	if (src_path_arg) {
>  		fd = openfile(argv[optind], NULL, IO_READONLY, 0, NULL);
> -		if (fd < 0)
> +		if (fd < 0) {
> +			exitcode = 1;
>  			return 0;
> +		}
>  	} else {
>  		fd = filetable[src_file_nr].fd;
>  	}
> @@ -158,6 +168,8 @@ copy_range_f(int argc, char **argv)
>  	ret = copy_file_range_cmd(fd, &src_off, &dst_off, len);
>  out:
>  	close(fd);
> +	if (ret < 0)
> +		exitcode = 1;
>  	return ret;
>  }
>  
> diff --git a/io/cowextsize.c b/io/cowextsize.c
> index da5c6680c7d2..549634438aa4 100644
> --- a/io/cowextsize.c
> +++ b/io/cowextsize.c
> @@ -39,6 +39,7 @@ get_cowextsize(const char *path, int fd)
>  	if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) {
>  		printf("%s: XFS_IOC_FSGETXATTR %s: %s\n",
>  			progname, path, strerror(errno));
> +		exitcode = 1;
>  		return 0;
>  	}
>  	printf("[%u] %s\n", fsx.fsx_cowextsize, path);
> @@ -53,11 +54,13 @@ set_cowextsize(const char *path, int fd, long extsz)
>  
>  	if (fstat64(fd, &stat) < 0) {
>  		perror("fstat64");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) {
>  		printf("%s: XFS_IOC_FSGETXATTR %s: %s\n",
>  			progname, path, strerror(errno));
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> @@ -72,6 +75,7 @@ set_cowextsize(const char *path, int fd, long extsz)
>  	if ((xfsctl(path, fd, FS_IOC_FSSETXATTR, &fsx)) < 0) {
>  		printf("%s: XFS_IOC_FSSETXATTR %s: %s\n",
>  			progname, path, strerror(errno));
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> @@ -154,6 +158,7 @@ cowextsize_f(
>  		if (cowextsize < 0) {
>  			printf(_("non-numeric cowextsize argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  	} else {
> diff --git a/io/encrypt.c b/io/encrypt.c
> index 01b7e0df8a6e..1b347dc1afdb 100644
> --- a/io/encrypt.c
> +++ b/io/encrypt.c
> @@ -603,6 +603,7 @@ set_encpolicy_f(int argc, char **argv)
>  				fprintf(stderr,
>  					_("invalid contents encryption mode: %s\n"),
>  					optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
> @@ -611,6 +612,7 @@ set_encpolicy_f(int argc, char **argv)
>  				fprintf(stderr,
>  					_("invalid filenames encryption mode: %s\n"),
>  					optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
> @@ -618,6 +620,7 @@ set_encpolicy_f(int argc, char **argv)
>  			if (!parse_byte_value(optarg, &flags)) {
>  				fprintf(stderr, _("invalid flags: %s\n"),
>  					optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
> @@ -628,6 +631,7 @@ set_encpolicy_f(int argc, char **argv)
>  				fprintf(stderr,
>  					_("invalid policy version: %s\n"),
>  					optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			if (val == 1) /* Just to avoid annoying people... */
> @@ -636,14 +640,17 @@ set_encpolicy_f(int argc, char **argv)
>  			break;
>  		}
>  		default:
> +			exitcode = 1;
>  			return command_usage(&set_encpolicy_cmd);
>  		}
>  	}
>  	argc -= optind;
>  	argv += optind;
>  
> -	if (argc > 1)
> +	if (argc > 1) {
> +		exitcode = 1;
>  		return command_usage(&set_encpolicy_cmd);
> +	}
>  
>  	/*
>  	 * If unspecified, the key descriptor or identifier defaults to all 0's.
> @@ -652,8 +659,10 @@ set_encpolicy_f(int argc, char **argv)
>  	memset(&key_spec, 0, sizeof(key_spec));
>  	if (argc > 0) {
>  		version = str2keyspec(argv[0], version, &key_spec);
> -		if (version < 0)
> +		if (version < 0) {
> +			exitcode = 1;
>  			return 0;
> +		}
>  	}
>  	if (version < 0) /* version unspecified? */
>  		version = FSCRYPT_POLICY_V1;
> @@ -735,6 +744,7 @@ add_enckey_f(int argc, char **argv)
>  				goto out;
>  			break;
>  		default:
> +			exitcode = 1;
>  			retval = command_usage(&add_enckey_cmd);
>  			goto out;
>  		}
> @@ -743,6 +753,7 @@ add_enckey_f(int argc, char **argv)
>  	argv += optind;
>  
>  	if (argc != 0) {
> +		exitcode = 1;
>  		retval = command_usage(&add_enckey_cmd);
>  		goto out;
>  	}
> @@ -760,6 +771,7 @@ add_enckey_f(int argc, char **argv)
>  			fprintf(stderr,
>  				_("Invalid key; got > FSCRYPT_MAX_KEY_SIZE (%d) bytes on stdin!\n"),
>  				FSCRYPT_MAX_KEY_SIZE);
> +			exitcode = 1;
>  			goto out;
>  		}
>  		arg->raw_size = raw_size;
> @@ -794,17 +806,22 @@ rm_enckey_f(int argc, char **argv)
>  			ioc = FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&rm_enckey_cmd);
>  		}
>  	}
>  	argc -= optind;
>  	argv += optind;
>  
> -	if (argc != 1)
> +	if (argc != 1) {
> +		exitcode = 1;
>  		return command_usage(&rm_enckey_cmd);
> +	}
>  
> -	if (str2keyspec(argv[0], -1, &arg.key_spec) < 0)
> +	if (str2keyspec(argv[0], -1, &arg.key_spec) < 0) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (ioctl(file->fd, ioc, &arg) != 0) {
>  		fprintf(stderr, _("Error removing encryption key: %s\n"),
> @@ -834,8 +851,10 @@ enckey_status_f(int argc, char **argv)
>  
>  	memset(&arg, 0, sizeof(arg));
>  
> -	if (str2keyspec(argv[1], -1, &arg.key_spec) < 0)
> +	if (str2keyspec(argv[1], -1, &arg.key_spec) < 0) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (ioctl(file->fd, FS_IOC_GET_ENCRYPTION_KEY_STATUS, &arg) != 0) {
>  		fprintf(stderr, _("Error getting encryption key status: %s\n"),
> diff --git a/io/fadvise.c b/io/fadvise.c
> index 4089a0eb2b2e..60cc0f088465 100644
> --- a/io/fadvise.c
> +++ b/io/fadvise.c
> @@ -65,19 +65,23 @@ fadvise_f(
>  			range = 1;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&fadvise_cmd);
>  		}
>  	}
>  	if (range) {
>  		size_t	blocksize, sectsize;
>  
> -		if (optind != argc - 2)
> +		if (optind != argc - 2) {
> +			exitcode = 1;
>  			return command_usage(&fadvise_cmd);
> +		}
>  		init_cvtnum(&blocksize, &sectsize);
>  		offset = cvtnum(blocksize, sectsize, argv[optind]);
>  		if (offset < 0) {
>  			printf(_("non-numeric offset argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  		optind++;
> @@ -85,14 +89,17 @@ fadvise_f(
>  		if (length < 0) {
>  			printf(_("non-numeric length argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  	} else if (optind != argc) {
> +		exitcode = 1;
>  		return command_usage(&fadvise_cmd);
>  	}
>  
>  	if (posix_fadvise(file->fd, offset, length, advise) < 0) {
>  		perror("fadvise");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> diff --git a/io/fiemap.c b/io/fiemap.c
> index 485bae16ebaa..f0c74dfe606d 100644
> --- a/io/fiemap.c
> +++ b/io/fiemap.c
> @@ -257,6 +257,7 @@ fiemap_f(
>  			vflag++;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&fiemap_cmd);
>  		}
>  	}
> @@ -266,6 +267,7 @@ fiemap_f(
>  		start_offset = cvtnum(fsblocksize, fssectsize, argv[optind]);
>  		if (start_offset < 0) {
>  			printf("non-numeric offset argument -- %s\n", argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  		last_logical = start_offset;
> @@ -277,6 +279,7 @@ fiemap_f(
>  		length = cvtnum(fsblocksize, fssectsize, argv[optind]);
>  		if (length < 0) {
>  			printf("non-numeric len argument -- %s\n", argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  		range_end = start_offset + length;
> diff --git a/io/file.c b/io/file.c
> index c45486ecfac2..3af829eadb8b 100644
> --- a/io/file.c
> +++ b/io/file.c
> @@ -69,6 +69,7 @@ file_f(
>  	i = atoi(argv[1]);
>  	if (i < 0 || i >= filecount) {
>  		printf(_("value %d is out of range (0-%d)\n"), i, filecount-1);
> +		exitcode = 1;
>  	} else {
>  		file = &filetable[i];
>  		filelist_f();
> diff --git a/io/fsmap.c b/io/fsmap.c
> index feacb264a9d0..4b2175957f9c 100644
> --- a/io/fsmap.c
> +++ b/io/fsmap.c
> @@ -417,13 +417,16 @@ fsmap_f(
>  			vflag++;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&fsmap_cmd);
>  		}
>  	}
>  
>  	if ((dflag + lflag + rflag > 1) || (mflag > 0 && vflag > 0) ||
> -	    (argc > optind && dflag + lflag + rflag == 0))
> +	    (argc > optind && dflag + lflag + rflag == 0)) {
> +		exitcode = 1;
>  		return command_usage(&fsmap_cmd);
> +	}
>  
>  	if (argc > optind) {
>  		start = cvtnum(fsblocksize, fssectsize, argv[optind]);
> @@ -431,6 +434,7 @@ fsmap_f(
>  			fprintf(stderr,
>  				_("Bad rmap start_bblock %s.\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  		start <<= BBSHIFT;
> @@ -442,6 +446,7 @@ fsmap_f(
>  			fprintf(stderr,
>  				_("Bad rmap end_bblock %s.\n"),
>  				argv[optind + 1]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  		end <<= BBSHIFT;
> @@ -495,8 +500,8 @@ fsmap_f(
>  				" iflags=0x%x [\"%s\"]: %s\n"),
>  				progname, head->fmh_iflags, file->name,
>  				strerror(errno));
> -			free(head);
>  			exitcode = 1;
> +			free(head);
>  			return 0;
>  		}
>  		if (head->fmh_entries > map_size + 2) {
> diff --git a/io/fsync.c b/io/fsync.c
> index e6f2331199be..b425b61222d7 100644
> --- a/io/fsync.c
> +++ b/io/fsync.c
> @@ -19,6 +19,7 @@ fsync_f(
>  {
>  	if (fsync(file->fd) < 0) {
>  		perror("fsync");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> @@ -31,6 +32,7 @@ fdatasync_f(
>  {
>  	if (fdatasync(file->fd) < 0) {
>  		perror("fdatasync");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> diff --git a/io/getrusage.c b/io/getrusage.c
> index 6962913df44f..11f86529bf77 100644
> --- a/io/getrusage.c
> +++ b/io/getrusage.c
> @@ -51,6 +51,7 @@ getrusage_f(
>  
>  	if (getrusage(RUSAGE_SELF, &rusage) < 0) {
>  		perror("getrusage");
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> diff --git a/io/imap.c b/io/imap.c
> index e75dad1a5de9..837b338215ae 100644
> --- a/io/imap.c
> +++ b/io/imap.c
> @@ -31,6 +31,7 @@ imap_f(int argc, char **argv)
>  	error = -xfrog_inumbers_alloc_req(nent, 0, &ireq);
>  	if (error) {
>  		xfrog_perror(error, "alloc req");
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> diff --git a/io/inject.c b/io/inject.c
> index cabfc3e362d9..4191c84ead41 100644
> --- a/io/inject.c
> +++ b/io/inject.c
> @@ -123,6 +123,7 @@ inject_f(
>  			command = XFS_IOC_ERROR_CLEARALL;
>  		if ((xfsctl(file->name, file->fd, command, &error)) < 0) {
>  			perror("XFS_IOC_ERROR_INJECTION");
> +			exitcode = 1;
>  			continue;
>  		}
>  	}
> diff --git a/io/link.c b/io/link.c
> index f4f4b1396951..8d255dee6f5f 100644
> --- a/io/link.c
> +++ b/io/link.c
> @@ -35,6 +35,7 @@ flink_f(
>  
>  	if (linkat(file->fd, "", AT_FDCWD, argv[1], AT_EMPTY_PATH) < 0) {
>  		perror("flink");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> diff --git a/io/log_writes.c b/io/log_writes.c
> index 9c2285fed9eb..20049d1866f0 100644
> --- a/io/log_writes.c
> +++ b/io/log_writes.c
> @@ -15,10 +15,10 @@ static cmdinfo_t log_writes_cmd;
>  static int
>  mark_log(const char *device, const char *mark)
>  {
> -	struct dm_task 	*dmt;
> -	const int 	size = 80;
> -	char 		message[size];
> -	int 		len, ret = 0;
> +	struct dm_task	*dmt;
> +	const int	size = 80;
> +	char		message[size];
> +	int		len, ret = 0;
>  
>  	len = snprintf(message, size, "mark %s", mark);
>  	if (len >= size) {
> @@ -47,14 +47,13 @@ out:
>  
>  static int
>  log_writes_f(
> -	int			argc,
> -	char			**argv)
> +	int		argc,
> +	char		**argv)
>  {
> -	const char 	*device = NULL;
> -	const char 	*mark = NULL;
> -	int 		c;
> +	const char	*device = NULL;
> +	const char	*mark = NULL;
> +	int		c;
>  
> -	exitcode = 1;
>  	while ((c = getopt(argc, argv, "d:m:")) != EOF) {
>  		switch (c) {
>  		case 'd':
> @@ -64,15 +63,18 @@ log_writes_f(
>  			mark = optarg;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&log_writes_cmd);
>  		}
>  	}
>  
> -	if (device == NULL || mark == NULL)
> +	if (device == NULL || mark == NULL) {
> +		exitcode = 1;
>  		return command_usage(&log_writes_cmd);
> +	}
>  
> -	if (mark_log(device, mark))
> -		exitcode = 0;
> +	if (!mark_log(device, mark))
> +		exitcode = 1;
>  
>  	return 0;
>  }
> diff --git a/io/madvise.c b/io/madvise.c
> index 9f6c010d8a33..bde31539b606 100644
> --- a/io/madvise.c
> +++ b/io/madvise.c
> @@ -60,6 +60,7 @@ madvise_f(
>  			advise = MADV_WILLNEED;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&madvise_cmd);
>  		}
>  	}
> @@ -73,6 +74,7 @@ madvise_f(
>  		if (offset < 0) {
>  			printf(_("non-numeric offset argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  		optind++;
> @@ -80,23 +82,29 @@ madvise_f(
>  		if (llength < 0) {
>  			printf(_("non-numeric length argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		} else if (llength > (size_t)llength) {
>  			printf(_("length argument too large -- %lld\n"),
>  				(long long)llength);
> +			exitcode = 1;
>  			return 0;
>  		} else
>  			length = (size_t)llength;
>  	} else {
> +		exitcode = 1;
>  		return command_usage(&madvise_cmd);
>  	}
>  
>  	start = check_mapping_range(mapping, offset, length, 1);
> -	if (!start)
> +	if (!start) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (madvise(start, length, advise) < 0) {
>  		perror("madvise");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> diff --git a/io/mincore.c b/io/mincore.c
> index 239134fedc8b..67f1d6c4b612 100644
> --- a/io/mincore.c
> +++ b/io/mincore.c
> @@ -34,36 +34,44 @@ mincore_f(
>  		if (offset < 0) {
>  			printf(_("non-numeric offset argument -- %s\n"),
>  				argv[1]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  		llength = cvtnum(blocksize, sectsize, argv[2]);
>  		if (llength < 0) {
>  			printf(_("non-numeric length argument -- %s\n"),
>  				argv[2]);
> +			exitcode = 1;
>  			return 0;
>  		} else if (llength > (size_t)llength) {
>  			printf(_("length argument too large -- %lld\n"),
>  				(long long)llength);
> +			exitcode = 1;
>  			return 0;
>  		} else
>  			length = (size_t)llength;
>  	} else {
> +		exitcode = 1;
>  		return command_usage(&mincore_cmd);
>  	}
>  
>  	start = check_mapping_range(mapping, offset, length, 1);
> -	if (!start)
> +	if (!start) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	vec = calloc(length/pagesize, sizeof(unsigned char));
>  	if (!vec) {
>  		perror("calloc");
> +		exitcode = 1;
>  		return 0;
>  	}
>  
>  	if (mincore(start, length, vec) < 0) {
>  		perror("mincore");
>  		free(vec);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> diff --git a/io/mmap.c b/io/mmap.c
> index f9383e5e790d..8c048a0ab6d0 100644
> --- a/io/mmap.c
> +++ b/io/mmap.c
> @@ -113,6 +113,7 @@ mapset_f(
>  	i = atoi(argv[1]);
>  	if (i < 0 || i >= mapcount) {
>  		printf("value %d is out of range (0-%d)\n", i, mapcount);
> +		exitcode = 1;
>  	} else {
>  		mapping = &maptable[i];
>  		maplist_f();
> @@ -162,6 +163,7 @@ mmap_f(
>  		fprintf(stderr, file ?
>  			_("no mapped regions, try 'help mmap'\n") :
>  			_("no files are open, try 'help open'\n"));
> +		exitcode = 1;
>  		return 0;
>  	} else if (argc == 2) {
>  		if (mapping)
> @@ -169,9 +171,11 @@ mmap_f(
>  		fprintf(stderr, file ?
>  			_("no mapped regions, try 'help mmap'\n") :
>  			_("no files are open, try 'help open'\n"));
> +		exitcode = 1;
>  		return 0;
>  	} else if (!file) {
>  		fprintf(stderr, _("no files are open, try 'help open'\n"));
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> @@ -205,30 +209,36 @@ mmap_f(
>  			length2 = cvtnum(blocksize, sectsize, optarg);
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&mmap_cmd);
>  		}
>  	}
>  	if (!prot)
>  		prot = PROT_READ | PROT_WRITE | PROT_EXEC;
>  
> -	if (optind != argc - 2)
> +	if (optind != argc - 2) {
> +		exitcode = 1;
>  		return command_usage(&mmap_cmd);
> +	}
>  
>  	offset = cvtnum(blocksize, sectsize, argv[optind]);
>  	if (offset < 0) {
>  		printf(_("non-numeric offset argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  	optind++;
>  	length = cvtnum(blocksize, sectsize, argv[optind]);
>  	if (length < 0) {
>  		printf(_("non-numeric length argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
>  	filename = strdup(file->name);
>  	if (!filename) {
>  		perror("strdup");
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> @@ -248,6 +258,7 @@ mmap_f(
>  	if (address == MAP_FAILED) {
>  		perror("mmap");
>  		free(filename);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> @@ -259,6 +270,7 @@ mmap_f(
>  		mapcount = 0;
>  		munmap(address, length);
>  		free(filename);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> @@ -313,6 +325,7 @@ msync_f(
>  			flags |= MS_SYNC;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&msync_cmd);
>  		}
>  	}
> @@ -326,6 +339,7 @@ msync_f(
>  		if (offset < 0) {
>  			printf(_("non-numeric offset argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  		optind++;
> @@ -333,18 +347,25 @@ msync_f(
>  		if (length < 0) {
>  			printf(_("non-numeric length argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  	} else {
> +		exitcode = 1;
>  		return command_usage(&msync_cmd);
>  	}
>  
>  	start = check_mapping_range(mapping, offset, length, 1);
> -	if (!start)
> +	if (!start) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
> -	if (msync(start, length, flags) < 0)
> +	if (msync(start, length, flags) < 0) {
>  		perror("msync");
> +		exitcode = 1;
> +		return 0;
> +	}
>  
>  	return 0;
>  }
> @@ -399,6 +420,7 @@ mread_f(
>  			dump = 1;	/* mapping offset dump */
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&mread_cmd);
>  		}
>  	}
> @@ -412,6 +434,7 @@ mread_f(
>  		if (offset < 0) {
>  			printf(_("non-numeric offset argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  		optind++;
> @@ -419,6 +442,7 @@ mread_f(
>  		if (length < 0) {
>  			printf(_("non-numeric length argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  	} else {
> @@ -426,16 +450,20 @@ mread_f(
>  	}
>  
>  	start = check_mapping_range(mapping, offset, length, 0);
> -	if (!start)
> +	if (!start) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  	dumpoffset = offset - mapping->offset;
>  	if (dump == 2)
>  		printoffset = offset;
>  	else
>  		printoffset = dumpoffset;
>  
> -	if (alloc_buffer(pagesize, 0, 0) < 0)
> +	if (alloc_buffer(pagesize, 0, 0) < 0) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  	bp = (char *)io_buffer;
>  
>  	dumplen = length % pagesize;
> @@ -487,6 +515,7 @@ munmap_f(
>  
>  	if (munmap(mapping->addr, mapping->length) < 0) {
>  		perror("munmap");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	free(mapping->name);
> @@ -558,6 +587,7 @@ mwrite_f(
>  			}
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&mwrite_cmd);
>  		}
>  	}
> @@ -571,6 +601,7 @@ mwrite_f(
>  		if (offset < 0) {
>  			printf(_("non-numeric offset argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  		optind++;
> @@ -578,15 +609,19 @@ mwrite_f(
>  		if (length < 0) {
>  			printf(_("non-numeric length argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  	} else {
> +		exitcode = 1;
>  		return command_usage(&mwrite_cmd);
>  	}
>  
>  	start = check_mapping_range(mapping, offset, length, 0);
> -	if (!start)
> +	if (!start) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	offset -= mapping->offset;
>  	if (rflag) {
> @@ -642,17 +677,21 @@ mremap_f(
>  			flags = MREMAP_MAYMOVE;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&mremap_cmd);
>  		}
>  	}
>  
> -	if (optind != argc - 1)
> +	if (optind != argc - 1) {
> +		exitcode = 1;
>  		return command_usage(&mremap_cmd);
> +	}
>  
>  	new_length = cvtnum(blocksize, sectsize, argv[optind]);
>  	if (new_length < 0) {
>  		printf(_("non-numeric offset argument -- %s\n"),
>  			argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> @@ -662,13 +701,14 @@ mremap_f(
>  	else
>  		new_addr = mremap(mapping->addr, mapping->length,
>  		                  new_length, flags, new_addr);
> -	if (new_addr == MAP_FAILED)
> +	if (new_addr == MAP_FAILED) {
>  		perror("mremap");
> -	else {
> -		mapping->addr = new_addr;
> -		mapping->length = new_length;
> +		exitcode = 1;
> +		return 0;
>  	}
>  
> +	mapping->addr = new_addr;
> +	mapping->length = new_length;
>  	return 0;
>  }
>  #endif /* HAVE_MREMAP */
> diff --git a/io/open.c b/io/open.c
> index 12990642b739..9a8b5e5c5904 100644
> --- a/io/open.c
> +++ b/io/open.c
> @@ -244,6 +244,7 @@ open_f(
>  		if (file)
>  			return stat_f(argc, argv);
>  		fprintf(stderr, _("no files are open, try 'help open'\n"));
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> @@ -266,6 +267,7 @@ open_f(
>  			mode = strtoul(optarg, &sp, 0);
>  			if (!sp || sp == optarg) {
>  				printf(_("non-numeric mode -- %s\n"), optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
> @@ -295,32 +297,43 @@ open_f(
>  			flags |= IO_NOFOLLOW;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&open_cmd);
>  		}
>  	}
>  
> -	if (optind != argc - 1)
> +	if (optind != argc - 1) {
> +		exitcode = 1;
>  		return command_usage(&open_cmd);
> +	}
>  
>  	if ((flags & (IO_READONLY|IO_TMPFILE)) == (IO_READONLY|IO_TMPFILE)) {
>  		fprintf(stderr, _("-T and -r options are incompatible\n"));
> +		exitcode = 1;
>  		return -1;
>  	}
>  
>  	if ((flags & (IO_PATH|IO_NOFOLLOW)) &&
>  	    (flags & ~(IO_PATH|IO_NOFOLLOW))) {
>  		fprintf(stderr, _("-P and -L are incompatible with the other options\n"));
> +		exitcode = 1;
>  		return -1;
>  	}
>  
>  	fd = openfile(argv[optind], &geometry, flags, mode, &fsp);
> -	if (fd < 0)
> +	if (fd < 0) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (!platform_test_xfs_fd(fd))
>  		flags |= IO_FOREIGN;
>  
> -	addfile(argv[optind], fd, &geometry, flags, &fsp);
> +	if (addfile(argv[optind], fd, &geometry, flags, &fsp) != 0) {
> +		exitcode = 1;
> +		return 0;
> +	}
> +
>  	return 0;
>  }
>  
> @@ -334,6 +347,7 @@ close_f(
>  
>  	if (close(file->fd) < 0) {
>  		perror("close");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	free(file->name);
> @@ -389,9 +403,12 @@ lsproj_callback(
>  	if ((fd = open(path, O_RDONLY)) == -1) {
>  		fprintf(stderr, _("%s: cannot open %s: %s\n"),
>  			progname, path, strerror(errno));
> +		exitcode = 1;
>  	} else {
>  		if (getprojid(path, fd, &projid) == 0)
>  			printf("[%u] %s\n", (unsigned int)projid, path);
> +		else
> +			exitcode = 1;
>  		close(fd);
>  	}
>  	return 0;
> @@ -417,19 +434,23 @@ lsproj_f(
>  			recurse_dir = 0;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&lsproj_cmd);
>  		}
>  	}
>  
> -	if (argc != optind)
> +	if (argc != optind) {
> +		exitcode = 1;
>  		return command_usage(&lsproj_cmd);
> +	}
>  
>  	if (recurse_all || recurse_dir)
>  		nftw(file->name, lsproj_callback,
>  			100, FTW_PHYS | FTW_MOUNT | FTW_DEPTH);
> -	else if (getprojid(file->name, file->fd, &projid) < 0)
> +	else if (getprojid(file->name, file->fd, &projid) < 0) {
>  		perror("getprojid");
> -	else
> +		exitcode = 1;
> +	} else
>  		printf(_("projid = %u\n"), (unsigned int)projid);
>  	return 0;
>  }
> @@ -461,9 +482,12 @@ chproj_callback(
>  	if ((fd = open(path, O_RDONLY)) == -1) {
>  		fprintf(stderr, _("%s: cannot open %s: %s\n"),
>  			progname, path, strerror(errno));
> +		exitcode = 1;
>  	} else {
> -		if (setprojid(path, fd, prid) < 0)
> +		if (setprojid(path, fd, prid) < 0) {
>  			perror("setprojid");
> +			exitcode = 1;
> +		}
>  		close(fd);
>  	}
>  	return 0;
> @@ -488,24 +512,30 @@ chproj_f(
>  			recurse_dir = 0;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&chproj_cmd);
>  		}
>  	}
>  
> -	if (argc != optind + 1)
> +	if (argc != optind + 1) {
> +		exitcode = 1;
>  		return command_usage(&chproj_cmd);
> +	}
>  
>  	prid = prid_from_string(argv[optind]);
>  	if (prid == -1) {
>  		printf(_("invalid project ID -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
>  	if (recurse_all || recurse_dir)
>  		nftw(file->name, chproj_callback,
>  			100, FTW_PHYS | FTW_MOUNT | FTW_DEPTH);
> -	else if (setprojid(file->name, file->fd, prid) < 0)
> +	else if (setprojid(file->name, file->fd, prid) < 0) {
>  		perror("setprojid");
> +		exitcode = 1;
> +	}
>  	return 0;
>  }
>  
> @@ -529,7 +559,7 @@ get_extsize(const char *path, int fd)
>  	if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) {
>  		printf("%s: FS_IOC_FSGETXATTR %s: %s\n",
>  			progname, path, strerror(errno));
> -		return 0;
> +		return -1;
>  	}
>  	printf("[%u] %s\n", fsx.fsx_extsize, path);
>  	return 0;
> @@ -543,12 +573,12 @@ set_extsize(const char *path, int fd, long extsz)
>  
>  	if (fstat(fd, &stat) < 0) {
>  		perror("fstat");
> -		return 0;
> +		return -1;
>  	}
>  	if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) {
>  		printf("%s: FS_IOC_FSGETXATTR %s: %s\n",
>  			progname, path, strerror(errno));
> -		return 0;
> +		return -1;
>  	}
>  
>  	if (S_ISREG(stat.st_mode)) {
> @@ -557,14 +587,14 @@ set_extsize(const char *path, int fd, long extsz)
>  		fsx.fsx_xflags |= FS_XFLAG_EXTSZINHERIT;
>  	} else {
>  		printf(_("invalid target file type - file %s\n"), path);
> -		return 0;
> +		return -1;
>  	}
>  	fsx.fsx_extsize = extsz;
>  
>  	if ((xfsctl(path, fd, FS_IOC_FSSETXATTR, &fsx)) < 0) {
>  		printf("%s: FS_IOC_FSSETXATTR %s: %s\n",
>  			progname, path, strerror(errno));
> -		return 0;
> +		return -1;
>  	}
>  
>  	return 0;
> @@ -585,8 +615,10 @@ get_extsize_callback(
>  	if ((fd = open(path, O_RDONLY)) == -1) {
>  		fprintf(stderr, _("%s: cannot open %s: %s\n"),
>  			progname, path, strerror(errno));
> +		exitcode = 1;
>  	} else {
> -		get_extsize(path, fd);
> +		if (get_extsize(path, fd) < 0)
> +			exitcode = 1;
>  		close(fd);
>  	}
>  	return 0;
> @@ -607,8 +639,10 @@ set_extsize_callback(
>  	if ((fd = open(path, O_RDONLY)) == -1) {
>  		fprintf(stderr, _("%s: cannot open %s: %s\n"),
>  			progname, path, strerror(errno));
> +		exitcode = 1;
>  	} else {
> -		set_extsize(path, fd, extsize);
> +		if (set_extsize(path, fd, extsize) < 0)
> +			exitcode = 1;
>  		close(fd);
>  	}
>  	return 0;
> @@ -635,6 +669,7 @@ extsize_f(
>  			recurse_dir = 0;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&extsize_cmd);
>  		}
>  	}
> @@ -644,20 +679,23 @@ extsize_f(
>  		if (extsize < 0) {
>  			printf(_("non-numeric extsize argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  	} else {
>  		extsize = -1;
>  	}
>  
> -	if (recurse_all || recurse_dir)
> +	if (recurse_all || recurse_dir) {
>  		nftw(file->name, (extsize >= 0) ?
>  			set_extsize_callback : get_extsize_callback,
>  			100, FTW_PHYS | FTW_MOUNT | FTW_DEPTH);
> -	else if (extsize >= 0)
> -		set_extsize(file->name, file->fd, extsize);
> -	else
> -		get_extsize(file->name, file->fd);
> +	} else if (extsize >= 0) {
> +		if (set_extsize(file->name, file->fd, extsize) < 0)
> +			exitcode = 1;
> +	} else if (get_extsize(file->name, file->fd) < 0) {
> +		exitcode = 1;
> +	}
>  	return 0;
>  }
>  
> @@ -689,6 +727,7 @@ get_last_inode(void)
>  	ret = -xfrog_inumbers_alloc_req(IGROUP_NR, 0, &ireq);
>  	if (ret) {
>  		xfrog_perror(ret, "alloc req");
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> @@ -696,6 +735,7 @@ get_last_inode(void)
>  		ret = -xfrog_inumbers(&xfd, ireq);
>  		if (ret) {
>  			xfrog_perror(ret, "XFS_IOC_FSINUMBERS");
> +			exitcode = 1;
>  			goto out;
>  		}
>  
> @@ -744,6 +784,7 @@ inode_f(
>  			ret_next = 1;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&inode_cmd);
>  		}
>  	}
> @@ -761,12 +802,16 @@ inode_f(
>  	}
>  
>  	/* Extra junk? */
> -	if (optind < argc)
> +	if (optind < argc) {
> +		exitcode = 1;
>  		return command_usage(&inode_cmd);
> +	}
>  
>  	/* -n option requires an inode number */
> -	if (ret_next && userino == NULLFSINO)
> +	if (ret_next && userino == NULLFSINO) {
> +		exitcode = 1;
>  		return command_usage(&inode_cmd);
> +	}
>  
>  	if (userino == NULLFSINO) {
>  		/* We are finding last inode in use */
> diff --git a/io/parent.c b/io/parent.c
> index a78b45884be0..8f63607ffec2 100644
> --- a/io/parent.c
> +++ b/io/parent.c
> @@ -375,6 +375,7 @@ parent_f(int argc, char **argv)
>  	if (!fs) {
>  		fprintf(stderr, _("file argument, \"%s\", is not in a mounted XFS filesystem\n"),
>  			file->name);
> +		exitcode = 1;
>  		return 1;
>  	}
>  	mntpt = fs->fs_dir;
> diff --git a/io/pread.c b/io/pread.c
> index d52e21d965f0..971dbbc93363 100644
> --- a/io/pread.c
> +++ b/io/pread.c
> @@ -387,6 +387,7 @@ pread_f(
>  			tmp = cvtnum(fsblocksize, fssectsize, optarg);
>  			if (tmp < 0) {
>  				printf(_("non-numeric bsize -- %s\n"), optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			bsize = tmp;
> @@ -418,6 +419,7 @@ pread_f(
>  			if (!sp || sp == optarg) {
>  				printf(_("non-numeric vector count == %s\n"),
>  					optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
> @@ -426,21 +428,26 @@ pread_f(
>  			zeed = strtoul(optarg, &sp, 0);
>  			if (!sp || sp == optarg) {
>  				printf(_("non-numeric seed -- %s\n"), optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&pread_cmd);
>  		}
>  	}
> -	if (optind != argc - 2)
> +	if (optind != argc - 2) {
> +		exitcode = 1;
>  		return command_usage(&pread_cmd);
> +	}
>  
>  	offset = cvtnum(fsblocksize, fssectsize, argv[optind]);
>  	if (offset < 0 && (direction & (IO_RANDOM|IO_BACKWARD))) {
>  		eof = -1;	/* read from EOF */
>  	} else if (offset < 0) {
>  		printf(_("non-numeric length argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  	optind++;
> @@ -449,11 +456,14 @@ pread_f(
>  		eof = -1;	/* read to EOF */
>  	} else if (count < 0) {
>  		printf(_("non-numeric length argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> -	if (alloc_buffer(bsize, uflag, 0xabababab) < 0)
> +	if (alloc_buffer(bsize, uflag, 0xabababab) < 0) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	gettimeofday(&t1, NULL);
>  	switch (direction) {
> @@ -473,8 +483,11 @@ pread_f(
>  	default:
>  		ASSERT(0);
>  	}
> -	if (c < 0)
> +	if (c < 0) {
> +		exitcode = 1;
>  		return 0;
> +	}
> +
>  	if (qflag)
>  		return 0;
>  	gettimeofday(&t2, NULL);
> diff --git a/io/prealloc.c b/io/prealloc.c
> index 6d452354ee45..382e811919c6 100644
> --- a/io/prealloc.c
> +++ b/io/prealloc.c
> @@ -76,11 +76,14 @@ allocsp_f(
>  {
>  	xfs_flock64_t	segment;
>  
> -	if (!offset_length(argv[1], argv[2], &segment))
> +	if (!offset_length(argv[1], argv[2], &segment)) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (xfsctl(file->name, file->fd, XFS_IOC_ALLOCSP64, &segment) < 0) {
>  		perror("XFS_IOC_ALLOCSP64");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> @@ -93,11 +96,14 @@ freesp_f(
>  {
>  	xfs_flock64_t	segment;
>  
> -	if (!offset_length(argv[1], argv[2], &segment))
> +	if (!offset_length(argv[1], argv[2], &segment)) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (xfsctl(file->name, file->fd, XFS_IOC_FREESP64, &segment) < 0) {
>  		perror("XFS_IOC_FREESP64");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> @@ -110,11 +116,14 @@ resvsp_f(
>  {
>  	xfs_flock64_t	segment;
>  
> -	if (!offset_length(argv[1], argv[2], &segment))
> +	if (!offset_length(argv[1], argv[2], &segment)) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (xfsctl(file->name, file->fd, XFS_IOC_RESVSP64, &segment) < 0) {
>  		perror("XFS_IOC_RESVSP64");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> @@ -127,11 +136,14 @@ unresvsp_f(
>  {
>  	xfs_flock64_t	segment;
>  
> -	if (!offset_length(argv[1], argv[2], &segment))
> +	if (!offset_length(argv[1], argv[2], &segment)) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (xfsctl(file->name, file->fd, XFS_IOC_UNRESVSP64, &segment) < 0) {
>  		perror("XFS_IOC_UNRESVSP64");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> @@ -144,11 +156,14 @@ zero_f(
>  {
>  	xfs_flock64_t	segment;
>  
> -	if (!offset_length(argv[1], argv[2], &segment))
> +	if (!offset_length(argv[1], argv[2], &segment)) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (xfsctl(file->name, file->fd, XFS_IOC_ZERO_RANGE, &segment) < 0) {
>  		perror("XFS_IOC_ZERO_RANGE");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> @@ -204,18 +219,24 @@ fallocate_f(
>  			mode = FALLOC_FL_UNSHARE_RANGE;
>  			break;
>  		default:
> +			exitcode = 1;
>  			command_usage(&falloc_cmd);
>  		}
>  	}
> -        if (optind != argc - 2)
> +        if (optind != argc - 2) {
> +		exitcode = 1;
>                  return command_usage(&falloc_cmd);
> +	}
>  
> -	if (!offset_length(argv[optind], argv[optind+1], &segment))
> +	if (!offset_length(argv[optind], argv[optind+1], &segment)) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (fallocate(file->fd, mode,
>  			segment.l_start, segment.l_len)) {
>  		perror("fallocate");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> @@ -229,12 +250,15 @@ fpunch_f(
>  	xfs_flock64_t	segment;
>  	int		mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE;
>  
> -	if (!offset_length(argv[1], argv[2], &segment))
> +	if (!offset_length(argv[1], argv[2], &segment)) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (fallocate(file->fd, mode,
>  			segment.l_start, segment.l_len)) {
>  		perror("fallocate");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> @@ -248,12 +272,15 @@ fcollapse_f(
>  	xfs_flock64_t	segment;
>  	int		mode = FALLOC_FL_COLLAPSE_RANGE;
>  
> -	if (!offset_length(argv[1], argv[2], &segment))
> +	if (!offset_length(argv[1], argv[2], &segment)) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (fallocate(file->fd, mode,
>  			segment.l_start, segment.l_len)) {
>  		perror("fallocate");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> @@ -267,12 +294,15 @@ finsert_f(
>  	xfs_flock64_t	segment;
>  	int		mode = FALLOC_FL_INSERT_RANGE;
>  
> -	if (!offset_length(argv[1], argv[2], &segment))
> +	if (!offset_length(argv[1], argv[2], &segment)) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (fallocate(file->fd, mode,
>  			segment.l_start, segment.l_len)) {
>  		perror("fallocate");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> @@ -318,12 +348,15 @@ funshare_f(
>  	int		mode = FALLOC_FL_UNSHARE_RANGE;
>  	int		index = 1;
>  
> -	if (!offset_length(argv[index], argv[index + 1], &segment))
> +	if (!offset_length(argv[index], argv[index + 1], &segment)) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (fallocate(file->fd, mode,
>  			segment.l_start, segment.l_len)) {
>  		perror("fallocate");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> diff --git a/io/pwrite.c b/io/pwrite.c
> index 1c28612f3bd6..995f6ece8384 100644
> --- a/io/pwrite.c
> +++ b/io/pwrite.c
> @@ -295,6 +295,7 @@ pwrite_f(
>  			tmp = cvtnum(fsblocksize, fssectsize, optarg);
>  			if (tmp < 0) {
>  				printf(_("non-numeric bsize -- %s\n"), optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			bsize = tmp;
> @@ -333,6 +334,7 @@ pwrite_f(
>  			skip = cvtnum(fsblocksize, fssectsize, optarg);
>  			if (skip < 0) {
>  				printf(_("non-numeric skip -- %s\n"), optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
> @@ -340,6 +342,7 @@ pwrite_f(
>  			seed = strtoul(optarg, &sp, 0);
>  			if (!sp || sp == optarg) {
>  				printf(_("non-numeric seed -- %s\n"), optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
> @@ -355,6 +358,7 @@ pwrite_f(
>  			if (!sp || sp == optarg) {
>  				printf(_("non-numeric vector count == %s\n"),
>  					optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
> @@ -369,11 +373,13 @@ pwrite_f(
>  			zeed = strtoul(optarg, &sp, 0);
>  			if (!sp || sp == optarg) {
>  				printf(_("non-numeric seed -- %s\n"), optarg);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
>  		default:
>  			/* Handle ifdef'd-out options above */
> +			exitcode = 1;
>  			if (c != '?')
>  				printf(_("%s: command -%c not supported\n"), argv[0], c);
>  			else
> @@ -381,28 +387,38 @@ pwrite_f(
>  			return 0;
>  		}
>  	}
> -	if (((skip || dflag) && !infile) || (optind != argc - 2))
> +	if (((skip || dflag) && !infile) || (optind != argc - 2)) {
> +		exitcode = 1;
>  		return command_usage(&pwrite_cmd);
> -	if (infile && direction != IO_FORWARD)
> +	}
> +	if (infile && direction != IO_FORWARD) {
> +		exitcode = 1;
>  		return command_usage(&pwrite_cmd);
> +	}
>  	offset = cvtnum(fsblocksize, fssectsize, argv[optind]);
>  	if (offset < 0) {
>  		printf(_("non-numeric offset argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  	optind++;
>  	count = cvtnum(fsblocksize, fssectsize, argv[optind]);
>  	if (count < 0) {
>  		printf(_("non-numeric length argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> -	if (alloc_buffer(bsize, uflag, seed) < 0)
> +	if (alloc_buffer(bsize, uflag, seed) < 0) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	c = IO_READONLY | (dflag ? IO_DIRECT : 0);
> -	if (infile && ((fd = openfile(infile, NULL, c, 0, NULL)) < 0))
> +	if (infile && ((fd = openfile(infile, NULL, c, 0, NULL)) < 0)) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	gettimeofday(&t1, NULL);
>  	switch (direction) {
> @@ -425,20 +441,25 @@ pwrite_f(
>  		total = 0;
>  		ASSERT(0);
>  	}
> -	if (c < 0)
> +	if (c < 0) {
> +		exitcode = 1;
>  		goto done;
> +	}
>  	if (Wflag) {
>  		if (fsync(file->fd) < 0) {
>  			perror("fsync");
> +			exitcode = 1;
>  			goto done;
>  		}
>  	}
>  	if (wflag) {
>  		if (fdatasync(file->fd) < 0) {
>  			perror("fdatasync");
> +			exitcode = 1;
>  			goto done;
>  		}
>  	}
> +
>  	if (qflag)
>  		goto done;
>  	gettimeofday(&t2, NULL);
> diff --git a/io/readdir.c b/io/readdir.c
> index 2cb897736faf..8ac3f988ac2f 100644
> --- a/io/readdir.c
> +++ b/io/readdir.c
> @@ -151,18 +151,22 @@ readdir_f(
>  			verbose = 1;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&readdir_cmd);
>  		}
>  	}
>  
>  	dfd = dup(file->fd);
> -	if (dfd < 0)
> -		return -1;
> +	if (dfd < 0) {
> +		exitcode = 1;
> +		return 0;
> +	}
>  
>  	dir = fdopendir(dfd);
>  	if (!dir) {
>  		close(dfd);
> -		return -1;
> +		exitcode = 1;
> +		return 0;
>  	}
>  
>  	if (offset == -1) {
> diff --git a/io/reflink.c b/io/reflink.c
> index 26eb2e32442d..8e4f389949be 100644
> --- a/io/reflink.c
> +++ b/io/reflink.c
> @@ -63,6 +63,7 @@ dedupe_ioctl(
>  		error = ioctl(fd, XFS_IOC_FILE_EXTENT_SAME, args);
>  		if (error) {
>  			perror("XFS_IOC_FILE_EXTENT_SAME");
> +			exitcode = 1;
>  			goto done;
>  		}
>  		if (info->status < 0) {
> @@ -117,34 +118,42 @@ dedupe_f(
>  			quiet_flag = 1;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&dedupe_cmd);
>  		}
>  	}
> -	if (optind != argc - 4)
> +	if (optind != argc - 4) {
> +		exitcode = 1;
>  		return command_usage(&dedupe_cmd);
> +	}
>  	infile = argv[optind];
>  	optind++;
>  	soffset = cvtnum(fsblocksize, fssectsize, argv[optind]);
>  	if (soffset < 0) {
>  		printf(_("non-numeric src offset argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  	optind++;
>  	doffset = cvtnum(fsblocksize, fssectsize, argv[optind]);
>  	if (doffset < 0) {
>  		printf(_("non-numeric dest offset argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  	optind++;
>  	count = cvtnum(fsblocksize, fssectsize, argv[optind]);
>  	if (count < 0) {
>  		printf(_("non-positive length argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
>  	fd = openfile(infile, NULL, IO_READONLY, 0, NULL);
> -	if (fd < 0)
> +	if (fd < 0) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	gettimeofday(&t1, NULL);
>  	total = dedupe_ioctl(fd, soffset, doffset, count, &ops);
> @@ -238,11 +247,14 @@ reflink_f(
>  			quiet_flag = 1;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&reflink_cmd);
>  		}
>  	}
> -	if (optind != argc - 4 && optind != argc - 1)
> +	if (optind != argc - 4 && optind != argc - 1) {
> +		exitcode = 1;
>  		return command_usage(&reflink_cmd);
> +	}
>  	infile = argv[optind];
>  	optind++;
>  	if (optind == argc)
> @@ -250,29 +262,37 @@ reflink_f(
>  	soffset = cvtnum(fsblocksize, fssectsize, argv[optind]);
>  	if (soffset < 0) {
>  		printf(_("non-numeric src offset argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  	optind++;
>  	doffset = cvtnum(fsblocksize, fssectsize, argv[optind]);
>  	if (doffset < 0) {
>  		printf(_("non-numeric dest offset argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  	optind++;
>  	count = cvtnum(fsblocksize, fssectsize, argv[optind]);
>  	if (count < 0) {
>  		printf(_("non-positive length argument -- %s\n"), argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
>  clone_all:
>  	fd = openfile(infile, NULL, IO_READONLY, 0, NULL);
> -	if (fd < 0)
> +	if (fd < 0) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	gettimeofday(&t1, NULL);
>  	total = reflink_ioctl(fd, soffset, doffset, count, &ops);
> -	if (ops == 0 || quiet_flag)
> +	if (ops == 0)
> +		goto done;
> +
> +	if (quiet_flag)
>  		goto done;
>  	gettimeofday(&t2, NULL);
>  	t2 = tsub(t2, t1);
> diff --git a/io/resblks.c b/io/resblks.c
> index 0dbec0957658..a93b14ff48e5 100644
> --- a/io/resblks.c
> +++ b/io/resblks.c
> @@ -24,15 +24,18 @@ resblks_f(
>  		blks = cvtnum(file->geom.blocksize, file->geom.sectsize, argv[1]);
>  		if (blks < 0) {
>  			printf(_("non-numeric argument -- %s\n"), argv[1]);
> +			exitcode = 1;
>  			return 0;
>  		}
>  		res.resblks = blks;
>  		if (xfsctl(file->name, file->fd, XFS_IOC_SET_RESBLKS, &res) < 0) {
>  			perror("XFS_IOC_SET_RESBLKS");
> +			exitcode = 1;
>  			return 0;
>  		}
>  	} else if (xfsctl(file->name, file->fd, XFS_IOC_GET_RESBLKS, &res) < 0) {
>  		perror("XFS_IOC_GET_RESBLKS");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	printf(_("reserved blocks = %llu\n"),
> diff --git a/io/seek.c b/io/seek.c
> index 59ba1cfd1db3..6734ecb5691a 100644
> --- a/io/seek.c
> +++ b/io/seek.c
> @@ -120,15 +120,20 @@ seek_f(
>  			startflag = 1;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&seek_cmd);
>  		}
>  	}
> -	if (!(flag & (SEEK_DFLAG | SEEK_HFLAG)) || optind != argc - 1)
> +	if (!(flag & (SEEK_DFLAG | SEEK_HFLAG)) || optind != argc - 1) {
> +		exitcode = 1;
>  		return command_usage(&seek_cmd);
> +	}
>  
>  	start = offset = cvtnum(fsblocksize, fssectsize, argv[optind]);
> -	if (offset < 0)
> +	if (offset < 0) {
> +		exitcode = 1;
>  		return command_usage(&seek_cmd);
> +	}
>  
>  	/*
>  	 * check to see if the offset is a data or hole entry and
> @@ -174,9 +179,10 @@ found_hole:
>  	for (c = 0; flag; c++) {
>  		if (offset == -1) {
>  			/* print error or eof if the only entry */
> -			if (errno != ENXIO || c == 0 )
> +			if (errno != ENXIO || c == 0 ) {
>  				seek_output(startflag, seekinfo[current].name,
>  					    start, offset);
> +			}
>  			return 0;	/* stop on error or EOF */
>  		}
>  
> diff --git a/io/sendfile.c b/io/sendfile.c
> index 68e607f1b32b..ff012c81042d 100644
> --- a/io/sendfile.c
> +++ b/io/sendfile.c
> @@ -88,6 +88,7 @@ sendfile_f(
>  			if (fd < 0 || fd >= filecount) {
>  				printf(_("value %d is out of range (0-%d)\n"),
>  					fd, filecount-1);
> +				exitcode = 1;
>  				return 0;
>  			}
>  			break;
> @@ -95,22 +96,28 @@ sendfile_f(
>  			infile = optarg;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&sendfile_cmd);
>  		}
>  	}
> -	if (infile && fd != -1)
> +	if (infile && fd != -1) {
> +		exitcode = 1;
>  		return command_usage(&sendfile_cmd);
> +	}
>  
>  	if (!infile)
>  		fd = filetable[fd].fd;
> -	else if ((fd = openfile(infile, NULL, IO_READONLY, 0, NULL)) < 0)
> +	else if ((fd = openfile(infile, NULL, IO_READONLY, 0, NULL)) < 0) {
> +		exitcode = 1;
>  		return 0;
> +	}
>  
>  	if (optind == argc - 2) {
>  		offset = cvtnum(blocksize, sectsize, argv[optind]);
>  		if (offset < 0) {
>  			printf(_("non-numeric offset argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			goto done;
>  		}
>  		optind++;
> @@ -118,6 +125,7 @@ sendfile_f(
>  		if (count < 0) {
>  			printf(_("non-numeric length argument -- %s\n"),
>  				argv[optind]);
> +			exitcode = 1;
>  			goto done;
>  		}
>  	} else {
> @@ -125,6 +133,7 @@ sendfile_f(
>  
>  		if (fstat(fd, &stat) < 0) {
>  			perror("fstat");
> +			exitcode = 1;
>  			goto done;
>  		}
>  		count = stat.st_size;
> @@ -132,8 +141,11 @@ sendfile_f(
>  
>  	gettimeofday(&t1, NULL);
>  	c = send_buffer(offset, count, fd, &total);
> -	if (c < 0)
> +	if (c < 0) {
> +		exitcode = 1;
>  		goto done;
> +	}
> +
>  	if (qflag)
>  		goto done;
>  	gettimeofday(&t2, NULL);
> diff --git a/io/shutdown.c b/io/shutdown.c
> index 052d3def1d4a..3c29ea790643 100644
> --- a/io/shutdown.c
> +++ b/io/shutdown.c
> @@ -24,12 +24,14 @@ shutdown_f(
>  			flag = XFS_FSOP_GOING_FLAGS_LOGFLUSH;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&shutdown_cmd);
>  		}
>  	}
>  
>  	if ((xfsctl(file->name, file->fd, XFS_IOC_GOINGDOWN, &flag)) < 0) {
>  		perror("XFS_IOC_GOINGDOWN");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> diff --git a/io/stat.c b/io/stat.c
> index d125a0f78539..5f513e0ddfc8 100644
> --- a/io/stat.c
> +++ b/io/stat.c
> @@ -137,15 +137,19 @@ stat_f(
>  			verbose = 1;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&stat_cmd);
>  		}
>  	}
>  
> -	if (raw && verbose)
> +	if (raw && verbose) {
> +		exitcode = 1;
>  		return command_usage(&stat_cmd);
> +	}
>  
>  	if (fstat(file->fd, &st) < 0) {
>  		perror("fstat");
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> @@ -185,6 +189,7 @@ statfs_f(
>  	printf(_("fd.path = \"%s\"\n"), file->name);
>  	if (platform_fstatfs(file->fd, &st) < 0) {
>  		perror("fstatfs");
> +		exitcode = 1;
>  	} else {
>  		printf(_("statfs.f_bsize = %lld\n"), (long long) st.f_bsize);
>  		printf(_("statfs.f_blocks = %lld\n"), (long long) st.f_blocks);
> @@ -200,6 +205,7 @@ statfs_f(
>  	ret = -xfrog_geometry(file->fd, &fsgeo);
>  	if (ret) {
>  		xfrog_perror(ret, "XFS_IOC_FSGEOMETRY");
> +		exitcode = 1;
>  	} else {
>  		printf(_("geom.bsize = %u\n"), fsgeo.blocksize);
>  		printf(_("geom.agcount = %u\n"), fsgeo.agcount);
> @@ -216,6 +222,7 @@ statfs_f(
>  	}
>  	if ((xfsctl(file->name, file->fd, XFS_IOC_FSCOUNTS, &fscounts)) < 0) {
>  		perror("XFS_IOC_FSCOUNTS");
> +		exitcode = 1;
>  	} else {
>  		printf(_("counts.freedata = %llu\n"),
>  			(unsigned long long) fscounts.freedata);
> @@ -321,6 +328,7 @@ statx_f(
>  				if (!p || p == optarg) {
>  					printf(
>  				_("non-numeric mask -- %s\n"), optarg);
> +					exitcode = 1;
>  					return 0;
>  				}
>  			}
> @@ -340,6 +348,7 @@ statx_f(
>  			atflag |= AT_STATX_DONT_SYNC;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&statx_cmd);
>  		}
>  	}
> @@ -350,8 +359,10 @@ statx_f(
>  	memset(&stx, 0xbf, sizeof(stx));
>  	if (_statx(file->fd, "", atflag | AT_EMPTY_PATH, mask, &stx) < 0) {
>  		perror("statx");
> +		exitcode = 1;
>  		return 0;
>  	}
> +	exitcode = 0;
>  
>  	if (raw)
>  		return dump_raw_statx(&stx);
> diff --git a/io/sync_file_range.c b/io/sync_file_range.c
> index 30bbc93d55a1..94285c22f829 100644
> --- a/io/sync_file_range.c
> +++ b/io/sync_file_range.c
> @@ -46,6 +46,7 @@ sync_range_f(
>  			sync_mode = SYNC_FILE_RANGE_WRITE;
>  			break;
>  		default:
> +			exitcode = 1;
>  			return command_usage(&sync_range_cmd);
>  		}
>  	}
> @@ -54,13 +55,16 @@ sync_range_f(
>  	if (!sync_mode)
>  		sync_mode = SYNC_FILE_RANGE_WRITE;
>  
> -	if (optind != argc - 2)
> +	if (optind != argc - 2) {
> +		exitcode = 1;
>  		return command_usage(&sync_range_cmd);
> +	}
>  	init_cvtnum(&blocksize, &sectsize);
>  	offset = cvtnum(blocksize, sectsize, argv[optind]);
>  	if (offset < 0) {
>  		printf(_("non-numeric offset argument -- %s\n"),
>  			argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  	optind++;
> @@ -68,11 +72,13 @@ sync_range_f(
>  	if (length < 0) {
>  		printf(_("non-numeric length argument -- %s\n"),
>  			argv[optind]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
>  	if (sync_file_range(file->fd, offset, length, sync_mode) < 0) {
>  		perror("sync_file_range");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> diff --git a/io/truncate.c b/io/truncate.c
> index 5c3f54c4cdf8..1d049194d380 100644
> --- a/io/truncate.c
> +++ b/io/truncate.c
> @@ -23,11 +23,13 @@ truncate_f(
>  	offset = cvtnum(blocksize, sectsize, argv[1]);
>  	if (offset < 0) {
>  		printf(_("non-numeric truncate argument -- %s\n"), argv[1]);
> +		exitcode = 1;
>  		return 0;
>  	}
>  
>  	if (ftruncate(file->fd, offset) < 0) {
>  		perror("ftruncate");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	return 0;
> diff --git a/io/utimes.c b/io/utimes.c
> index 40117472e873..39127b84a90c 100644
> --- a/io/utimes.c
> +++ b/io/utimes.c
> @@ -36,17 +36,20 @@ utimes_f(
>  	result = timespec_from_string(argv[1], argv[2], &t[0]);
>  	if (result) {
>  		fprintf(stderr, "Bad value for atime\n");
> +		exitcode = 1;
>  		return 0;
>  	}
>  	result = timespec_from_string(argv[3], argv[4], &t[1]);
>  	if (result) {
>  		fprintf(stderr, "Bad value for mtime\n");
> +		exitcode = 1;
>  		return 0;
>  	}
>  
>  	/* Call futimens to update time. */
>  	if (futimens(file->fd, t)) {
>  		perror("futimens");
> +		exitcode = 1;
>  		return 0;
>  	}
>  
> -- 
> 2.26.0.rc2
> 




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux