Fix gcc and clang warnings

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
index a270e8c..2bf6a30 100644
--- a/debugfs/debugfs.c
+++ b/debugfs/debugfs.c
@@ -60,8 +60,9 @@
 			     io_manager *io_ptr)
 {
 	errcode_t retval = ENOMEM;
-	char *tdb_dir = NULL, *tdb_file = NULL;
-	char *dev_name, *tmp_name;
+	const char	*tdb_dir = NULL;
+	char		*tdb_file = NULL;
+	char		*dev_name, *tmp_name;
 
 	/* (re)open a specific undo file */
 	if (undo_file && undo_file[0] != 0) {
@@ -2103,7 +2104,6 @@
 	reset_getopt();
 	while ((c = getopt (argc, argv, "bex")) != EOF) {
 		if (mode || c == '?') {
-		print_usage:
 			com_err(argv[0], 0,
 				"Usage: inode_dump [-b]|[-e] <file>");
 			return;
@@ -2144,7 +2144,6 @@
 	case 'x':
 	case 'e':
 		if (size <= EXT2_GOOD_OLD_INODE_SIZE) {
-		no_extra_space:
 			com_err(argv[0], 0, "No extra space in inode");
 			goto err;
 		}
diff --git a/debugfs/debugfs.h b/debugfs/debugfs.h
index 3322d05..93f036d 100644
--- a/debugfs/debugfs.h
+++ b/debugfs/debugfs.h
@@ -137,6 +137,7 @@
 extern void do_link(int argc, char **argv);
 extern void do_undel(int argc, char **argv);
 extern void do_unlink(int argc, char **argv);
+extern void do_copy_inode(int argc, char *argv[]);
 extern void do_find_free_block(int argc, char **argv);
 extern void do_find_free_inode(int argc, char **argv);
 extern void do_stat(int argc, char **argv);
diff --git a/debugfs/xattrs.c b/debugfs/xattrs.c
index 6c32712..c29761e 100644
--- a/debugfs/xattrs.c
+++ b/debugfs/xattrs.c
@@ -406,7 +406,6 @@
 				   unsigned value_start)
 {
 	struct ext2_ext_attr_entry ent;
-	char *name;
 	unsigned int off = start;
 	unsigned int vstart;
 
@@ -417,7 +416,6 @@
 			break;
 		}
 		if ((off + sizeof(struct ext2_ext_attr_entry)) >= len) {
-		overrun:
 			fprintf(f, "xattr buffer overrun at %u (len = %u)\n",
 				off, len);
 			break;
@@ -456,7 +454,7 @@
 				   ent.e_value_size);
 		else {
 			fprintf(f, "<hexdump>\n");
-			do_byte_hexdump(f, (char *)(buf + vstart),
+			do_byte_hexdump(f, (unsigned char *)(buf + vstart),
 					ent.e_value_size);
 		}
 		fputc('\n', f);
diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h
index e930d81..cd5cba2 100644
--- a/e2fsck/e2fsck.h
+++ b/e2fsck/e2fsck.h
@@ -635,7 +635,8 @@
 			   const char *name, io_manager manager);
 extern int ext2_file_type(unsigned int mode);
 extern int write_all(int fd, char *buf, size_t count);
-void dump_mmp_msg(struct mmp_struct *mmp, const char *fmt, ...);
+void dump_mmp_msg(struct mmp_struct *mmp, const char *fmt, ...)
+	E2FSCK_ATTR((format(printf, 2, 3)));
 errcode_t e2fsck_mmp_update(ext2_filsys fs);
 
 extern void e2fsck_set_bitmap_type(ext2_filsys fs,
diff --git a/e2fsck/extents.c b/e2fsck/extents.c
index ef3146d..3073725 100644
--- a/e2fsck/extents.c
+++ b/e2fsck/extents.c
@@ -171,7 +171,7 @@
 					     list->count - 1;
 		blk64_t end = last->e_len + 1;
 
-		if (last->e_lblk + last->e_len == blockcnt &&
+		if (last->e_lblk + last->e_len == (__u64) blockcnt &&
 		    last->e_pblk + last->e_len == *blocknr &&
 		    end < (1ULL << 32)) {
 			last->e_len++;
diff --git a/e2fsck/jfs_user.h b/e2fsck/jfs_user.h
index d30b728..8289795 100644
--- a/e2fsck/jfs_user.h
+++ b/e2fsck/jfs_user.h
@@ -30,6 +30,14 @@
 #include "e2fsck.h"
 #endif
 
+#if __STDC_VERSION__ < 199901L
+# if __GNUC__ >= 2 || _MSC_VER >= 1300
+#  define __func__ __FUNCTION__
+# else
+#  define __func__ "<unknown>"
+# endif
+#endif
+
 struct buffer_head {
 #ifdef DEBUGFS
 	ext2_filsys	b_fs;
@@ -100,6 +108,9 @@
 extern lkmem_cache_t *do_cache_create(int len);
 extern void do_cache_destroy(lkmem_cache_t *cache);
 extern size_t journal_tag_bytes(journal_t *journal);
+extern __u32 __hash_32(__u32 val);
+extern __u32 hash_32(__u32 val, unsigned int bits);
+extern __u32 hash_64(__u64 val, unsigned int bits);
 #endif
 
 #if (defined(E2FSCK_INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
@@ -121,7 +132,6 @@
 #endif /* __STDC_VERSION__ >= 199901L */
 #endif /* E2FSCK_INCLUDE_INLINE_FUNCS */
 
-
 _INLINE_ lkmem_cache_t *do_cache_create(int len)
 {
 	lkmem_cache_t *new_cache;
@@ -201,7 +211,7 @@
 	do { if (!(assert)) {						\
 		printf ("Assertion failure in %s() at %s line %d: "	\
 			"\"%s\"\n",					\
-			__FUNCTION__, __FILE__, __LINE__, # assert);	\
+			__func__, __FILE__, __LINE__, # assert);	\
 		fatal_error(e2fsck_global_ctx, 0);			\
 	} } while (0)
 
diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index 8dfa82a..f1fa5d9 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -819,7 +819,6 @@
 	errcode_t		retval;
 	char			*tdb_dir;
 	int			enable;
-	int			full_map;
 
 	*ret = 0;
 
@@ -1173,8 +1172,8 @@
 	const char	*old_op;
 	int		imagic_fs, extent_fs, inlinedata_fs;
 	int		low_dtime_check = 1;
-	int		inode_size = EXT2_INODE_SIZE(fs->super);
-	int		bufsize;
+	unsigned int	inode_size = EXT2_INODE_SIZE(fs->super);
+	unsigned int	bufsize;
 	int		failed_csum = 0;
 	ext2_ino_t	ino_threshold = 0;
 	dgrp_t		ra_group = 0;
@@ -2295,7 +2294,8 @@
 	if (ext2fs_test_block_bitmap_range2(ctx->block_found_map, block, num))
 		ext2fs_mark_block_bitmap_range2(ctx->block_found_map, block, num);
 	else {
-		int i;
+		unsigned int i;
+
 		for (i = 0; i < num; i += EXT2FS_CLUSTER_RATIO(ctx->fs))
 			mark_block_used(ctx, block + i);
 	}
@@ -2574,7 +2574,7 @@
 			return 0;
 	}
 
-	if (quota_blocks != EXT2FS_C2B(fs, 1)) {
+	if (quota_blocks != EXT2FS_C2B(fs, 1U)) {
 		if (!ctx->ea_block_quota_blocks) {
 			pctx->errcode = ea_refcount_create(0,
 						&ctx->ea_block_quota_blocks);
diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c
index c6aff71..b92eec1 100644
--- a/e2fsck/pass2.c
+++ b/e2fsck/pass2.c
@@ -129,7 +129,7 @@
 #endif
 	struct check_dir_struct cd;
 	struct dx_dir_info	*dx_dir;
-	struct dx_dirblock_info	*dx_db, *dx_parent;
+	struct dx_dirblock_info	*dx_db;
 	int			b;
 	int			i, depth;
 	problem_t		code;
diff --git a/e2fsck/quota.c b/e2fsck/quota.c
index b0f9af6..3d48284 100644
--- a/e2fsck/quota.c
+++ b/e2fsck/quota.c
@@ -92,7 +92,6 @@
 	struct problem_context	pctx;
 	ext2_filsys		fs = ctx->fs;
 	enum quota_type qtype;
-	ext2_ino_t quota_ino;
 
 	clear_problem_context(&pctx);
 
diff --git a/e2fsck/rehash.c b/e2fsck/rehash.c
index 486e1f2..7c4ab08 100644
--- a/e2fsck/rehash.c
+++ b/e2fsck/rehash.c
@@ -653,7 +653,6 @@
 	struct ext2_dx_entry		*root, *int_ent, *dx_ent = 0;
 	struct ext2_dx_countlimit	*root_limit, *int_limit, *limit;
 	errcode_t			retval;
-	char				* block_start;
 	int				i, c1, c2, c3, nblks;
 	int				limit_offset, int_offset, root_offset;
 
diff --git a/e2fsck/unix.c b/e2fsck/unix.c
index 61396f7..42eef75 100644
--- a/e2fsck/unix.c
+++ b/e2fsck/unix.c
@@ -287,7 +287,7 @@
 {
 	FILE	*f;
 	DIR	*d;
-	char	tmp[80], tmp2[80], fname[80];
+	char	tmp[80], tmp2[80], fname[NAME_MAX+30];
 	unsigned int	acflag;
 	struct dirent*	de;
 
@@ -311,7 +311,8 @@
 		while ((de=readdir(d)) != NULL) {
 			if (!strncmp(".", de->d_name, 1))
 				continue;
-			snprintf(fname, 80, "/proc/acpi/ac_adapter/%s/state",
+			snprintf(fname, sizeof(fname),
+				 "/proc/acpi/ac_adapter/%s/state",
 				 de->d_name);
 			f = fopen(fname, "r");
 			if (!f)
@@ -934,6 +935,7 @@
 			break;
 		case 'L':
 			replace_bad_blocks++;
+			/* fall through */
 		case 'l':
 			if (bad_blocks_file)
 				free(bad_blocks_file);
diff --git a/e2fsck/util.c b/e2fsck/util.c
index 5793b65..db6a1cc 100644
--- a/e2fsck/util.c
+++ b/e2fsck/util.c
@@ -204,9 +204,10 @@
 	static int	yes_answers;
 
 #ifdef HAVE_TERMIOS_H
-	struct termios	termios = {0, }, tmp;
+	struct termios	termios, tmp;
 
-	tcgetattr (0, &termios);
+	if (tcgetattr (0, &termios) < 0)
+		memset(&termios, 0, sizeof(termios));
 	tmp = termios;
 	tmp.c_lflag &= ~(ICANON | ECHO);
 	tmp.c_cc[VMIN] = 1;
diff --git a/lib/e2p/crypto_mode.c b/lib/e2p/crypto_mode.c
index bc553fd..4933016 100644
--- a/lib/e2p/crypto_mode.c
+++ b/lib/e2p/crypto_mode.c
@@ -20,7 +20,7 @@
 #include "e2p.h"
 
 struct mode {
-	unsigned int	num;
+	int		num;
 	const char	*string;
 };
 
diff --git a/lib/e2p/e2p.h b/lib/e2p/e2p.h
index e96cdec..d70b59a 100644
--- a/lib/e2p/e2p.h
+++ b/lib/e2p/e2p.h
@@ -77,3 +77,6 @@
 int e2p_string2os(char *str);
 
 unsigned int e2p_percent(int percent, unsigned int base);
+
+const char *e2p_encmode2string(int num);
+int e2p_string2encmode(char *string);
diff --git a/lib/e2p/ljs.c b/lib/e2p/ljs.c
index 2db700b..0b1bead 100644
--- a/lib/e2p/ljs.c
+++ b/lib/e2p/ljs.c
@@ -52,8 +52,8 @@
 	journal_superblock_t *jsb = (journal_superblock_t *) journal_sb_buf;
 	__u32 *mask_ptr, mask, m;
 	unsigned int size;
-	int i, j, printed = 0;
-	unsigned int nr_users;
+	int j, printed = 0;
+	unsigned int i, nr_users;
 
 	fprintf(f, "%s", "Journal features:        ");
 	for (i=0, mask_ptr=&jsb->s_feature_compat; i <3; i++,mask_ptr++) {
@@ -75,7 +75,7 @@
 	else
 		fprintf(f, "%uM\n", size >> 10);
 	nr_users = (unsigned int) ntohl(jsb->s_nr_users);
-	if (exp_block_size != ntohl(jsb->s_blocksize))
+	if (exp_block_size != (int) ntohl(jsb->s_blocksize))
 		fprintf(f, "Journal block size:       %u\n",
 			(unsigned int)ntohl(jsb->s_blocksize));
 	fprintf(f, "Journal length:           %u\n",
diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h
index eb6c092..3d4afac 100644
--- a/lib/ext2fs/ext2fs.h
+++ b/lib/ext2fs/ext2fs.h
@@ -1738,6 +1738,7 @@
 extern blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group);
 extern blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
 				      struct ext2_inode *inode);
+extern int ext2fs_htree_intnode_maxrecs(ext2_filsys fs, int blocks);
 extern unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b);
 extern __u64 ext2fs_div64_ceil(__u64 a, __u64 b);
 extern int ext2fs_dirent_name_len(const struct ext2_dir_entry *entry);
@@ -1969,18 +1970,6 @@
 	return (blk_t) ext2fs_inode_data_blocks2(fs, inode);
 }
 
-/* htree levels for ext4 */
-#define EXT4_HTREE_LEVEL_COMPAT 2
-#define EXT4_HTREE_LEVEL	3
-
-static inline unsigned int ext2_dir_htree_level(ext2_filsys fs)
-{
-	if (ext2fs_has_feature_largedir(fs->super))
-		return EXT4_HTREE_LEVEL;
-
-	return EXT4_HTREE_LEVEL_COMPAT;
-}
-
 _INLINE_ int ext2fs_htree_intnode_maxrecs(ext2_filsys fs, int blocks)
 {
 	return blocks * ((fs->blocksize - 8) / sizeof(struct ext2_dx_entry));
@@ -2039,6 +2028,18 @@
 #undef _INLINE_
 #endif
 
+/* htree levels for ext4 */
+#define EXT4_HTREE_LEVEL_COMPAT 2
+#define EXT4_HTREE_LEVEL	3
+
+static inline unsigned int ext2_dir_htree_level(ext2_filsys fs)
+{
+	if (ext2fs_has_feature_largedir(fs->super))
+		return EXT4_HTREE_LEVEL;
+
+	return EXT4_HTREE_LEVEL_COMPAT;
+}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/ext2fs/ext4_acl.h b/lib/ext2fs/ext4_acl.h
index 69ff79d..1f5245d 100644
--- a/lib/ext2fs/ext4_acl.h
+++ b/lib/ext2fs/ext4_acl.h
@@ -50,6 +50,9 @@
 
 typedef struct {
         __le32                  a_version;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
         posix_acl_xattr_entry   a_entries[0];
+#pragma GCC diagnostic pop
 } posix_acl_xattr_header;
 
diff --git a/lib/ext2fs/ext_attr.c b/lib/ext2fs/ext_attr.c
index 81b067a..77a0362 100644
--- a/lib/ext2fs/ext_attr.c
+++ b/lib/ext2fs/ext_attr.c
@@ -357,13 +357,13 @@
 	return NULL;
 }
 
-static int find_ea_index(const char *fullname, char **name, int *index)
+static int find_ea_index(const char *fullname, const char **name, int *index)
 {
 	struct ea_name_index *e;
 
 	for (e = ea_names; e->name; e++) {
 		if (strncmp(fullname, e->name, strlen(e->name)) == 0) {
-			*name = (char *)fullname + strlen(e->name);
+			*name = fullname + strlen(e->name);
 			*index = e->index;
 			return 1;
 		}
@@ -525,11 +525,13 @@
 static errcode_t convert_posix_acl_to_disk_buffer(const void *value, size_t size,
 						  void *out_buf, size_t *size_out)
 {
-	posix_acl_xattr_header *header = (posix_acl_xattr_header*) value;
-	posix_acl_xattr_entry *entry = (posix_acl_xattr_entry *)(header+1), *end;
+	const posix_acl_xattr_header *header =
+		(const posix_acl_xattr_header*) value;
+	const posix_acl_xattr_entry *end, *entry =
+		(const posix_acl_xattr_entry *)(header+1);
 	ext4_acl_header *ext_acl;
 	size_t s;
-	void *e;
+	char *e;
 
 	int count;
 
@@ -579,7 +581,7 @@
 {
 	posix_acl_xattr_header *header;
 	posix_acl_xattr_entry *entry;
-	ext4_acl_header *ext_acl = (ext4_acl_header *) value;
+	const ext4_acl_header *ext_acl = (const ext4_acl_header *) value;
 	errcode_t err;
 	const char *cp;
 	char *out;
@@ -597,7 +599,7 @@
 	header->a_version = ext2fs_cpu_to_le32(POSIX_ACL_XATTR_VERSION);
 	entry = (posix_acl_xattr_entry *) (out + sizeof(posix_acl_xattr_header));
 
-	cp = value + sizeof(ext4_acl_header);
+	cp = (const char *) value + sizeof(ext4_acl_header);
 	size -= sizeof(ext4_acl_header);
 
 	while (size > 0) {
@@ -640,9 +642,9 @@
 {
 	struct ext2_xattr *x;
 	struct ext2_ext_attr_entry *e = entries_start;
-	void *end = entries_start + storage_size;
-	char *shortname;
-	unsigned int entry_size, value_size;
+	char *end = (char *) entries_start + storage_size;
+	const char *shortname;
+	unsigned int value_size;
 	int idx, ret;
 	errcode_t err;
 
@@ -652,10 +654,6 @@
 		shortname = x->name;
 		ret = find_ea_index(x->name, &shortname, &idx);
 
-		/* Calculate entry and value size */
-		entry_size = (sizeof(*e) + strlen(shortname) +
-			      EXT2_EXT_ATTR_PAD - 1) &
-			     ~(EXT2_EXT_ATTR_PAD - 1);
 		value_size = ((x->value_len + EXT2_EXT_ATTR_PAD - 1) /
 			      EXT2_EXT_ATTR_PAD) * EXT2_EXT_ATTR_PAD;
 
@@ -672,8 +670,8 @@
 			e->e_value_offs = 0;
 		} else {
 			end -= value_size;
-			e->e_value_offs = end - entries_start +
-							value_offset_correction;
+			e->e_value_offs = end - (char *) entries_start +
+						value_offset_correction;
 			memcpy(end, x->value, e->e_value_size);
 		}
 
@@ -695,7 +693,7 @@
 errcode_t ext2fs_xattrs_write(struct ext2_xattr_handle *handle)
 {
 	ext2_filsys fs = handle->fs;
-	const int inode_size = EXT2_INODE_SIZE(fs->super);
+	const unsigned int inode_size = EXT2_INODE_SIZE(fs->super);
 	struct ext2_inode_large *inode;
 	char *start, *block_buf = NULL;
 	struct ext2_ext_attr_header *header;
@@ -977,7 +975,7 @@
 static void xattrs_free_keys(struct ext2_xattr_handle *h)
 {
 	struct ext2_xattr *a = h->attrs;
-	size_t i;
+	int i;
 
 	for (i = 0; i < h->capacity; i++) {
 		if (a[i].name)
@@ -1362,7 +1360,7 @@
 {
 	struct ext2_xattr *x;
 	int i;
-	char *shortname, *x_shortname;
+	const char *shortname, *x_shortname;
 	int name_idx, x_name_idx;
 	int shortname_len, x_shortname_len;
 
@@ -1398,7 +1396,7 @@
 	int add_to_ibody;
 	int needed;
 	int name_len, name_idx;
-	char *shortname;
+	const char *shortname;
 	int new_idx;
 	int ret;
 
@@ -1504,7 +1502,7 @@
 {
 	int total = 0;
 	struct ext2_xattr *x;
-	char *shortname;
+	const char *shortname;
 	int i, len, name_idx;
 
 	for (i = 0, x = attrs; i < count; i++, x++) {
diff --git a/lib/ext2fs/fiemap.h b/lib/ext2fs/fiemap.h
index a331bc1..5c851b2 100644
--- a/lib/ext2fs/fiemap.h
+++ b/lib/ext2fs/fiemap.h
@@ -31,7 +31,10 @@
 	__u32 fm_mapped_extents;/* number of extents that were mapped (out) */
 	__u32 fm_extent_count;  /* size of fm_extents array (in) */
 	__u32 fm_reserved;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
 	struct fiemap_extent fm_extents[0]; /* array of mapped extents (out) */
+#pragma GCC diagnostic pop
 };
 
 #if defined(__linux__) && !defined(FS_IOC_FIEMAP)
diff --git a/lib/ext2fs/hashmap.h b/lib/ext2fs/hashmap.h
index 7127186..be1e8a7 100644
--- a/lib/ext2fs/hashmap.h
+++ b/lib/ext2fs/hashmap.h
@@ -17,7 +17,10 @@
 		struct ext2fs_hashmap_entry *next;
 		struct ext2fs_hashmap_entry *list_next;
 		struct ext2fs_hashmap_entry *list_prev;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
 	} *entries[0];
+#pragma GCC diagnostic pop
 };
 
 struct ext2fs_hashmap *ext2fs_hashmap_create(
diff --git a/lib/ext2fs/jfs_compat.h b/lib/ext2fs/jfs_compat.h
index 9137367..f1a3f96 100644
--- a/lib/ext2fs/jfs_compat.h
+++ b/lib/ext2fs/jfs_compat.h
@@ -87,14 +87,6 @@
 	__u32			j_csum_seed;
 };
 
-#define J_ASSERT(assert)						\
-	do { if (!(assert)) {						\
-		printf ("Assertion failure in %s() at %s line %d: "	\
-			"\"%s\"\n",					\
-			__FUNCTION__, __FILE__, __LINE__, # assert);	\
-		fatal_error(e2fsck_global_ctx, 0);			\
-	} } while (0)
-
 #define is_journal_abort(x) 0
 
 #define BUFFER_TRACE(bh, info)	do {} while (0)
diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c
index 0c8ad24..85d73e2 100644
--- a/lib/ext2fs/openfs.c
+++ b/lib/ext2fs/openfs.c
@@ -127,7 +127,7 @@
 	blk64_t		group_block, blk;
 	char		*dest, *cp;
 	int		group_zero_adjust = 0;
-	int		inode_size;
+	unsigned int	inode_size;
 	__u64		groups_cnt;
 #ifdef WORDS_BIGENDIAN
 	unsigned int	groups_per_block;
diff --git a/lib/ext2fs/unix_io.c b/lib/ext2fs/unix_io.c
index c6b058d..53fbd28 100644
--- a/lib/ext2fs/unix_io.c
+++ b/lib/ext2fs/unix_io.c
@@ -349,7 +349,7 @@
 					retval = errno;
 					goto error_out;
 				}
-				memset(data->bounce + actual, 0,
+				memset((char *) data->bounce + actual, 0,
 				       channel->block_size - actual);
 			}
 		}
diff --git a/lib/support/mkquota.c b/lib/support/mkquota.c
index d136a91..0b9e766 100644
--- a/lib/support/mkquota.c
+++ b/lib/support/mkquota.c
@@ -268,6 +268,7 @@
 			inode->i_extra_isize;
 		if (inode_includes(inode_size, i_projid))
 			return inode_projid(*inode);
+		return 0;
 	default:
 		return 0;
 	}
@@ -567,7 +568,8 @@
  * Read all dquots from quota file into memory
  */
 static errcode_t quota_read_all_dquots(struct quota_handle *qh,
-                                       quota_ctx_t qctx, int update_limits)
+                                       quota_ctx_t qctx,
+				       int update_limits EXT2FS_ATTR((unused)))
 {
 	struct scan_dquots_data scan_data;
 
diff --git a/misc/e2freefrag.c b/misc/e2freefrag.c
index 09fae5c..268fac9 100644
--- a/misc/e2freefrag.c
+++ b/misc/e2freefrag.c
@@ -173,7 +173,7 @@
 	int mount_flags;
 	int fd;
 	int ret;
-	int i;
+	unsigned int i;
 
 	/* Try to open the mountpoint for a live query. */
 	retval = ext2fs_check_mount_point(fs->device_name, &mount_flags,
@@ -182,7 +182,7 @@
 		com_err(fs->device_name, retval, "while checking mount status");
 		return 0;
 	}
-	if (!mount_flags & EXT2_MF_MOUNTED)
+	if (!(mount_flags & EXT2_MF_MOUNTED))
 		return 0;
 	fd = open(mntpoint, O_RDONLY);
 	if (fd < 0) {
diff --git a/misc/e2undo.c b/misc/e2undo.c
index 6443ca2..0593738 100644
--- a/misc/e2undo.c
+++ b/misc/e2undo.c
@@ -81,8 +81,10 @@
 	__le32 magic;		/* KEYBLOCK_MAGIC number */
 	__le32 crc;		/* block checksum */
 	__le64 reserved;	/* zero */
-
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
 	struct undo_key keys[0];	/* keys, which come immediately after */
+#pragma GCC diagnostic pop
 };
 
 struct undo_key_info {
diff --git a/misc/e4crypt.c b/misc/e4crypt.c
index c1ec9ab..759a082 100644
--- a/misc/e4crypt.c
+++ b/misc/e4crypt.c
@@ -676,8 +676,10 @@
 			options |= OPT_QUIET;
 			break;
 		default:
-			fprintf(stderr, "Unrecognized option: %c\n", opt);
 		case '?':
+			if (opt != '?')
+				fprintf(stderr, "Unrecognized option: %c\n",
+					opt);
 			fputs("USAGE:\n  ", stderr);
 			fputs(cmd->cmd_help, stderr);
 			exit(1);
diff --git a/misc/e4defrag.c b/misc/e4defrag.c
index d63343e..5ac251d 100644
--- a/misc/e4defrag.c
+++ b/misc/e4defrag.c
@@ -1851,6 +1851,7 @@
 				/* "e4defrag mount_point_dir/else_dir" */
 				memset(lost_found_dir, 0, PATH_MAX + 1);
 			}
+			/* fall through */
 		case DEVNAME:
 			if (arg_type == DEVNAME) {
 				strncpy(lost_found_dir, dir_name,
diff --git a/misc/filefrag.c b/misc/filefrag.c
index c8444d7..7f1c5bf 100644
--- a/misc/filefrag.c
+++ b/misc/filefrag.c
@@ -208,7 +208,7 @@
 	__u64 buf[2048];	/* __u64 for proper field alignment */
 	struct fiemap *fiemap = (struct fiemap *)buf;
 	struct fiemap_extent *fm_ext = &fiemap->fm_extents[0];
-	struct fiemap_extent fm_last = {0};
+	struct fiemap_extent fm_last;
 	int count = (sizeof(buf) - sizeof(*fiemap)) /
 			sizeof(struct fiemap_extent);
 	unsigned long long expected = 0;
@@ -221,6 +221,7 @@
 	int rc;
 
 	memset(fiemap, 0, sizeof(struct fiemap));
+	memset(&fm_last, 0, sizeof(fm_last));
 
 	if (sync_file)
 		flags |= FIEMAP_FLAG_SYNC;
@@ -534,15 +535,17 @@
 				char *end;
 				blocksize = strtoul(optarg, &end, 0);
 				if (end) {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
 					switch (end[0]) {
 					case 'g':
 					case 'G':
 						blocksize *= 1024;
-						/* no break */
+						/* fall through */
 					case 'm':
 					case 'M':
 						blocksize *= 1024;
-						/* no break */
+						/* fall through */
 					case 'k':
 					case 'K':
 						blocksize *= 1024;
@@ -550,6 +553,7 @@
 					default:
 						break;
 					}
+#pragma GCC diagnostic pop
 				}
 			} else { /* Allow -b without argument for compat. Remove
 				  * this eventually so "-b {blocksize}" works */
diff --git a/misc/fsck.c b/misc/fsck.c
index cd23537..4efe10e 100644
--- a/misc/fsck.c
+++ b/misc/fsck.c
@@ -408,9 +408,12 @@
   tpl = (strncmp(type, "fsck.", 5) ? "%s/fsck.%s" : "%s/%s");
 
   for(s = strtok(p, ":"); s; s = strtok(NULL, ":")) {
-	if (snprintf(prog, sizeof(prog), tpl, s, type) >= sizeof(prog))
-		continue;
-	if (stat(prog, &st) == 0) break;
+	  int len = snprintf(prog, sizeof(prog), tpl, s, type);
+
+	  if ((len < 0) || (len >= (int) sizeof(prog)))
+		  continue;
+	  if (stat(prog, &st) == 0)
+		  break;
   }
   free(p);
   return(s ? prog : NULL);
@@ -437,11 +440,12 @@
 		   int interactive)
 {
 	char *s, *argv[80], prog[256];
-	int  argc, i;
+	int  argc, i, len;
 	struct fsck_instance *inst, *p;
 	pid_t	pid;
 
-	if (snprintf(prog, sizeof(prog), "fsck.%s", type) >= sizeof(prog))
+	len = snprintf(prog, sizeof(prog), "fsck.%s", type);
+	if ((len < 0) || (len >= (int) sizeof(prog)))
 		return EINVAL;
 
 	inst = malloc(sizeof(struct fsck_instance));
diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c
index 9feafd7..056d34e 100644
--- a/misc/fuse2fs.c
+++ b/misc/fuse2fs.c
@@ -118,7 +118,10 @@
 
 typedef struct {
 	u_int32_t	a_version;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
 	acl_ea_entry	a_entries[0];
+#pragma GCC diagnostic pop
 } acl_ea_header;
 
 static inline size_t acl_ea_size(int count)
diff --git a/misc/mk_hugefiles.c b/misc/mk_hugefiles.c
index fe35a4b..76693fa 100644
--- a/misc/mk_hugefiles.c
+++ b/misc/mk_hugefiles.c
@@ -68,7 +68,7 @@
 static char *fn_numbuf;
 int zero_hugefile = 1;
 
-#define SYSFS_PATH_LEN 256
+#define SYSFS_PATH_LEN 300
 typedef char sysfs_path_t[SYSFS_PATH_LEN];
 
 #ifndef HAVE_SNPRINTF
diff --git a/misc/mklost+found.c b/misc/mklost+found.c
index c061357..1431187 100644
--- a/misc/mklost+found.c
+++ b/misc/mklost+found.c
@@ -31,8 +31,8 @@
 
 int main (int argc, char ** argv)
 {
-	char name [EXT2_NAME_LEN];
-	char path [sizeof (LPF) + 1 + 256];
+	char name[EXT2_NAME_LEN + 2];
+	char path[sizeof (LPF) + 1 + 256];
 	struct stat st;
 	int i, j;
 	int d;
diff --git a/misc/tune2fs.c b/misc/tune2fs.c
index 93160c9..f1ddfe4 100644
--- a/misc/tune2fs.c
+++ b/misc/tune2fs.c
@@ -753,7 +753,8 @@
 	if (retval)
 		fatal_err(retval, "close ea_inode");
 
-	hash = ext2fs_crc32c_le(ctx->fs->csum_seed, ctx->ea_buf, inode->i_size);
+	hash = ext2fs_crc32c_le(ctx->fs->csum_seed,
+				(unsigned char *) ctx->ea_buf, inode->i_size);
 	ext2fs_set_ea_inode_hash(inode, hash);
 }
 
@@ -802,7 +803,7 @@
 }
 
 static void update_block_xattr_hashes(struct rewrite_context *ctx,
-				      void *block_buf)
+				      char *block_buf)
 {
 	struct ext2_ext_attr_header *header;
 	struct ext2_ext_attr_entry *start, *end;
diff --git a/resize/resize2fs.c b/resize/resize2fs.c
index 7afc134..fe52a61 100644
--- a/resize/resize2fs.c
+++ b/resize/resize2fs.c
@@ -1991,7 +1991,6 @@
 {
 	int modified = 0;
 	ext2_ino_t new_ino;
-	errcode_t retval;
 
 	while (entry < end && !EXT2_EXT_IS_LAST_ENTRY(entry)) {
 		if (entry->e_value_inum > last_ino) {
@@ -2061,10 +2060,12 @@
 	int		inode_size = EXT2_INODE_SIZE(fs->super);
 	blk64_t		blk;
 	int		modified;
-	struct blk_cache blk_cache = { 0 };
+	struct blk_cache blk_cache;
 	struct ext2_ext_attr_header *header;
 	errcode_t		retval;
 
+	memset(&blk_cache, 0, sizeof(blk_cache));
+
 	header = (struct ext2_ext_attr_header *)block_buf;
 
 	retval = ext2fs_open_inode_scan(fs, 0, &scan);
diff --git a/tests/progs/test_icount.c b/tests/progs/test_icount.c
index d028a60..0a0f306 100644
--- a/tests/progs/test_icount.c
+++ b/tests/progs/test_icount.c
@@ -93,6 +93,10 @@
 
 void do_free_icount(int argc, char **argv)
 {
+	if (argc != 1) {
+		printf("Usage: free_icount\n");
+		return;
+	}
 	if (check_icount(argv[0]))
 		return;
 
@@ -206,6 +210,10 @@
 	ext2_ino_t	i;
 	__u16		count;
 
+	if (argc != 1) {
+		printf("Usage: dump\n");
+		return;
+	}
 	if (check_icount(argv[0]))
 		return;
 	for (i=1; i <= test_fs->super->s_inodes_count; i++) {
@@ -224,6 +232,10 @@
 {
 	errcode_t	retval;
 
+	if (argc != 1) {
+		printf("Usage: validate\n");
+		return;
+	}
 	if (check_icount(argv[0]))
 		return;
 	retval = ext2fs_icount_validate(test_icount, stdout);
@@ -238,6 +250,10 @@
 {
 	ext2_ino_t	size;
 
+	if (argc != 1) {
+		printf("Usage: get_size\n");
+		return;
+	}
 	if (check_icount(argv[0]))
 		return;
 	size = ext2fs_get_icount_size(test_icount);