Merge branch 'debian/master' into debian/backports
diff --git a/Android.bp b/Android.bp
index 1e6aa1a..46f6334 100644
--- a/Android.bp
+++ b/Android.bp
@@ -62,6 +62,10 @@
                 "libdl",
             ],
         },
+        darwin: {
+            // This matches what the upstream CI uses
+            cflags: ["-Wno-error=deprecated-declarations"],
+        },
         windows: {
             include_dirs: ["external/e2fsprogs/include/mingw"],
         },
diff --git a/README b/README
index 1bc0521..8510c84 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-	This is the new version (1.47.1) of the second extended file
+	This is the new version (1.47.2) of the second extended file
 system management programs.
 
 	From time to time, I release new versions of e2fsprogs, to fix
diff --git a/configure b/configure
index 2b712e5..f9a7aa4 100755
--- a/configure
+++ b/configure
@@ -13018,6 +13018,11 @@
 else
   echo "#undef HAVE_SYS_TYPES_H" >> public_config.h
 fi
+if grep SIZEOF_TIME_T confdefs.h > tmp_config.$$; then
+  uniq tmp_config.$$ >> public_config.h
+else
+  echo "#undef SIZEOF_TIME_T" >> public_config.h
+fi
 if grep WORDS_BIGENDIAN confdefs.h > tmp_config.$$; then
   uniq tmp_config.$$ >> public_config.h
 else
@@ -13745,6 +13750,9 @@
 	try_libarchive=""
 	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Disabling libarchive support" >&5
 printf "%s\n" "Disabling libarchive support" >&6; }
+
+printf "%s\n" "#define CONFIG_DISABLE_LIBARCHIVE 1" >>confdefs.h
+
 elif test "$withval" = "direct"
 then
 	try_libarchive="direct"
@@ -15646,9 +15654,6 @@
 
 
 fi
-if test "$enable_fuzzer" = "yes" && test "$have_fuzzer" != "yes"; then
-	as_fn_error $? "Fuzzing not supported by compiler." "$LINENO" 5
-fi
 
 LINUX_CMT="#"
 CYGWIN_CMT="#"
diff --git a/configure.ac b/configure.ac
index e00e8d0..1f67604 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1156,6 +1156,11 @@
 else
   echo "#undef HAVE_SYS_TYPES_H" >> public_config.h
 fi
+if grep SIZEOF_TIME_T confdefs.h > tmp_config.$$; then
+  uniq tmp_config.$$ >> public_config.h
+else
+  echo "#undef SIZEOF_TIME_T" >> public_config.h
+fi
 if grep WORDS_BIGENDIAN confdefs.h > tmp_config.$$; then
   uniq tmp_config.$$ >> public_config.h
 else
@@ -1307,6 +1312,8 @@
 then
 	try_libarchive=""
 	AC_MSG_RESULT([Disabling libarchive support])
+	AC_DEFINE(CONFIG_DISABLE_LIBARCHIVE, 1,
+		[Define to 1 to completely disable libarchive])
 elif test "$withval" = "direct"
 then
 	try_libarchive="direct"
@@ -1664,9 +1671,6 @@
 	AC_SUBST(fuzzer_cflags)
 	AC_SUBST(fuzzer_ldflags)
 fi
-if test "$enable_fuzzer" = "yes" && test "$have_fuzzer" != "yes"; then
-	AC_MSG_ERROR([Fuzzing not supported by compiler.])
-fi
 AC_SUBST(FUZZING_CMT)
 dnl
 dnl OS-specific uncomment control
diff --git a/contrib/android/Android.bp b/contrib/android/Android.bp
index 6c9dd5c..650824c 100644
--- a/contrib/android/Android.bp
+++ b/contrib/android/Android.bp
@@ -16,6 +16,7 @@
     name: "e2fsdroid",
     host_supported: true,
     recovery_available: true,
+    vendor_available: true,
     defaults: ["e2fsprogs-defaults"],
 
     srcs: [
diff --git a/contrib/android/e2fsdroid.c b/contrib/android/e2fsdroid.c
index 6e51414..82bd340 100644
--- a/contrib/android/e2fsdroid.c
+++ b/contrib/android/e2fsdroid.c
@@ -22,6 +22,11 @@
 #define UID_GID_MAP_MAX_EXTENTS 340
 #endif
 
+// disable leak detection, breaks host asan build
+const char *__asan_default_options() {
+    return "detect_leaks=0";
+}
+
 static char *prog_name = "e2fsdroid";
 static char *in_file;
 static char *block_list;
diff --git a/contrib/android/ext2simg.c b/contrib/android/ext2simg.c
index 017e16f..2bf76b9 100644
--- a/contrib/android/ext2simg.c
+++ b/contrib/android/ext2simg.c
@@ -24,16 +24,14 @@
 #include <sparse/sparse.h>
 
 struct {
-	int	crc;
-	int	sparse;
-	int	gzip;
+	bool	crc;
+	bool	sparse;
+	bool	gzip;
 	char	*in_file;
 	char	*out_file;
 	bool	overwrite_input;
 } params = {
-	.crc	    = 0,
-	.sparse	    = 1,
-	.gzip	    = 0,
+	.sparse	    = true,
 };
 
 #define ext2fs_fatal(Retval, Format, ...) \
@@ -60,39 +58,41 @@
 
 static struct buf_item {
 	struct buf_item	    *next;
-	void		    *buf[0];
+	void		    *buf[];
 } *buf_list;
 
-static void add_chunk(ext2_filsys fs, struct sparse_file *s, blk_t chunk_start, blk_t chunk_end)
+/*
+ * Add @num_blks blocks, starting at index @chunk_start, of the filesystem @fs
+ * to the sparse file @s.
+ */
+static void add_chunk(ext2_filsys fs, struct sparse_file *s,
+		      blk_t chunk_start, int num_blks)
 {
+	uint64_t len = (uint64_t)num_blks * fs->blocksize;
+	int64_t offset = (int64_t)chunk_start * fs->blocksize;
+	struct buf_item *bi;
 	int retval;
-	unsigned int nb_blk = chunk_end - chunk_start;
-	size_t len = nb_blk * fs->blocksize;
-	int64_t offset = (int64_t)chunk_start * (int64_t)fs->blocksize;
 
-	if (params.overwrite_input == false) {
+	if (!params.overwrite_input) {
 		if (sparse_file_add_file(s, params.in_file, offset, len, chunk_start) < 0)
 			sparse_fatal("adding data to the sparse file");
-	} else {
-		/*
-		 * The input file will be overwritten, make a copy of
-		 * the blocks
-		 */
-		struct buf_item *bi = calloc(1, sizeof(struct buf_item) + len);
-		if (buf_list == NULL)
-			buf_list = bi;
-		else {
-			bi->next = buf_list;
-			buf_list = bi;
-		}
-
-		retval = io_channel_read_blk64(fs->io, chunk_start, nb_blk, bi->buf);
-		if (retval < 0)
-			ext2fs_fatal(retval, "reading block %u - %u", chunk_start, chunk_end);
-
-		if (sparse_file_add_data(s, bi->buf, len, chunk_start) < 0)
-			sparse_fatal("adding data to the sparse file");
+		return;
 	}
+
+	/* The input file will be overwritten, so make a copy of the blocks. */
+	if (len > SIZE_MAX - sizeof(*bi))
+		sparse_fatal("filesystem is too large");
+	bi = calloc(1, sizeof(*bi) + len);
+	if (!bi)
+		sparse_fatal("out of memory");
+	bi->next = buf_list;
+	buf_list = bi;
+	retval = io_channel_read_blk64(fs->io, chunk_start, num_blks, bi->buf);
+	if (retval)
+		ext2fs_fatal(retval, "reading data from %s", params.in_file);
+
+	if (sparse_file_add_data(s, bi->buf, len, chunk_start) < 0)
+		sparse_fatal("adding data to the sparse file");
 }
 
 static void free_chunks(void)
@@ -106,13 +106,23 @@
 	}
 }
 
+static blk_t fs_blocks_count(ext2_filsys fs)
+{
+	blk64_t blks = ext2fs_blocks_count(fs->super);
+
+	/* libsparse assumes 32-bit block numbers. */
+	if ((blk_t)blks != blks)
+		sparse_fatal("filesystem is too large");
+	return blks;
+}
+
 static struct sparse_file *ext_to_sparse(const char *in_file)
 {
 	errcode_t retval;
 	ext2_filsys fs;
 	struct sparse_file *s;
 	int64_t chunk_start = -1;
-	blk_t first_blk, last_blk, nb_blk, cur_blk;
+	blk_t fs_blks, cur_blk;
 
 	retval = ext2fs_open(in_file, 0, 0, 0, unix_io_manager, &fs);
 	if (retval)
@@ -122,11 +132,9 @@
 	if (retval)
 		ext2fs_fatal(retval, "while reading block bitmap of %s", in_file);
 
-	first_blk = ext2fs_get_block_bitmap_start2(fs->block_map);
-	last_blk = ext2fs_get_block_bitmap_end2(fs->block_map);
-	nb_blk = last_blk - first_blk + 1;
+	fs_blks = fs_blocks_count(fs);
 
-	s = sparse_file_new(fs->blocksize, (uint64_t)fs->blocksize * (uint64_t)nb_blk);
+	s = sparse_file_new(fs->blocksize, (uint64_t)fs_blks * fs->blocksize);
 	if (!s)
 		sparse_fatal("creating sparse file");
 
@@ -138,24 +146,39 @@
 	 * larger than INT32_MAX (32-bit _and_ 64-bit systems).
 	 * Make sure we do not create chunks larger than this limit.
 	 */
-	int64_t max_blk_per_chunk = (INT32_MAX - 12) / fs->blocksize;
+	int32_t max_blk_per_chunk = (INT32_MAX - 12) / fs->blocksize;
 
-	/* Iter on the blocks to merge contiguous chunk */
-	for (cur_blk = first_blk; cur_blk <= last_blk; ++cur_blk) {
+	/*
+	 * Iterate through the filesystem's blocks, identifying "chunks" that
+	 * are contiguous ranges of blocks that are in-use by the filesystem.
+	 * Add each chunk to the sparse_file.
+	 */
+	for (cur_blk = ext2fs_get_block_bitmap_start2(fs->block_map);
+	     cur_blk < fs_blks; ++cur_blk) {
 		if (ext2fs_test_block_bitmap2(fs->block_map, cur_blk)) {
+			/*
+			 * @cur_blk is in-use.  Append it to the pending chunk
+			 * if there is one, otherwise start a new chunk.
+			 */
 			if (chunk_start == -1) {
 				chunk_start = cur_blk;
 			} else if (cur_blk - chunk_start + 1 == max_blk_per_chunk) {
-				add_chunk(fs, s, chunk_start, cur_blk);
+				/*
+				 * Appending @cur_blk to the pending chunk made
+				 * it reach the maximum length, so end it.
+				 */
+				add_chunk(fs, s, chunk_start, max_blk_per_chunk);
 				chunk_start = -1;
 			}
 		} else if (chunk_start != -1) {
-			add_chunk(fs, s, chunk_start, cur_blk);
+			/* @cur_blk is not in-use, so end the pending chunk. */
+			add_chunk(fs, s, chunk_start, cur_blk - chunk_start);
 			chunk_start = -1;
 		}
 	}
+	/* If there's still a pending chunk, end it. */
 	if (chunk_start != -1)
-		add_chunk(fs, s, chunk_start, cur_blk - 1);
+		add_chunk(fs, s, chunk_start, cur_blk - chunk_start);
 
 	ext2fs_free(fs);
 	return s;
@@ -165,14 +188,14 @@
 {
 	struct stat st1, st2;
 
-	if (access(out, F_OK) == -1)
-		return false;
-
-	if (lstat(in, &st1) == -1)
+	if (stat(in, &st1) == -1)
 		ext2fs_fatal(errno, "stat %s\n", in);
-	if (lstat(out, &st2) == -1)
+	if (stat(out, &st2) == -1) {
+		if (errno == ENOENT)
+			return false;
 		ext2fs_fatal(errno, "stat %s\n", out);
-	return st1.st_ino == st2.st_ino;
+	}
+	return st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino;
 }
 
 int main(int argc, char *argv[])
@@ -184,13 +207,13 @@
 	while ((opt = getopt(argc, argv, "czS")) != -1) {
 		switch(opt) {
 		case 'c':
-			params.crc = 1;
+			params.crc = true;
 			break;
 		case 'z':
-			params.gzip = 1;
+			params.gzip = true;
 			break;
 		case 'S':
-			params.sparse = 0;
+			params.sparse = false;
 			break;
 		default:
 			usage(argv[0]);
diff --git a/debian/changelog b/debian/changelog
index 6fc50be..8c0f695 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,11 +1,77 @@
+e2fsprogs (1.47.2~rc1-2~bpo12+1) bookworm-backports; urgency=medium
+
+  * Rebuild for bookworm-backports.
+
+ -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 09 Dec 2024 22:40:25 -0500
+
+e2fsprogs (1.47.2~rc1-2) unstable; urgency=medium
+
+  * Fix fuseext2 transition to account for /usr-move (Closes: #1088838)
+  * Fix orphan_file support on big endian systems.
+  * Mke2fs will allow "-r 1" since fsarchiver uses it rather pointlessly
+  * Allow building e2fsprogs without libarchive-dev installed to make life
+    easier for bootstrapping for new Debian ports (Closes: #1078693)
+
+ -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 03 Dec 2024 23:40:01 -0500
+
+e2fsprogs (1.47.2~rc1-1) unstable; urgency=medium
+
+  * New upstream version
+  * Remove the -r option from tune2fs and replace it with an extended
+    option since most users will never need to request a file system
+    suitable for pre-1995 1.2 version kernels and a typo will just end up
+    confusing the user and leaving them with a file system missing most
+    modern ext4 features, including no support for on-line resizing and no
+    support for post-2038 timestamps.   (Closes: #1086603)
+  * Add support for gnu.translator extended attrbutes in tar files fed to
+    mke2fs -d.
+  * Avoid a spurious failure in badblocks when -n or -w is specified
+    twice.  (Closes: #1087341)
+  * Fix a bug which caused e2fsck to skip checking a file system with the
+    orphan_file feature if there are orphaned files which need to be
+    cleaned up.
+  * Fix a bug which caused tune2fs to corrupt a revision 0 file system
+    when changing the inode size by updating the revision to the current
+    standard revision supported by all Linux kernels since 1995.
+  * Fix fuse2fs --helpfull so that it displays the full help message.
+  * Allow resize2fs to perform an offline resize past the 256 TiB boundary
+  * Fix unused parameter warnings for packages which including ext2fs.h.
+    (Closes: #1082500)
+  * Provide fuseext2 to replace the debian package src:fuse-umfuse-ext2.
+    (Closes: #1085590)
+  * Clean up groff warnings in man pages.  (Closes: #1086892, #1082787,
+    #1072866, #1087898)
+  * Document the orphan_file feature in the ext4(5) and tune2fs(8) man
+    pages.  (Closes: #1073062)
+
+ -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 28 Nov 2024 23:35:35 -0500
+
+e2fsprogs (1.47.1-1) unstable; urgency=medium
+
+  * New upstream version
+  * Clarify the lsattr and mklost+found man pages that they are applicable
+    for ext2, ext3, and ext4 file systems and not just for ext2.  (Closes:
+    #1041115)
+  * Replace the build-depend on pkg-config with pkgconf to fix a Lintian
+    warning.
+  * E2fsck will now perform more consistency checks on EA (extended
+    attribute value) inodes.
+  * Fix a big where e2fsck could potentially leak an acl block when
+    releasing an orphan inode.
+  * Avoid a divide by zero crash in libext2fs if the container
+    infrastructure, such as lxcfs, reports that the system has zero CPU's
+    via sysconf(_SC_NPROCESSORS_CONF).
+
+ -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 20 May 2024 15:28:06 -0400
+
 e2fsprogs (1.47.1~rc2-1~bpo12+1) bookworm-backports; urgency=medium
 
   * Rebuild for bookworm-backports.
 
  -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 06 May 2024 00:50:10 -0400
-
 e2fsprogs (1.47.1~rc2-1) unstable; urgency=medium
 
+  * New upstream version
   * Update Chinese, Czech, French, Polish Romainian, Swedish, and
     Ukrainian translations
   * Fix libarchive support in mke2fs on mips64el (Closes: #1070042)
@@ -13,7 +79,7 @@
     systemd.  (Closes: #1070107)
   * Update to standards 4.7.0
 
- -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 01 May 2024 00:50:49 -0400
+ -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 20 May 2024 15:24:47 -0400
 
 e2fsprogs (1.47.1~rc1-3) unstable; urgency=medium
 
diff --git a/debian/control b/debian/control
index 78c534f..b127bc6 100644
--- a/debian/control
+++ b/debian/control
@@ -2,7 +2,7 @@
 Section: admin
 Priority: required
 Maintainer: Theodore Y. Ts'o <tytso@mit.edu>
-Build-Depends: gettext, texinfo, pkg-config, libarchive-dev, libfuse3-dev [linux-any kfreebsd-any] <!pkg.e2fsprogs.no-fuse2fs>, debhelper-compat (= 12), dh-exec, libblkid-dev, uuid-dev, m4, udev [linux-any], systemd [linux-any], cron [linux-any]
+Build-Depends: gettext, texinfo, pkgconf, libarchive-dev <!nocheck>, libfuse3-dev [linux-any kfreebsd-any] <!pkg.e2fsprogs.no-fuse2fs>, debhelper-compat (= 12), dh-exec, libblkid-dev, uuid-dev, m4, udev [linux-any], systemd [linux-any], cron [linux-any]
 Rules-Requires-Root: no
 Standards-Version: 4.7.0
 Homepage: http://e2fsprogs.sourceforge.net
@@ -13,12 +13,23 @@
 Build-Profiles: <!pkg.e2fsprogs.no-fuse2fs>
 Priority: optional
 Depends: ${shlibs:Depends}, ${misc:Depends}
+Breaks: fuseext2 (<< 1.47.1-2~)
+Replaces: fuseext2 (<< 1.47.1-2~)
 Architecture: linux-any kfreebsd-any
 Description: ext2 / ext3 / ext4 file system driver for FUSE
  fuse2fs is a FUSE file system client that supports reading and
  writing from devices or image files containing ext2, ext3, and ext4
  file systems.
 
+Package: fuseext2
+Build-Profiles: <!pkg.e2fsprogs.no-fuse2fs>
+Depends: fuse2fs (>= 1.47.1-2), ${misc:Depends}
+Architecture: all
+Priority: optional
+Section: oldlibs
+Description: transitional package
+ This is a transitional package. It can safely be removed.
+
 Package: logsave
 Priority: optional
 Depends: ${shlibs:Depends}, ${misc:Depends}
diff --git a/debian/copyright b/debian/copyright
index 77bd5ea..604ed9e 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -21,6 +21,15 @@
            1995-1996 Michael Nonweiler <mrn20@cam.ac.uk>
 License: GPL-2
 
+Files: debian/fuse-ext2
+Copyright: 2008-2010 Alper Akcan <alper.akcan@gmail.com>
+           2009-2010 Renzo Davoli <renzo@cs.unibo.it>
+License: GPL-2+
+
+Files: debian/fuse-ext2.1
+Copyright: 2024 наб <nabijaczleweli@nabijaczleweli.xyz>
+License: 0BSD
+
 Files: lib/et/*
        lib/ss/*
 Copyright: 1987-1988 MIT Student Information Processing Board
@@ -471,6 +480,37 @@
  On Debian systems, the complete text of the GNU General
  Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
 
+License: GPL-2+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program (in the main directory of the fuse-ext2
+ distribution in the file COPYING); if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+Comment:
+ On Debian systems, the complete text of the GNU General
+ Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
+
+License: 0BSD
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted.
+ .
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
 License: LGPL-2
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Library General Public License as
diff --git a/debian/fuse-ext2 b/debian/fuse-ext2
new file mode 100755
index 0000000..ebd3b8a
--- /dev/null
+++ b/debian/fuse-ext2
@@ -0,0 +1,65 @@
+#!/bin/sh
+usage() {
+	printf 'usage: %s [-hv] [-o ro|force|allow_others[,...]]... device|image mountpoint\n\nUse fuse2fs instead.\n' "${0##*/}"
+	exit 9
+}
+
+args="$(getopt -o 'hvo:' --long 'help,verbose,options:' -n "${0##*/}" -s 'sh' -- "$@")" || exit
+eval set -- "$args"
+
+original_options=
+readonly=
+force=
+while :; do
+	case "$1" in
+		-o|--options)
+			original_options="$original_options,$2"
+			shift 2
+			;;
+		-h|--help)
+			usage
+			shift
+			;;
+		-v|--verbose)
+			shift
+			;;
+		--)
+			shift
+			break
+			;;
+	esac
+done
+
+[ $# -eq 2 ] || usage
+device="$1"
+mountpoint="$2"
+
+# let fuse2fs check $device
+
+options=
+while [ -n "${original_options#,}" ]; do
+	original_options="${original_options#,}"
+	full="${original_options%%,*}"
+	original_options="${original_options#*,},"
+	case "${full%%=*}" in
+		"ro"    ) readonly=y               ;;  # Read-only mount.
+		"rw"    ) readonly=                ;;  # Read-write mount
+		"rw+"   ) readonly=; force=y       ;;  # Read-write mount
+		"silent")                          ;;  # keep silent
+		"force" ) force=y                  ;;  # enable read/write
+		*       ) options="$options,$full"; continue ;;
+	esac
+	[ "$full" = "${full%=*}" ] || {
+		printf '%s: %s: value given but not allowed\n' "${0##*/}" "$full" >&2
+		exit 254
+	}
+done
+
+[ -z "$readonly" ] && [ -z "$force" ] && {
+	printf '%s: Mounting %s Read-Only. Use '\''force'\'' or '\''rw+'\'' options to enable Read-Write mode\n' "${0##*/}" "$device" >&2
+	readonly=y
+}
+
+[ -n "$readonly" ] && options="$options,ro" || options="$options,rw"
+
+exec /usr/bin/fuse2fs "$device" "$mountpoint" -o "${options#,}"
diff --git a/debian/fuse-ext2.1 b/debian/fuse-ext2.1
new file mode 100644
index 0000000..b24ab56
--- /dev/null
+++ b/debian/fuse-ext2.1
@@ -0,0 +1,67 @@
+.\" SPDX-License-Identifier: 0BSD
+.\"
+.Dd October 24, 2024
+.Dt FUSE-EXT2 1
+.Os fuse2fs
+.
+.Sh NAME
+.Nm fuse-ext2
+.Nd fuse2fs compatibility wrapper
+.Sh SYNOPSIS
+.Nm
+.Op Fl hv
+.Oo Fl o Cm ro Ns \&| Ns Cm force Ns \&| Ns Cm allow_others Ns Oo ,… Oc Oc Ns …
+.Ar device Ns \&| Ns Ar image
+.Ar mountpoint
+.
+.Sh DESCRIPTION
+This wrapper provides the
+.Nm
+interface via
+.Xr fuse2fs 1 ,
+which you should migrate to instead.
+.
+.Sh OPTIONS
+.Bl -tag -compact -width ".Fl o , -options Ar option Ns Op ,…"
+.It Fl h , -help
+Show usage string.
+.
+.It Fl v , -verbose
+Ignored.
+.
+.It Fl o , -options Ar option Ns Op ,…
+.Xr mount.fuse3 8
+options, of which these are handled specially:
+.Bl -tag -compact -offset 4n -width ".Cm silent"
+.It Cm ro
+Mount read-only.
+.
+.It Cm rw
+Mount read-write
+.Em if
+.Cm force
+also given.
+This is the default.
+.
+.It Cm rw+
+Same as
+.Fl o Cm rw , Ns Cm force
+.It Cm silent
+Ignored.
+.It Cm force
+If
+.Cm rw ,
+mount read-write.
+.El
+all other
+.Ar option Ns s
+are forwarded to
+.Nm fuse2fs
+directly.
+.Pp
+If
+.Cm rw
+but not
+.Cm force ,
+the mount is read-only and a warning is issued.
+.El
diff --git a/debian/fuse2fs.install b/debian/fuse2fs.install
index 2ed4c3c..5ff8792 100644
--- a/debian/fuse2fs.install
+++ b/debian/fuse2fs.install
@@ -1,2 +1,5 @@
 /usr/bin/fuse2fs
 /usr/share/man/man1/fuse2fs.1
+
+debian/fuse-ext2   /usr/bin/
+debian/fuse-ext2.1 /usr/share/man/man1/
diff --git a/debian/fuse2fs.links b/debian/fuse2fs.links
new file mode 100644
index 0000000..71cb0b6
--- /dev/null
+++ b/debian/fuse2fs.links
@@ -0,0 +1,7 @@
+/usr/bin/fuse-ext2        /usr/bin/fuseext2
+/usr/bin/fuse-ext2        /usr/sbin/mount.fuse-ext2
+/usr/sbin/mount.fuse-ext2 /usr/sbin/mount.fuseext2
+
+/usr/share/man/man1/fuse-ext2.1       /usr/share/man/man1/fuseext2.1
+/usr/share/man/man1/fuse-ext2.1       /usr/share/man/man8/mount.fuse-ext2.8
+/usr/share/man/man8/mount.fuse-ext2.8 /usr/share/man/man8/mount.fuseext2.8
diff --git a/debian/fuse2fs.postinst b/debian/fuse2fs.postinst
new file mode 100644
index 0000000..38384ff
--- /dev/null
+++ b/debian/fuse2fs.postinst
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+# begin-remove-after: released:trixie
+if test "$1" = configure && dpkg --compare-versions "$2" lt 1.47.2~rc1-1~; then
+    # DEP17 P1 mitigation.
+    for cmd in /sbin/mount.fuse-ext2 /sbin/mount.fuseext2; do
+        dpkg-divert --package fuse2fs --no-rename --divert "$cmd.usr-is-merged" --remove "$cmd"
+    done
+fi
+# end-remove-after: released:trixie
+
+#DEBHELPER#
diff --git a/debian/fuse2fs.postrm b/debian/fuse2fs.postrm
new file mode 100644
index 0000000..68a43f8
--- /dev/null
+++ b/debian/fuse2fs.postrm
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+# begin-remove-after: released:trixie
+if test "$1" = remove || test "$1" = upgrade -o "$1" = failed-upgrade - o "$1" = abort-install -o "$1" = abort-upgrade && dpkg --compare-versions "$2" lt 1.47.2~rc1-1~; then
+    # DEP17 P1 mitigation.
+    for cmd in /sbin/mount.fuse-ext2 /sbin/mount.fuseext2; do
+        dpkg-divert --package fuse2fs --no-rename --divert "$cmd.usr-is-merged" --remove "$cmd"
+    done
+fi
+# end-remove-after: released:trixie
+
+#DEBHELPER#
diff --git a/debian/fuse2fs.preinst b/debian/fuse2fs.preinst
new file mode 100644
index 0000000..24e2504
--- /dev/null
+++ b/debian/fuse2fs.preinst
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+# begin-remove-after: released:trixie
+if test "$1" = install -o "$1" = upgrade && dpkg --compare-versions "$2" lt 1.47.2~rc1-1~; then
+    # DEP17 P1 mitigation.
+    for cmd in /sbin/mount.fuse-ext2 /sbin/mount.fuseext2; do
+        dpkg-divert --package fuse2fs --no-rename --divert "$cmd.usr-is-merged" --add "$cmd"
+    done
+fi
+# end-remove-after: released:trixie
+
+#DEBHELPER#
diff --git a/debian/patches/0001-Decouple-without-libarchive-and-HAVE_ARCHIVE_H.patch b/debian/patches/0001-Decouple-without-libarchive-and-HAVE_ARCHIVE_H.patch
new file mode 100644
index 0000000..4209e71
--- /dev/null
+++ b/debian/patches/0001-Decouple-without-libarchive-and-HAVE_ARCHIVE_H.patch
@@ -0,0 +1,162 @@
+From: Johannes Schauer Marin Rodrigues <josch@mister-muffin.de>
+Subject: Decouple --without-libarchive and HAVE_ARCHIVE_H
+
+To aid bootstrapping, it would be useful to be able to build e2fsprogs
+without archive.h as otherwise there is a build dependency loop with
+libarchive. If archive.h is not present, add the missing forward
+declarations (as opaque structs) and preprocessor definitions and
+typedefs. Since this allows building e2fsprogs with libarchive support
+even without the archive.h header present on the system, we cannot check
+HAVE_ARCHIVE_H anymore to decide whether to build with libarchive
+support or not. So if --without-libarchive is passed to ./configure,
+CONFIG_DISABLE_LIBARCHIVE gets set and later checked to decide about
+libarchive support.
+
+Origin: upstream
+Addresses-Debian-Bug: #1078693
+---
+ configure                      |  3 +++
+ configure.ac                   |  2 ++
+ lib/config.h.in                |  3 +++
+ misc/create_inode_libarchive.c | 46 ++++++++++++++++++++++++++--------
+ 5 files changed, 44 insertions(+), 12 deletions(-)
+
+diff --git a/configure b/configure
+index e299be028..f9a7aa4e2 100755
+--- a/configure
++++ b/configure
+@@ -13750,6 +13750,9 @@ then
+ 	try_libarchive=""
+ 	{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Disabling libarchive support" >&5
+ printf "%s\n" "Disabling libarchive support" >&6; }
++
++printf "%s\n" "#define CONFIG_DISABLE_LIBARCHIVE 1" >>confdefs.h
++
+ elif test "$withval" = "direct"
+ then
+ 	try_libarchive="direct"
+diff --git a/configure.ac b/configure.ac
+index 9a3dff1cf..1f6760403 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1312,6 +1312,8 @@ AS_HELP_STRING([--without-libarchive],[disable use of libarchive]),
+ then
+ 	try_libarchive=""
+ 	AC_MSG_RESULT([Disabling libarchive support])
++	AC_DEFINE(CONFIG_DISABLE_LIBARCHIVE, 1,
++		[Define to 1 to completely disable libarchive])
+ elif test "$withval" = "direct"
+ then
+ 	try_libarchive="direct"
+diff --git a/lib/config.h.in b/lib/config.h.in
+index 04cec72b8..819c43313 100644
+--- a/lib/config.h.in
++++ b/lib/config.h.in
+@@ -12,6 +12,9 @@
+ /* Define to 1 for features for use by ext4 developers */
+ #undef CONFIG_DEVELOPER_FEATURES
+ 
++/* Define to 1 to completely disable libarchive */
++#undef CONFIG_DISABLE_LIBARCHIVE
++
+ /* Define to 1 if using dlopen to access libarchive */
+ #undef CONFIG_DLOPEN_LIBARCHIVE
+ 
+diff --git a/misc/create_inode_libarchive.c b/misc/create_inode_libarchive.c
+index ff697f4c8..d14efe81d 100644
+--- a/misc/create_inode_libarchive.c
++++ b/misc/create_inode_libarchive.c
+@@ -13,20 +13,50 @@
+ #define _GNU_SOURCE 1
+ 
+ #include "config.h"
+-#include <ext2fs/ext2_types.h>
+ #include "create_inode.h"
+ #include "create_inode_libarchive.h"
+ #include "support/nls-enable.h"
+ 
+-#ifdef HAVE_ARCHIVE_H
++#ifdef CONFIG_DISABLE_LIBARCHIVE
++
++/* If ./configure was run with --without-libarchive, then only
++ * __populate_fs_from_tar() remains in this file and will return an error. */
++errcode_t __populate_fs_from_tar(ext2_filsys, ext2_ino_t, const char *,
++                                 ext2_ino_t, struct hdlinks_s *,
++                                 struct file_info *,
++                                 struct fs_ops_callbacks *) {
++  com_err(__func__, 0,
++          _("you need to compile e2fsprogs without --without-libarchive"
++            "be able to process tarballs"));
++  return 1;
++}
++
++#else
++
++/* If ./configure was NOT run with --without-libarchive, then build with
++ * support for dlopen()-ing libarchive at runtime. This will also work even
++ * if archive.h is not available at compile-time. See the comment below. */
+ 
+ /* 64KiB is the minimum blksize to best minimize system call overhead. */
+ //#define COPY_FILE_BUFLEN 65536
+ //#define COPY_FILE_BUFLEN 1048576
+ #define COPY_FILE_BUFLEN 16777216
+ 
++/* If archive.h was found, include it as usual. To support easier
++ * bootstrapping, also allow compilation without archive.h present by
++ * declaring the necessary opaque structs and preprocessor definitions. */
++#ifdef HAVE_ARCHIVE_H
+ #include <archive.h>
+ #include <archive_entry.h>
++#else
++struct archive;
++struct archive_entry;
++#define	ARCHIVE_EOF	  1	/* Found end of archive. */
++#define	ARCHIVE_OK	  0	/* Operation was successful. */
++#include <unistd.h>  /* ssize_t */
++typedef ssize_t la_ssize_t;
++#endif /* HAVE_ARCHIVE_H */
++
+ #include <libgen.h>
+ #include <locale.h>
+ 
+@@ -175,7 +205,7 @@ static int libarchive_available(void)
+ 
+ 	return 1;
+ }
+-#endif
++#endif /* CONFIG_DLOPEN_LIBARCHIVE */
+ 
+ static errcode_t __find_path(ext2_filsys fs, ext2_ino_t root, const char *name,
+ 			     ext2_ino_t *inode)
+@@ -541,7 +571,6 @@ static errcode_t handle_entry(ext2_filsys fs, ext2_ino_t root_ino,
+ 	}
+ 	return 0;
+ }
+-#endif
+ 
+ errcode_t __populate_fs_from_tar(ext2_filsys fs, ext2_ino_t root_ino,
+ 				 const char *source_tar, ext2_ino_t root,
+@@ -549,12 +578,6 @@ errcode_t __populate_fs_from_tar(ext2_filsys fs, ext2_ino_t root_ino,
+ 				 struct file_info *target,
+ 				 struct fs_ops_callbacks *fs_callbacks)
+ {
+-#ifndef HAVE_ARCHIVE_H
+-	com_err(__func__, 0,
+-		_("you need to compile e2fsprogs with libarchive to "
+-		  "be able to process tarballs"));
+-	return 1;
+-#else
+ 	char *path2, *path3, *dir, *name;
+ 	unsigned int dir_exists;
+ 	struct archive *a;
+@@ -700,5 +723,6 @@ out:
+ 	uselocale(old_locale);
+ 	freelocale(archive_locale);
+ 	return retval;
+-#endif
+ }
++
++#endif /* CONFIG_DISABLE_LIBARCHIVE */
+-- 
+2.45.2
+
diff --git a/debian/patches/0002-mke2fs-allow-specifying-the-revision-1-via-r-1.patch b/debian/patches/0002-mke2fs-allow-specifying-the-revision-1-via-r-1.patch
new file mode 100644
index 0000000..aad37a3
--- /dev/null
+++ b/debian/patches/0002-mke2fs-allow-specifying-the-revision-1-via-r-1.patch
@@ -0,0 +1,57 @@
+From: Theodore Ts'o <tytso@mit.edu>
+Subject: mke2fs: allow specifying the revision 1 via "-r 1"
+
+The fsarchiver program unconditionally passes -r 1 even though it's
+effectively a no-op.  To avoid commit 3fffe9dd6be5 breaking
+fsarchiver, we'll silently allow the "-r 1" option instead of printing
+an error and exiting.
+
+---
+ misc/mke2fs.c | 22 +++++++++++++++++++---
+ 1 file changed, 19 insertions(+), 3 deletions(-)
+
+diff --git a/misc/mke2fs.c b/misc/mke2fs.c
+index 170ec9bc3..aa4e45440 100644
+--- a/misc/mke2fs.c
++++ b/misc/mke2fs.c
+@@ -1656,6 +1656,7 @@ static void PRS(int argc, char *argv[])
+ 	 * Finally, we complain about fs_blocks_count > 2^32 on a non-64bit fs.
+ 	 */
+ 	blk64_t		fs_blocks_count = 0;
++	int		r_opt = -1;
+ 	char		*fs_features = 0;
+ 	int		fs_features_size = 0;
+ 	int		use_bsize;
+@@ -1932,11 +1933,26 @@ profile_error:
+ 			quiet = 1;
+ 			break;
+ 		case 'r':
+-			com_err(program_name, 0,
+-				_("the -r option has been removed.\n\n"
++			r_opt = strtoul(optarg, &tmp, 0);
++			if (*tmp) {
++				com_err(program_name, 0,
++					_("bad revision level - %s"), optarg);
++				exit(1);
++			}
++			if (r_opt > EXT2_MAX_SUPP_REV) {
++				com_err(program_name, EXT2_ET_REV_TOO_HIGH,
++					_("while trying to create revision %d"), r_opt);
++				exit(1);
++			}
++			if (r_opt != EXT2_DYNAMIC_REV) {
++				com_err(program_name, 0,
++	_("the -r option has been removed.\n\n"
+ 	"If you really need compatibility with pre-1995 Linux systems, use the\n"
+ 	"command-line option \"-E revision=0\".\n"));
+-			exit(1);
++				exit(1);
++			}
++			fs_param.s_rev_level = r_opt;
++			break;
+ 		case 's':
+ 			com_err(program_name, 0,
+ 				_("the -s option has been removed.\n\n"
+-- 
+2.45.2
+
diff --git a/debian/patches/0003-e2fsck-fix-big-endian-support-for-orphan_file-file-s.patch b/debian/patches/0003-e2fsck-fix-big-endian-support-for-orphan_file-file-s.patch
new file mode 100644
index 0000000..93d8fb6
--- /dev/null
+++ b/debian/patches/0003-e2fsck-fix-big-endian-support-for-orphan_file-file-s.patch
@@ -0,0 +1,85 @@
+From: Theodore Ts'o <tytso@mit.edu>
+Subject: e2fsck: fix big-endian support for orphan_file file systems
+
+---
+ e2fsck/super.c       |  5 +++--
+ lib/ext2fs/ext2_fs.h |  4 ++--
+ lib/ext2fs/orphan.c  | 12 +++++++-----
+ 3 files changed, 12 insertions(+), 9 deletions(-)
+
+diff --git a/e2fsck/super.c b/e2fsck/super.c
+index 04d6ddee6..d6bbb6317 100644
+--- a/e2fsck/super.c
++++ b/e2fsck/super.c
+@@ -605,8 +605,9 @@ return_abort:
+ 		 * Update checksum to match expected buffer contents with
+ 		 * appropriate block number.
+ 		 */
+-		tail->ob_checksum = ext2fs_do_orphan_file_block_csum(fs,
+-				pd->ino, pd->generation, blk, pd->buf);
++		tail->ob_checksum =
++			ext2fs_cpu_to_le32(ext2fs_do_orphan_file_block_csum(fs,
++				    pd->ino, pd->generation, blk, pd->buf));
+ 	}
+ 	if (!pd->clear) {
+ 		pd->errcode = io_channel_read_blk64(fs->io, blk, 1,
+diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
+index 586141f89..3a5eb7387 100644
+--- a/lib/ext2fs/ext2_fs.h
++++ b/lib/ext2fs/ext2_fs.h
+@@ -1122,8 +1122,8 @@ static inline unsigned int ext2fs_dir_rec_len(__u8 name_len,
+ 
+ /* Structure at the tail of orphan block */
+ struct ext4_orphan_block_tail {
+-	__u32 ob_magic;
+-	__u32 ob_checksum;
++	__le32 ob_magic;
++	__le32 ob_checksum;
+ };
+ 
+ /*
+diff --git a/lib/ext2fs/orphan.c b/lib/ext2fs/orphan.c
+index 913eb9a03..e256fd220 100644
+--- a/lib/ext2fs/orphan.c
++++ b/lib/ext2fs/orphan.c
+@@ -58,7 +58,7 @@ __u32 ext2fs_do_orphan_file_block_csum(ext2_filsys fs, ext2_ino_t ino,
+ 	crc = ext2fs_crc32c_le(crc, (unsigned char *)buf,
+ 				inodes_per_ob * sizeof(__u32));
+ 
+-	return ext2fs_cpu_to_le32(crc);
++	return crc;
+ }
+ 
+ struct mkorphan_info {
+@@ -101,8 +101,9 @@ static int mkorphan_proc(ext2_filsys	fs,
+ 			struct ext4_orphan_block_tail *tail;
+ 
+ 			tail = ext2fs_orphan_block_tail(fs, oi->buf);
+-			tail->ob_checksum = ext2fs_do_orphan_file_block_csum(fs,
+-				oi->ino, oi->generation, new_blk, oi->buf);
++			tail->ob_checksum =
++		ext2fs_cpu_to_le32(ext2fs_do_orphan_file_block_csum(fs,
++				    oi->ino, oi->generation, new_blk, oi->buf));
+ 		}
+ 		err = io_channel_write_blk64(fs->io, new_blk, 1, oi->buf);
+ 	} else	/* zerobuf is used to initialize new indirect blocks... */
+@@ -249,13 +250,14 @@ errcode_t ext2fs_orphan_file_block_csum_set(ext2_filsys fs, ext2_ino_t ino,
+ 					    blk64_t blk, char *buf)
+ {
+ 	struct ext4_orphan_block_tail *tail;
++	__u32 crc;
+ 
+ 	if (!ext2fs_has_feature_metadata_csum(fs->super))
+ 		return 0;
+ 
+ 	tail = ext2fs_orphan_block_tail(fs, buf);
+-	return ext2fs_orphan_file_block_csum(fs, ino, blk, buf,
+-					     &tail->ob_checksum);
++	return ext2fs_orphan_file_block_csum(fs, ino, blk, buf, &crc);
++	tail->ob_checksum = ext2fs_cpu_to_le32(crc);
+ }
+ 
+ int ext2fs_orphan_file_block_csum_verify(ext2_filsys fs, ext2_ino_t ino,
+-- 
+2.45.2
+
diff --git a/debian/patches/0004-More-reease-note-updates b/debian/patches/0004-More-reease-note-updates
new file mode 100644
index 0000000..8209523
--- /dev/null
+++ b/debian/patches/0004-More-reease-note-updates
@@ -0,0 +1,48 @@
+From: Theodore Ts'o <tytso@mit.edu>
+Subject: More release note updates for 1.47.2.
+
+---
+ doc/RelNotes/v1.47.2.txt | 11 +++++++++--
+ 2 files changed, 19 insertions(+), 2 deletions(-)
+
+diff --git a/doc/RelNotes/v1.47.2.txt b/doc/RelNotes/v1.47.2.txt
+index 84cd21640..3c27e34ca 100644
+--- a/doc/RelNotes/v1.47.2.txt
++++ b/doc/RelNotes/v1.47.2.txt
+@@ -1,4 +1,4 @@
+-E2fsprogs 1.47.2 (November 28, 2024) 6ba18ef7bf4b
++E2fsprogs 1.47.2 (November 28, 2024) 283fcab2c9af
+ ====================================
+ 
+ Updates/Fixes since v1.47.1:
+@@ -22,6 +22,8 @@ https://github.com/tytso/e2fsprogs/issues/192)
+ Fixes
+ -----
+ 
++Fix orphan_file support on big endian systems.
++
+ Avoid a spurious failure in badblocks when -n or -w is specified twice.
+ (Addresses Debian Bug #1087341)
+ 
+@@ -68,7 +70,7 @@ Enable Continuous Integration testing in Debian's Salsa forge.
+ Fix a memory leak in oss-fuzz test programs.
+ 
+ Provide fuseext2 to replace the debian package src:fuse-umfuse-ext2.
+-(Addresses Debian Bug #1085590)
++(Addresses Debian Bug #1085590, #1088838)
+ 
+ Fix the f_badjour_encrypted test to write the error output from mke2fs
+ and debugfs to a log file so it doesn't mess up the "make check" output
+@@ -82,4 +84,9 @@ Clean up groff warnings in man pages.  (Addresses Debian Bugs #1086892,
+ Document the orphan_file feature in the ext4(5) and tune2fs(8) man
+ pages.  (Addresses Debian Bug #1073062)
+ 
++Allow building e2fsprogs without libarchive-dev installed to make life
++easier for bootstrapping for new Debian ports (Addresses Debian Bug
++#1078693)
++
+ Various man page cleanups.
++
+-- 
+2.45.2
+
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..8cfb8fe
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,4 @@
+0001-Decouple-without-libarchive-and-HAVE_ARCHIVE_H.patch
+0002-mke2fs-allow-specifying-the-revision-1-via-r-1.patch
+0003-e2fsck-fix-big-endian-support-for-orphan_file-file-s.patch
+0004-More-reease-note-updates
diff --git a/debian/salsa-ci.yml b/debian/salsa-ci.yml
new file mode 100644
index 0000000..0c22dc4
--- /dev/null
+++ b/debian/salsa-ci.yml
@@ -0,0 +1,3 @@
+include:
+  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
+  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
diff --git a/debugfs/Makefile.in b/debugfs/Makefile.in
index b845a6f..50a21e5 100644
--- a/debugfs/Makefile.in
+++ b/debugfs/Makefile.in
@@ -363,16 +363,18 @@
  $(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/hashmap.h \
  $(top_srcdir)/lib/ext2fs/bitops.h $(top_srcdir)/lib/ext2fs/fiemap.h \
  $(srcdir)/../misc/create_inode.h $(top_srcdir)/lib/e2p/e2p.h \
- $(top_srcdir)/lib/support/nls-enable.h
+ $(top_srcdir)/lib/support/nls-enable.h \
+ $(srcdir)/../misc/create_inode_libarchive.h
 create_inode_libarchive.o: $(srcdir)/../misc/create_inode_libarchive.c \
- $(top_builddir)/lib/config.h $(srcdir)/../misc/create_inode_libarchive.h \
- $(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
- $(top_builddir)/lib/ext2fs/ext2_types.h $(top_srcdir)/lib/ext2fs/ext2_fs.h \
- $(top_srcdir)/lib/ext2fs/ext3_extents.h $(top_srcdir)/lib/et/com_err.h \
- $(top_srcdir)/lib/ext2fs/ext2_io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+ $(top_builddir)/lib/config.h $(top_builddir)/lib/dirpaths.h \
+ $(top_builddir)/lib/ext2fs/ext2_types.h $(srcdir)/../misc/create_inode.h \
+ $(top_srcdir)/lib/et/com_err.h $(top_srcdir)/lib/e2p/e2p.h \
+ $(top_srcdir)/lib/ext2fs/ext2_fs.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
+ $(top_srcdir)/lib/ext2fs/ext3_extents.h $(top_srcdir)/lib/ext2fs/ext2_io.h \
+ $(top_builddir)/lib/ext2fs/ext2_err.h \
  $(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/hashmap.h \
- $(top_srcdir)/lib/ext2fs/bitops.h $(top_srcdir)/lib/ext2fs/fiemap.h \
- $(srcdir)/../misc/create_inode.h $(top_srcdir)/lib/e2p/e2p.h \
+ $(top_srcdir)/lib/ext2fs/bitops.h \
+ $(srcdir)/../misc/create_inode_libarchive.h \
  $(top_srcdir)/lib/support/nls-enable.h
 xattrs.o: $(srcdir)/xattrs.c $(top_builddir)/lib/config.h \
  $(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/support/cstring.h \
diff --git a/debugfs/debugfs.8.in b/debugfs/debugfs.8.in
index 7cf5c16..2066c0f 100644
--- a/debugfs/debugfs.8.in
+++ b/debugfs/debugfs.8.in
@@ -76,7 +76,7 @@
 no safety checks are in place, and
 .B debugfs
 may fail in interesting ways if commands such as
-.IR ls ", " dump ", "
+.IR ls ", " dump ,
 etc. are tried without specifying the
 .I data_source_device
 using the
@@ -85,7 +85,7 @@
 .B debugfs
 is a debugging tool.  It has rough edges!
 .TP
-.I -d data_source_device
+.I \-d data_source_device
 Used with the
 .I \-i
 option, specifies that
@@ -93,24 +93,24 @@
 should be used when reading blocks not found in the ext2 image file.
 This includes data, directory, and indirect blocks.
 .TP
-.I -b blocksize
+.I \-b blocksize
 Forces the use of the given block size (in bytes) for the file system,
 rather than detecting the correct block size automatically.  (This
 option is rarely needed; it is used primarily when the file system is
 extremely badly damaged/corrupted.)
 .TP
-.I -s superblock
+.I \-s superblock
 Causes the file system superblock to be read from the given block
 number, instead of using the primary superblock (located at an offset of
 1024 bytes from the beginning of the file system).  If you specify the
-.I -s
+.I \-s
 option, you must also provide the blocksize of the file system via the
-.I -b
+.I \-b
 option.   (This
 option is rarely needed; it is used primarily when the file system is
 extremely badly damaged/corrupted.)
 .TP
-.I -f cmd_file
+.I \-f cmd_file
 Causes
 .B debugfs
 to read in commands from
@@ -119,7 +119,7 @@
 .B debugfs
 is finished executing those commands, it will exit.
 .TP
-.I -D
+.I \-D
 Causes
 .B debugfs
 to open the device using Direct I/O, bypassing the buffer cache.  Note
@@ -133,14 +133,16 @@
 .IR request ,
 and then exit.
 .TP
-.I -V
+.I \-V
 print the version number of
 .B debugfs
 and exit.
 .TP
 .BI \-z " undo_file"
 Before overwriting a file system block, write the old contents of the block to
-an undo file.  This undo file can be used with e2undo(8) to restore the old
+an undo file.  This undo file can be used with
+.BR e2undo (8)
+to restore the old
 contents of the file system should something go wrong.  If the empty string is
 passed as the undo_file argument, the undo file will be written to a file named
 debugfs-\fIdevice\fR.e2undo in the directory specified via the
@@ -184,7 +186,7 @@
 .I filespec
 to stdout.
 .TP
-.BI bmap " [ -a ] filespec logical_block [physical_block]"
+.BI bmap " [ \-a ] filespec logical_block [physical_block]"
 Print or set the physical block number corresponding to the logical block number
 .I logical_block
 in the inode
@@ -193,7 +195,7 @@
 .I \-a
 flag is specified, try to allocate a block if necessary.
 .TP
-.BI block_dump " '[ -x ] [-f filespec] block_num"
+.BI block_dump " '[ \-x ] [\-f filespec] block_num"
 Dump the file system block given by
 .I block_num
 in hex and ASCII format to the console.  If the
@@ -219,9 +221,9 @@
 Change the root directory to be the directory
 .IR filespec .
 .TP
-.BI close " [-a]"
+.BI close " [\-a]"
 Close the currently open file system.  If the
-.I -a
+.I \-a
 option is specified, write out any changes to the superblock and block
 group descriptors to all of the backup superblocks, not just to the
 master superblock.
@@ -242,13 +244,13 @@
 for
 .IR filename .
 .TP
-.BI dirty " [-clean]"
+.BI dirty " [\-clean]"
 Mark the file system as dirty, so that the superblocks will be written on exit.
 Additionally, clear the superblock's valid flag, or set it if
 .I -clean
 is specified.
 .TP
-.BI dump " [-p] filespec out_file"
+.BI dump " [\-p] filespec out_file"
 Dump the contents of the inode
 .I filespec
 to the output file
@@ -268,13 +270,13 @@
 .B s_mmp_block
 field in the superblock to locate and use the existing MMP block.
 .TP
-.BI dx_hash " [-cv] [-h hash_alg] [-s hash_seed] filename"
+.BI dx_hash " [\-cv] [\-h hash_alg] [\-s hash_seed] filename"
 Calculate the directory hash of
 .IR filename .
 The
-.I -c
+.I \-c
 option will casefold the filename before calculating the hash.  The
-.I -v
+.I \-v
 option will make the
 .B dx_hash
 command more verbose and print the hash algorithm and hash seed to
@@ -282,19 +284,19 @@
 If a file system is open, use the hash_seed and
 default hash_algorithm used by the file system, although these can be
 overridden by the
-.I -h
+.I \-h
 and
-.I -s
+.I \-s
 options.
 The hash algorithm specified with
-.I -h
+.I \-h
 may be
 .BR legacy , " half_md4" ", or " tea .
 The hash seed specified with
-.I -s
+.I \-s
 must be in UUID format.
 .TP
-.BI dump_extents " [-n] [-l] filespec"
+.BI dump_extents " [\-n] [\-l] filespec"
 Dump the extent tree of the inode
 .IR filespec .
 The
@@ -302,7 +304,7 @@
 flag will cause
 .B dump_extents
 to only display the interior nodes in the extent tree.   The
-.I -l
+.I \-l
 flag will cause
 .B dump_extents
 to only display the leaf nodes in the extent tree.
@@ -316,19 +318,19 @@
 .B dump_unused
 Dump unused blocks which contain non-null bytes.
 .TP
-.BI ea_get " [-f outfile]|[-xVC] [-r] filespec attr_name"
+.BI ea_get " [\-f outfile]|[\-xVC] [\-r] filespec attr_name"
 Retrieve the value of the extended attribute
 .I attr_name
 in the file
 .I filespec
 and write it either to stdout or to \fIoutfile\fR.
 .TP
-.BI ea_list " filespec
+.BI ea_list " filespec"
 List the extended attributes associated with the file
 .I filespec
 to standard output.
 .TP
-.BI ea_set " [-f infile] [-r] filespec attr_name attr_value
+.BI ea_set " [\-f infile] [\-r] filespec attr_name attr_value"
 Set the value of the extended attribute
 .I attr_name
 in the file
@@ -337,7 +339,7 @@
 .I attr_value
 or read it from \fIinfile\fR.
 .TP
-.BI ea_rm " filespec attr_names...
+.BI ea_rm " filespec attr_names..."
 Remove the extended attribute
 .I attr_name
 from the file \fIfilespec\fR.
@@ -346,35 +348,35 @@
 Expand the directory
 .IR filespec .
 .TP
-.BI fallocate " filespec start_block [end_block]
+.BI fallocate " filespec start_block [end_block]"
 Allocate and map uninitialized blocks into \fIfilespec\fR between
 logical block \fIstart_block\fR and \fIend_block\fR, inclusive.  If
 \fIend_block\fR is not supplied, this function maps until it runs out
 of free disk blocks or the maximum file size is reached.  Existing
 mappings are left alone.
 .TP
-.BI feature " [fs_feature] [-fs_feature] ..."
+.BI feature " [fs_feature] [\-fs_feature] ..."
 Set or clear various file system features in the superblock.  After setting
 or clearing any file system features that were requested, print the current
 state of the file system feature set.
 .TP
-.BI filefrag " [-dvr] filespec"
+.BI filefrag " [\-dvr] filespec"
 Print the number of contiguous extents in
 .IR filespec .
 If
 .I filespec
 is a directory and the
-.I -d
+.I \-d
 option is not specified,
 .I filefrag
 will print the number of contiguous extents for each file in
 the directory.  The
-.I -v
+.I \-v
 option will cause
 .I filefrag
 print a tabular listing of the contiguous extents in the
 file.  The
-.I -r
+.I \-r
 option will cause
 .I filefrag
 to do a recursive listing of the directory.
@@ -411,7 +413,7 @@
 .I block
 will be marked as not allocated.
 .TP
-.BI freefrag " [-c chunk_kb]"
+.BI freefrag " [\-c chunk_kb]"
 Report free space fragmentation on the currently open file system.
 If the
 .I \-c
@@ -426,7 +428,7 @@
 .IR filespec .
 If
 .I num
-is specified, also clear num-1 inodes after the specified inode.
+is specified, also clear num\-1 inodes after the specified inode.
 .TP
 .BI get_quota " quota_type id"
 Display quota information for given quota type (user, group, or project) and ID.
@@ -444,7 +446,7 @@
 Print a listing of the inodes which use the one or more blocks specified
 on the command line.
 .TP
-.BI inode_dump " [-b]|[-e]|[-x] filespec"
+.BI inode_dump " [\-b]|[\-e]|[\-x] filespec"
 Print the contents of the inode data structure in hex and ASCII format.
 The
 .I \-b
@@ -475,25 +477,25 @@
 program.  This is just a call to the low-level library, which sets up
 the superblock and block descriptors.
 .TP
-.BI journal_close
+.B journal_close
 Close the open journal.
 .TP
-.BI journal_open " [-c] [-v ver] [-f ext_jnl]
+.BI journal_open " [\-c] [\-v ver] [\-f ext_jnl]"
 Opens the journal for reading and writing.  Journal checksumming can
-be enabled by supplying \fI-c\fR; checksum formats 2 and 3 can be
-selected with the \fI-v\fR option.  An external journal can be loaded
+be enabled by supplying \fI\-c\fR; checksum formats 2 and 3 can be
+selected with the \fI\-v\fR option.  An external journal can be loaded
 from \fIext_jnl\fR.
 .TP
-.BI journal_run
+.B journal_run
 Replay all transactions in the open journal.
 .TP
-.BI journal_write " [-b blocks] [-r revoke] [-c] file
+.BI journal_write " [\-b blocks] [\-r revoke] [\-c] file"
 Write a transaction to the open journal.  The list of blocks to write
 should be supplied as a comma-separated list in \fIblocks\fR; the
 blocks themselves should be readable from \fIfile\fR.  A list of
 blocks to revoke can be supplied as a comma-separated list in
 \fIrevoke\fR.  By default, a commit record is written at the end; the
-\fI-c\fR switch writes an uncommitted transaction.
+\fI\-c\fR switch writes an uncommitted transaction.
 .TP
 .BI kill_file " filespec"
 Deallocate the inode
@@ -520,7 +522,7 @@
 .IR filespec .
 Note this does not adjust the inode reference counts.
 .TP
-.BI logdump " [-acsOS] [-b block] [-n num_trans ] [-i filespec] [-f journal_file] [output_file]"
+.BI logdump " [\-acsOS] [\-b block] [\-n num_trans ] [\-i filespec] [\-f journal_file] [output_file]"
 Dump the contents of the ext3 journal.  By default, dump the journal inode as
 specified in the superblock.  However, this can be overridden with the
 .I \-i
@@ -573,7 +575,7 @@
 .I num_trans
 transactions.
 .TP
-.BI ls " [-l] [-c] [-d] [-p] [-r] filespec"
+.BI ls " [\-l] [\-c] [\-d] [\-p] [\-r] filespec"
 Print a listing of the files in the directory
 .IR filespec .
 The
@@ -622,22 +624,22 @@
 .I minor
 device numbers must be specified.
 .TP
-.BI ncheck " [-c] inode_num ..."
+.BI ncheck " [\-c] inode_num ..."
 Take the requested list of inode numbers, and print a listing of pathnames
 to those inodes.  The
 .I -c
 flag will enable checking the file type information in the directory
 entry to make sure it matches the inode's type.
 .TP
-.BI open " [-weficD] [-b blocksize] [-d image_filename] [-s superblock] [-z undo_file] device"
+.BI open " [\-weficD] [\-b blocksize] [\-d image_filename] [\-s superblock] [\-z undo_file] device"
 Open a file system for editing.  The
-.I -f
+.I \-f
 flag forces the file system to be opened even if there are some unknown
 or incompatible file system features which would normally
 prevent the file system from being opened.  The
-.I -e
+.I \-e
 flag causes the file system to be opened in exclusive mode.  The
-.IR -b ", " -c ", " -d ", " -i ", " -s ", " -w ", and " -D
+.IR \-b ", " \-c ", " \-d ", " \-i ", " \-s ", " \-w ", and " \-D
 options behave the same as the command-line options to
 .BR debugfs .
 .TP
@@ -680,7 +682,6 @@
 .I pathname
 to have no other references, deallocate the file.  This command functions
 as the unlink() system call.
-.I
 .TP
 .BI rmdir " filespec"
 Remove the directory
@@ -717,7 +718,7 @@
 .I filespec
 as in use in the inode bitmap.  If
 .I num
-is specified, also set num-1 inodes after the specified inode.
+is specified, also set num\-1 inodes after the specified inode.
 .TP
 .BI set_inode_field " filespec field value"
 Modify the inode specified by
@@ -725,10 +726,10 @@
 so that the inode field
 .I field
 has value
-.I value.
+.IR value .
 The list of valid inode fields which can be set via this command
 can be displayed by using the command:
-.B set_inode_field -l
+.B set_inode_field \-l
 Also available as
 .BR sif .
 .TP
@@ -736,10 +737,10 @@
 Modify the multiple-mount protection (MMP) data so that the MMP field
 .I field
 has value
-.I value.
+.IR value .
 The list of valid MMP fields which can be set via this command
 can be displayed by using the command:
-.B set_mmp_value -l
+.B set_mmp_value \-l
 Also available as
 .BR smmp .
 .TP
@@ -747,10 +748,10 @@
 Set the superblock field
 .I field
 to
-.I value.
+.IR value .
 The list of valid superblock fields which can be set via this command
 can be displayed by using the command:
-.B set_super_value -l
+.B set_super_value \-l
 Also available as
 .BR ssv .
 .TP
@@ -759,9 +760,9 @@
 .B debugfs
 parameters such as information about currently opened file system.
 .TP
-.BI show_super_stats " [-h]"
+.BI show_super_stats " [\-h]"
 List the contents of the super block and the block group descriptors.  If the
-.I -h
+.I \-h
 flag is given, only print out the superblock contents. Also available as
 .BR stats .
 .TP
@@ -822,34 +823,34 @@
 into a newly-created file in the file system named
 .IR out_file .
 .TP
-.BI zap_block " [-f filespec] [-o offset] [-l length] [-p pattern] block_num"
+.BI zap_block " [\-f filespec] [\-o offset] [\-l length] [\-p pattern] block_num"
 Overwrite the block specified by
 .I block_num
 with zero (NUL) bytes, or if
-.I -p
+.I \-p
 is given use the byte specified by
 .IR pattern .
 If
-.I -f
+.I \-f
 is given then
 .I block_num
 is relative to the start of the file given by
 .IR filespec .
 The
-.I -o
+.I \-o
 and
-.I -l
+.I \-l
 options limit the range of bytes to zap to the specified
 .I offset
 and
 .I length
 relative to the start of the block.
 .TP
-.BI zap_block " [-f filespec] [-b bit] block_num"
+.BI zap_block " [\-f filespec] [\-b bit] block_num"
 Bit-flip portions of the physical
 .IR block_num .
 If
-.I -f
+.I \-f
 is given, then
 .I block_num
 is a logical block relative to the start of
diff --git a/doc/RelNotes/v1.47.1.txt b/doc/RelNotes/v1.47.1.txt
index ccc46d6..4e7d455 100644
--- a/doc/RelNotes/v1.47.1.txt
+++ b/doc/RelNotes/v1.47.1.txt
@@ -1,5 +1,5 @@
-E2fsprogs 1.47.1 (May 1, 2024)
-==============================
+E2fsprogs 1.47.1 (May 20, 2024)
+===============================
 
 Updates/Fixes since v1.47.0:
 
@@ -60,6 +60,16 @@
 the orphan_present feature is set, in preen mode, e2fsck will now clear
 the orphan_present feature flag silently.
 
+E2fsck will now perform more consistency checks on EA (extended
+attribute value) inodes.
+
+Fix a big where e2fsck could potentially leak an acl block when
+releasing an orphan inode.
+
+Avoid a divide by zero crash in libext2fs if the container
+infrastructure, such as lxcfs, reports that the system has zero CPU's
+via sysconf(_SC_NPROCESSORS_CONF).
+
 When resize2fs is performing an online resize, it's possible for reading
 the superblock can race with a kernel modifying the superblock with the
 checksum being invalid and causing the resize to fail with an bad
@@ -123,7 +133,8 @@
 
 Fixed/improved various Debian packaging issues.
 
-Update and clarify various man pages.  (Addresses Debian Bug #1038286)
+Update and clarify various man pages.  (Addresses Debian Bugs #1038286,
+#1041115)
 
 
 
@@ -169,6 +180,10 @@
 
 Fix various sanitizer, static code analysis, and compiler warnings.
 
+Synchronized changes from Android's AOSP e2fsprogs tree.
+
+Updated config.guess and config.sub with newer versions from the FSF.
+
 Add Romainian translation.
 
 Update Chinese, Czech, French, Malay, Polish, Swedish, and Ukrainian
diff --git a/doc/RelNotes/v1.47.2.txt b/doc/RelNotes/v1.47.2.txt
new file mode 100644
index 0000000..3c27e34
--- /dev/null
+++ b/doc/RelNotes/v1.47.2.txt
@@ -0,0 +1,92 @@
+E2fsprogs 1.47.2 (November 28, 2024) 283fcab2c9af
+====================================
+
+Updates/Fixes since v1.47.1:
+
+UI and Features
+---------------
+
+Drop the tune2fs -r option and replace it with -E revision=<fs-rev>.
+Revision 0 file systems are needed for compatibility with pre-1995 Linux
+kernels (older that version 1.2).  Most of the time, users shouldn't be
+using the -r option and they can confuse themselves and end up creating
+a file system that is missing most modern ext4 features, including no
+online resizing, no support for post-2038 timestamps, etc.  (Addresses
+Debian Bug #1086603)
+
+Add support for gnu.translator extended attributes in tar files fed to
+mke2fs -d.  (Addresses Github issue
+https://github.com/tytso/e2fsprogs/issues/192)
+
+
+Fixes
+-----
+
+Fix orphan_file support on big endian systems.
+
+Avoid a spurious failure in badblocks when -n or -w is specified twice.
+(Addresses Debian Bug #1087341)
+
+Fix a bug where e2fsck could skip checking a file systems with the
+orphan_file feature if there are orphaned files that need to be cleaned
+up.  (Addresses Red Hat Bugzilla 2318710, SuSE Bugzilla #1226043)
+
+Tune2fs will now upgrade a revision 0 file system to revision 1 before
+trying to change the inode size.  Otherwise, this could result in a
+corrupted file system.
+
+Fix fuse2fs --helpfull so that it displays the full help message.
+
+Allow resize2fs to perform an offline resize past the 256 TiB boundary
+(which the kernel could do as part of an online resize).
+
+
+
+Performance, Internal Implementation, Development Support etc.
+--------------------------------------------------------------
+
+Speed up tune2fs -g when the group is not changed by the command.
+
+Fix build failures on GCC 15 due to it switched to using -std=c23 by
+default.  (Addresses Github issue
+https://github.com/tytso/e2fsprogs/issues/202)
+
+Fix build failure when linking fuse2fs with old (2.9.9) version of
+libfuse2 on aarch64.  This hack was needed to fix a regression caused by
+another hacky workaround needed to work around a build failure on
+mipsel64 thanks to glibc using different struct stat layouts depending
+_FILE_OFFSET_BITS is set and this caused failures when dynamic linking
+against libarchive on Debian's mipsel64.  (Sigh.)
+
+Fix unused parameter warnings for packages which including ext2fs.h.
+(Addresses Debian Bug #1082500)
+
+Fix bug where packages including ext2fs.h would get the 32-bit versions
+of the timestamp routines even on 64-bit platforms due to a missing
+SIZEOF_TIME_T autoconf definiton in public_config.h.
+
+Enable Continuous Integration testing in Debian's Salsa forge.
+
+Fix a memory leak in oss-fuzz test programs.
+
+Provide fuseext2 to replace the debian package src:fuse-umfuse-ext2.
+(Addresses Debian Bug #1085590, #1088838)
+
+Fix the f_badjour_encrypted test to write the error output from mke2fs
+and debugfs to a log file so it doesn't mess up the "make check" output
+and to make those error messages available in the case of test failure.
+
+Fix my_llseek() declaration when building against musl libc.
+
+Clean up groff warnings in man pages.  (Addresses Debian Bugs #1086892,
+#1082787, #1072866, #1087898)
+
+Document the orphan_file feature in the ext4(5) and tune2fs(8) man
+pages.  (Addresses Debian Bug #1073062)
+
+Allow building e2fsprogs without libarchive-dev installed to make life
+easier for bootstrapping for new Debian ports (Addresses Debian Bug
+#1078693)
+
+Various man page cleanups.
+
diff --git a/doc/libext2fs.texinfo b/doc/libext2fs.texinfo
index c9931da..4fd4ca6 100644
--- a/doc/libext2fs.texinfo
+++ b/doc/libext2fs.texinfo
@@ -1,7 +1,7 @@
 \input texinfo    @c -*-texinfo-*-
 @c %**start of header
 @setfilename libext2fs.info
-@settitle The EXT2FS Library (version 1.47.1)
+@settitle The EXT2FS Library (version 1.47.2)
 @synindex tp fn
 @comment %**end of header
 
@@ -60,8 +60,8 @@
 
 @title The EXT2FS Library
 @subtitle The EXT2FS Library
-@subtitle Version 1.47.1
-@subtitle May 2024
+@subtitle Version 1.47.2
+@subtitle November 2024
 
 @author by Theodore Ts'o
 
@@ -101,7 +101,7 @@
 
 @top The EXT2FS Library
 
-This manual documents the EXT2FS Library, version 1.47.1.
+This manual documents the EXT2FS Library, version 1.47.2.
 
 @menu
 * Introduction to the EXT2FS Library::  
diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h
index 55738fd..ae1273d 100644
--- a/e2fsck/e2fsck.h
+++ b/e2fsck/e2fsck.h
@@ -533,6 +533,12 @@
 typedef __u64 ea_key_t;
 typedef __u64 ea_value_t;
 
+/*
+ * Special refcount value we use for inodes which have EA_INODE flag set but we
+ * do not yet know about any references.
+ */
+#define EA_INODE_NO_REFS (~(ea_value_t)0)
+
 extern errcode_t ea_refcount_create(size_t size, ext2_refcount_t *ret);
 extern void ea_refcount_free(ext2_refcount_t refcount);
 extern errcode_t ea_refcount_fetch(ext2_refcount_t refcount, ea_key_t ea_key,
diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index 8b6238e..eb73922 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -387,34 +387,71 @@
 	return 0;
 }
 
+static int alloc_ea_inode_refs(e2fsck_t ctx, struct problem_context *pctx)
+{
+	pctx->errcode = ea_refcount_create(0, &ctx->ea_inode_refs);
+	if (pctx->errcode) {
+		pctx->num = 4;
+		fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx);
+		ctx->flags |= E2F_FLAG_ABORT;
+		return 0;
+	}
+	return 1;
+}
+
 static void inc_ea_inode_refs(e2fsck_t ctx, struct problem_context *pctx,
 			      struct ext2_ext_attr_entry *first, void *end)
 {
 	struct ext2_ext_attr_entry *entry = first;
 	struct ext2_ext_attr_entry *np = EXT2_EXT_ATTR_NEXT(entry);
+	ea_value_t refs;
 
 	while ((void *) entry < end && (void *) np < end &&
 	       !EXT2_EXT_IS_LAST_ENTRY(entry)) {
 		if (!entry->e_value_inum)
 			goto next;
-		if (!ctx->ea_inode_refs) {
-			pctx->errcode = ea_refcount_create(0,
-							   &ctx->ea_inode_refs);
-			if (pctx->errcode) {
-				pctx->num = 4;
-				fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx);
-				ctx->flags |= E2F_FLAG_ABORT;
-				return;
-			}
-		}
-		ea_refcount_increment(ctx->ea_inode_refs, entry->e_value_inum,
-				      0);
+		if (!ctx->ea_inode_refs && !alloc_ea_inode_refs(ctx, pctx))
+			return;
+		ea_refcount_fetch(ctx->ea_inode_refs, entry->e_value_inum,
+				  &refs);
+		if (refs == EA_INODE_NO_REFS)
+			refs = 1;
+		else
+			refs += 1;
+		ea_refcount_store(ctx->ea_inode_refs, entry->e_value_inum, refs);
 	next:
 		entry = np;
 		np = EXT2_EXT_ATTR_NEXT(entry);
 	}
 }
 
+/*
+ * Make sure inode is tracked as EA inode. We use special EA_INODE_NO_REFS
+ * value if we didn't find any xattrs referencing this inode yet.
+ */
+static int track_ea_inode(e2fsck_t ctx, struct problem_context *pctx,
+			  ext2_ino_t ino)
+{
+	ea_value_t refs;
+
+	if (!ctx->ea_inode_refs && !alloc_ea_inode_refs(ctx, pctx))
+		return 0;
+
+	ea_refcount_fetch(ctx->ea_inode_refs, ino, &refs);
+	if (refs > 0)
+		return 1;
+
+	pctx->errcode = ea_refcount_store(ctx->ea_inode_refs, ino,
+					  EA_INODE_NO_REFS);
+	if (pctx->errcode) {
+		pctx->num = 5;
+		fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx);
+		ctx->flags |= E2F_FLAG_ABORT;
+		return 0;
+	}
+	return 1;
+}
+
 static void check_ea_in_inode(e2fsck_t ctx, struct problem_context *pctx,
 			      struct ea_quota *ea_ibody_quota)
 {
@@ -510,6 +547,12 @@
 		} else {
 			blk64_t quota_blocks;
 
+			if (!ext2fs_has_feature_ea_inode(sb) &&
+			    fix_problem(ctx, PR_1_EA_INODE_FEATURE, pctx)) {
+				ext2fs_set_feature_ea_inode(sb);
+				ext2fs_mark_super_dirty(ctx->fs);
+			}
+
 			problem = check_large_ea_inode(ctx, entry, pctx,
 						       &quota_blocks);
 			if (problem != 0)
@@ -1502,6 +1545,17 @@
 			e2fsck_write_inode(ctx, ino, inode, "pass1");
 		}
 
+		if (inode->i_flags & EXT4_EA_INODE_FL) {
+			if (!LINUX_S_ISREG(inode->i_mode) &&
+			    fix_problem(ctx, PR_1_EA_INODE_NONREG, &pctx)) {
+				inode->i_flags &= ~EXT4_EA_INODE_FL;
+				e2fsck_write_inode(ctx, ino, inode, "pass1");
+			}
+			if (inode->i_flags & EXT4_EA_INODE_FL)
+				if (!track_ea_inode(ctx, &pctx, ino))
+					continue;
+		}
+
 		/* Conflicting inlinedata/extents inode flags? */
 		if ((inode->i_flags & EXT4_INLINE_DATA_FL) &&
 		    (inode->i_flags & EXT4_EXTENTS_FL)) {
@@ -2622,6 +2676,12 @@
 			problem_t problem;
 			blk64_t entry_quota_blocks;
 
+			if (!ext2fs_has_feature_ea_inode(fs->super) &&
+			    fix_problem(ctx, PR_1_EA_INODE_FEATURE, pctx)) {
+				ext2fs_set_feature_ea_inode(fs->super);
+				ext2fs_mark_super_dirty(fs);
+			}
+
 			problem = check_large_ea_inode(ctx, entry, pctx,
 						       &entry_quota_blocks);
 			if (problem && fix_problem(ctx, problem, pctx))
diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c
index 08ab40f..036c002 100644
--- a/e2fsck/pass2.c
+++ b/e2fsck/pass2.c
@@ -1501,6 +1501,21 @@
 			problem = PR_2_NULL_NAME;
 		}
 
+		/*
+		 * Check if inode was tracked as EA inode and has actual
+		 * references from xattrs. In that case dir entry is likely
+		 * bogus and we want to clear it. The case of EA inode without
+		 * references from xattrs will be handled in pass 4.
+		 */
+		if (!problem && ctx->ea_inode_refs) {
+			ea_value_t refs;
+
+			ea_refcount_fetch(ctx->ea_inode_refs, dirent->inode,
+					  &refs);
+			if (refs && refs != EA_INODE_NO_REFS)
+				problem = PR_2_EA_INODE_DIR_LINK;
+		}
+
 		if (problem) {
 			if (fix_problem(ctx, problem, &cd->pctx)) {
 				dirent->inode = 0;
diff --git a/e2fsck/pass4.c b/e2fsck/pass4.c
index d2dda02..cf0cf7c 100644
--- a/e2fsck/pass4.c
+++ b/e2fsck/pass4.c
@@ -96,9 +96,10 @@
  * an xattr inode at all. Return immediately if EA_INODE flag is not set.
  */
 static void check_ea_inode(e2fsck_t ctx, ext2_ino_t i, ext2_ino_t *last_ino,
-			   struct ext2_inode_large *inode, __u16 *link_counted)
+			   struct ext2_inode_large *inode, __u16 *link_counted,
+			   ea_value_t actual_refs)
 {
-	__u64 actual_refs = 0;
+	struct problem_context pctx;
 	__u64 ref_count;
 
 	if (*last_ino != i) {
@@ -107,13 +108,26 @@
 				       "pass4: check_ea_inode");
 		*last_ino = i;
 	}
-	if (!(inode->i_flags & EXT4_EA_INODE_FL))
-		return;
 
-	if (ctx->ea_inode_refs)
-		ea_refcount_fetch(ctx->ea_inode_refs, i, &actual_refs);
-	if (!actual_refs)
+	clear_problem_context(&pctx);
+	pctx.ino = i;
+	pctx.inode = EXT2_INODE(inode);
+
+	/* No references to the inode from xattrs? */
+	if (actual_refs == EA_INODE_NO_REFS) {
+		/*
+		 * No references from directory hierarchy either? Inode will
+		 * will get attached to lost+found so clear EA_INODE_FL.
+		 * Otherwise this is likely a spuriously set flag so clear it.
+		 */
+		if (*link_counted == 0 ||
+		    fix_problem(ctx, PR_4_EA_INODE_SPURIOUS_FLAG, &pctx)) {
+			/* Clear EA_INODE_FL (likely a normal file) */
+			inode->i_flags &= ~EXT4_EA_INODE_FL;
+			e2fsck_write_inode(ctx, i, EXT2_INODE(inode), "pass4");
+		}
 		return;
+	}
 
 	/*
 	 * There are some attribute references, link_counted is now considered
@@ -127,10 +141,6 @@
 	 * However, their i_ctime and i_atime should be the same.
 	 */
 	if (ref_count != actual_refs && inode->i_ctime != inode->i_atime) {
-		struct problem_context pctx;
-
-		clear_problem_context(&pctx);
-		pctx.ino = i;
 		pctx.num = ref_count;
 		pctx.num2 = actual_refs;
 		if (fix_problem(ctx, PR_4_EA_INODE_REF_COUNT, &pctx)) {
@@ -188,6 +198,7 @@
 	/* Protect loop from wrap-around if s_inodes_count maxed */
 	for (i = 1; i <= fs->super->s_inodes_count && i > 0; i++) {
 		ext2_ino_t last_ino = 0;
+		ea_value_t ea_refs;
 		int isdir;
 
 		if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
@@ -211,13 +222,19 @@
 		ext2fs_icount_fetch(ctx->inode_link_info, i, &link_count);
 		ext2fs_icount_fetch(ctx->inode_count, i, &link_counted);
 
-		if (link_counted == 0) {
-			/*
-			 * link_counted is expected to be 0 for an ea_inode.
-			 * check_ea_inode() will update link_counted if
-			 * necessary.
-			 */
-			check_ea_inode(ctx, i, &last_ino, inode, &link_counted);
+		if (ctx->ea_inode_refs) {
+			ea_refcount_fetch(ctx->ea_inode_refs, i, &ea_refs);
+			if (ea_refs) {
+				/*
+				 * Final consolidation of EA inodes. We either
+				 * decide the inode is fine and set link_counted
+				 * to one, or we decide this is actually a
+				 * normal file and clear EA_INODE flag, or
+				 * decide the inode should just be deleted.
+				 */
+				check_ea_inode(ctx, i, &last_ino, inode,
+					       &link_counted, ea_refs);
+			}
 		}
 
 		if (link_counted == 0) {
diff --git a/e2fsck/problem.c b/e2fsck/problem.c
index 207ebbb..e433281 100644
--- a/e2fsck/problem.c
+++ b/e2fsck/problem.c
@@ -1309,6 +1309,16 @@
 	  N_("Orphan file @i %i is not in use, but contains data.  "),
 	  PROMPT_CLEAR, PR_PREEN_OK },
 
+	/* EA_INODE flag set on a non-regular file */
+	{ PR_1_EA_INODE_NONREG,
+	  N_("@i %i has the ea_inode flag set but is not a regular file.  "),
+	  PROMPT_CLEAR_FLAG, 0, 0, 0, 0 },
+
+	/* EA_INODE present but the file system is missing the ea_inode feature */
+	{ PR_1_EA_INODE_FEATURE,
+	  N_("@i %i references EA inode but @S is missing EA_INODE feature\n"),
+	  PROMPT_FIX, PR_PREEN_OK, 0, 0, 0 },
+
 	/* Pass 1b errors */
 
 	/* Pass 1B: Rescan for duplicate/bad blocks */
@@ -1860,6 +1870,10 @@
 	   N_("Duplicate filename @E found.  "),
 	   PROMPT_CLEAR, 0, 0, 0, 0 },
 
+	/* Directory filename is null */
+	{ PR_2_EA_INODE_DIR_LINK,
+	  N_("@E references EA @i %Di.\n"),
+	  PROMPT_CLEAR, 0, 0, 0, 0 },
 
 	/* Pass 3 errors */
 
@@ -2102,6 +2116,10 @@
 	  N_("@d @i %i ref count set to overflow but could be exact value %N.  "),
 	  PROMPT_FIX, PR_PREEN_OK, 0, 0, 0 },
 
+	{ PR_4_EA_INODE_SPURIOUS_FLAG,
+	  N_("Regular @f @i %i has EA_INODE flag set. "),
+	  PROMPT_CLEAR, PR_PREEN_OK, 0, 0, 0 },
+
 	/* Pass 5 errors */
 
 	/* Pass 5: Checking group summary information */
diff --git a/e2fsck/problem.h b/e2fsck/problem.h
index b47b0c6..ef15b8c 100644
--- a/e2fsck/problem.h
+++ b/e2fsck/problem.h
@@ -734,6 +734,12 @@
 /* Orphan file inode is not in use, but contains data */
 #define PR_1_ORPHAN_FILE_NOT_CLEAR		0x010090
 
+/* Inode has EA_INODE_FL set but is not a regular file */
+#define PR_1_EA_INODE_NONREG			0x010091
+
+/* Inode references EA inode but ea_inode feature is not enabled */
+#define PR_1_EA_INODE_FEATURE			0x010092
+
 /*
  * Pass 1b errors
  */
@@ -1061,6 +1067,9 @@
 /* Non-unique filename found, but can't rename */
 #define PR_2_NON_UNIQUE_FILE_NO_RENAME	0x020054
 
+/* EA inode referenced from directory */
+#define PR_2_EA_INODE_DIR_LINK 0x020055
+
 /*
  * Pass 3 errors
  */
@@ -1203,6 +1212,9 @@
 /* Directory ref count set to overflow but it doesn't have to be */
 #define PR_4_DIR_OVERFLOW_REF_COUNT	0x040007
 
+/* EA_INODE_FL set on normal file linked from directory hierarchy */
+#define PR_4_EA_INODE_SPURIOUS_FLAG	0x040008
+
 /*
  * Pass 5 errors
  */
diff --git a/e2fsck/super.c b/e2fsck/super.c
index 60c690c..d6bbb63 100644
--- a/e2fsck/super.c
+++ b/e2fsck/super.c
@@ -196,7 +196,7 @@
 	__u32				count;
 
 	if (!ext2fs_inode_has_valid_blocks2(fs, EXT2_INODE(inode)))
-		return 0;
+		goto release_acl;
 
 	pb.buf = block_buf + 3 * ctx->fs->blocksize;
 	pb.ctx = ctx;
@@ -235,7 +235,7 @@
 	if (pb.truncated_blocks)
 		ext2fs_iblk_sub_blocks(fs, EXT2_INODE(inode),
 				pb.truncated_blocks);
-
+release_acl:
 	blk = ext2fs_file_acl_block(fs, EXT2_INODE(inode));
 	if (blk) {
 		retval = ext2fs_adjust_ea_refcount3(fs, blk, block_buf, -1,
@@ -605,8 +605,9 @@
 		 * Update checksum to match expected buffer contents with
 		 * appropriate block number.
 		 */
-		tail->ob_checksum = ext2fs_do_orphan_file_block_csum(fs,
-				pd->ino, pd->generation, blk, pd->buf);
+		tail->ob_checksum =
+			ext2fs_cpu_to_le32(ext2fs_do_orphan_file_block_csum(fs,
+				    pd->ino, pd->generation, blk, pd->buf));
 	}
 	if (!pd->clear) {
 		pd->errcode = io_channel_read_blk64(fs->io, blk, 1,
diff --git a/e2fsck/unix.c b/e2fsck/unix.c
index de20b21..7768f0e 100644
--- a/e2fsck/unix.c
+++ b/e2fsck/unix.c
@@ -371,6 +371,10 @@
 	if (ctx->options & E2F_OPT_JOURNAL_ONLY)
 		goto skip;
 
+	if (ext2fs_has_feature_orphan_file(fs->super) &&
+	    ext2fs_has_feature_orphan_present(fs->super))
+		return;
+
 	lastcheck = ext2fs_get_tstamp(sb, s_lastcheck);
 	if (lastcheck > ctx->now)
 		lastcheck -= ctx->time_fudge;
diff --git a/e2fsprogs.lsm b/e2fsprogs.lsm
index 116edf6..7ff8749 100644
--- a/e2fsprogs.lsm
+++ b/e2fsprogs.lsm
@@ -1,15 +1,15 @@
 Begin3
 Title:          EXT2 Filesystem utilities
-Version:        1.47.1
-Entered-date:   2024-05-01
+Version:        1.47.2
+Entered-date:   2024-10-28
 Description:    The filesystem utilities for the EXT2, EXT3, and EXT4
 		filesystems, including e2fsck, mke2fs, dumpe2fs, and others.
 Keywords:       utilities, filesystem, Ext2fs, ext3, ext4
 Author:         tytso@mit.edu (Theodore Tso)
 Maintained-by:  tytso@mit.edu (Theodore Tso)
 Primary-site:   ftp.kernel.org /pub/linux/kernel/people/tytso/e2fsprogs
-                9704kB e2fsprogs-1.47.1.tar.gz
-                1kB    e2fsprogs-1.47.1.lsm
+                9732kB e2fsprogs-1.47.2.tar.gz
+                1kB    e2fsprogs-1.47.2.lsm
 pAlternate-site: download.sourceforge.net /pub/sourceforge/e2fsprogs
 Platforms:	linux 1.2.x/1.3.x/2.0.x/2.1.x/2.2.x/2.3.x/2.4.x/2.5.x/2.6.x/3.x/4.x/5.x/6.x
 Copying-policy: GPL-2/LGPL-2
diff --git a/e2fsprogs.spec b/e2fsprogs.spec
index b11e55b..f502fce 100644
--- a/e2fsprogs.spec
+++ b/e2fsprogs.spec
@@ -5,7 +5,7 @@
 
 Summary: Utilities for managing ext2/ext3/ext4 filesystems
 Name: e2fsprogs
-Version: 1.47.1
+Version: 1.47.2
 Release: 0
 License: GPLv2
 Group: System Environment/Base
diff --git a/lib/blkid/Android.bp b/lib/blkid/Android.bp
index 891c74a..89e39ab 100644
--- a/lib/blkid/Android.bp
+++ b/lib/blkid/Android.bp
@@ -38,6 +38,9 @@
     shared_libs: ["libext2_uuid"],
 
     target: {
+        darwin: {
+            enabled: true,
+        },
         windows: {
             enabled: true,
         },
diff --git a/lib/blkid/llseek.c b/lib/blkid/llseek.c
index 5929864..edb6432 100644
--- a/lib/blkid/llseek.c
+++ b/lib/blkid/llseek.c
@@ -52,7 +52,7 @@
 
 #if SIZEOF_LONG == SIZEOF_LONG_LONG
 
-#define llseek lseek
+#define my_llseek lseek
 
 #else /* SIZEOF_LONG != SIZEOF_LONG_LONG */
 
diff --git a/lib/config.h.in b/lib/config.h.in
index 04cec72..819c433 100644
--- a/lib/config.h.in
+++ b/lib/config.h.in
@@ -12,6 +12,9 @@
 /* Define to 1 for features for use by ext4 developers */
 #undef CONFIG_DEVELOPER_FEATURES
 
+/* Define to 1 to completely disable libarchive */
+#undef CONFIG_DISABLE_LIBARCHIVE
+
 /* Define to 1 if using dlopen to access libarchive */
 #undef CONFIG_DLOPEN_LIBARCHIVE
 
diff --git a/lib/e2p/Android.bp b/lib/e2p/Android.bp
index bed92c1..02825cd 100644
--- a/lib/e2p/Android.bp
+++ b/lib/e2p/Android.bp
@@ -15,6 +15,7 @@
     host_supported: true,
     ramdisk_available: true,
     vendor_ramdisk_available: true,
+    vendor_available: true,
     recovery_available: true,
     unique_host_soname: true,
     defaults: ["e2fsprogs-defaults"],
diff --git a/lib/et/Android.bp b/lib/et/Android.bp
index 565feb5..5d4a129 100644
--- a/lib/et/Android.bp
+++ b/lib/et/Android.bp
@@ -18,6 +18,7 @@
     ramdisk_available: true,
     vendor_ramdisk_available: true,
     recovery_available: true,
+    vendor_available: true,
     unique_host_soname: true,
     defaults: ["e2fsprogs-defaults"],
     srcs: [
diff --git a/lib/ext2fs/Android.bp b/lib/ext2fs/Android.bp
index db8b3b7..af4c2db 100644
--- a/lib/ext2fs/Android.bp
+++ b/lib/ext2fs/Android.bp
@@ -19,6 +19,7 @@
     host_supported: true,
     ramdisk_available: true,
     vendor_ramdisk_available: true,
+    vendor_available: true,
     recovery_available: true,
     unique_host_soname: true,
     defaults: ["e2fsprogs-defaults"],
diff --git a/lib/ext2fs/e2image.h b/lib/ext2fs/e2image.h
index 53b20cc..143e0dc 100644
--- a/lib/ext2fs/e2image.h
+++ b/lib/ext2fs/e2image.h
@@ -26,8 +26,9 @@
 
 	__u32	image_device;	/* Device number of image file */
 	__u32	image_inode;	/* Inode number of image file */
-	__u32	image_time;	/* Time of image creation */
-	__u32	image_reserved[8];
+	__u32	image_time_lo;	/* Time of image creation */
+	__u32	image_time_hi;	/* High bits of image test creation */
+	__u32	image_reserved[7];
 
 	__u32	offset_super;	/* Byte offset of the sb and descriptors */
 	__u32	offset_inode;	/* Byte offset of the inode table  */
diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
index 586141f..3a5eb73 100644
--- a/lib/ext2fs/ext2_fs.h
+++ b/lib/ext2fs/ext2_fs.h
@@ -1122,8 +1122,8 @@
 
 /* Structure at the tail of orphan block */
 struct ext4_orphan_block_tail {
-	__u32 ob_magic;
-	__u32 ob_checksum;
+	__le32 ob_magic;
+	__le32 ob_checksum;
 };
 
 /*
diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h
index 6e87829..ff22f66 100644
--- a/lib/ext2fs/ext2fs.h
+++ b/lib/ext2fs/ext2fs.h
@@ -585,7 +585,8 @@
  */
 #define EXT2_I_SIZE(i)	((i)->i_size | ((__u64) (i)->i_size_high << 32))
 
-static inline __u32 __encode_extra_time(time_t seconds, __u32 nsec)
+static inline __u32 __encode_extra_time(time_t seconds EXT2FS_ATTR((unused)),
+					__u32 nsec)
 {
 	__u32 extra = 0;
 
@@ -595,7 +596,8 @@
 #endif
 	return extra | (nsec << EXT4_EPOCH_BITS);
 }
-static inline time_t __decode_extra_sec(time_t seconds, __u32 extra)
+static inline time_t __decode_extra_sec(time_t seconds,
+					__u32 extra EXT2FS_ATTR((unused)))
 {
 #if (SIZEOF_TIME_T > 4)
 	if (extra & EXT4_EPOCH_MASK)
@@ -630,7 +632,8 @@
 		((struct ext2_inode_large *)(inode))->field ## _extra) :      \
 		(time_t)(inode)->field)
 
-static inline void __sb_set_tstamp(__u32 *lo, __u8 *hi, time_t seconds)
+static inline void __sb_set_tstamp(__u32 *lo, __u8 *hi EXT2FS_ATTR((unused)),
+				   time_t seconds)
 {
 	*lo = seconds & 0xffffffff;
 #if (SIZEOF_TIME_T > 4)
@@ -639,7 +642,7 @@
 	*hi = 0;
 #endif
 }
-static inline time_t __sb_get_tstamp(__u32 *lo, __u8 *hi)
+static inline time_t __sb_get_tstamp(__u32 *lo, __u8 *hi EXT2FS_ATTR((unused)))
 {
 #if (SIZEOF_TIME_T == 4)
 	return *lo;
diff --git a/lib/ext2fs/orphan.c b/lib/ext2fs/orphan.c
index 913eb9a..e256fd2 100644
--- a/lib/ext2fs/orphan.c
+++ b/lib/ext2fs/orphan.c
@@ -58,7 +58,7 @@
 	crc = ext2fs_crc32c_le(crc, (unsigned char *)buf,
 				inodes_per_ob * sizeof(__u32));
 
-	return ext2fs_cpu_to_le32(crc);
+	return crc;
 }
 
 struct mkorphan_info {
@@ -101,8 +101,9 @@
 			struct ext4_orphan_block_tail *tail;
 
 			tail = ext2fs_orphan_block_tail(fs, oi->buf);
-			tail->ob_checksum = ext2fs_do_orphan_file_block_csum(fs,
-				oi->ino, oi->generation, new_blk, oi->buf);
+			tail->ob_checksum =
+		ext2fs_cpu_to_le32(ext2fs_do_orphan_file_block_csum(fs,
+				    oi->ino, oi->generation, new_blk, oi->buf));
 		}
 		err = io_channel_write_blk64(fs->io, new_blk, 1, oi->buf);
 	} else	/* zerobuf is used to initialize new indirect blocks... */
@@ -249,13 +250,14 @@
 					    blk64_t blk, char *buf)
 {
 	struct ext4_orphan_block_tail *tail;
+	__u32 crc;
 
 	if (!ext2fs_has_feature_metadata_csum(fs->super))
 		return 0;
 
 	tail = ext2fs_orphan_block_tail(fs, buf);
-	return ext2fs_orphan_file_block_csum(fs, ino, blk, buf,
-					     &tail->ob_checksum);
+	return ext2fs_orphan_file_block_csum(fs, ino, blk, buf, &crc);
+	tail->ob_checksum = ext2fs_cpu_to_le32(crc);
 }
 
 int ext2fs_orphan_file_block_csum_verify(ext2_filsys fs, ext2_ino_t ino,
diff --git a/lib/ext2fs/qcow2.h b/lib/ext2fs/qcow2.h
index b649c9c..343e85a 100644
--- a/lib/ext2fs/qcow2.h
+++ b/lib/ext2fs/qcow2.h
@@ -24,6 +24,8 @@
  * %End-Header%
  */
 
+#include <ext2fs/ext2_types.h>
+
 /* Number of l2 tables in memory before writeback */
 #define L2_CACHE_PREALLOC	512
 
diff --git a/lib/ext2fs/rbtree.h b/lib/ext2fs/rbtree.h
index 790f5c1..b96e6f2 100644
--- a/lib/ext2fs/rbtree.h
+++ b/lib/ext2fs/rbtree.h
@@ -163,7 +163,7 @@
 extern struct rb_node *ext2fs_rb_last(const struct rb_root *);
 
 /* Fast replacement of a single node without remove/rebalance/add/rebalance */
-extern void ext2fs_rb_replace_node(struct rb_node *victim, struct rb_node *new,
+extern void ext2fs_rb_replace_node(struct rb_node *victim, struct rb_node *new_,
 				 struct rb_root *root);
 
 static inline void ext2fs_rb_link_node(struct rb_node * node,
diff --git a/lib/ext2fs/rw_bitmaps.c b/lib/ext2fs/rw_bitmaps.c
index 1fe65f7..1da75e4 100644
--- a/lib/ext2fs/rw_bitmaps.c
+++ b/lib/ext2fs/rw_bitmaps.c
@@ -557,7 +557,7 @@
 	 * MacOS, FreeBSD, etc.
 	 * ref: https://stackoverflow.com/questions/150355
 	 */
-	if (num_threads < 0)
+	if (num_threads <= 0)
 		num_threads = 4;
 
 	if ((unsigned) num_threads > fs->group_desc_count)
diff --git a/lib/ext2fs/tdb.c b/lib/ext2fs/tdb.c
index b07b291..98dc95d 100644
--- a/lib/ext2fs/tdb.c
+++ b/lib/ext2fs/tdb.c
@@ -110,7 +110,9 @@
 #endif
 #endif
 
+#if defined __STDC__ && defined __STDC_VERSION__ && __STDC_VERSION__ <= 201710L
 typedef int bool;
+#endif
 
 #include "tdb.h"
 
diff --git a/lib/support/Android.bp b/lib/support/Android.bp
index af9b28d..ded3d40 100644
--- a/lib/support/Android.bp
+++ b/lib/support/Android.bp
@@ -15,6 +15,7 @@
     host_supported: true,
     ramdisk_available: true,
     vendor_ramdisk_available: true,
+    vendor_available: true,
     recovery_available: true,
     unique_host_soname: true,
     defaults: ["e2fsprogs-defaults"],
diff --git a/lib/support/Makefile.in b/lib/support/Makefile.in
index b622909..3f26cd3 100644
--- a/lib/support/Makefile.in
+++ b/lib/support/Makefile.in
@@ -137,10 +137,11 @@
  $(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/hashmap.h \
  $(top_srcdir)/lib/ext2fs/bitops.h $(srcdir)/nls-enable.h
 print_fs_flags.o: $(srcdir)/print_fs_flags.c $(top_builddir)/lib/config.h \
- $(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
- $(top_builddir)/lib/ext2fs/ext2_types.h $(top_srcdir)/lib/ext2fs/ext2_fs.h \
- $(top_srcdir)/lib/ext2fs/ext3_extents.h $(top_srcdir)/lib/et/com_err.h \
- $(top_srcdir)/lib/ext2fs/ext2_io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+ $(top_builddir)/lib/dirpaths.h $(srcdir)/print_fs_flags.h \
+ $(top_srcdir)/lib/ext2fs/ext2fs.h $(top_builddir)/lib/ext2fs/ext2_types.h \
+ $(top_srcdir)/lib/ext2fs/ext2_fs.h $(top_srcdir)/lib/ext2fs/ext3_extents.h \
+ $(top_srcdir)/lib/et/com_err.h $(top_srcdir)/lib/ext2fs/ext2_io.h \
+ $(top_builddir)/lib/ext2fs/ext2_err.h \
  $(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/hashmap.h \
  $(top_srcdir)/lib/ext2fs/bitops.h
 profile.o: $(srcdir)/profile.c $(top_builddir)/lib/config.h \
diff --git a/lib/support/print_fs_flags.c b/lib/support/print_fs_flags.c
index f47cd66..093820f 100644
--- a/lib/support/print_fs_flags.c
+++ b/lib/support/print_fs_flags.c
@@ -14,6 +14,7 @@
 #include "config.h"
 #include <stdio.h>
 
+#include "print_fs_flags.h"
 #include "ext2fs/ext2fs.h"
 
 struct flags_name {
diff --git a/lib/support/quotaio.h b/lib/support/quotaio.h
index 390f7dc..6152416 100644
--- a/lib/support/quotaio.h
+++ b/lib/support/quotaio.h
@@ -101,8 +101,8 @@
 
 /* Generic information about quotafile */
 struct util_dqinfo {
-	time_t dqi_bgrace;	/* Block grace time for given quotafile */
-	time_t dqi_igrace;	/* Inode grace time for given quotafile */
+	__u32 dqi_bgrace;	/* Block grace time for given quotafile */
+	__u32 dqi_igrace;	/* Inode grace time for given quotafile */
 	union {
 		struct v2_mem_dqinfo v2_mdqi;
 	} u;			/* Format specific info about quotafile */
@@ -137,8 +137,8 @@
 	qsize_t dqb_bhardlimit;
 	qsize_t dqb_bsoftlimit;
 	qsize_t dqb_curspace;
-	time_t dqb_btime;
-	time_t dqb_itime;
+	__u64 dqb_btime;
+	__u64 dqb_itime;
 	union {
 		struct v2_mem_dqblk v2_mdqb;
 	} u;			/* Format specific dquot information */
diff --git a/lib/uuid/Android.bp b/lib/uuid/Android.bp
index 3e6048d..279592b 100644
--- a/lib/uuid/Android.bp
+++ b/lib/uuid/Android.bp
@@ -40,6 +40,9 @@
         "uuid_time.c",
     ],
     target: {
+        darwin: {
+            enabled: true,
+        },
         windows: {
             enabled: true,
         },
diff --git a/misc/Android.bp b/misc/Android.bp
index 0656bf4..4edac23 100644
--- a/misc/Android.bp
+++ b/misc/Android.bp
@@ -18,6 +18,7 @@
     name: "libext2_misc",
     host_supported: true,
     recovery_available: true,
+    vendor_available: true,
     defaults: ["e2fsprogs-defaults"],
 
     target: {
@@ -58,6 +59,7 @@
 cc_binary {
     name: "mke2fs",
     host_supported: true,
+    vendor_available: true,
     defaults: ["mke2fs_defaults"],
     target: {
         host: {
@@ -126,7 +128,7 @@
             symlinks: ["mkfs.ext4.microdroid"],
         },
     },
-    installable: false,
+    no_full_install: true,
     stem: "mke2fs",
     visibility: ["//packages/modules/Virtualization/microdroid"],
 }
@@ -191,9 +193,8 @@
 //########################################################################
 // Build badblocks
 
-cc_binary {
+cc_binary_host {
     name: "badblocks",
-    host_supported: true,
     defaults: ["e2fsprogs-defaults"],
 
     srcs: ["badblocks.c"],
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 37c2699..8769620 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -107,6 +107,7 @@
 		$(srcdir)/filefrag.c $(srcdir)/base_device.c \
 		$(srcdir)/ismounted.c $(srcdir)/e2undo.c \
 		$(srcdir)/e2freefrag.c $(srcdir)/create_inode.c \
+		$(srcdir)/create_inode_libarchive.c \
 		$(srcdir)/fuse2fs.c $(srcdir)/e2fuzz.c \
 		$(srcdir)/check_fuzzer.c \
 		$(srcdir)/../debugfs/journal.c $(srcdir)/../e2fsck/revoke.c \
@@ -857,16 +858,16 @@
  $(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/hashmap.h \
  $(top_srcdir)/lib/ext2fs/bitops.h $(top_srcdir)/lib/ext2fs/fiemap.h \
  $(srcdir)/create_inode.h $(top_srcdir)/lib/e2p/e2p.h \
- $(top_srcdir)/lib/support/nls-enable.h
+ $(top_srcdir)/lib/support/nls-enable.h $(srcdir)/create_inode_libarchive.h
 create_inode_libarchive.o: $(srcdir)/create_inode_libarchive.c \
- $(top_builddir)/lib/config.h \
- $(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
- $(top_builddir)/lib/ext2fs/ext2_types.h $(top_srcdir)/lib/ext2fs/ext2_fs.h \
- $(top_srcdir)/lib/ext2fs/ext3_extents.h $(top_srcdir)/lib/et/com_err.h \
- $(top_srcdir)/lib/ext2fs/ext2_io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+ $(top_builddir)/lib/config.h $(top_builddir)/lib/dirpaths.h \
+ $(top_builddir)/lib/ext2fs/ext2_types.h $(srcdir)/create_inode.h \
+ $(top_srcdir)/lib/et/com_err.h $(top_srcdir)/lib/e2p/e2p.h \
+ $(top_srcdir)/lib/ext2fs/ext2_fs.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
+ $(top_srcdir)/lib/ext2fs/ext3_extents.h $(top_srcdir)/lib/ext2fs/ext2_io.h \
+ $(top_builddir)/lib/ext2fs/ext2_err.h \
  $(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/hashmap.h \
- $(top_srcdir)/lib/ext2fs/bitops.h $(top_srcdir)/lib/ext2fs/fiemap.h \
- $(srcdir)/create_inode.h $(top_srcdir)/lib/e2p/e2p.h \
+ $(top_srcdir)/lib/ext2fs/bitops.h $(srcdir)/create_inode_libarchive.h \
  $(top_srcdir)/lib/support/nls-enable.h
 fuse2fs.o: $(srcdir)/fuse2fs.c $(top_builddir)/lib/config.h \
  $(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
diff --git a/misc/badblocks.c b/misc/badblocks.c
index 2b5ff6d..2fc1b0d 100644
--- a/misc/badblocks.c
+++ b/misc/badblocks.c
@@ -1119,13 +1119,13 @@
 			v_flag++;
 			break;
 		case 'w':
-			if (w_flag)
+			if (w_flag && w_flag != 1)
 				exclusive_usage();
 			test_func = test_rw;
 			w_flag = 1;
 			break;
 		case 'n':
-			if (w_flag)
+			if (w_flag && w_flag != 2)
 				exclusive_usage();
 			test_func = test_nd;
 			w_flag = 2;
diff --git a/misc/create_inode_libarchive.c b/misc/create_inode_libarchive.c
index 8705eb1..d14efe8 100644
--- a/misc/create_inode_libarchive.c
+++ b/misc/create_inode_libarchive.c
@@ -13,20 +13,50 @@
 #define _GNU_SOURCE 1
 
 #include "config.h"
-#include <ext2fs/ext2_types.h>
 #include "create_inode.h"
 #include "create_inode_libarchive.h"
 #include "support/nls-enable.h"
 
-#ifdef HAVE_ARCHIVE_H
+#ifdef CONFIG_DISABLE_LIBARCHIVE
+
+/* If ./configure was run with --without-libarchive, then only
+ * __populate_fs_from_tar() remains in this file and will return an error. */
+errcode_t __populate_fs_from_tar(ext2_filsys, ext2_ino_t, const char *,
+                                 ext2_ino_t, struct hdlinks_s *,
+                                 struct file_info *,
+                                 struct fs_ops_callbacks *) {
+  com_err(__func__, 0,
+          _("you need to compile e2fsprogs without --without-libarchive"
+            "be able to process tarballs"));
+  return 1;
+}
+
+#else
+
+/* If ./configure was NOT run with --without-libarchive, then build with
+ * support for dlopen()-ing libarchive at runtime. This will also work even
+ * if archive.h is not available at compile-time. See the comment below. */
 
 /* 64KiB is the minimum blksize to best minimize system call overhead. */
 //#define COPY_FILE_BUFLEN 65536
 //#define COPY_FILE_BUFLEN 1048576
 #define COPY_FILE_BUFLEN 16777216
 
+/* If archive.h was found, include it as usual. To support easier
+ * bootstrapping, also allow compilation without archive.h present by
+ * declaring the necessary opaque structs and preprocessor definitions. */
+#ifdef HAVE_ARCHIVE_H
 #include <archive.h>
 #include <archive_entry.h>
+#else
+struct archive;
+struct archive_entry;
+#define	ARCHIVE_EOF	  1	/* Found end of archive. */
+#define	ARCHIVE_OK	  0	/* Operation was successful. */
+#include <unistd.h>  /* ssize_t */
+typedef ssize_t la_ssize_t;
+#endif /* HAVE_ARCHIVE_H */
+
 #include <libgen.h>
 #include <locale.h>
 
@@ -175,7 +205,7 @@
 
 	return 1;
 }
-#endif
+#endif /* CONFIG_DLOPEN_LIBARCHIVE */
 
 static errcode_t __find_path(ext2_filsys fs, ext2_ino_t root, const char *name,
 			     ext2_ino_t *inode)
@@ -442,7 +472,7 @@
 	dl_archive_entry_xattr_reset(entry);
 	while (dl_archive_entry_xattr_next(entry, &name, &value, &value_size) ==
 	       ARCHIVE_OK) {
-		if (strcmp(name, "security.capability") != 0)
+		if (strcmp(name, "security.capability") != 0 && strcmp(name, "gnu.translator"))
 			continue;
 
 		retval = ext2fs_xattr_set(handle, name, value, value_size);
@@ -541,7 +571,6 @@
 	}
 	return 0;
 }
-#endif
 
 errcode_t __populate_fs_from_tar(ext2_filsys fs, ext2_ino_t root_ino,
 				 const char *source_tar, ext2_ino_t root,
@@ -549,12 +578,6 @@
 				 struct file_info *target,
 				 struct fs_ops_callbacks *fs_callbacks)
 {
-#ifndef HAVE_ARCHIVE_H
-	com_err(__func__, 0,
-		_("you need to compile e2fsprogs with libarchive to "
-		  "be able to process tarballs"));
-	return 1;
-#else
 	char *path2, *path3, *dir, *name;
 	unsigned int dir_exists;
 	struct archive *a;
@@ -700,5 +723,6 @@
 	uselocale(old_locale);
 	freelocale(archive_locale);
 	return retval;
-#endif
 }
+
+#endif /* CONFIG_DISABLE_LIBARCHIVE */
diff --git a/misc/e2image.8.in b/misc/e2image.8.in
index 90ea0c2..384ef30 100644
--- a/misc/e2image.8.in
+++ b/misc/e2image.8.in
@@ -55,7 +55,7 @@
 It is a very good idea to create image files for all file systems on a
 system and save the partition layout (which can be generated using the
 .B fdisk \-l
-command) at regular intervals --- at boot time, and/or every week or so.
+command) at regular intervals \(em at boot time, and/or every week or so.
 The image file should be stored on some file system other than
 the file system whose data it contains, to ensure that this data is
 accessible in the case where the file system has been badly damaged.
@@ -127,7 +127,7 @@
 with a particular blocksize. If the superblock is not found, e2image will
 terminate with a fatal error.
 .TP
-.BI \-c
+.B \-c
 Compare each block to be copied from the source
 .I device
 to the corresponding block in the target
@@ -216,7 +216,7 @@
 .BR dumpe2fs (8),
 .BR e2fsck (8),
 .BR losetup (8),
-etc. and can be run directly on the raw image file.  In order to minimize
+etc. can be run directly on the raw image file.  In order to minimize
 the amount of disk space consumed by the raw image file, it is
 created as a sparse file.  (Beware of copying or
 compressing/decompressing this file with utilities that don't understand
@@ -230,7 +230,6 @@
 .B hda1
 with the appropriate device for your system):
 .PP
-.br
 	\fBe2image \-r /dev/hda1 \- | bzip2 > hda1.e2i.bz2\fR
 .PP
 This will only send the metadata information, without any data blocks.
@@ -260,10 +259,9 @@
 .B hda1
 with the appropriate device for your system):
 .PP
+\&	\fBe2image \-Q /dev/hda1 hda1.qcow2\fR
 .br
-\	\fBe2image \-Q /dev/hda1 hda1.qcow2\fR
-.br
-\	\fBbzip2 -z hda1.qcow2\fR
+\&	\fBbzip2 -z hda1.qcow2\fR
 .PP
 This will only send the metadata information, without any data blocks.
 As described for
@@ -280,8 +278,7 @@
 .PP
 You can convert a .qcow2 image into a raw image with:
 .PP
-.br
-\	\fBe2image \-r hda1.qcow2 hda1.raw\fR
+\&	\fBe2image \-r hda1.qcow2 hda1.raw\fR
 .br
 .PP
 This can be useful to write a QCOW2 image containing all data to a
@@ -305,15 +302,13 @@
 image of a whole hard drive that contains an ext2 fs in a partition
 starting at 1 MiB, you can clone that image to a block device with:
 .PP
-.br
-\	\fBe2image \-aro 1048576 img /dev/sda1\fR
+\&	\fBe2image \-aro 1048576 img /dev/sda1\fR
 .br
 .PP
 Or you can clone a file system from a block device into an image file,
 leaving room in the first MiB for a partition table with:
 .PP
-.br
-\	\fBe2image -arO 1048576 /dev/sda1 img\fR
+\&	\fBe2image -arO 1048576 /dev/sda1 img\fR
 .br
 .PP
 If you specify at least one offset, and only one file, an in-place
diff --git a/misc/e2image.c b/misc/e2image.c
index 1ae0300..a926724 100644
--- a/misc/e2image.c
+++ b/misc/e2image.c
@@ -239,6 +239,7 @@
 	struct ext2_image_hdr	hdr;
 	struct stat		st;
 	errcode_t		retval;
+	time_t			now = time(0);
 
 	write_header(fd, NULL, sizeof(struct ext2_image_hdr), fs->blocksize);
 	memset(&hdr, 0, sizeof(struct ext2_image_hdr));
@@ -292,7 +293,12 @@
 	}
 	memcpy(hdr.fs_uuid, fs->super->s_uuid, sizeof(hdr.fs_uuid));
 
-	hdr.image_time = ext2fs_cpu_to_le32(time(0));
+	hdr.image_time_lo = ext2fs_cpu_to_le32(now & 0xFFFFFFFF);
+#if (SIZEOF_TIME_T > 4)
+	hdr.image_time_hi = ext2fs_cpu_to_le32(now >> 32);
+#else
+	hdr.image_time_hi = 0;
+#endif
 	write_header(fd, &hdr, sizeof(struct ext2_image_hdr), fs->blocksize);
 }
 
diff --git a/misc/e4defrag.c b/misc/e4defrag.c
index e3011d7..5bfa6ff 100644
--- a/misc/e4defrag.c
+++ b/misc/e4defrag.c
@@ -1206,9 +1206,8 @@
 
 	if (mode_flag & DETAIL) {
 		/* Print statistic info */
-		sprintf(msg_buffer, "[%u/%u]%.*s",
-				defraged_file_count, total_count,
-			PATH_MAX, file);
+		snprintf(msg_buffer, sizeof(msg_buffer), "[%u/%u]%.*s",
+			 defraged_file_count, total_count, PATH_MAX, file);
 		if (current_uid == ROOT_UID) {
 			if (strlen(msg_buffer) > 40)
 				printf("\033[79;0H\033[K%s\n"
diff --git a/misc/ext4.5.in b/misc/ext4.5.in
index c835a34..e909fd1 100644
--- a/misc/ext4.5.in
+++ b/misc/ext4.5.in
@@ -1,3 +1,4 @@
+'\" t
 .\" -*- nroff -*-
 .\" Copyright 1993, 1994, 1995 by Theodore Ts'o.  All Rights Reserved.
 .\" This file may be copied under the terms of the GNU Public License.
@@ -189,7 +190,7 @@
 option to
 .BR mke2fs (8)
 or
-.BR tune2fs(8) .
+.BR tune2fs 8) .
 .TP
 .B large_dir
 .br
@@ -244,6 +245,13 @@
 protect the file system from being multiply mounted and is useful in
 shared storage environments.
 .TP
+.B orphan_file
+.br
+This ext4 feature fixes a potential scalability bottleneck for workloads
+that are doing a large number of truncate or file extensions in
+parallel.  It is supported by Linux kernels starting version 5.15, and
+by e2fsprogs starting with version 1.47.0.
+.TP
 .B project
 .br
 This ext4 feature provides project quota support. With this feature,
@@ -455,7 +463,7 @@
 option to print out where the superblocks exist, supposing
 .B mke2fs
 is supplied with arguments that are consistent with the file system's layout
-(e.g. blocksize, blocks per group,
+(e.g., blocksize, blocks per group,
 .BR sparse_super ,
 etc.).
 .IP
@@ -516,7 +524,7 @@
 .B data_err=abort
 Abort the journal if an error occurs in a file data buffer in ordered mode.
 .TP
-.BR barrier=0 " / " barrier=1 "
+.BR barrier=0 " / " barrier=1
 This disables / enables the use of write barriers in the jbd code.  barrier=0
 disables, barrier=1 enables (default). This also requires an IO stack which can
 support barriers, and if jbd gets an error on a barrier write, it will disable
@@ -688,7 +696,7 @@
 beyond the specified limit in kilobytes will cause an ENOSPC error. This is
 useful in memory-constrained environments, where a very large directory can
 cause severe performance problems or even provoke the Out Of Memory killer. (For
-example, if there is only 512\ MB memory available, a 176\ MB directory may
+example, if there is only 512\~MiB memory available, a 176\~MiB directory may
 seriously cramp the system's style.)
 .TP
 .B i_version
@@ -712,27 +720,27 @@
 .BR chattr (1)
 utility:
 .sp
-.BR a " - append only"
+.BR a " \- append only"
 .sp
-.BR A " - no atime updates"
+.BR A " \- no atime updates"
 .sp
-.BR d " - no dump"
+.BR d " \- no dump"
 .sp
-.BR D " - synchronous directory updates"
+.BR D " \- synchronous directory updates"
 .sp
-.BR i " - immutable"
+.BR i " \- immutable"
 .sp
-.BR S " - synchronous updates"
+.BR S " \- synchronous updates"
 .sp
-.BR u " - undeletable"
+.BR u " \- undeletable"
 .sp
 In addition, the ext3 and ext4 file systems support the following flag:
 .sp
-.BR j " - data journaling"
+.BR j " \- data journaling"
 .sp
 Finally, the ext4 file system also supports the following flag:
 .sp
-.BR e " - extents format"
+.BR e " \- extents format"
 .sp
 For descriptions of these attribute flags, please refer to the
 .BR chattr (1)
@@ -746,49 +754,49 @@
 that some distributions may have backported features into older kernels;
 in particular the kernel versions in certain "enterprise distributions"
 can be extremely misleading.
-.IP "\fBfiletype\fR" 2in
+.IP "\fBfiletype\fR" 2i
 ext2, 2.2.0
-.IP "\fBsparse_super\fR" 2in
+.IP "\fBsparse_super\fR" 2i
 ext2, 2.2.0
-.IP "\fBlarge_file\fR" 2in
+.IP "\fBlarge_file\fR" 2i
 ext2, 2.2.0
-.IP "\fBhas_journal\fR" 2in
+.IP "\fBhas_journal\fR" 2i
 ext3, 2.4.15
-.IP "\fBext_attr\fR" 2in
+.IP "\fBext_attr\fR" 2i
 ext2/ext3, 2.6.0
-.IP "\fBdir_index\fR" 2in
+.IP "\fBdir_index\fR" 2i
 ext3, 2.6.0
-.IP "\fBresize_inode\fR" 2in
+.IP "\fBresize_inode\fR" 2i
 ext3, 2.6.10 (online resizing)
-.IP "\fB64bit\fR" 2in
+.IP "\fB64bit\fR" 2i
 ext4, 2.6.28
-.IP "\fBdir_nlink\fR" 2in
+.IP "\fBdir_nlink\fR" 2i
 ext4, 2.6.28
-.IP "\fBextent\fR" 2in
+.IP "\fBextent\fR" 2i
 ext4, 2.6.28
-.IP "\fBextra_isize\fR" 2in
+.IP "\fBextra_isize\fR" 2i
 ext4, 2.6.28
-.IP "\fBflex_bg\fR" 2in
+.IP "\fBflex_bg\fR" 2i
 ext4, 2.6.28
-.IP "\fBhuge_file\fR" 2in
+.IP "\fBhuge_file\fR" 2i
 ext4, 2.6.28
-.IP "\fBmeta_bg\fR" 2in
+.IP "\fBmeta_bg\fR" 2i
 ext4, 2.6.28
-.IP "\fBuninit_bg\fR" 2in
+.IP "\fBuninit_bg\fR" 2i
 ext4, 2.6.28
-.IP "\fBmmp\fR" 2in
+.IP "\fBmmp\fR" 2i
 ext4, 3.0
-.IP "\fBbigalloc\fR" 2in
+.IP "\fBbigalloc\fR" 2i
 ext4, 3.2
-.IP "\fBquota\fR" 2in
+.IP "\fBquota\fR" 2i
 ext4, 3.6
-.IP "\fBinline_data\fR" 2in
+.IP "\fBinline_data\fR" 2i
 ext4, 3.8
-.IP "\fBsparse_super2\fR" 2in
+.IP "\fBsparse_super2\fR" 2i
 ext4, 3.16
-.IP "\fBmetadata_csum\fR" 2in
+.IP "\fBmetadata_csum\fR" 2i
 ext4, 3.18
-.IP "\fBencrypt\fR" 2in
+.IP "\fBencrypt\fR" 2i
 ext4, 4.1
 .IP "\fBmetadata_csum_seed\fR" 2i
 ext4, 4.4
diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c
index 56a0d54..a6390ab 100644
--- a/misc/fuse2fs.c
+++ b/misc/fuse2fs.c
@@ -26,7 +26,23 @@
 #endif
 #include <sys/ioctl.h>
 #include <unistd.h>
+#ifdef __SET_FOB_FOR_FUSE
+# error Do not set magic value __SET_FOB_FOR_FUSE!!!!
+#endif
+#ifndef _FILE_OFFSET_BITS
+/*
+ * Old versions of libfuse (e.g. Debian 2.9.9 package) required that the build
+ * system set _FILE_OFFSET_BITS explicitly, even if doing so isn't required to
+ * get a 64-bit off_t.  AC_SYS_LARGEFILE doesn't set any _FILE_OFFSET_BITS if
+ * it's not required (such as on aarch64), so we must inject it here.
+ */
+# define __SET_FOB_FOR_FUSE
+# define _FILE_OFFSET_BITS 64
+#endif /* _FILE_OFFSET_BITS */
 #include <fuse.h>
+#ifdef __SET_FOB_FOR_FUSE
+# undef _FILE_OFFSET_BITS
+#endif /* __SET_FOB_FOR_FUSE */
 #include <inttypes.h>
 #include "ext2fs/ext2fs.h"
 #include "ext2fs/ext2_fs.h"
@@ -3759,7 +3775,7 @@
 	"\n",
 			outargs->argv[0]);
 		if (key == FUSE2FS_HELPFULL) {
-			fuse_opt_add_arg(outargs, "-ho");
+			fuse_opt_add_arg(outargs, "-h");
 			fuse_main(outargs->argc, outargs->argv, &fs_ops, NULL);
 		} else {
 			fprintf(stderr, "Try --helpfull to get a list of "
diff --git a/misc/lsattr.1.in b/misc/lsattr.1.in
index 4d02a95..9884a4d 100644
--- a/misc/lsattr.1.in
+++ b/misc/lsattr.1.in
@@ -1,7 +1,7 @@
 .\" -*- nroff -*-
 .TH LSATTR 1 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@"
 .SH NAME
-lsattr \- list file attributes on a Linux second extended file system
+lsattr \- list ext2/ext3/ext4 file attributes
 .SH SYNOPSIS
 .B lsattr
 [
@@ -12,7 +12,7 @@
 ]
 .SH DESCRIPTION
 .B lsattr
-lists the file attributes on a second extended file system.  See
+lists the file attributes on an ext2/ext3/ext4 file system.  See
 .BR chattr (1)
 for a description of the attributes and what they mean.
 .SH OPTIONS
diff --git a/misc/mke2fs.8.in b/misc/mke2fs.8.in
index c12b607..4ff564b 100644
--- a/misc/mke2fs.8.in
+++ b/misc/mke2fs.8.in
@@ -74,10 +74,6 @@
 .B \-q
 ]
 [
-.B \-r
-.I fs-revision-level
-]
-[
 .B \-E
 .I extended-options
 ]
@@ -284,6 +280,21 @@
 The following extended options are supported:
 .RS 1.2i
 .TP
+.B assume_storage_prezeroed\fR[\fB= \fI<0 to disable, 1 to enable>\fR]
+If enabled,
+.BR mke2fs
+assumes that the storage device has been prezeroed, skips zeroing the journal
+and inode tables, and annotates the block group flags to signal that the inode
+table has been zeroed.
+.TP
+.B discard
+Attempt to discard blocks at mkfs time (discarding blocks initially is useful
+on solid state devices and sparse / thin-provisioned storage). When the device
+advertises that discard also zeroes data (any subsequent read after the discard
+and before write returns zero), then mark all not-yet-zeroed inode tables as
+zeroed. This significantly speeds up file system initialization. This is set
+as default.
+.TP
 .BI encoding= encoding-name
 Enable the
 .I casefold
@@ -309,6 +320,24 @@
 .I strict
 flag is disabled.
 .TP
+.B lazy_itable_init\fR[\fB= \fI<0 to disable, 1 to enable>\fR]
+If enabled and the uninit_bg feature is enabled, the inode table will
+not be fully initialized by
+.BR mke2fs .
+This speeds up file system
+initialization noticeably, but it requires the kernel to finish
+initializing the file system in the background when the file system is
+first mounted.  If the option value is omitted, it defaults to 1 to
+enable lazy inode table zeroing.
+.TP
+.B lazy_journal_init\fR[\fB= \fI<0 to disable, 1 to enable>\fR]
+If enabled, the journal inode will not be fully zeroed out by
+.BR mke2fs .
+This speeds up file system initialization noticeably, but carries some
+small risk if the system crashes before the journal has been overwritten
+entirely one time.  If the option value is omitted, it defaults to 1 to
+enable lazy journal inode zeroing.
+.TP
 .BI mmp_update_interval= interval
 Adjust the initial MMP update interval to
 .I interval
@@ -318,6 +347,80 @@
 be less than 300 seconds.  Requires that the
 .B mmp
 feature be enabled.
+.B nodiscard
+Do not attempt to discard blocks at mkfs time.
+.TP
+.B no_copy_xattrs
+Normally
+.B mke2fs
+will copy the extended attributes of the files in the directory
+hierarchy specified via the (optional)
+.B \-d
+option.  This will disable the copy and leaves the files in the newly
+created file system without any extended attributes.
+.TP
+.BI num_backup_sb= <0|1|2>
+If the
+.B sparse_super2
+file system feature is enabled this option controls whether there will
+be 0, 1, or 2 backup superblocks created in the file system.
+.TP
+.BI offset= offset
+Create the file system at an offset from the beginning of the device or
+file.  This can be useful when creating disk images for virtual machines.
+.TP
+.TP
+.BI orphan_file_size= size
+Set size of the file for tracking unlinked but still open inodes and inodes
+with truncate in progress. Larger file allows for better scalability, reserving
+a few blocks per cpu is ideal.
+.TP
+.B packed_meta_blocks\fR[\fB= \fI<0 to disable, 1 to enable>\fR]
+Place the allocation bitmaps and the inode table at the beginning of the
+disk.  This option requires that the flex_bg file system feature to be
+enabled in order for it to have effect, and will also create the journal
+at the beginning of the file system.  This option is useful for flash
+devices that use SLC flash at the beginning of the disk.
+It also maximizes the range of contiguous data blocks, which
+can be useful for certain specialized use cases, such as supported
+Shingled Drives.
+.TP
+.B quotatype
+Specify the which  quota types (usrquota, grpquota, prjquota) which
+should be enabled in the created file system.  The argument of this
+extended option should be a colon separated list.  This option has
+effect only if the
+.B quota
+feature is set.   The default quota types to be initialized if this
+option is not specified is both user and group quotas.  If the project
+feature is enabled that project quotas will be initialized as well.
+.TP
+.BI resize= max-online-resize
+Reserve enough space so that the block group descriptor table can grow
+to support a file system that has
+.I max-online-resize
+blocks.
+.TP
+.BI revision= fs-revision
+Specify the file system revision number.   Revision 0 file systems
+provide compatibility with pre-1.2 Linux kernels (dating from before
+1995).   This is only needed for testing or people who want to use
+very early, historical Linux systems.  The current default (supported
+by all modern Linux systems) is revision 1.
+.TP
+.BI root_owner [=uid:gid]
+Specify the numeric user and group ID of the root directory.  If no UID:GID
+is specified, use the user and group ID of the user running \fBmke2fs\fR.
+In \fBmke2fs\fR 1.42 and earlier the UID and GID of the root directory were
+set by default to the UID and GID of the user running the mke2fs command.
+The \fBroot_owner=\fR option allows explicitly specifying these values,
+and avoid side-effects for users that do not expect the contents of the
+file system to change based on the user running \fBmke2fs\fR.
+.TP
+.BI root_perms [=permissions]
+Specify the root directory permissions in octal format. If no permissions
+are specified then the root directory permissions would be set in accordance with
+the default filesystem umask.
 .TP
 .BI stride= stride-size
 Configure the file system for a RAID array with
@@ -339,109 +442,9 @@
 This allows the block allocator to prevent read-modify-write of the
 parity in a RAID stripe if possible when the data is written.
 .TP
-.BI offset= offset
-Create the file system at an offset from the beginning of the device or
-file.  This can be useful when creating disk images for virtual machines.
-.TP
-.BI resize= max-online-resize
-Reserve enough space so that the block group descriptor table can grow
-to support a file system that has
-.I max-online-resize
-blocks.
-.TP
-.B lazy_itable_init\fR[\fB= \fI<0 to disable, 1 to enable>\fR]
-If enabled and the uninit_bg feature is enabled, the inode table will
-not be fully initialized by
-.BR mke2fs .
-This speeds up file system
-initialization noticeably, but it requires the kernel to finish
-initializing the file system in the background when the file system is
-first mounted.  If the option value is omitted, it defaults to 1 to
-enable lazy inode table zeroing.
-.TP
-.B lazy_journal_init\fR[\fB= \fI<0 to disable, 1 to enable>\fR]
-If enabled, the journal inode will not be fully zeroed out by
-.BR mke2fs .
-This speeds up file system initialization noticeably, but carries some
-small risk if the system crashes before the journal has been overwritten
-entirely one time.  If the option value is omitted, it defaults to 1 to
-enable lazy journal inode zeroing.
-.TP
-.B assume_storage_prezeroed\fR[\fB= \fI<0 to disable, 1 to enable>\fR]
-If enabled,
-.BR mke2fs
-assumes that the storage device has been prezeroed, skips zeroing the journal
-and inode tables, and annotates the block group flags to signal that the inode
-table has been zeroed.
-.TP
-.B no_copy_xattrs
-Normally
-.B mke2fs
-will copy the extended attributes of the files in the directory
-hierarchy specified via the (optional)
-.B \-d
-option.  This will disable the copy and leaves the files in the newly
-created file system without any extended attributes.
-.TP
-.BI num_backup_sb= <0|1|2>
-If the
-.B sparse_super2
-file system feature is enabled this option controls whether there will
-be 0, 1, or 2 backup superblocks created in the file system.
-.TP
-.B packed_meta_blocks\fR[\fB= \fI<0 to disable, 1 to enable>\fR]
-Place the allocation bitmaps and the inode table at the beginning of the
-disk.  This option requires that the flex_bg file system feature to be
-enabled in order for it to have effect, and will also create the journal
-at the beginning of the file system.  This option is useful for flash
-devices that use SLC flash at the beginning of the disk.
-It also maximizes the range of contiguous data blocks, which
-can be useful for certain specialized use cases, such as supported
-Shingled Drives.
-.TP
-.BI root_owner [=uid:gid]
-Specify the numeric user and group ID of the root directory.  If no UID:GID
-is specified, use the user and group ID of the user running \fBmke2fs\fR.
-In \fBmke2fs\fR 1.42 and earlier the UID and GID of the root directory were
-set by default to the UID and GID of the user running the mke2fs command.
-The \fBroot_owner=\fR option allows explicitly specifying these values,
-and avoid side-effects for users that do not expect the contents of the
-file system to change based on the user running \fBmke2fs\fR.
-.TP
-.BI root_perms [=permissions]
-Specify the root directory permissions in octal format. If no permissions
-are specified then the root directory permissions would be set in accordance with
-the default filesystem umask.
-.TP
 .B test_fs
 Set a flag in the file system superblock indicating that it may be
 mounted using experimental kernel code, such as the ext4dev file system.
-.TP
-.BI orphan_file_size= size
-Set size of the file for tracking unlinked but still open inodes and inodes
-with truncate in progress. Larger file allows for better scalability, reserving
-a few blocks per cpu is ideal.
-.TP
-.B discard
-Attempt to discard blocks at mkfs time (discarding blocks initially is useful
-on solid state devices and sparse / thin-provisioned storage). When the device
-advertises that discard also zeroes data (any subsequent read after the discard
-and before write returns zero), then mark all not-yet-zeroed inode tables as
-zeroed. This significantly speeds up file system initialization. This is set
-as default.
-.TP
-.B nodiscard
-Do not attempt to discard blocks at mkfs time.
-.TP
-.B quotatype
-Specify the which  quota types (usrquota, grpquota, prjquota) which
-should be enabled in the created file system.  The argument of this
-extended option should be a colon separated list.  This option has
-effect only if the
-.B quota
-feature is set.   The default quota types to be initialized if this
-option is not specified is both user and group quotas.  If the project
-feature is enabled that project quotas will be initialized as well.
 .RE
 .TP
 .B \-F
@@ -532,43 +535,6 @@
 separated, and may take an argument using the equals ('=')  sign.
 The following journal options are supported:
 .RS 1.2i
-.TP
-.BI size= journal-size
-Create an internal journal (i.e., stored inside the file system) of size
-.I journal-size
-megabytes.
-The size of the journal must be at least 1024 file system blocks
-(i.e., 1MB if using 1k blocks, 4MB if using 4k blocks, etc.)
-and may be no more than 10,240,000 file system blocks or half the total
-file system size (whichever is smaller)
-.TP
-.BI fast_commit_size= fast-commit-size
-Create an additional fast commit journal area of size
-.I fast-commit-size
-kilobytes.
-This option is only valid if
-.B fast_commit
-feature is enabled
-on the file system. If this option is not specified and if
-.B fast_commit
-feature is turned on, fast commit area size defaults to
-.I journal-size
-/ 64 megabytes. The total size of the journal with
-.B fast_commit
-feature set is
-.I journal-size
-+ (
-.I fast-commit-size
-* 1024) megabytes. The total journal size may be no more than
-10,240,000 file system blocks or half the total file system size
-(whichever is smaller).
-.TP
-.BI location =journal-location
-Specify the location of the journal.  The argument
-.I journal-location
-can either be specified as a block number, or if the number has a units
-suffix (e.g., 'M', 'G', etc.) interpret it as the offset from the
-beginning of the file system.
 @JDEV@.TP
 @JDEV@.BI device= external-journal
 @JDEV@Attach the file system to the journal block device located on
@@ -602,6 +568,43 @@
 @JDEV@.B -L
 @JDEV@option of
 @JDEV@.BR tune2fs (8).
+.TP
+.BI fast_commit_size= fast-commit-size
+Create an additional fast commit journal area of size
+.I fast-commit-size
+kilobytes.
+This option is only valid if
+.B fast_commit
+feature is enabled
+on the file system. If this option is not specified and if
+.B fast_commit
+feature is turned on, fast commit area size defaults to
+.I journal-size
+/ 64 megabytes. The total size of the journal with
+.B fast_commit
+feature set is
+.I journal-size
++ (
+.I fast-commit-size
+* 1024) megabytes. The total journal size may be no more than
+10,240,000 file system blocks or half the total file system size
+(whichever is smaller).
+.TP
+.BI location =journal-location
+Specify the location of the journal.  The argument
+.I journal-location
+can either be specified as a block number, or if the number has a units
+suffix (e.g., 'M', 'G', etc.) interpret it as the offset from the
+beginning of the file system.
+.TP
+.BI size= journal-size
+Create an internal journal (i.e., stored inside the file system) of size
+.I journal-size
+megabytes.
+The size of the journal must be at least 1024 file system blocks
+(i.e., 1MB if using 1k blocks, 4MB if using 4k blocks, etc.)
+and may be no more than 10,240,000 file system blocks or half the total
+file system size (whichever is smaller)
 .RE
 @JDEV@.IP
 @JDEV@Only one of the
@@ -720,12 +723,6 @@
 Quiet execution.  Useful if
 .B mke2fs
 is run in a script.
-.TP
-.BI \-r " revision"
-Set the file system revision for the new file system.  Note that 1.2
-kernels only support revision 0 file systems.  The default is to
-create revision 1 file systems.
-.TP
 .B \-S
 Write superblock and group descriptors only.  This is an extreme
 measure to be taken only in the very unlikely case that all of
diff --git a/misc/mke2fs.c b/misc/mke2fs.c
index 58ade9d..aa4e454 100644
--- a/misc/mke2fs.c
+++ b/misc/mke2fs.c
@@ -836,10 +836,9 @@
 static void parse_extended_opts(struct ext2_super_block *param,
 				const char *opts)
 {
+	unsigned long ulong;
 	char	*buf, *token, *next, *p, *arg, *badopt = 0;
-	int	len;
-	int	r_usage = 0;
-	int	ret;
+	int	len, ret, r_usage = 0;
 	int	encoding = -1;
 	char 	*encoding_flags = NULL;
 
@@ -865,8 +864,6 @@
 		}
 		if (strcmp(token, "desc-size") == 0 ||
 		    strcmp(token, "desc_size") == 0) {
-			int desc_size;
-
 			if (!ext2fs_has_feature_64bit(&fs_param)) {
 				fprintf(stderr,
 					_("%s requires '-O 64bit'\n"), token);
@@ -885,14 +882,14 @@
 				badopt = token;
 				continue;
 			}
-			desc_size = strtoul(arg, &p, 0);
-			if (*p || (desc_size & (desc_size - 1))) {
+			ulong = strtoul(arg, &p, 0);
+			if (*p || (ulong & (ulong - 1))) {
 				fprintf(stderr,
 					_("Invalid desc_size: '%s'\n"), arg);
 				r_usage++;
 				continue;
 			}
-			param->s_desc_size = desc_size;
+			param->s_desc_size = ulong;
 		} else if (strcmp(token, "hash_seed") == 0) {
 			if (!arg) {
 				r_usage++;
@@ -1044,6 +1041,24 @@
 
 				param->s_reserved_gdt_blocks = rsv_gdb;
 			}
+		} else if (!strcmp(token, "revision")) {
+			if (!arg) {
+				r_usage++;
+				badopt = token;
+				continue;
+			}
+			param->s_rev_level = strtoul(arg, &p, 0);
+			if (*p) {
+				com_err(program_name, 0,
+					_("bad revision level - %s"), arg);
+				exit(1);
+			}
+			if (param->s_rev_level > EXT2_MAX_SUPP_REV) {
+				com_err(program_name, EXT2_ET_REV_TOO_HIGH,
+					_("while trying to create revision %d"),
+					param->s_rev_level);
+				exit(1);
+			}
 		} else if (!strcmp(token, "test_fs")) {
 			param->s_flags |= EXT2_FLAGS_TEST_FILESYS;
 		} else if (!strcmp(token, "lazy_itable_init")) {
@@ -1177,6 +1192,7 @@
 			"\ttest_fs\n"
 			"\tdiscard\n"
 			"\tnodiscard\n"
+			"\trevision=<revision>\n"
 			"\tencoding=<encoding>\n"
 			"\tencoding_flags=<flags>\n"
 			"\tquotatype=<quota type(s) to be enabled>\n"
@@ -1640,7 +1656,7 @@
 	 * Finally, we complain about fs_blocks_count > 2^32 on a non-64bit fs.
 	 */
 	blk64_t		fs_blocks_count = 0;
-	int		s_opt = -1, r_opt = -1;
+	int		r_opt = -1;
 	char		*fs_features = 0;
 	int		fs_features_size = 0;
 	int		use_bsize;
@@ -1928,11 +1944,20 @@
 					_("while trying to create revision %d"), r_opt);
 				exit(1);
 			}
+			if (r_opt != EXT2_DYNAMIC_REV) {
+				com_err(program_name, 0,
+	_("the -r option has been removed.\n\n"
+	"If you really need compatibility with pre-1995 Linux systems, use the\n"
+	"command-line option \"-E revision=0\".\n"));
+				exit(1);
+			}
 			fs_param.s_rev_level = r_opt;
 			break;
-		case 's':	/* deprecated */
-			s_opt = atoi(optarg);
-			break;
+		case 's':
+			com_err(program_name, 0,
+				_("the -s option has been removed.\n\n"
+	"Use the -O option to set or clear the sparse_super feature.\n"));
+			exit(1);
 		case 'S':
 			super_only = 1;
 			break;
@@ -2191,7 +2216,6 @@
 		ext2fs_clear_feature_csum_seed(&fs_param);
 	if (tmp)
 		free(tmp);
-	(void) ext2fs_free_mem(&fs_features);
 	/*
 	 * If the user specified features incompatible with the Hurd, complain
 	 */
@@ -2329,33 +2353,8 @@
 		print_str_list(fs_types);
 	}
 
-	if (r_opt == EXT2_GOOD_OLD_REV &&
-	    (fs_param.s_feature_compat || fs_param.s_feature_incompat ||
-	     fs_param.s_feature_ro_compat)) {
-		fprintf(stderr, "%s", _("Filesystem features not supported "
-					"with revision 0 filesystems\n"));
-		exit(1);
-	}
-
-	if (s_opt > 0) {
-		if (r_opt == EXT2_GOOD_OLD_REV) {
-			fprintf(stderr, "%s",
-				_("Sparse superblocks not supported "
-				  "with revision 0 filesystems\n"));
-			exit(1);
-		}
-		ext2fs_set_feature_sparse_super(&fs_param);
-	} else if (s_opt == 0)
-		ext2fs_clear_feature_sparse_super(&fs_param);
-
-	if (journal_size != 0) {
-		if (r_opt == EXT2_GOOD_OLD_REV) {
-			fprintf(stderr, "%s", _("Journals not supported with "
-						"revision 0 filesystems\n"));
-			exit(1);
-		}
+	if (journal_size != 0)
 		ext2fs_set_feature_journal(&fs_param);
-	}
 
 	/* Get reserved_ratio from profile if not specified on cmd line. */
 	if (reserved_ratio < 0.0) {
@@ -2560,6 +2559,28 @@
 	if (extended_opts)
 		parse_extended_opts(&fs_param, extended_opts);
 
+	if (fs_param.s_rev_level == EXT2_GOOD_OLD_REV) {
+		if (fs_features) {
+			fprintf(stderr, "%s",
+				_("Filesystem features not supported "
+				  "with revision 0 filesystems\n"));
+			exit(1);
+		}
+		if (journal_size != 0) {
+			fprintf(stderr, "%s", _("Journals not supported with "
+						"revision 0 filesystems\n"));
+			exit(1);
+		}
+		if (fs_param.s_inode_size > EXT2_GOOD_OLD_INODE_SIZE) {
+			fprintf(stderr, "%s", _("Inode size incompatible with "
+						"revision 0 filesystems\n"));
+			exit(1);
+		}
+		fs_param.s_feature_compat = fs_param.s_feature_ro_compat =
+			fs_param.s_feature_incompat = 0;
+		fs_param.s_default_mount_opts = 0;
+	}
+
 	if (explicit_fssize == 0 && offset > 0) {
 		fs_blocks_count -= offset / EXT2_BLOCK_SIZE(&fs_param);
 		ext2fs_blocks_count_set(&fs_param, fs_blocks_count);
@@ -2761,6 +2782,7 @@
 
 	free(fs_type);
 	free(usage_types);
+	(void) ext2fs_free_mem(&fs_features);
 
 	/* The isatty() test is so we don't break existing scripts */
 	flags = CREATE_FILE;
diff --git a/misc/mklost+found.8.in b/misc/mklost+found.8.in
index d338239..59b7e76 100644
--- a/misc/mklost+found.8.in
+++ b/misc/mklost+found.8.in
@@ -4,15 +4,15 @@
 .\" 
 .TH MKLOST+FOUND 8 "@E2FSPROGS_MONTH@ @E2FSPROGS_YEAR@" "E2fsprogs version @E2FSPROGS_VERSION@"
 .SH NAME
-mklost+found \- create a lost+found directory on a mounted Linux
-second extended file system
+mklost+found \- create a lost+found directory on a mounted
+ext2/ext3/ext4 file system
 .SH SYNOPSIS
 .B mklost+found
 .SH DESCRIPTION
 .B mklost+found
 is used to create a
 .I lost+found
-directory in the current working directory on a Linux second extended
+directory in the current working directory on an ext2/ext3/ext4
 file system.  There is normally a
 .I lost+found
 directory in the root directory of each file system.
diff --git a/misc/tune2fs.8.in b/misc/tune2fs.8.in
index dcf108c..ff0bd51 100644
--- a/misc/tune2fs.8.in
+++ b/misc/tune2fs.8.in
@@ -98,7 +98,7 @@
 allows the system administrator to adjust various tunable file system
 parameters on Linux ext2, ext3, or ext4 file systems.  The current values
 of these options can be displayed by using the
-.B -l
+.B \-l
 option to
 .BR tune2fs (8)
 program, or by using the
@@ -175,43 +175,7 @@
 .B clear_mmp
 Reset the MMP block (if any) back to the clean state.  Use only if
 absolutely certain the device is not currently mounted or being
-fscked, or major file system corruption can result.  Needs '-f'.
-.TP
-.BI mmp_update_interval= interval
-Adjust the initial MMP update interval to
-.I interval
-seconds.  Specifying an
-.I interval
-of 0 means to use the default interval.  The specified interval must
-be less than 300 seconds.  Requires that the
-.B mmp
-feature be enabled.
-.TP
-.BI stride= stride-size
-Configure the file system for a RAID array with
-.I stride-size
-file system blocks. This is the number of blocks read or written to disk
-before moving to next disk. This mostly affects placement of file system
-metadata like bitmaps at
-.BR mke2fs (2)
-time to avoid placing them on a single disk, which can hurt the performance.
-It may also be used by block allocator.
-.TP
-.BI stripe_width= stripe-width
-Configure the file system for a RAID array with
-.I stripe-width
-file system blocks per stripe. This is typically be stride-size * N, where
-N is the number of data disks in the RAID (e.g. RAID 5 N+1, RAID 6 N+2).
-This allows the block allocator to prevent read-modify-write of the
-parity in a RAID stripe if possible when the data is written.
-.TP
-.BI hash_alg= hash-alg
-Set the default hash algorithm used for file systems with hashed b-tree
-directories.  Valid algorithms accepted are:
-.IR legacy ,
-.IR half_md4 ,
-and
-.IR tea .
+fscked, or major file system corruption can result.  Needs '\-f'.
 .TP
 .BI encoding= encoding-name
 Enable the
@@ -237,11 +201,33 @@
 .I strict
 flag is disabled.
 .TP
+.B force_fsck
+Set a flag in the file system superblock indicating that errors have been found.
+This will force fsck to run at the next mount.
+.TP
+.BI hash_alg= hash-alg
+Set the default hash algorithm used for file systems with hashed b-tree
+directories.  Valid algorithms accepted are:
+.IR legacy ,
+.IR half_md4 ,
+and
+.IR tea .
+.TP
+.BI mmp_update_interval= interval
+Adjust the initial MMP update interval to
+.I interval
+seconds.  Specifying an
+.I interval
+of 0 means to use the default interval.  The specified interval must
+be less than 300 seconds.  Requires that the
+.B mmp
+feature be enabled.
+.TP
 .BI mount_opts= mount_option_string
 Set a set of default mount options which will be used when the file
 system is mounted.  Unlike the bitmask-based default mount options which
 can be specified with the
-.B -o
+.B \-o
 option,
 .I mount_option_string
 is an arbitrary string with a maximum length of 63 bytes, which is
@@ -262,9 +248,23 @@
 with truncate in progress. Larger file allows for better scalability, reserving
 a few blocks per cpu is ideal.
 .TP
-.B force_fsck
-Set a flag in the file system superblock indicating that errors have been found.
-This will force fsck to run at the next mount.
+.BI stride= stride-size
+Configure the file system for a RAID array with
+.I stride-size
+file system blocks. This is the number of blocks read or written to disk
+before moving to next disk. This mostly affects placement of file system
+metadata like bitmaps at
+.BR mke2fs (2)
+time to avoid placing them on a single disk, which can hurt the performance.
+It may also be used by block allocator.
+.TP
+.BI stripe_width= stripe-width
+Configure the file system for a RAID array with
+.I stripe-width
+file system blocks per stripe. This is typically be stride-size * N, where
+N is the number of data disks in the RAID (e.g. RAID 5 N+1, RAID 6 N+2).
+This allows the block allocator to prevent read-modify-write of the
+parity in a RAID stripe if possible when the data is written.
 .TP
 .B test_fs
 Set a flag in the file system superblock indicating that it may be
@@ -371,15 +371,39 @@
 separated, and may take an argument using the equals ('=')  sign.
 The following journal options are supported:
 .RS 1.2i
-.TP
-.BI size= journal-size
-Create a journal stored in the file system of size
-.I journal-size
-megabytes.   The size of the journal must be at least 1024 file system blocks
-(i.e., 1MB if using 1k blocks, 4MB if using 4k blocks, etc.)
-and may be no more than 10,240,000 file system blocks.
-There must be enough free space in the file system to create a journal of
-that size.
+@JDEV@.TP
+@JDEV@.BI device= external-journal
+@JDEV@Attach the file system to the journal block device located on
+@JDEV@.IR external-journal .
+@JDEV@The external
+@JDEV@journal must have been already created using the command
+@JDEV@.IP
+@JDEV@.B mke2fs \-O journal_dev
+@JDEV@.I external-journal
+@JDEV@.IP
+@JDEV@Note that
+@JDEV@.I external-journal
+@JDEV@must be formatted with the same block
+@JDEV@size as file systems which will be using it.
+@JDEV@In addition, while there is support for attaching
+@JDEV@multiple file systems to a single external journal,
+@JDEV@the Linux kernel and
+@JDEV@.BR e2fsck (8)
+@JDEV@do not currently support shared external journals yet.
+@JDEV@.IP
+@JDEV@Instead of specifying a device name directly,
+@JDEV@.I external-journal
+@JDEV@can also be specified by either
+@JDEV@.BI LABEL= label
+@JDEV@or
+@JDEV@.BI UUID= UUID
+@JDEV@to locate the external journal by either the volume label or UUID
+@JDEV@stored in the ext2 superblock at the start of the journal.  Use
+@JDEV@.BR dumpe2fs (8)
+@JDEV@to display a journal device's volume label and UUID.  See also the
+@JDEV@.B \-L
+@JDEV@option of
+@JDEV@.BR tune2fs (8).
 .TP
 .BI fast_commit_size= fast-commit-size
 Create an additional fast commit journal area of size
@@ -408,39 +432,15 @@
 can either be specified as a block number, or if the number has a units
 suffix (e.g., 'M', 'G', etc.) interpret it as the offset from the
 beginning of the file system.
-@JDEV@.TP
-@JDEV@.BI device= external-journal
-@JDEV@Attach the file system to the journal block device located on
-@JDEV@.IR external-journal .
-@JDEV@The external
-@JDEV@journal must have been already created using the command
-@JDEV@.IP
-@JDEV@.B mke2fs -O journal_dev
-@JDEV@.I external-journal
-@JDEV@.IP
-@JDEV@Note that
-@JDEV@.I external-journal
-@JDEV@must be formatted with the same block
-@JDEV@size as file systems which will be using it.
-@JDEV@In addition, while there is support for attaching
-@JDEV@multiple file systems to a single external journal,
-@JDEV@the Linux kernel and
-@JDEV@.BR e2fsck (8)
-@JDEV@do not currently support shared external journals yet.
-@JDEV@.IP
-@JDEV@Instead of specifying a device name directly,
-@JDEV@.I external-journal
-@JDEV@can also be specified by either
-@JDEV@.BI LABEL= label
-@JDEV@or
-@JDEV@.BI UUID= UUID
-@JDEV@to locate the external journal by either the volume label or UUID
-@JDEV@stored in the ext2 superblock at the start of the journal.  Use
-@JDEV@.BR dumpe2fs (8)
-@JDEV@to display a journal device's volume label and UUID.  See also the
-@JDEV@.B -L
-@JDEV@option of
-@JDEV@.BR tune2fs (8).
+.TP
+.BI size= journal-size
+Create a journal stored in the file system of size
+.I journal-size
+megabytes.   The size of the journal must be at least 1024 file system blocks
+(i.e., 1\~MiB if using 1k blocks, 4\~MiB if using 4k blocks, etc.)
+and may be no more than 10,240,000 file system blocks.
+There must be enough free space in the file system to create a journal of
+that size.
 .RE
 @JDEV@.IP
 @JDEV@Only one of the
@@ -642,7 +642,6 @@
 .B \-j
 option.
 .TP
-.TP
 .B fast_commit
 Enable fast commit journaling feature to improve fsync latency.
 .TP
@@ -655,7 +654,7 @@
 Support files larger than 2 terabytes in size.
 .TP
 .B large_file
-File System can contain files that are greater than 2GB.
+File System can contain files that are greater than 2\~GiB.
 .TP
 .B metadata_csum
 Store a checksum to protect the contents in each metadata block.
@@ -670,6 +669,11 @@
 .B mmp
 Enable or disable multiple mount protection (MMP) feature.
 .TP
+.B orphan_file
+Store the list of orphan inodes in multiple blocks instead of a single
+linked-list to avoid potential scalability bottlenecks for workloads
+that perform a large number of file truncations or extensions in parallel.
+.TP
 .B project
 Enable project ID tracking.  This is used for project quota tracking.
 .TP
@@ -727,7 +731,7 @@
 if necessary.  After setting the
 .B dir_index
 feature,
-.B e2fsck -D
+.B e2fsck \-D
 can be run to convert existing directories to the hashed B-tree format.
 Enabling certain file system features may prevent the file system from being
 mounted by kernels which do not support those features.  In particular, the
@@ -756,7 +760,7 @@
 .TP
 .BI \-T " time-last-checked"
 Set the time the file system was last checked using
-.BR  e2fsck .
+.BR e2fsck .
 The time is interpreted using the current (local) timezone.
 This can be useful in scripts which use a Logical Volume Manager to make
 a consistent snapshot of a file system, and then check the file system
diff --git a/misc/tune2fs.c b/misc/tune2fs.c
index 6de40e9..2548a76 100644
--- a/misc/tune2fs.c
+++ b/misc/tune2fs.c
@@ -2864,6 +2864,7 @@
 	int new_ino_blks_per_grp;
 	ext2fs_block_bitmap bmap;
 
+	ext2fs_update_dynamic_rev(fs);
 	retval = ext2fs_read_inode_bitmap(fs);
 	if (retval) {
 		fputs(_("Failed to read inode bitmap\n"), stderr);
@@ -3381,9 +3382,13 @@
 		printf(_("Setting error behavior to %d\n"), errors);
 	}
 	if (g_flag) {
-		sb->s_def_resgid = resgid;
-		ext2fs_mark_super_dirty(fs);
-		printf(_("Setting reserved blocks gid to %lu\n"), resgid);
+		if (sb->s_def_resgid != resgid) {
+			sb->s_def_resgid = resgid;
+			ext2fs_mark_super_dirty(fs);
+			printf(_("Setting reserved blocks gid to %lu\n"), resgid);
+		} else {
+			printf(_("Reserved blocks gid already set to %lu\n"), resgid);
+		}
 	}
 	if (i_flag) {
 		if ((unsigned long long)interval >= (1ULL << 32)) {
diff --git a/po/e2fsprogs.pot b/po/e2fsprogs.pot
index 1a324df..174625f 100644
--- a/po/e2fsprogs.pot
+++ b/po/e2fsprogs.pot
@@ -2,9 +2,9 @@
 # Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
 #     2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012,
 #     2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022,
-#     2023 by Theodore Ts'o
+#     2023, 2024 by Theodore Ts'o
 # This file is distributed under the same license as the e2fsprogs package.
-# Theodore Ts'o <tytso@mit.edu>, 2023.
+# Theodore Ts'o <tytso@mit.edu>, 2024.
 #
 #. The strings in e2fsck's problem.c can be very hard to translate,
 #. since the strings are expanded in two different ways.  First of all,
@@ -78,9 +78,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: e2fsprogs 1.47.0.95\n"
+"Project-Id-Version: e2fsprogs 1.47.1.95\n"
 "Report-Msgid-Bugs-To: tytso@alum.mit.edu\n"
-"POT-Creation-Date: 2024-04-24 13:22-0400\n"
+"POT-Creation-Date: 2024-11-29 02:11-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -90,7 +90,7 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: e2fsck/badblocks.c:23 misc/mke2fs.c:223
+#: e2fsck/badblocks.c:23 misc/mke2fs.c:224
 #, c-format
 msgid "Bad block %u out of range; ignored.\n"
 msgstr ""
@@ -103,12 +103,12 @@
 msgid "while reading the bad blocks inode"
 msgstr ""
 
-#: e2fsck/badblocks.c:72 e2fsck/scantest.c:107 e2fsck/unix.c:1595
-#: e2fsck/unix.c:1710 misc/badblocks.c:1273 misc/badblocks.c:1281
+#: e2fsck/badblocks.c:72 e2fsck/scantest.c:107 e2fsck/unix.c:1599
+#: e2fsck/unix.c:1714 misc/badblocks.c:1273 misc/badblocks.c:1281
 #: misc/badblocks.c:1295 misc/badblocks.c:1307 misc/dumpe2fs.c:438
-#: misc/dumpe2fs.c:704 misc/dumpe2fs.c:708 misc/e2image.c:1441
-#: misc/e2image.c:1641 misc/e2image.c:1662 misc/mke2fs.c:239
-#: misc/tune2fs.c:3043 misc/tune2fs.c:3232 resize/main.c:424
+#: misc/dumpe2fs.c:704 misc/dumpe2fs.c:708 misc/e2image.c:1447
+#: misc/e2image.c:1647 misc/e2image.c:1668 misc/mke2fs.c:240
+#: misc/tune2fs.c:3044 misc/tune2fs.c:3233 resize/main.c:422
 #, c-format
 msgid "while trying to open %s"
 msgstr ""
@@ -118,7 +118,7 @@
 msgid "while trying popen '%s'"
 msgstr ""
 
-#: e2fsck/badblocks.c:95 misc/mke2fs.c:246
+#: e2fsck/badblocks.c:95 misc/mke2fs.c:247
 msgid "while reading in list of bad blocks from file"
 msgstr ""
 
@@ -135,30 +135,35 @@
 msgid "while freeing dir_info tdb file"
 msgstr ""
 
-#: e2fsck/ehandler.c:55
+#: e2fsck/ehandler.c:56
 #, c-format
 msgid "Error reading block %lu (%s) while %s.  "
 msgstr ""
 
-#: e2fsck/ehandler.c:58
+#: e2fsck/ehandler.c:59
 #, c-format
 msgid "Error reading block %lu (%s).  "
 msgstr ""
 
-#: e2fsck/ehandler.c:66 e2fsck/ehandler.c:115
+#: e2fsck/ehandler.c:67 e2fsck/ehandler.c:121
 msgid "Ignore error"
 msgstr ""
 
-#: e2fsck/ehandler.c:67
+#: e2fsck/ehandler.c:68
 msgid "Force rewrite"
 msgstr ""
 
-#: e2fsck/ehandler.c:109
+#: e2fsck/ehandler.c:72
+#, c-format
+msgid "Error rewriting block %lu (%s)\n"
+msgstr ""
+
+#: e2fsck/ehandler.c:115
 #, c-format
 msgid "Error writing block %lu (%s) while %s.  "
 msgstr ""
 
-#: e2fsck/ehandler.c:112
+#: e2fsck/ehandler.c:118
 #, c-format
 msgid "Error writing block %lu (%s).  "
 msgstr ""
@@ -224,7 +229,7 @@
 msgid "%s: incorrect fast commit blocks\n"
 msgstr ""
 
-#: e2fsck/journal.c:1688 misc/fuse2fs.c:3857
+#: e2fsck/journal.c:1688 misc/fuse2fs.c:3872
 #, c-format
 msgid "%s: recovering journal\n"
 msgstr ""
@@ -500,85 +505,85 @@
 msgid "while hashing entry with e_value_inum = %u"
 msgstr ""
 
-#: e2fsck/pass1.c:774 e2fsck/pass2.c:1155
+#: e2fsck/pass1.c:817 e2fsck/pass2.c:1155
 msgid "reading directory block"
 msgstr ""
 
-#: e2fsck/pass1.c:1175
+#: e2fsck/pass1.c:1218
 msgid "getting next inode from scan"
 msgstr ""
 
-#: e2fsck/pass1.c:1228
+#: e2fsck/pass1.c:1271
 msgid "in-use inode map"
 msgstr ""
 
-#: e2fsck/pass1.c:1239
+#: e2fsck/pass1.c:1282
 msgid "directory inode map"
 msgstr ""
 
-#: e2fsck/pass1.c:1249
+#: e2fsck/pass1.c:1292
 msgid "regular file inode map"
 msgstr ""
 
-#: e2fsck/pass1.c:1258 misc/e2image.c:1290
+#: e2fsck/pass1.c:1301 misc/e2image.c:1296
 msgid "in-use block map"
 msgstr ""
 
-#: e2fsck/pass1.c:1267
+#: e2fsck/pass1.c:1310
 msgid "metadata block map"
 msgstr ""
 
-#: e2fsck/pass1.c:1278
+#: e2fsck/pass1.c:1321
 msgid "inode casefold map"
 msgstr ""
 
-#: e2fsck/pass1.c:1343
+#: e2fsck/pass1.c:1386
 msgid "opening inode scan"
 msgstr ""
 
-#: e2fsck/pass1.c:2139
+#: e2fsck/pass1.c:2193
 msgid "Pass 1"
 msgstr ""
 
-#: e2fsck/pass1.c:2200
+#: e2fsck/pass1.c:2254
 #, c-format
 msgid "reading indirect blocks of inode %u"
 msgstr ""
 
-#: e2fsck/pass1.c:2251
+#: e2fsck/pass1.c:2305
 msgid "bad inode map"
 msgstr ""
 
-#: e2fsck/pass1.c:2291
+#: e2fsck/pass1.c:2345
 msgid "inode in bad block map"
 msgstr ""
 
-#: e2fsck/pass1.c:2311
+#: e2fsck/pass1.c:2365
 msgid "imagic inode map"
 msgstr ""
 
-#: e2fsck/pass1.c:2342
+#: e2fsck/pass1.c:2396
 msgid "multiply claimed block map"
 msgstr ""
 
-#: e2fsck/pass1.c:2467
+#: e2fsck/pass1.c:2521
 msgid "ext attr block map"
 msgstr ""
 
-#: e2fsck/pass1.c:3768
+#: e2fsck/pass1.c:3828
 #, c-format
 msgid "%6lu(%c): expecting %6lu got phys %6lu (blkcnt %lld)\n"
 msgstr ""
 
-#: e2fsck/pass1.c:4189
+#: e2fsck/pass1.c:4249
 msgid "block bitmap"
 msgstr ""
 
-#: e2fsck/pass1.c:4195
+#: e2fsck/pass1.c:4255
 msgid "inode bitmap"
 msgstr ""
 
-#: e2fsck/pass1.c:4201
+#: e2fsck/pass1.c:4261
 msgid "inode table"
 msgstr ""
 
@@ -610,7 +615,7 @@
 msgid "inode loop detection bitmap"
 msgstr ""
 
-#: e2fsck/pass4.c:300
+#: e2fsck/pass4.c:317
 msgid "Pass 4"
 msgstr ""
 
@@ -803,16 +808,19 @@
 msgstr ""
 
 #: e2fsck/problem.c:118
+#, c-format
 #. @-expanded: block bitmap for group %g is not in group.  (block %b)\n
 msgid "@b @B for @g %g is not in @g.  (@b %b)\n"
 msgstr ""
 
 #: e2fsck/problem.c:122
+#, c-format
 #. @-expanded: inode bitmap for group %g is not in group.  (block %b)\n
 msgid "@i @B for @g %g is not in @g.  (@b %b)\n"
 msgstr ""
 
 #: e2fsck/problem.c:127
+#, c-format
 #. @-expanded: inode table for group %g is not in group.  (block %b)\n
 #. @-expanded: WARNING: SEVERE DATA LOSS POSSIBLE.\n
 msgid ""
@@ -843,6 +851,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:144
+#, c-format
 #. @-expanded: The filesystem size (according to the superblock) is %b blocks\n
 #. @-expanded: The physical size of the device is %c blocks\n
 #. @-expanded: Either the superblock or the partition table is likely to be corrupt!\n
@@ -853,6 +862,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:151
+#, c-format
 #. @-expanded: superblock block_size = %b, fragsize = %c.\n
 #. @-expanded: This version of e2fsck does not support fragment sizes different\n
 #. @-expanded: from the block size.\n
@@ -863,11 +873,13 @@
 msgstr ""
 
 #: e2fsck/problem.c:158
+#, c-format
 #. @-expanded: superblock blocks_per_group = %b, should have been %c\n
 msgid "@S @bs_per_group = %b, should have been %c\n"
 msgstr ""
 
 #: e2fsck/problem.c:163
+#, c-format
 #. @-expanded: superblock first_data_block = %b, should have been %c\n
 msgid "@S first_data_@b = %b, should have been %c\n"
 msgstr ""
@@ -1127,6 +1139,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:392
+#, c-format
 #. @-expanded: group descriptor %g has invalid unused inodes count %b.  
 msgid "@g descriptor %g has invalid unused inodes count %b.  "
 msgstr ""
@@ -1176,6 +1189,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:435
+#, c-format
 #. @-expanded: Setting free blocks count to %c (was %b)\n
 msgid "Setting free @bs count to %c (was %b)\n"
 msgstr ""
@@ -1271,6 +1285,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:531
+#, c-format
 #. @-expanded: Orphan file (inode %i) contains hole at block %b. Terminating orphan file 
 #. @-expanded: recovery.\n
 msgid ""
@@ -1279,6 +1294,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:536
+#, c-format
 #. @-expanded: Orphan file (inode %i) block %b contains wrong magic. Terminating orphan file 
 #. @-expanded: recovery.\n
 msgid ""
@@ -1287,6 +1303,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:541
+#, c-format
 #. @-expanded: Orphan file (inode %i) block %b contains wrong checksum. Terminating orphan file 
 #. @-expanded: recovery.\n
 msgid ""
@@ -1342,26 +1359,31 @@
 msgstr ""
 
 #: e2fsck/problem.c:590
+#, c-format
 #. @-expanded: group %g's block bitmap at %b conflicts with some other fs block.\n
 msgid "@g %g's @b @B at %b @C.\n"
 msgstr ""
 
 #: e2fsck/problem.c:595
+#, c-format
 #. @-expanded: group %g's inode bitmap at %b conflicts with some other fs block.\n
 msgid "@g %g's @i @B at %b @C.\n"
 msgstr ""
 
 #: e2fsck/problem.c:600
+#, c-format
 #. @-expanded: group %g's inode table at %b conflicts with some other fs block.\n
 msgid "@g %g's @i table at %b @C.\n"
 msgstr ""
 
 #: e2fsck/problem.c:605
+#, c-format
 #. @-expanded: group %g's block bitmap (%b) is bad.  
 msgid "@g %g's @b @B (%b) is bad.  "
 msgstr ""
 
 #: e2fsck/problem.c:610
+#, c-format
 #. @-expanded: group %g's inode bitmap (%b) is bad.  
 msgid "@g %g's @i @B (%b) is bad.  "
 msgstr ""
@@ -1414,6 +1436,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:662
+#, c-format
 #. @-expanded: Bad block %b used as bad block inode indirect block.  
 msgid "Bad @b %b used as bad @b @i indirect @b.  "
 msgstr ""
@@ -1449,26 +1472,31 @@
 msgstr ""
 
 #: e2fsck/problem.c:685
+#, c-format
 #. @-expanded: The primary superblock (%b) is on the bad block list.\n
 msgid "The primary @S (%b) is on the bad @b list.\n"
 msgstr ""
 
 #: e2fsck/problem.c:690
+#, c-format
 #. @-expanded: Block %b in the primary group descriptors is on the bad block list\n
 msgid "Block %b in the primary @g descriptors is on the bad @b list\n"
 msgstr ""
 
 #: e2fsck/problem.c:696
+#, c-format
 #. @-expanded: Warning: Group %g's superblock (%b) is bad.\n
 msgid "Warning: Group %g's @S (%b) is bad.\n"
 msgstr ""
 
 #: e2fsck/problem.c:702
+#, c-format
 #. @-expanded: Warning: Group %g's copy of the group descriptors has a bad block (%b).\n
 msgid "Warning: Group %g's copy of the @g descriptors has a bad @b (%b).\n"
 msgstr ""
 
 #: e2fsck/problem.c:708
+#, c-format
 #. @-expanded: Programming error?  block #%b claimed for no reason in process_bad_block.\n
 msgid "Programming error?  @b #%b claimed for no reason in process_bad_@b.\n"
 msgstr ""
@@ -1485,6 +1513,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:725
+#, c-format
 #. @-expanded: Relocating group %g's %s from %b to %c...\n
 msgid "Relocating @g %g's %s from %b to %c...\n"
 msgstr ""
@@ -1496,16 +1525,18 @@
 msgstr ""
 
 #: e2fsck/problem.c:736
+#, c-format
 #. @-expanded: Warning: could not read block %b of %s: %m\n
 msgid "Warning: could not read @b %b of %s: %m\n"
 msgstr ""
 
 #: e2fsck/problem.c:741
+#, c-format
 #. @-expanded: Warning: could not write block %b for %s: %m\n
 msgid "Warning: could not write @b %b for %s: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:746 e2fsck/problem.c:1965
+#: e2fsck/problem.c:746 e2fsck/problem.c:1979
 #. @-expanded: error allocating inode bitmap (%N): %m\n
 msgid "@A @i @B (%N): %m\n"
 msgstr ""
@@ -1603,16 +1634,19 @@
 msgstr ""
 
 #: e2fsck/problem.c:851
+#, c-format
 #. @-expanded: Error reading extended attribute block %b for inode %i.  
 msgid "Error reading @a @b %b for @i %i.  "
 msgstr ""
 
 #: e2fsck/problem.c:856
+#, c-format
 #. @-expanded: inode %i has a bad extended attribute block %b.  
 msgid "@i %i has a bad @a @b %b.  "
 msgstr ""
 
 #: e2fsck/problem.c:861
+#, c-format
 #. @-expanded: Error reading extended attribute block %b (%m).  
 msgid "Error reading @a @b %b (%m).  "
 msgstr ""
@@ -1623,11 +1657,13 @@
 msgstr ""
 
 #: e2fsck/problem.c:871
+#, c-format
 #. @-expanded: Error writing extended attribute block %b (%m).  
 msgid "Error writing @a @b %b (%m).  "
 msgstr ""
 
 #: e2fsck/problem.c:876
+#, c-format
 #. @-expanded: extended attribute block %b has h_blocks > 1.  
 msgid "@a @b %b has h_@bs > 1.  "
 msgstr ""
@@ -1638,16 +1674,19 @@
 msgstr ""
 
 #: e2fsck/problem.c:886
+#, c-format
 #. @-expanded: extended attribute block %b is corrupt (allocation collision).  
 msgid "@a @b %b is corrupt (allocation collision).  "
 msgstr ""
 
 #: e2fsck/problem.c:891
+#, c-format
 #. @-expanded: extended attribute block %b is corrupt (invalid name).  
 msgid "@a @b %b is corrupt (@n name).  "
 msgstr ""
 
 #: e2fsck/problem.c:896
+#, c-format
 #. @-expanded: extended attribute block %b is corrupt (invalid value).  
 msgid "@a @b %b is corrupt (@n value).  "
 msgstr ""
@@ -1706,6 +1745,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:956
+#, c-format
 #. @-expanded: Bad block inode has an indirect block (%b) that conflicts with\n
 #. @-expanded: filesystem metadata.  
 msgid ""
@@ -1761,6 +1801,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:1009
+#, c-format
 #. @-expanded: Failed to iterate extents in inode %i\n
 #. @-expanded: \t(op %s, blk %b, lblk %c): %m\n
 msgid ""
@@ -1816,6 +1857,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:1053
+#, c-format
 #. @-expanded: inode %i has an invalid extent node (blk %b, lblk %c)\n
 msgid "@i %i has an invalid extent node (blk %b, lblk %c)\n"
 msgstr ""
@@ -1847,6 +1889,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:1084
+#, c-format
 #. @-expanded: inode %i has zero length extent\n
 #. @-expanded: \t(invalid logical block %c, physical block %b)\n
 msgid ""
@@ -1881,6 +1924,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:1119
+#, c-format
 #. @-expanded: inode %i extended attribute block %b passes checks, but checksum does not match block.  
 msgid "@i %i @a @b %b passes checks, but checksum does not match @b.  "
 msgstr ""
@@ -1921,6 +1965,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:1155
+#, c-format
 #. @-expanded: directory inode %i block %b should be at block %c.  
 msgid "@d @i %i @b %b should be at @b %c.  "
 msgstr ""
@@ -1932,6 +1977,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:1166
+#, c-format
 #. @-expanded: inode %i logical block %b (physical block %c) violates cluster allocation rules.\n
 #. @-expanded: Will fix in pass 1B.\n
 msgid ""
@@ -2002,6 +2048,7 @@
 msgstr ""
 
 #: e2fsck/problem.c:1229
+#, c-format
 #. @-expanded: inode %i extent tree could be more shallow (%b; could be <= %c)\n
 msgid "@i %i @x tree could be more shallow (%b; could be <= %c)\n"
 msgstr ""
@@ -2098,7 +2145,19 @@
 msgid "Orphan file @i %i is not in use, but contains data.  "
 msgstr ""
 
-#: e2fsck/problem.c:1316
+#: e2fsck/problem.c:1314
+#, c-format
+#. @-expanded: inode %i has the ea_inode flag set but is not a regular file.  
+msgid "@i %i has the ea_inode flag set but is not a regular file.  "
+msgstr ""
+
+#: e2fsck/problem.c:1319
+#, c-format
+#. @-expanded: inode %i references EA inode but superblock is missing EA_INODE feature\n
+msgid "@i %i references EA inode but @S is missing EA_INODE feature\n"
+msgstr ""
+
+#: e2fsck/problem.c:1326
 #. @-expanded: \n
 #. @-expanded: Running additional passes to resolve blocks claimed by more than one inode...\n
 #. @-expanded: Pass 1B: Rescanning for multiply-claimed blocks\n
@@ -2108,45 +2167,46 @@
 "Pass 1B: Rescanning for @m @bs\n"
 msgstr ""
 
-#: e2fsck/problem.c:1323
+#: e2fsck/problem.c:1333
 #, no-c-format
 #. @-expanded: multiply-claimed block(s) in inode %i:
 msgid "@m @b(s) in @i %i:"
 msgstr ""
 
-#: e2fsck/problem.c:1339
+#: e2fsck/problem.c:1349
 #, no-c-format
 msgid "Error while scanning inodes (%i): %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1345
+#: e2fsck/problem.c:1355
 #, no-c-format
 #. @-expanded: error allocating inode bitmap (inode_dup_map): %m\n
 msgid "@A @i @B (@i_dup_map): %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1351
+#: e2fsck/problem.c:1361
 #, no-c-format
 #. @-expanded: Error while iterating over blocks in inode %i (%s): %m\n
 msgid "Error while iterating over @bs in @i %i (%s): %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1356 e2fsck/problem.c:1736
+#: e2fsck/problem.c:1366 e2fsck/problem.c:1746
+#, c-format
 #. @-expanded: Error adjusting refcount for extended attribute block %b (inode %i): %m\n
 msgid "Error adjusting refcount for @a @b %b (@i %i): %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1366
+#: e2fsck/problem.c:1376
 #. @-expanded: Pass 1C: Scanning directories for inodes with multiply-claimed blocks\n
 msgid "Pass 1C: Scanning directories for @is with @m @bs\n"
 msgstr ""
 
-#: e2fsck/problem.c:1372
+#: e2fsck/problem.c:1382
 #. @-expanded: Pass 1D: Reconciling multiply-claimed blocks\n
 msgid "Pass 1D: Reconciling @m @bs\n"
 msgstr ""
 
-#: e2fsck/problem.c:1377
+#: e2fsck/problem.c:1387
 #. @-expanded: File %Q (inode #%i, mod time %IM) \n
 #. @-expanded:   has %r multiply-claimed block(s), shared with %N file(s):\n
 msgid ""
@@ -2154,17 +2214,17 @@
 "  has %r @m @b(s), shared with %N file(s):\n"
 msgstr ""
 
-#: e2fsck/problem.c:1383
+#: e2fsck/problem.c:1393
 #. @-expanded: \t%Q (inode #%i, mod time %IM)\n
 msgid "\t%Q (@i #%i, mod time %IM)\n"
 msgstr ""
 
-#: e2fsck/problem.c:1388
+#: e2fsck/problem.c:1398
 #. @-expanded: \t<filesystem metadata>\n
 msgid "\t<@f metadata>\n"
 msgstr ""
 
-#: e2fsck/problem.c:1393
+#: e2fsck/problem.c:1403
 #. @-expanded: (There are %N inodes containing multiply-claimed blocks.)\n
 #. @-expanded: \n
 msgid ""
@@ -2172,7 +2232,7 @@
 "\n"
 msgstr ""
 
-#: e2fsck/problem.c:1398
+#: e2fsck/problem.c:1408
 #. @-expanded: multiply-claimed blocks already reassigned or cloned.\n
 #. @-expanded: \n
 msgid ""
@@ -2180,348 +2240,353 @@
 "\n"
 msgstr ""
 
-#: e2fsck/problem.c:1412
+#: e2fsck/problem.c:1422
 #, no-c-format
 msgid "Couldn't clone file: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1418
+#: e2fsck/problem.c:1428
 #. @-expanded: Pass 1E: Optimizing extent trees\n
 msgid "Pass 1E: Optimizing @x trees\n"
 msgstr ""
 
-#: e2fsck/problem.c:1424
+#: e2fsck/problem.c:1434
 #, no-c-format
 #. @-expanded: Failed to optimize extent tree %p (%i): %m\n
 msgid "Failed to optimize @x tree %p (%i): %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1429
+#: e2fsck/problem.c:1439
 #. @-expanded: Optimizing extent trees: 
 msgid "Optimizing @x trees: "
 msgstr ""
 
-#: e2fsck/problem.c:1444
+#: e2fsck/problem.c:1454
+#, c-format
 msgid "Internal error: max extent tree depth too large (%b; expected=%c).\n"
 msgstr ""
 
-#: e2fsck/problem.c:1449
+#: e2fsck/problem.c:1459
+#, c-format
 #. @-expanded: inode %i extent tree (at level %b) could be shorter.  
 msgid "@i %i @x tree (at level %b) could be shorter.  "
 msgstr ""
 
-#: e2fsck/problem.c:1454
+#: e2fsck/problem.c:1464
+#, c-format
 #. @-expanded: inode %i extent tree (at level %b) could be narrower.  
 msgid "@i %i @x tree (at level %b) could be narrower.  "
 msgstr ""
 
-#: e2fsck/problem.c:1461
+#: e2fsck/problem.c:1471
 #. @-expanded: Pass 2: Checking directory structure\n
 msgid "Pass 2: Checking @d structure\n"
 msgstr ""
 
-#: e2fsck/problem.c:1467
+#: e2fsck/problem.c:1477
 #, no-c-format
 #. @-expanded: invalid inode number for '.' in directory inode %i.\n
 msgid "@n @i number for '.' in @d @i %i.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1472
+#: e2fsck/problem.c:1482
 #. @-expanded: entry '%Dn' in %p (%i) has invalid inode #: %Di.\n
 msgid "@E has @n @i #: %Di.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1477
+#: e2fsck/problem.c:1487
 #. @-expanded: entry '%Dn' in %p (%i) has deleted/unused inode %Di.  
 msgid "@E has @D/unused @i %Di.  "
 msgstr ""
 
-#: e2fsck/problem.c:1482
+#: e2fsck/problem.c:1492
 #. @-expanded: entry '%Dn' in %p (%i) is a link to '.'  
 msgid "@E @L to '.'  "
 msgstr ""
 
-#: e2fsck/problem.c:1487
+#: e2fsck/problem.c:1497
 #. @-expanded: entry '%Dn' in %p (%i) points to inode (%Di) located in a bad block.\n
 msgid "@E points to @i (%Di) located in a bad @b.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1492
+#: e2fsck/problem.c:1502
 #. @-expanded: entry '%Dn' in %p (%i) is a link to directory %P (%Di).\n
 msgid "@E @L to @d %P (%Di).\n"
 msgstr ""
 
-#: e2fsck/problem.c:1497
+#: e2fsck/problem.c:1507
 #. @-expanded: entry '%Dn' in %p (%i) is a link to the root inode.\n
 msgid "@E @L to the @r.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1502
+#: e2fsck/problem.c:1512
 #. @-expanded: entry '%Dn' in %p (%i) has illegal characters in its name.\n
 msgid "@E has illegal characters in its name.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1508
+#: e2fsck/problem.c:1518
 #, no-c-format
 #. @-expanded: Missing '.' in directory inode %i.\n
 msgid "Missing '.' in @d @i %i.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1514
+#: e2fsck/problem.c:1524
 #, no-c-format
 #. @-expanded: Missing '..' in directory inode %i.\n
 msgid "Missing '..' in @d @i %i.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1519
+#: e2fsck/problem.c:1529
 #. @-expanded: First entry '%Dn' (inode=%Di) in directory inode %i (%p) should be '.'\n
 msgid "First @e '%Dn' (@i=%Di) in @d @i %i (%p) @s '.'\n"
 msgstr ""
 
-#: e2fsck/problem.c:1524
+#: e2fsck/problem.c:1534
 #. @-expanded: Second entry '%Dn' (inode=%Di) in directory inode %i should be '..'\n
 msgid "Second @e '%Dn' (@i=%Di) in @d @i %i @s '..'\n"
 msgstr ""
 
-#: e2fsck/problem.c:1529
+#: e2fsck/problem.c:1539
 #. @-expanded: i_faddr for inode %i (%Q) is %IF, should be zero.\n
 msgid "i_faddr @F %IF, @s zero.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1534
+#: e2fsck/problem.c:1544
 #. @-expanded: i_file_acl for inode %i (%Q) is %If, should be zero.\n
 msgid "i_file_acl @F %If, @s zero.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1539
+#: e2fsck/problem.c:1549
 #. @-expanded: i_size_high for inode %i (%Q) is %Id, should be zero.\n
 msgid "i_size_high @F %Id, @s zero.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1544
+#: e2fsck/problem.c:1554
 #. @-expanded: i_frag for inode %i (%Q) is %N, should be zero.\n
 msgid "i_frag @F %N, @s zero.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1549
+#: e2fsck/problem.c:1559
 #. @-expanded: i_fsize for inode %i (%Q) is %N, should be zero.\n
 msgid "i_fsize @F %N, @s zero.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1554
+#: e2fsck/problem.c:1564
 #. @-expanded: inode %i (%Q) has invalid mode (%Im).\n
 msgid "@i %i (%Q) has @n mode (%Im).\n"
 msgstr ""
 
-#: e2fsck/problem.c:1559
+#: e2fsck/problem.c:1569
 #. @-expanded: directory inode %i, %B, offset %N: directory corrupted\n
 msgid "@d @i %i, %B, offset %N: @d corrupted\n"
 msgstr ""
 
-#: e2fsck/problem.c:1564
+#: e2fsck/problem.c:1574
 #. @-expanded: directory inode %i, %B, offset %N: filename too long\n
 msgid "@d @i %i, %B, offset %N: filename too long\n"
 msgstr ""
 
-#: e2fsck/problem.c:1569
+#: e2fsck/problem.c:1579
 #. @-expanded: directory inode %i has an unallocated %B.  
 msgid "@d @i %i has an unallocated %B.  "
 msgstr ""
 
-#: e2fsck/problem.c:1575
+#: e2fsck/problem.c:1585
 #, no-c-format
 #. @-expanded: '.' directory entry in directory inode %i is not NULL terminated\n
 msgid "'.' @d @e in @d @i %i is not NULL terminated\n"
 msgstr ""
 
-#: e2fsck/problem.c:1581
+#: e2fsck/problem.c:1591
 #, no-c-format
 #. @-expanded: '..' directory entry in directory inode %i is not NULL terminated\n
 msgid "'..' @d @e in @d @i %i is not NULL terminated\n"
 msgstr ""
 
-#: e2fsck/problem.c:1586
+#: e2fsck/problem.c:1596
 #. @-expanded: inode %i (%Q) is an illegal character device.\n
 msgid "@i %i (%Q) is an @I character @v.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1591
+#: e2fsck/problem.c:1601
 #. @-expanded: inode %i (%Q) is an illegal block device.\n
 msgid "@i %i (%Q) is an @I @b @v.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1596
+#: e2fsck/problem.c:1606
 #. @-expanded: entry '%Dn' in %p (%i) is duplicate '.' entry.\n
 msgid "@E is duplicate '.' @e.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1601
+#: e2fsck/problem.c:1611
 #. @-expanded: entry '%Dn' in %p (%i) is duplicate '..' entry.\n
 msgid "@E is duplicate '..' @e.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1607 e2fsck/problem.c:1992
+#: e2fsck/problem.c:1617 e2fsck/problem.c:2006
 #, no-c-format
 msgid "Internal error: couldn't find dir_info for %i.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1612
+#: e2fsck/problem.c:1622
 #. @-expanded: entry '%Dn' in %p (%i) has rec_len of %Dr, should be %N.\n
 msgid "@E has rec_len of %Dr, @s %N.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1618
+#: e2fsck/problem.c:1628
 #, no-c-format
 #. @-expanded: error allocating icount structure: %m\n
 msgid "@A icount structure: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1624
+#: e2fsck/problem.c:1634
 #, no-c-format
 #. @-expanded: Error iterating over directory blocks: %m\n
 msgid "Error iterating over @d @bs: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1629
+#: e2fsck/problem.c:1639
+#, c-format
 #. @-expanded: Error reading directory block %b (inode %i): %m\n
 msgid "Error reading @d @b %b (@i %i): %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1634
+#: e2fsck/problem.c:1644
+#, c-format
 #. @-expanded: Error writing directory block %b (inode %i): %m\n
 msgid "Error writing @d @b %b (@i %i): %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1640
+#: e2fsck/problem.c:1650
 #, no-c-format
 #. @-expanded: error allocating new directory block for inode %i (%s): %m\n
 msgid "@A new @d @b for @i %i (%s): %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1646
+#: e2fsck/problem.c:1656
 #, no-c-format
 #. @-expanded: Error deallocating inode %i: %m\n
 msgid "Error deallocating @i %i: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1652
+#: e2fsck/problem.c:1662
 #, no-c-format
 #. @-expanded: directory entry for '.' in %p (%i) is big.\n
 msgid "@d @e for '.' in %p (%i) is big.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1657
+#: e2fsck/problem.c:1667
 #. @-expanded: inode %i (%Q) is an illegal FIFO.\n
 msgid "@i %i (%Q) is an @I FIFO.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1662
+#: e2fsck/problem.c:1672
 #. @-expanded: inode %i (%Q) is an illegal socket.\n
 msgid "@i %i (%Q) is an @I socket.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1667
+#: e2fsck/problem.c:1677
 #. @-expanded: Setting filetype for entry '%Dn' in %p (%i) to %N.\n
 msgid "Setting filetype for @E to %N.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1672
+#: e2fsck/problem.c:1682
 #. @-expanded: entry '%Dn' in %p (%i) has an incorrect filetype (was %Dt, should be %N).\n
 msgid "@E has an incorrect filetype (was %Dt, @s %N).\n"
 msgstr ""
 
-#: e2fsck/problem.c:1677
+#: e2fsck/problem.c:1687
 #. @-expanded: entry '%Dn' in %p (%i) has filetype set.\n
 msgid "@E has filetype set.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1682
+#: e2fsck/problem.c:1692
 #. @-expanded: entry '%Dn' in %p (%i) has a zero-length name.\n
 msgid "@E has a @z name.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1687
+#: e2fsck/problem.c:1697
 #. @-expanded: Symlink %Q (inode #%i) is invalid.\n
 msgid "Symlink %Q (@i #%i) is @n.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1692
+#: e2fsck/problem.c:1702
 #. @-expanded: extended attribute block for inode %i (%Q) is invalid (%If).\n
 msgid "@a @b @F @n (%If).\n"
 msgstr ""
 
-#: e2fsck/problem.c:1697
+#: e2fsck/problem.c:1707
 #. @-expanded: filesystem contains large files, but lacks LARGE_FILE flag in superblock.\n
 msgid "@f contains large files, but lacks LARGE_FILE flag in @S.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1702
+#: e2fsck/problem.c:1712
 #. @-expanded: problem in HTREE directory inode %d: %B not referenced\n
 msgid "@p @h %d: %B not referenced\n"
 msgstr ""
 
-#: e2fsck/problem.c:1707
+#: e2fsck/problem.c:1717
 #. @-expanded: problem in HTREE directory inode %d: %B referenced twice\n
 msgid "@p @h %d: %B referenced twice\n"
 msgstr ""
 
-#: e2fsck/problem.c:1712
+#: e2fsck/problem.c:1722
 #. @-expanded: problem in HTREE directory inode %d: %B has bad min hash\n
 msgid "@p @h %d: %B has bad min hash\n"
 msgstr ""
 
-#: e2fsck/problem.c:1717
+#: e2fsck/problem.c:1727
 #. @-expanded: problem in HTREE directory inode %d: %B has bad max hash\n
 msgid "@p @h %d: %B has bad max hash\n"
 msgstr ""
 
-#: e2fsck/problem.c:1722
+#: e2fsck/problem.c:1732
 #. @-expanded: invalid HTREE directory inode %d (%q).  
 msgid "@n @h %d (%q).  "
 msgstr ""
 
-#: e2fsck/problem.c:1726
+#: e2fsck/problem.c:1736
 #. @-expanded: filesystem has large directories, but lacks LARGE_DIR flag in superblock.\n
 msgid "@f has large directories, but lacks LARGE_DIR flag in @S.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1731
+#: e2fsck/problem.c:1741
 #. @-expanded: problem in HTREE directory inode %d (%q): bad block number %b.\n
 msgid "@p @h %d (%q): bad @b number %b.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1742
+#: e2fsck/problem.c:1752
 #, no-c-format
 #. @-expanded: problem in HTREE directory inode %d: root node is invalid\n
 msgid "@p @h %d: root node is @n\n"
 msgstr ""
 
-#: e2fsck/problem.c:1747
+#: e2fsck/problem.c:1757
 #. @-expanded: problem in HTREE directory inode %d: %B has invalid limit (%N)\n
 msgid "@p @h %d: %B has @n limit (%N)\n"
 msgstr ""
 
-#: e2fsck/problem.c:1752
+#: e2fsck/problem.c:1762
 #. @-expanded: problem in HTREE directory inode %d: %B has invalid count (%N)\n
 msgid "@p @h %d: %B has @n count (%N)\n"
 msgstr ""
 
-#: e2fsck/problem.c:1757
+#: e2fsck/problem.c:1767
 #. @-expanded: problem in HTREE directory inode %d: %B has an unordered hash table\n
 msgid "@p @h %d: %B has an unordered hash table\n"
 msgstr ""
 
-#: e2fsck/problem.c:1762
+#: e2fsck/problem.c:1772
 #. @-expanded: problem in HTREE directory inode %d: %B has invalid depth (%N)\n
 msgid "@p @h %d: %B has @n depth (%N)\n"
 msgstr ""
 
-#: e2fsck/problem.c:1767
+#: e2fsck/problem.c:1777
 #. @-expanded: Duplicate entry '%Dn' in %p (%i) found.  
 msgid "Duplicate @E found.  "
 msgstr ""
 
-#: e2fsck/problem.c:1772
+#: e2fsck/problem.c:1782
 #, no-c-format
 #. @-expanded: entry '%Dn' in %p (%i) has a non-unique filename.\n
 #. @-expanded: Rename to %s
@@ -2530,7 +2595,7 @@
 "Rename to %s"
 msgstr ""
 
-#: e2fsck/problem.c:1777
+#: e2fsck/problem.c:1787
 #. @-expanded: Duplicate entry '%Dn' found.\n
 #. @-expanded: \tMarking %p (%i) to be rebuilt.\n
 #. @-expanded: \n
@@ -2540,175 +2605,180 @@
 "\n"
 msgstr ""
 
-#: e2fsck/problem.c:1782
+#: e2fsck/problem.c:1792
 #. @-expanded: i_blocks_hi for inode %i (%Q) is %N, should be zero.\n
 msgid "i_blocks_hi @F %N, @s zero.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1787
+#: e2fsck/problem.c:1797
 #. @-expanded: Unexpected block in HTREE directory inode %d (%q).\n
 msgid "Unexpected @b in @h %d (%q).\n"
 msgstr ""
 
-#: e2fsck/problem.c:1792
+#: e2fsck/problem.c:1802
 #. @-expanded: entry '%Dn' in %p (%i) references inode %Di in group %g where _INODE_UNINIT is set.\n
 msgid "@E references @i %Di in @g %g where _INODE_UNINIT is set.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1797
+#: e2fsck/problem.c:1807
 #. @-expanded: entry '%Dn' in %p (%i) references inode %Di found in group %g's unused inodes area.\n
 msgid "@E references @i %Di found in @g %g's unused inodes area.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1802
+#: e2fsck/problem.c:1812
 #. @-expanded: i_file_acl_hi for inode %i (%Q) is %N, should be zero.\n
 msgid "i_file_acl_hi @F %N, @s zero.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1808
+#: e2fsck/problem.c:1818
 #, no-c-format
 #. @-expanded: problem in HTREE directory inode %d: root node fails checksum.\n
 msgid "@p @h %d: root node fails checksum.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1814
+#: e2fsck/problem.c:1824
 #, no-c-format
 #. @-expanded: problem in HTREE directory inode %d: internal node fails checksum.\n
 msgid "@p @h %d: internal node fails checksum.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1819
+#: e2fsck/problem.c:1829
 #. @-expanded: directory inode %i, %B, offset %N: directory has no checksum.\n
 msgid "@d @i %i, %B, offset %N: @d has no checksum.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1824
+#: e2fsck/problem.c:1834
 #. @-expanded: directory inode %i, %B: directory passes checks but fails checksum.\n
 msgid "@d @i %i, %B: @d passes checks but fails checksum.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1829
+#: e2fsck/problem.c:1839
 #. @-expanded: Inline directory inode %i size (%N) must be a multiple of 4.\n
 msgid "Inline @d @i %i size (%N) must be a multiple of 4.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1835
+#: e2fsck/problem.c:1845
 #, no-c-format
 #. @-expanded: Fixing size of inline directory inode %i failed.\n
 msgid "Fixing size of inline @d @i %i failed.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1840
+#: e2fsck/problem.c:1850
 #. @-expanded: Encrypted entry '%Dn' in %p (%i) is too short.\n
 msgid "Encrypted @E is too short.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1845
+#: e2fsck/problem.c:1855
 #. @-expanded: Encrypted entry '%Dn' in %p (%i) references unencrypted inode %Di.\n
 msgid "Encrypted @E references unencrypted @i %Di.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1850
+#: e2fsck/problem.c:1860
 #. @-expanded: Encrypted entry '%Dn' in %p (%i) references inode %Di, which has a different encryption policy.\n
 msgid ""
 "Encrypted @E references @i %Di, which has a different encryption policy.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1855
+#: e2fsck/problem.c:1865
 #. @-expanded: entry '%Dn' in %p (%i) has illegal UTF-8 characters in its name.\n
 msgid "@E has illegal UTF-8 characters in its name.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1860
+#: e2fsck/problem.c:1870
 #. @-expanded: Duplicate filename entry '%Dn' in %p (%i) found.  
 msgid "Duplicate filename @E found.  "
 msgstr ""
 
-#: e2fsck/problem.c:1868
+#: e2fsck/problem.c:1875
+#. @-expanded: entry '%Dn' in %p (%i) references EA inode %Di.\n
+msgid "@E references EA @i %Di.\n"
+msgstr ""
+
+#: e2fsck/problem.c:1882
 #. @-expanded: Pass 3: Checking directory connectivity\n
 msgid "Pass 3: Checking @d connectivity\n"
 msgstr ""
 
-#: e2fsck/problem.c:1873
+#: e2fsck/problem.c:1887
 #. @-expanded: root inode not allocated.  
 msgid "@r not allocated.  "
 msgstr ""
 
-#: e2fsck/problem.c:1878
+#: e2fsck/problem.c:1892
 #. @-expanded: No room in lost+found directory.  
 msgid "No room in @l @d.  "
 msgstr ""
 
-#: e2fsck/problem.c:1884
+#: e2fsck/problem.c:1898
 #, no-c-format
 #. @-expanded: Unconnected directory inode %i (was in %q)\n
 msgid "Unconnected @d @i %i (was in %q)\n"
 msgstr ""
 
-#: e2fsck/problem.c:1889
+#: e2fsck/problem.c:1903
 #. @-expanded: /lost+found not found.  
 msgid "/@l not found.  "
 msgstr ""
 
-#: e2fsck/problem.c:1894
+#: e2fsck/problem.c:1908
 #. @-expanded: '..' in %Q (%i) is %P (%j), should be %q (%d).\n
 msgid "'..' in %Q (%i) is %P (%j), @s %q (%d).\n"
 msgstr ""
 
-#: e2fsck/problem.c:1900
+#: e2fsck/problem.c:1914
 #, no-c-format
 #. @-expanded: Bad or non-existent /lost+found.  Cannot reconnect.\n
 msgid "Bad or non-existent /@l.  Cannot reconnect.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1906
+#: e2fsck/problem.c:1920
 #, no-c-format
 #. @-expanded: Could not expand /lost+found: %m\n
 msgid "Could not expand /@l: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1912
+#: e2fsck/problem.c:1926
 #, no-c-format
 msgid "Could not reconnect %i: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1918
+#: e2fsck/problem.c:1932
 #, no-c-format
 #. @-expanded: Error while trying to find /lost+found: %m\n
 msgid "Error while trying to find /@l: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1924
+#: e2fsck/problem.c:1938
 #, no-c-format
 #. @-expanded: ext2fs_new_block: %m while trying to create /lost+found directory\n
 msgid "ext2fs_new_@b: %m while trying to create /@l @d\n"
 msgstr ""
 
-#: e2fsck/problem.c:1930
+#: e2fsck/problem.c:1944
 #, no-c-format
 #. @-expanded: ext2fs_new_inode: %m while trying to create /lost+found directory\n
 msgid "ext2fs_new_@i: %m while trying to create /@l @d\n"
 msgstr ""
 
-#: e2fsck/problem.c:1936
+#: e2fsck/problem.c:1950
 #, no-c-format
 #. @-expanded: ext2fs_new_dir_block: %m while creating new directory block\n
 msgid "ext2fs_new_dir_@b: %m while creating new @d @b\n"
 msgstr ""
 
-#: e2fsck/problem.c:1942
+#: e2fsck/problem.c:1956
 #, no-c-format
 #. @-expanded: ext2fs_write_dir_block: %m while writing the directory block for /lost+found\n
 msgid "ext2fs_write_dir_@b: %m while writing the @d @b for /@l\n"
 msgstr ""
 
-#: e2fsck/problem.c:1948
+#: e2fsck/problem.c:1962
 #, no-c-format
 #. @-expanded: Error while adjusting inode count on inode %i\n
 msgid "Error while adjusting @i count on @i %i\n"
 msgstr ""
 
-#: e2fsck/problem.c:1954
+#: e2fsck/problem.c:1968
 #, no-c-format
 #. @-expanded: Couldn't fix parent of inode %i: %m\n
 #. @-expanded: \n
@@ -2717,7 +2787,7 @@
 "\n"
 msgstr ""
 
-#: e2fsck/problem.c:1960
+#: e2fsck/problem.c:1974
 #, no-c-format
 #. @-expanded: Couldn't fix parent of inode %i: Couldn't find parent directory entry\n
 #. @-expanded: \n
@@ -2726,40 +2796,40 @@
 "\n"
 msgstr ""
 
-#: e2fsck/problem.c:1971
+#: e2fsck/problem.c:1985
 #, no-c-format
 #. @-expanded: Error creating root directory (%s): %m\n
 msgid "Error creating root @d (%s): %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1977
+#: e2fsck/problem.c:1991
 #, no-c-format
 #. @-expanded: Error creating /lost+found directory (%s): %m\n
 msgid "Error creating /@l @d (%s): %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:1982
+#: e2fsck/problem.c:1996
 #. @-expanded: root inode is not a directory; aborting.\n
 msgid "@r is not a @d; aborting.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1987
+#: e2fsck/problem.c:2001
 #. @-expanded: Cannot proceed without a root inode.\n
 msgid "Cannot proceed without a @r.\n"
 msgstr ""
 
-#: e2fsck/problem.c:1998
+#: e2fsck/problem.c:2012
 #, no-c-format
 #. @-expanded: /lost+found is not a directory (ino=%i)\n
 msgid "/@l is not a @d (ino=%i)\n"
 msgstr ""
 
-#: e2fsck/problem.c:2003
+#: e2fsck/problem.c:2017
 #. @-expanded: /lost+found has inline data\n
 msgid "/@l has inline data\n"
 msgstr ""
 
-#: e2fsck/problem.c:2008
+#: e2fsck/problem.c:2022
 #. @-expanded: Cannot allocate space for /lost+found.\n
 #. @-expanded: Place lost files in root directory instead
 msgid ""
@@ -2767,7 +2837,7 @@
 "Place lost files in root directory instead"
 msgstr ""
 
-#: e2fsck/problem.c:2013
+#: e2fsck/problem.c:2027
 #. @-expanded: Insufficient space to recover lost files!\n
 #. @-expanded: Move data off the filesystem and re-run e2fsck.\n
 #. @-expanded: \n
@@ -2777,56 +2847,56 @@
 "\n"
 msgstr ""
 
-#: e2fsck/problem.c:2018
+#: e2fsck/problem.c:2032
 #. @-expanded: /lost+found is encrypted\n
 msgid "/@l is encrypted\n"
 msgstr ""
 
-#: e2fsck/problem.c:2024
+#: e2fsck/problem.c:2038
 #, no-c-format
 #. @-expanded: Recursively looped directory inode %i (%p)\n
 msgid "Recursively looped @d @i %i (%p)\n"
 msgstr ""
 
-#: e2fsck/problem.c:2031
+#: e2fsck/problem.c:2045
 msgid "Pass 3A: Optimizing directories\n"
 msgstr ""
 
-#: e2fsck/problem.c:2037
+#: e2fsck/problem.c:2051
 #, no-c-format
 msgid "Failed to create dirs_to_hash iterator: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:2042
+#: e2fsck/problem.c:2056
 msgid "Failed to optimize directory %q (%d): %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:2047
+#: e2fsck/problem.c:2061
 msgid "Optimizing directories: "
 msgstr ""
 
-#: e2fsck/problem.c:2064
+#: e2fsck/problem.c:2078
 msgid "Pass 4: Checking reference counts\n"
 msgstr ""
 
-#: e2fsck/problem.c:2070
+#: e2fsck/problem.c:2084
 #, no-c-format
 #. @-expanded: unattached zero-length inode %i.  
 msgid "@u @z @i %i.  "
 msgstr ""
 
-#: e2fsck/problem.c:2076
+#: e2fsck/problem.c:2090
 #, no-c-format
 #. @-expanded: unattached inode %i\n
 msgid "@u @i %i\n"
 msgstr ""
 
-#: e2fsck/problem.c:2081
+#: e2fsck/problem.c:2095
 #. @-expanded: inode %i ref count is %Il, should be %N.  
 msgid "@i %i ref count is %Il, @s %N.  "
 msgstr ""
 
-#: e2fsck/problem.c:2085
+#: e2fsck/problem.c:2099
 #. @-expanded: WARNING: PROGRAMMING BUG IN E2FSCK!\n
 #. @-expanded: \tOR SOME BONEHEAD (YOU) IS CHECKING A MOUNTED (LIVE) FILESYSTEM.\n
 #. @-expanded: inode_link_info[%i] is %N, inode.i_links_count is %Il.  They should be the same!\n
@@ -2836,72 +2906,80 @@
 "@i_link_info[%i] is %N, @i.i_links_count is %Il.  They @s the same!\n"
 msgstr ""
 
-#: e2fsck/problem.c:2092
+#: e2fsck/problem.c:2106
 #. @-expanded: extended attribute inode %i ref count is %N, should be %n. 
 msgid "@a @i %i ref count is %N, @s %n. "
 msgstr ""
 
-#: e2fsck/problem.c:2097
+#: e2fsck/problem.c:2111
 #. @-expanded: directory exceeds max links, but no DIR_NLINK feature in superblock.\n
 msgid "@d exceeds max links, but no DIR_NLINK feature in @S.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2102
+#: e2fsck/problem.c:2116
 #. @-expanded: directory inode %i ref count set to overflow but could be exact value %N.  
 msgid "@d @i %i ref count set to overflow but could be exact value %N.  "
 msgstr ""
 
-#: e2fsck/problem.c:2109
+#: e2fsck/problem.c:2120
+#, c-format
+#. @-expanded: Regular filesystem inode %i has EA_INODE flag set. 
+msgid "Regular @f @i %i has EA_INODE flag set. "
+msgstr ""
+
+#: e2fsck/problem.c:2127
 #. @-expanded: Pass 5: Checking group summary information\n
 msgid "Pass 5: Checking @g summary information\n"
 msgstr ""
 
-#: e2fsck/problem.c:2114
+#: e2fsck/problem.c:2132
 #. @-expanded: Padding at end of inode bitmap is not set. 
 msgid "Padding at end of @i @B is not set. "
 msgstr ""
 
-#: e2fsck/problem.c:2119
+#: e2fsck/problem.c:2137
 #. @-expanded: Padding at end of block bitmap is not set. 
 msgid "Padding at end of @b @B is not set. "
 msgstr ""
 
-#: e2fsck/problem.c:2124
+#: e2fsck/problem.c:2142
 #. @-expanded: block bitmap differences: 
 msgid "@b @B differences: "
 msgstr ""
 
-#: e2fsck/problem.c:2146
+#: e2fsck/problem.c:2164
 #. @-expanded: inode bitmap differences: 
 msgid "@i @B differences: "
 msgstr ""
 
-#: e2fsck/problem.c:2168
+#: e2fsck/problem.c:2186
 #. @-expanded: Free inodes count wrong for group #%g (%i, counted=%j).\n
 msgid "Free @is count wrong for @g #%g (%i, counted=%j).\n"
 msgstr ""
 
-#: e2fsck/problem.c:2173
+#: e2fsck/problem.c:2191
 #. @-expanded: Directories count wrong for group #%g (%i, counted=%j).\n
 msgid "Directories count wrong for @g #%g (%i, counted=%j).\n"
 msgstr ""
 
-#: e2fsck/problem.c:2178
+#: e2fsck/problem.c:2196
 #. @-expanded: Free inodes count wrong (%i, counted=%j).\n
 msgid "Free @is count wrong (%i, counted=%j).\n"
 msgstr ""
 
-#: e2fsck/problem.c:2183
+#: e2fsck/problem.c:2201
+#, c-format
 #. @-expanded: Free blocks count wrong for group #%g (%b, counted=%c).\n
 msgid "Free @bs count wrong for @g #%g (%b, counted=%c).\n"
 msgstr ""
 
-#: e2fsck/problem.c:2188
+#: e2fsck/problem.c:2206
+#, c-format
 #. @-expanded: Free blocks count wrong (%b, counted=%c).\n
 msgid "Free @bs count wrong (%b, counted=%c).\n"
 msgstr ""
 
-#: e2fsck/problem.c:2193
+#: e2fsck/problem.c:2211
 #. @-expanded: PROGRAMMING ERROR: filesystem (#%N) bitmap endpoints (%b, %c) don't match calculated bitmap 
 #. @-expanded: endpoints (%i, %j)\n
 msgid ""
@@ -2909,128 +2987,130 @@
 "endpoints (%i, %j)\n"
 msgstr ""
 
-#: e2fsck/problem.c:2199
+#: e2fsck/problem.c:2217
 msgid "Internal error: fudging end of bitmap (%N)\n"
 msgstr ""
 
-#: e2fsck/problem.c:2205
+#: e2fsck/problem.c:2223
 #, no-c-format
 #. @-expanded: Error copying in replacement inode bitmap: %m\n
 msgid "Error copying in replacement @i @B: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:2211
+#: e2fsck/problem.c:2229
 #, no-c-format
 #. @-expanded: Error copying in replacement block bitmap: %m\n
 msgid "Error copying in replacement @b @B: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:2241
+#: e2fsck/problem.c:2259
 #, no-c-format
 #. @-expanded: group %g block(s) in use but group is marked BLOCK_UNINIT\n
 msgid "@g %g @b(s) in use but @g is marked BLOCK_UNINIT\n"
 msgstr ""
 
-#: e2fsck/problem.c:2247
+#: e2fsck/problem.c:2265
 #, no-c-format
 #. @-expanded: group %g inode(s) in use but group is marked INODE_UNINIT\n
 msgid "@g %g @i(s) in use but @g is marked INODE_UNINIT\n"
 msgstr ""
 
-#: e2fsck/problem.c:2253
+#: e2fsck/problem.c:2271
 #, no-c-format
 #. @-expanded: group %g inode bitmap does not match checksum.\n
 msgid "@g %g @i @B does not match checksum.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2259
+#: e2fsck/problem.c:2277
 #, no-c-format
 #. @-expanded: group %g block bitmap does not match checksum.\n
 msgid "@g %g @b @B does not match checksum.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2266
+#: e2fsck/problem.c:2284
 #. @-expanded: Recreate journal
 msgid "Recreate @j"
 msgstr ""
 
-#: e2fsck/problem.c:2271
+#: e2fsck/problem.c:2289
 msgid "Update quota info for quota type %N"
 msgstr ""
 
-#: e2fsck/problem.c:2277
+#: e2fsck/problem.c:2295
 #, no-c-format
 #. @-expanded: Error setting block group checksum info: %m\n
 msgid "Error setting @b @g checksum info: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:2283
+#: e2fsck/problem.c:2301
 #, no-c-format
 msgid "Error writing file system info: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:2289
+#: e2fsck/problem.c:2307
 #, no-c-format
 msgid "Error flushing writes to storage device: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:2294
+#: e2fsck/problem.c:2312
 msgid "Error writing quota info for quota type %N: %m\n"
 msgstr ""
 
-#: e2fsck/problem.c:2299
+#: e2fsck/problem.c:2317
 #. @-expanded: superblock has orphan file without journal.\n
 msgid "@S has orphan file without @j.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2304
+#: e2fsck/problem.c:2322
 msgid "Failed to truncate orphan file.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2309
+#: e2fsck/problem.c:2327
 msgid "Failed to initialize orphan file.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2314
+#: e2fsck/problem.c:2332
 msgid "Cannot fix corrupted orphan file with invalid bitmaps.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2319
+#: e2fsck/problem.c:2337
 #, c-format
 #. @-expanded: Failed to truncate orphan file (inode %i).\n
 msgid "Failed to truncate orphan file (@i %i).\n"
 msgstr ""
 
-#: e2fsck/problem.c:2324
+#: e2fsck/problem.c:2342
+#, c-format
 #. @-expanded: Orphan file (inode %i) block %b is not clean.\n
 msgid "Orphan file (@i %i) @b %b is not clean.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2329
+#: e2fsck/problem.c:2347
 msgid "Feature orphan_present is set but orphan file is clean.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2334
+#: e2fsck/problem.c:2352
 msgid "Feature orphan_present is set but feature orphan_file is not.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2339
+#: e2fsck/problem.c:2357
 #, c-format
 #. @-expanded: Orphan file (inode %i) size is not multiple of block size.\n
 msgid "Orphan file (@i %i) size is not multiple of block size.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2344
+#: e2fsck/problem.c:2362
+#, c-format
 #. @-expanded: Orphan file (inode %i) contains hole at block %b.\n
 msgid "Orphan file (@i %i) contains hole at @b %b.\n"
 msgstr ""
 
-#: e2fsck/problem.c:2509
+#: e2fsck/problem.c:2527
 #, c-format
 msgid "Unhandled error code (0x%x)!\n"
 msgstr ""
 
-#: e2fsck/problem.c:2637 e2fsck/problem.c:2641
+#: e2fsck/problem.c:2655 e2fsck/problem.c:2659
 msgid "IGNORED"
 msgstr ""
 
@@ -3048,7 +3128,7 @@
 msgid "size of inode=%d\n"
 msgstr ""
 
-#: e2fsck/scantest.c:114 misc/e2image.c:1331
+#: e2fsck/scantest.c:114 misc/e2image.c:1337
 msgid "while opening inode scan"
 msgstr ""
 
@@ -3258,8 +3338,8 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: e2fsck/unix.c:241 misc/badblocks.c:1001 misc/tune2fs.c:3325 misc/util.c:135
-#: resize/main.c:359
+#: e2fsck/unix.c:241 misc/badblocks.c:1001 misc/tune2fs.c:3326 misc/util.c:135
+#: resize/main.c:357
 #, c-format
 msgid "while determining whether %s is mounted."
 msgstr ""
@@ -3307,77 +3387,77 @@
 msgid "check aborted.\n"
 msgstr ""
 
-#: e2fsck/unix.c:379
+#: e2fsck/unix.c:383
 msgid " contains a file system with errors"
 msgstr ""
 
-#: e2fsck/unix.c:381
+#: e2fsck/unix.c:385
 msgid " was not cleanly unmounted"
 msgstr ""
 
-#: e2fsck/unix.c:383
+#: e2fsck/unix.c:387
 msgid " primary superblock features different from backup"
 msgstr ""
 
-#: e2fsck/unix.c:387
+#: e2fsck/unix.c:391
 #, c-format
 msgid " has been mounted %u times without being checked"
 msgstr ""
 
-#: e2fsck/unix.c:394
+#: e2fsck/unix.c:398
 msgid " has filesystem last checked time in the future"
 msgstr ""
 
-#: e2fsck/unix.c:400
+#: e2fsck/unix.c:404
 #, c-format
 msgid " has gone %u days without being checked"
 msgstr ""
 
-#: e2fsck/unix.c:409
+#: e2fsck/unix.c:413
 msgid "ignoring check interval, broken_system_clock set\n"
 msgstr ""
 
-#: e2fsck/unix.c:415
+#: e2fsck/unix.c:419
 msgid ", check forced.\n"
 msgstr ""
 
-#: e2fsck/unix.c:448
+#: e2fsck/unix.c:452
 #, c-format
 msgid "%s: clean, %u/%u files, %llu/%llu blocks"
 msgstr ""
 
-#: e2fsck/unix.c:469
+#: e2fsck/unix.c:473
 msgid " (check deferred; on battery)"
 msgstr ""
 
-#: e2fsck/unix.c:472
+#: e2fsck/unix.c:476
 msgid " (check after next mount)"
 msgstr ""
 
-#: e2fsck/unix.c:474
+#: e2fsck/unix.c:478
 #, c-format
 msgid " (check in %ld mounts)"
 msgstr ""
 
-#: e2fsck/unix.c:624
+#: e2fsck/unix.c:628
 #, c-format
 msgid "ERROR: Couldn't open /dev/null (%s)\n"
 msgstr ""
 
-#: e2fsck/unix.c:695
+#: e2fsck/unix.c:699
 msgid "Invalid EA version.\n"
 msgstr ""
 
-#: e2fsck/unix.c:708
+#: e2fsck/unix.c:712
 msgid "Invalid readahead buffer size.\n"
 msgstr ""
 
-#: e2fsck/unix.c:771
+#: e2fsck/unix.c:775
 #, c-format
 msgid "Unknown extended option: %s\n"
 msgstr ""
 
-#: e2fsck/unix.c:779
+#: e2fsck/unix.c:783
 msgid ""
 "\n"
 "Extended options are separated by commas, and may take an argument which\n"
@@ -3385,87 +3465,87 @@
 "\n"
 msgstr ""
 
-#: e2fsck/unix.c:783
+#: e2fsck/unix.c:787
 msgid "\tea_ver=<ea_version (1 or 2)>\n"
 msgstr ""
 
-#: e2fsck/unix.c:792
+#: e2fsck/unix.c:796
 msgid "\treadahead_kb=<buffer size>\n"
 msgstr ""
 
-#: e2fsck/unix.c:805
+#: e2fsck/unix.c:809
 #, c-format
 msgid ""
 "Syntax error in e2fsck config file (%s, line #%d)\n"
 "\t%s\n"
 msgstr ""
 
-#: e2fsck/unix.c:878
+#: e2fsck/unix.c:882
 #, c-format
 msgid "Error validating file descriptor %d: %s\n"
 msgstr ""
 
-#: e2fsck/unix.c:882
+#: e2fsck/unix.c:886
 msgid "Invalid completion information file descriptor"
 msgstr ""
 
-#: e2fsck/unix.c:897
+#: e2fsck/unix.c:901
 msgid "Only one of the options -p/-a, -n or -y may be specified."
 msgstr ""
 
-#: e2fsck/unix.c:918
+#: e2fsck/unix.c:922
 #, c-format
 msgid "The -t option is not supported on this version of e2fsck.\n"
 msgstr ""
 
-#: e2fsck/unix.c:950 e2fsck/unix.c:1028 misc/e2initrd_helper.c:331
+#: e2fsck/unix.c:954 e2fsck/unix.c:1032 misc/e2initrd_helper.c:331
 #: misc/tune2fs.c:1920 misc/tune2fs.c:2220 misc/tune2fs.c:2238
 #, c-format
 msgid "Unable to resolve '%s'"
 msgstr ""
 
-#: e2fsck/unix.c:1007
+#: e2fsck/unix.c:1011
 msgid "The -n and -D options are incompatible."
 msgstr ""
 
-#: e2fsck/unix.c:1012
+#: e2fsck/unix.c:1016
 msgid "The -n and -c options are incompatible."
 msgstr ""
 
-#: e2fsck/unix.c:1017
+#: e2fsck/unix.c:1021
 msgid "The -n and -l/-L options are incompatible."
 msgstr ""
 
-#: e2fsck/unix.c:1041
+#: e2fsck/unix.c:1045
 msgid "The -D and -E fixes_only options are incompatible."
 msgstr ""
 
-#: e2fsck/unix.c:1047
+#: e2fsck/unix.c:1051
 msgid "The -E bmap2extent and fixes_only options are incompatible."
 msgstr ""
 
-#: e2fsck/unix.c:1098
+#: e2fsck/unix.c:1102
 #, c-format
 msgid "while opening %s for flushing"
 msgstr ""
 
-#: e2fsck/unix.c:1104 resize/main.c:391
+#: e2fsck/unix.c:1108 resize/main.c:389
 #, c-format
 msgid "while trying to flush %s"
 msgstr ""
 
-#: e2fsck/unix.c:1111
+#: e2fsck/unix.c:1115
 msgid "The -c and the -l/-L options may not be both used at the same time.\n"
 msgstr ""
 
-#: e2fsck/unix.c:1158
+#: e2fsck/unix.c:1162
 #, c-format
 msgid ""
 "E2FSCK_JBD_DEBUG \"%s\" not an integer\n"
 "\n"
 msgstr ""
 
-#: e2fsck/unix.c:1167
+#: e2fsck/unix.c:1171
 #, c-format
 msgid ""
 "\n"
@@ -3473,31 +3553,31 @@
 "\n"
 msgstr ""
 
-#: e2fsck/unix.c:1265
+#: e2fsck/unix.c:1269
 #, c-format
 msgid ""
 "MMP interval is %u seconds and total wait time is %u seconds. Please "
 "wait...\n"
 msgstr ""
 
-#: e2fsck/unix.c:1282 e2fsck/unix.c:1287
+#: e2fsck/unix.c:1286 e2fsck/unix.c:1291
 msgid "while checking MMP block"
 msgstr ""
 
-#: e2fsck/unix.c:1289
+#: e2fsck/unix.c:1293
 #, c-format
 msgid ""
 "If you are sure the filesystem is not in use on any node, run:\n"
 "'tune2fs -f -E clear_mmp %s'\n"
 msgstr ""
 
-#: e2fsck/unix.c:1305
+#: e2fsck/unix.c:1309
 msgid "while reading MMP block"
 msgstr ""
 
-#: e2fsck/unix.c:1325 e2fsck/unix.c:1377 misc/e2undo.c:242 misc/e2undo.c:287
-#: misc/mke2fs.c:2826 misc/mke2fs.c:2877 misc/tune2fs.c:2960
-#: misc/tune2fs.c:3005 resize/main.c:188 resize/main.c:233
+#: e2fsck/unix.c:1329 e2fsck/unix.c:1381 misc/e2undo.c:242 misc/e2undo.c:287
+#: misc/mke2fs.c:2850 misc/mke2fs.c:2901 misc/tune2fs.c:2961
+#: misc/tune2fs.c:3006 resize/main.c:188 resize/main.c:233
 #, c-format
 msgid ""
 "Overwriting existing filesystem; this can be undone using the command:\n"
@@ -3505,215 +3585,215 @@
 "\n"
 msgstr ""
 
-#: e2fsck/unix.c:1366 misc/e2undo.c:276 misc/mke2fs.c:2866 misc/tune2fs.c:2994
+#: e2fsck/unix.c:1370 misc/e2undo.c:276 misc/mke2fs.c:2890 misc/tune2fs.c:2995
 #: resize/main.c:222
 #, c-format
 msgid "while trying to delete %s"
 msgstr ""
 
-#: e2fsck/unix.c:1392 misc/mke2fs.c:2892 resize/main.c:243
+#: e2fsck/unix.c:1396 misc/mke2fs.c:2916 resize/main.c:243
 msgid "while trying to setup undo file\n"
 msgstr ""
 
-#: e2fsck/unix.c:1436
+#: e2fsck/unix.c:1440
 msgid "Error: ext2fs library version out of date!\n"
 msgstr ""
 
-#: e2fsck/unix.c:1443
+#: e2fsck/unix.c:1447
 msgid "while trying to initialize program"
 msgstr ""
 
-#: e2fsck/unix.c:1480
+#: e2fsck/unix.c:1484
 #, c-format
 msgid "\tUsing %s, %s\n"
 msgstr ""
 
-#: e2fsck/unix.c:1492
+#: e2fsck/unix.c:1496
 msgid "need terminal for interactive repairs"
 msgstr ""
 
-#: e2fsck/unix.c:1553
+#: e2fsck/unix.c:1557
 #, c-format
 msgid "%s: %s trying backup blocks...\n"
 msgstr ""
 
-#: e2fsck/unix.c:1555
+#: e2fsck/unix.c:1559
 msgid "Superblock invalid,"
 msgstr ""
 
-#: e2fsck/unix.c:1556
+#: e2fsck/unix.c:1560
 msgid "Group descriptors look bad..."
 msgstr ""
 
-#: e2fsck/unix.c:1566
-#, c-format
-msgid "%s: %s while using the backup blocks"
-msgstr ""
-
 #: e2fsck/unix.c:1570
 #, c-format
+msgid "%s: %s while using the backup blocks"
+msgstr ""
+
+#: e2fsck/unix.c:1574
+#, c-format
 msgid "%s: going back to original superblock\n"
 msgstr ""
 
-#: e2fsck/unix.c:1599
+#: e2fsck/unix.c:1603
 msgid ""
 "The filesystem revision is apparently too high for this version of e2fsck.\n"
 "(Or the filesystem superblock is corrupt)\n"
 "\n"
 msgstr ""
 
-#: e2fsck/unix.c:1606
+#: e2fsck/unix.c:1610
 msgid "Could this be a zero-length partition?\n"
 msgstr ""
 
-#: e2fsck/unix.c:1608
+#: e2fsck/unix.c:1612
 #, c-format
 msgid "You must have %s access to the filesystem or be root\n"
 msgstr ""
 
-#: e2fsck/unix.c:1614
+#: e2fsck/unix.c:1618
 msgid "Possibly non-existent or swap device?\n"
 msgstr ""
 
-#: e2fsck/unix.c:1616
+#: e2fsck/unix.c:1620
 msgid "Filesystem mounted or opened exclusively by another program?\n"
 msgstr ""
 
-#: e2fsck/unix.c:1620
+#: e2fsck/unix.c:1624
 msgid "Possibly non-existent device?\n"
 msgstr ""
 
-#: e2fsck/unix.c:1623
+#: e2fsck/unix.c:1627
 msgid ""
 "Disk write-protected; use the -n option to do a read-only\n"
 "check of the device.\n"
 msgstr ""
 
-#: e2fsck/unix.c:1638
+#: e2fsck/unix.c:1642
 #, c-format
 msgid "%s: Trying to load superblock despite errors...\n"
 msgstr ""
 
-#: e2fsck/unix.c:1713
+#: e2fsck/unix.c:1717
 msgid "Get a newer version of e2fsck!"
 msgstr ""
 
-#: e2fsck/unix.c:1773
+#: e2fsck/unix.c:1777
 #, c-format
 msgid "while checking journal for %s"
 msgstr ""
 
-#: e2fsck/unix.c:1776
+#: e2fsck/unix.c:1780
 msgid "Cannot proceed with file system check"
 msgstr ""
 
-#: e2fsck/unix.c:1787
+#: e2fsck/unix.c:1791
 msgid ""
 "Warning: skipping journal recovery because doing a read-only filesystem "
 "check.\n"
 msgstr ""
 
-#: e2fsck/unix.c:1799
+#: e2fsck/unix.c:1803
 #, c-format
 msgid "unable to set superblock flags on %s\n"
 msgstr ""
 
-#: e2fsck/unix.c:1805
+#: e2fsck/unix.c:1809
 #, c-format
 msgid "Journal checksum error found in %s\n"
 msgstr ""
 
-#: e2fsck/unix.c:1809
+#: e2fsck/unix.c:1813
 #, c-format
 msgid "Journal corrupted in %s\n"
 msgstr ""
 
-#: e2fsck/unix.c:1813
+#: e2fsck/unix.c:1817
 #, c-format
 msgid "while recovering journal of %s"
 msgstr ""
 
-#: e2fsck/unix.c:1835
+#: e2fsck/unix.c:1839
 #, c-format
 msgid "%s has unsupported feature(s):"
 msgstr ""
 
-#: e2fsck/unix.c:1850
+#: e2fsck/unix.c:1854
 #, c-format
 msgid "%s has unsupported encoding: %0x\n"
 msgstr ""
 
-#: e2fsck/unix.c:1900
+#: e2fsck/unix.c:1904
 #, c-format
 msgid "%s: %s while reading bad blocks inode\n"
 msgstr ""
 
-#: e2fsck/unix.c:1903
+#: e2fsck/unix.c:1907
 msgid "This doesn't bode well, but we'll try to go on...\n"
 msgstr ""
 
-#: e2fsck/unix.c:1946
+#: e2fsck/unix.c:1950
 #, c-format
 msgid "Creating journal (%d blocks): "
 msgstr ""
 
-#: e2fsck/unix.c:1955 e2fsck/unix.c:2027
+#: e2fsck/unix.c:1959 e2fsck/unix.c:2031
 msgid " Done.\n"
 msgstr ""
 
-#: e2fsck/unix.c:1957
+#: e2fsck/unix.c:1961
 msgid ""
 "\n"
 "*** journal has been regenerated ***\n"
 msgstr ""
 
-#: e2fsck/unix.c:1963
+#: e2fsck/unix.c:1967
 msgid "aborted"
 msgstr ""
 
-#: e2fsck/unix.c:1965
+#: e2fsck/unix.c:1969
 #, c-format
 msgid "%s: e2fsck canceled.\n"
 msgstr ""
 
-#: e2fsck/unix.c:2015
+#: e2fsck/unix.c:2019
 #, c-format
 msgid "Creating orphan file (%d blocks): "
 msgstr ""
 
-#: e2fsck/unix.c:2059
+#: e2fsck/unix.c:2063
 msgid "Restarting e2fsck from the beginning...\n"
 msgstr ""
 
-#: e2fsck/unix.c:2063
+#: e2fsck/unix.c:2067
 msgid "while resetting context"
 msgstr ""
 
-#: e2fsck/unix.c:2123
+#: e2fsck/unix.c:2127
 #, c-format
 msgid ""
 "\n"
 "%s: ***** FILE SYSTEM ERRORS CORRECTED *****\n"
 msgstr ""
 
-#: e2fsck/unix.c:2125
+#: e2fsck/unix.c:2129
 #, c-format
 msgid "%s: File system was modified.\n"
 msgstr ""
 
-#: e2fsck/unix.c:2129 e2fsck/util.c:67
+#: e2fsck/unix.c:2133 e2fsck/util.c:67
 #, c-format
 msgid ""
 "\n"
 "%s: ***** FILE SYSTEM WAS MODIFIED *****\n"
 msgstr ""
 
-#: e2fsck/unix.c:2134
+#: e2fsck/unix.c:2138
 #, c-format
 msgid "%s: ***** REBOOT SYSTEM *****\n"
 msgstr ""
 
-#: e2fsck/unix.c:2144 e2fsck/util.c:73
+#: e2fsck/unix.c:2148 e2fsck/util.c:73
 #, c-format
 msgid ""
 "\n"
@@ -4138,168 +4218,168 @@
 msgid "Must use '-v', =, - or +\n"
 msgstr ""
 
-#: misc/create_inode.c:82 misc/create_inode.c:121
+#: misc/create_inode.c:81 misc/create_inode.c:127
 #, c-format
 msgid "while reading inode %u"
 msgstr ""
 
-#: misc/create_inode.c:92 misc/create_inode.c:301 misc/create_inode.c:368
-#: misc/create_inode.c:406
+#: misc/create_inode.c:91 misc/create_inode.c:307 misc/create_inode.c:374
+#: misc/create_inode.c:412
 msgid "while expanding directory"
 msgstr ""
 
-#: misc/create_inode.c:99
+#: misc/create_inode.c:98
 #, c-format
 msgid "while linking \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:107 misc/create_inode.c:136 misc/create_inode.c:337
+#: misc/create_inode.c:106 misc/create_inode.c:142 misc/create_inode.c:343
 #, c-format
 msgid "while writing inode %u"
 msgstr ""
 
-#: misc/create_inode.c:158 misc/create_inode.c:189
+#: misc/create_inode.c:164 misc/create_inode.c:195
 #, c-format
 msgid "while listing attributes of \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:169
+#: misc/create_inode.c:175
 #, c-format
 msgid "while opening inode %u"
 msgstr ""
 
-#: misc/create_inode.c:176
+#: misc/create_inode.c:182
 #, c-format
 msgid "while reading xattrs for inode %u"
 msgstr ""
 
-#: misc/create_inode.c:182 misc/create_inode.c:209 misc/create_inode.c:1066
+#: misc/create_inode.c:188 misc/create_inode.c:215 misc/create_inode.c:1072
 #: misc/e2undo.c:188 misc/e2undo.c:485 misc/e2undo.c:491 misc/e2undo.c:497
-#: misc/mke2fs.c:363
+#: misc/mke2fs.c:364
 msgid "while allocating memory"
 msgstr ""
 
-#: misc/create_inode.c:202 misc/create_inode.c:218
+#: misc/create_inode.c:208 misc/create_inode.c:224
 #, c-format
 msgid "while reading attribute \"%s\" of \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:227
+#: misc/create_inode.c:233
 #, c-format
 msgid "while writing attribute \"%s\" to inode %u"
 msgstr ""
 
-#: misc/create_inode.c:237
+#: misc/create_inode.c:243
 #, c-format
 msgid "while closing inode %u"
 msgstr ""
 
-#: misc/create_inode.c:288
+#: misc/create_inode.c:294
 #, c-format
 msgid "while allocating inode \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:307
+#: misc/create_inode.c:313
 #, c-format
 msgid "while creating inode \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:375
+#: misc/create_inode.c:381
 #, c-format
 msgid "while creating symlink \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:393 misc/create_inode.c:658 misc/create_inode.c:986
+#: misc/create_inode.c:399 misc/create_inode.c:664 misc/create_inode.c:992
 #, c-format
 msgid "while looking up \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:413
+#: misc/create_inode.c:419
 #, c-format
 msgid "while creating directory \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:644
+#: misc/create_inode.c:650
 #, c-format
 msgid "while opening \"%s\" to copy"
 msgstr ""
 
-#: misc/create_inode.c:824
+#: misc/create_inode.c:830
 #, c-format
 msgid "while changing working directory to \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:834
+#: misc/create_inode.c:840
 #, c-format
 msgid "while scanning directory \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:844
+#: misc/create_inode.c:850
 #, c-format
 msgid "while lstat \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:894
+#: misc/create_inode.c:900
 #, c-format
 msgid "while creating special file \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:906
+#: misc/create_inode.c:912
 msgid "malloc failed"
 msgstr ""
 
-#: misc/create_inode.c:914
+#: misc/create_inode.c:920
 #, c-format
 msgid "while trying to read link \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:921
+#: misc/create_inode.c:927
 msgid "symlink increased in size between lstat() and readlink()"
 msgstr ""
 
-#: misc/create_inode.c:932
+#: misc/create_inode.c:938
 #, c-format
 msgid "while writing symlink\"%s\""
 msgstr ""
 
-#: misc/create_inode.c:944
+#: misc/create_inode.c:950
 #, c-format
 msgid "while writing file \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:957
+#: misc/create_inode.c:963
 #, c-format
 msgid "while making dir \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:975
+#: misc/create_inode.c:981
 msgid "while changing directory"
 msgstr ""
 
-#: misc/create_inode.c:981
+#: misc/create_inode.c:987
 #, c-format
 msgid "ignoring entry \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:994
+#: misc/create_inode.c:1000
 #, c-format
 msgid "while setting inode for \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:1001
+#: misc/create_inode.c:1007
 #, c-format
 msgid "while setting xattrs for \"%s\""
 msgstr ""
 
-#: misc/create_inode.c:1027
+#: misc/create_inode.c:1033
 msgid "while saving inode data"
 msgstr ""
 
-#: misc/create_inode.c:1086
+#: misc/create_inode.c:1092
 msgid "while calling stat"
 msgstr ""
 
-#: misc/create_inode.c:1098
+#: misc/create_inode.c:1104
 msgid "while copying xattrs on root directory"
 msgstr ""
 
@@ -4450,7 +4530,7 @@
 msgid "reading MMP block %llu from '%s'\n"
 msgstr ""
 
-#: misc/dumpe2fs.c:520 misc/mke2fs.c:837 misc/tune2fs.c:2260
+#: misc/dumpe2fs.c:520 misc/mke2fs.c:849 misc/tune2fs.c:2260
 msgid "Couldn't allocate memory to parse options!\n"
 msgstr ""
 
@@ -4478,13 +4558,13 @@
 "\tblocksize=<blocksize>\n"
 msgstr ""
 
-#: misc/dumpe2fs.c:663 misc/mke2fs.c:1963
+#: misc/dumpe2fs.c:663 misc/mke2fs.c:1990
 #, c-format
 msgid "\tUsing %s\n"
 msgstr ""
 
-#: misc/dumpe2fs.c:710 misc/e2image.c:1643 misc/tune2fs.c:3250
-#: resize/main.c:426
+#: misc/dumpe2fs.c:710 misc/e2image.c:1649 misc/tune2fs.c:3251
+#: resize/main.c:424
 msgid "Couldn't find valid filesystem superblock.\n"
 msgstr ""
 
@@ -4523,7 +4603,7 @@
 "[ dest_fs ]\n"
 msgstr ""
 
-#: misc/e2image.c:177 misc/e2image.c:593 misc/e2image.c:599 misc/e2image.c:1201
+#: misc/e2image.c:177 misc/e2image.c:599 misc/e2image.c:605 misc/e2image.c:1207
 msgid "while allocating buffer"
 msgstr ""
 
@@ -4549,158 +4629,158 @@
 msgid "Couldn't allocate header buffer\n"
 msgstr ""
 
-#: misc/e2image.c:250
+#: misc/e2image.c:251
 msgid "while writing superblock"
 msgstr ""
 
-#: misc/e2image.c:259
+#: misc/e2image.c:260
 msgid "while writing inode table"
 msgstr ""
 
-#: misc/e2image.c:267
+#: misc/e2image.c:268
 msgid "while writing block bitmap"
 msgstr ""
 
-#: misc/e2image.c:275
+#: misc/e2image.c:276
 msgid "while writing inode bitmap"
 msgstr ""
 
-#: misc/e2image.c:517
+#: misc/e2image.c:523
 #, c-format
 msgid "Corrupt directory block %llu: bad rec_len (%d)\n"
 msgstr ""
 
-#: misc/e2image.c:529
+#: misc/e2image.c:535
 #, c-format
 msgid "Corrupt directory block %llu: bad name_len (%d)\n"
 msgstr ""
 
-#: misc/e2image.c:570
+#: misc/e2image.c:576
 #, c-format
 msgid "%llu / %llu blocks (%d%%)"
 msgstr ""
 
-#: misc/e2image.c:603 misc/e2image.c:643
+#: misc/e2image.c:609 misc/e2image.c:649
 msgid "Copying "
 msgstr ""
 
-#: misc/e2image.c:640
+#: misc/e2image.c:646
 msgid ""
 "Stopping now will destroy the filesystem, interrupt again if you are sure\n"
 msgstr ""
 
-#: misc/e2image.c:666
+#: misc/e2image.c:672
 #, c-format
 msgid " %s remaining at %.2f MB/s"
 msgstr ""
 
-#: misc/e2image.c:678 misc/e2image.c:1211
+#: misc/e2image.c:684 misc/e2image.c:1217
 #, c-format
 msgid "error reading block %llu"
 msgstr ""
 
-#: misc/e2image.c:733
+#: misc/e2image.c:739
 #, c-format
 msgid "Copied %llu / %llu blocks (%d%%) in %s "
 msgstr ""
 
-#: misc/e2image.c:738
+#: misc/e2image.c:744
 #, c-format
 msgid "at %.2f MB/s"
 msgstr ""
 
-#: misc/e2image.c:774
+#: misc/e2image.c:780
 msgid "while allocating l1 table"
 msgstr ""
 
-#: misc/e2image.c:819
+#: misc/e2image.c:825
 msgid "while allocating l2 cache"
 msgstr ""
 
-#: misc/e2image.c:842
+#: misc/e2image.c:848
 msgid ""
 "Warning: There are still tables in the cache while putting the cache, data "
 "will be lost so the image may not be valid.\n"
 msgstr ""
 
-#: misc/e2image.c:1168
+#: misc/e2image.c:1174
 msgid "while allocating ext2_qcow2_image"
 msgstr ""
 
-#: misc/e2image.c:1175
+#: misc/e2image.c:1181
 msgid "while initializing ext2_qcow2_image"
 msgstr ""
 
-#: misc/e2image.c:1235 misc/e2image.c:1253
+#: misc/e2image.c:1241 misc/e2image.c:1259
 msgid "Programming error: multiple sequential refcount blocks created!\n"
 msgstr ""
 
-#: misc/e2image.c:1294
+#: misc/e2image.c:1300
 msgid "while allocating block bitmap"
 msgstr ""
 
-#: misc/e2image.c:1303
+#: misc/e2image.c:1309
 msgid "while allocating scramble block bitmap"
 msgstr ""
 
-#: misc/e2image.c:1326
+#: misc/e2image.c:1332
 msgid "Scanning inodes...\n"
 msgstr ""
 
-#: misc/e2image.c:1338
+#: misc/e2image.c:1344
 msgid "Can't allocate block buffer"
 msgstr ""
 
-#: misc/e2image.c:1350
+#: misc/e2image.c:1356
 msgid "while getting next inode"
 msgstr ""
 
-#: misc/e2image.c:1380 misc/e2image.c:1394
+#: misc/e2image.c:1386 misc/e2image.c:1400
 #, c-format
 msgid "while iterating over inode %u"
 msgstr ""
 
-#: misc/e2image.c:1426
+#: misc/e2image.c:1432
 msgid "Raw and qcow2 images cannot be installed"
 msgstr ""
 
-#: misc/e2image.c:1448
+#: misc/e2image.c:1454
 msgid "error reading bitmaps"
 msgstr ""
 
-#: misc/e2image.c:1460
+#: misc/e2image.c:1466
 msgid "while opening device file"
 msgstr ""
 
-#: misc/e2image.c:1471
+#: misc/e2image.c:1477
 msgid "while restoring the image table"
 msgstr ""
 
-#: misc/e2image.c:1579
+#: misc/e2image.c:1585
 msgid "-a option can only be used with raw or QCOW2 images."
 msgstr ""
 
-#: misc/e2image.c:1584
+#: misc/e2image.c:1590
 msgid "-b option can only be used with raw or QCOW2 images."
 msgstr ""
 
-#: misc/e2image.c:1590
+#: misc/e2image.c:1596
 msgid "Offsets are only allowed with raw images."
 msgstr ""
 
-#: misc/e2image.c:1595
+#: misc/e2image.c:1601
 msgid "Move mode is only allowed with raw images."
 msgstr ""
 
-#: misc/e2image.c:1600
+#: misc/e2image.c:1606
 msgid "Move mode requires all data mode."
 msgstr ""
 
-#: misc/e2image.c:1610
+#: misc/e2image.c:1616
 msgid "checking if mounted"
 msgstr ""
 
-#: misc/e2image.c:1617
+#: misc/e2image.c:1623
 msgid ""
 "\n"
 "Running e2image on a R/W mounted filesystem can result in an\n"
@@ -4708,51 +4788,51 @@
 "Use -f option if you really want to do that.\n"
 msgstr ""
 
-#: misc/e2image.c:1671
+#: misc/e2image.c:1677
 msgid "QCOW2 image can not be written to the stdout!\n"
 msgstr ""
 
-#: misc/e2image.c:1677
+#: misc/e2image.c:1683
 msgid "Can not stat output\n"
 msgstr ""
 
-#: misc/e2image.c:1687
-#, c-format
-msgid "Image (%s) is compressed\n"
-msgstr ""
-
-#: misc/e2image.c:1690
-#, c-format
-msgid "Image (%s) is encrypted\n"
-msgstr ""
-
 #: misc/e2image.c:1693
 #, c-format
+msgid "Image (%s) is compressed\n"
+msgstr ""
+
+#: misc/e2image.c:1696
+#, c-format
+msgid "Image (%s) is encrypted\n"
+msgstr ""
+
+#: misc/e2image.c:1699
+#, c-format
 msgid "Image (%s) is corrupted\n"
 msgstr ""
 
-#: misc/e2image.c:1697
+#: misc/e2image.c:1703
 #, c-format
 msgid "while trying to convert qcow2 image (%s) into raw image (%s)"
 msgstr ""
 
-#: misc/e2image.c:1707
+#: misc/e2image.c:1713
 msgid "The -c option only supported in raw mode\n"
 msgstr ""
 
-#: misc/e2image.c:1712
+#: misc/e2image.c:1718
 msgid "The -c option not supported when writing to stdout\n"
 msgstr ""
 
-#: misc/e2image.c:1719
+#: misc/e2image.c:1725
 msgid "while allocating check_buf"
 msgstr ""
 
-#: misc/e2image.c:1725
+#: misc/e2image.c:1731
 msgid "The -p option only supported in raw mode\n"
 msgstr ""
 
-#: misc/e2image.c:1735
+#: misc/e2image.c:1741
 #, c-format
 msgid "%d blocks already contained the data to be copied\n"
 msgstr ""
@@ -4782,7 +4862,7 @@
 msgid "e2label: not an ext2 filesystem\n"
 msgstr ""
 
-#: misc/e2label.c:97 misc/tune2fs.c:3137 misc/tune2fs.c:3460
+#: misc/e2label.c:97 misc/tune2fs.c:3138 misc/tune2fs.c:3465
 #, c-format
 msgid "Warning: label too long, truncating.\n"
 msgstr ""
@@ -4958,51 +5038,51 @@
 msgid "Incomplete undo record; run e2fsck.\n"
 msgstr ""
 
-#: misc/findsuper.c:110
+#: misc/findsuper.c:108
 #, c-format
 msgid "Usage:  findsuper device [skipbytes [startkb]]\n"
 msgstr ""
 
-#: misc/findsuper.c:155
+#: misc/findsuper.c:153
 #, c-format
 msgid "skipbytes should be a number, not %s\n"
 msgstr ""
 
-#: misc/findsuper.c:162
+#: misc/findsuper.c:160
 #, c-format
 msgid "skipbytes must be a multiple of the sector size\n"
 msgstr ""
 
-#: misc/findsuper.c:169
+#: misc/findsuper.c:167
 #, c-format
 msgid "startkb should be a number, not %s\n"
 msgstr ""
 
-#: misc/findsuper.c:175
+#: misc/findsuper.c:173
 #, c-format
 msgid "startkb should be positive, not %llu\n"
 msgstr ""
 
-#: misc/findsuper.c:186
+#: misc/findsuper.c:184
 #, c-format
 msgid "starting at %llu, with %u byte increments\n"
 msgstr ""
 
-#: misc/findsuper.c:188
+#: misc/findsuper.c:186
 #, c-format
 msgid ""
 "[*] probably superblock written in the ext3 journal superblock,\n"
 "\tso start/end/grp wrong\n"
 msgstr ""
 
-#: misc/findsuper.c:190
+#: misc/findsuper.c:188
 #, c-format
 msgid ""
 "byte_offset  byte_start     byte_end  fs_blocks blksz  grp  mkfs/"
 "mount_time           sb_uuid label\n"
 msgstr ""
 
-#: misc/findsuper.c:264
+#: misc/findsuper.c:262
 #, c-format
 msgid ""
 "\n"
@@ -5067,92 +5147,92 @@
 msgid "Couldn't allocate memory for filesystem types\n"
 msgstr ""
 
-#: misc/fsck.c:894
+#: misc/fsck.c:895
 #, c-format
 msgid ""
 "%s: skipping bad line in /etc/fstab: bind mount with nonzero fsck pass "
 "number\n"
 msgstr ""
 
-#: misc/fsck.c:921
+#: misc/fsck.c:922
 #, c-format
 msgid "fsck: cannot check %s: fsck.%s not found\n"
 msgstr ""
 
-#: misc/fsck.c:977
+#: misc/fsck.c:978
 msgid "Checking all file systems.\n"
 msgstr ""
 
-#: misc/fsck.c:1068
+#: misc/fsck.c:1069
 #, c-format
 msgid "--waiting-- (pass %d)\n"
 msgstr ""
 
-#: misc/fsck.c:1088
+#: misc/fsck.c:1089
 msgid ""
 "Usage: fsck [-AMNPRTV] [ -C [ fd ] ] [-t fstype] [fs-options] [filesys ...]\n"
 msgstr ""
 
-#: misc/fsck.c:1130
+#: misc/fsck.c:1131
 #, c-format
 msgid "%s: too many devices\n"
 msgstr ""
 
-#: misc/fsck.c:1163 misc/fsck.c:1249
+#: misc/fsck.c:1164 misc/fsck.c:1250
 #, c-format
 msgid "%s: too many arguments\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3804
+#: misc/fuse2fs.c:3819
 msgid "Mounting read-only.\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3828
+#: misc/fuse2fs.c:3843
 #, c-format
 msgid "%s: Allowing users to allocate all blocks. This is dangerous!\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3842 misc/fuse2fs.c:3860
+#: misc/fuse2fs.c:3857 misc/fuse2fs.c:3875
 #, c-format
 msgid "%s: %s.\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3843 misc/fuse2fs.c:3862 misc/tune2fs.c:3351
+#: misc/fuse2fs.c:3858 misc/fuse2fs.c:3877 misc/tune2fs.c:3352
 #, c-format
 msgid "Please run e2fsck -fy %s.\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3853
+#: misc/fuse2fs.c:3868
 #, c-format
 msgid "%s: mounting read-only without recovering journal\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3869
+#: misc/fuse2fs.c:3884
 msgid "Journal needs recovery; running `e2fsck -E journal_only' is required.\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3877
+#: misc/fuse2fs.c:3892
 #, c-format
 msgid "%s: Writing to the journal is not supported.\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3892
+#: misc/fuse2fs.c:3907
 msgid "Warning: Mounting unchecked fs, running e2fsck is recommended.\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3896
+#: misc/fuse2fs.c:3911
 msgid "Warning: Maximal mount count reached, running e2fsck is recommended.\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3901
+#: misc/fuse2fs.c:3916
 msgid "Warning: Check time reached; running e2fsck is recommended.\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3905
+#: misc/fuse2fs.c:3920
 msgid "Orphans detected; running e2fsck is recommended.\n"
 msgstr ""
 
-#: misc/fuse2fs.c:3909
+#: misc/fuse2fs.c:3924
 msgid "Errors detected; running e2fsck is required.\n"
 msgstr ""
 
@@ -5180,7 +5260,7 @@
 msgid "Couldn't allocate path variable in lsattr_dir_proc\n"
 msgstr ""
 
-#: misc/mke2fs.c:133
+#: misc/mke2fs.c:134
 #, c-format
 msgid ""
 "Usage: %s [-c|-l filename] [-b block-size] [-C cluster-size]\n"
@@ -5194,35 +5274,35 @@
 "\t[-jnqvDFSV] device [blocks-count]\n"
 msgstr ""
 
-#: misc/mke2fs.c:265
+#: misc/mke2fs.c:266
 #, c-format
 msgid "Running command: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:269
+#: misc/mke2fs.c:270
 #, c-format
 msgid "while trying to run '%s'"
 msgstr ""
 
-#: misc/mke2fs.c:276
+#: misc/mke2fs.c:277
 msgid "while processing list of bad blocks from program"
 msgstr ""
 
-#: misc/mke2fs.c:303
+#: misc/mke2fs.c:304
 #, c-format
 msgid "Block %d in primary superblock/group descriptor area bad.\n"
 msgstr ""
 
-#: misc/mke2fs.c:305
+#: misc/mke2fs.c:306
 #, c-format
 msgid "Blocks %u through %u must be good in order to build a filesystem.\n"
 msgstr ""
 
-#: misc/mke2fs.c:308
+#: misc/mke2fs.c:309
 msgid "Aborting....\n"
 msgstr ""
 
-#: misc/mke2fs.c:328
+#: misc/mke2fs.c:329
 #, c-format
 msgid ""
 "Warning: the backup superblock/group descriptors at block %u contain\n"
@@ -5230,268 +5310,278 @@
 "\n"
 msgstr ""
 
-#: misc/mke2fs.c:347 misc/mke2fs.c:3398
+#: misc/mke2fs.c:348 misc/mke2fs.c:3422
 msgid "while marking bad blocks as used"
 msgstr ""
 
-#: misc/mke2fs.c:372
+#: misc/mke2fs.c:373
 msgid "while writing reserved inodes"
 msgstr ""
 
-#: misc/mke2fs.c:424
+#: misc/mke2fs.c:425
 msgid "Writing inode tables: "
 msgstr ""
 
-#: misc/mke2fs.c:456 misc/mke2fs.c:475
+#: misc/mke2fs.c:457 misc/mke2fs.c:476
 #, c-format
 msgid ""
 "\n"
 "Could not write %d blocks in inode table starting at %llu: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:485 misc/mke2fs.c:2938 misc/mke2fs.c:3358
+#: misc/mke2fs.c:486 misc/mke2fs.c:2962 misc/mke2fs.c:3382
 msgid "done                            \n"
 msgstr ""
 
-#: misc/mke2fs.c:500
+#: misc/mke2fs.c:502
 msgid "while creating root dir"
 msgstr ""
 
-#: misc/mke2fs.c:507
+#: misc/mke2fs.c:512
 msgid "while reading root inode"
 msgstr ""
 
-#: misc/mke2fs.c:519
+#: misc/mke2fs.c:532
 msgid "while setting root inode ownership"
 msgstr ""
 
-#: misc/mke2fs.c:537
+#: misc/mke2fs.c:550
 msgid "while creating /lost+found"
 msgstr ""
 
-#: misc/mke2fs.c:544
+#: misc/mke2fs.c:557
 msgid "while looking up /lost+found"
 msgstr ""
 
-#: misc/mke2fs.c:557
+#: misc/mke2fs.c:570
 msgid "while expanding /lost+found"
 msgstr ""
 
-#: misc/mke2fs.c:572
+#: misc/mke2fs.c:585
 msgid "while setting bad block inode"
 msgstr ""
 
-#: misc/mke2fs.c:599
+#: misc/mke2fs.c:612
 #, c-format
 msgid "Out of memory erasing sectors %d-%d\n"
 msgstr ""
 
-#: misc/mke2fs.c:609
+#: misc/mke2fs.c:622
 #, c-format
 msgid "Warning: could not read block 0: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:627
+#: misc/mke2fs.c:640
 #, c-format
 msgid "Warning: could not erase sector %d: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:643
+#: misc/mke2fs.c:656
 msgid "while splitting the journal size"
 msgstr ""
 
-#: misc/mke2fs.c:650
+#: misc/mke2fs.c:663
 msgid "while initializing journal superblock"
 msgstr ""
 
-#: misc/mke2fs.c:658
+#: misc/mke2fs.c:671
 msgid "Zeroing journal device: "
 msgstr ""
 
-#: misc/mke2fs.c:670
+#: misc/mke2fs.c:683
 #, c-format
 msgid "while zeroing journal device (block %llu, count %d)"
 msgstr ""
 
-#: misc/mke2fs.c:688
+#: misc/mke2fs.c:701
 msgid "while writing journal superblock"
 msgstr ""
 
-#: misc/mke2fs.c:702
+#: misc/mke2fs.c:715
 #, c-format
 msgid "Creating filesystem with %llu %dk blocks and %u inodes\n"
 msgstr ""
 
-#: misc/mke2fs.c:710
+#: misc/mke2fs.c:723
 #, c-format
 msgid ""
 "warning: %llu blocks unused.\n"
 "\n"
 msgstr ""
 
-#: misc/mke2fs.c:714
+#: misc/mke2fs.c:727
 #, c-format
 msgid "Filesystem label=%.*s\n"
 msgstr ""
 
-#: misc/mke2fs.c:718
+#: misc/mke2fs.c:731
 #, c-format
 msgid "OS type: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:720
+#: misc/mke2fs.c:733
 #, c-format
 msgid "Block size=%u (log=%u)\n"
 msgstr ""
 
-#: misc/mke2fs.c:723
+#: misc/mke2fs.c:736
 #, c-format
 msgid "Cluster size=%u (log=%u)\n"
 msgstr ""
 
-#: misc/mke2fs.c:727
+#: misc/mke2fs.c:740
 #, c-format
 msgid "Fragment size=%u (log=%u)\n"
 msgstr ""
 
-#: misc/mke2fs.c:729
+#: misc/mke2fs.c:742
 #, c-format
 msgid "Stride=%u blocks, Stripe width=%u blocks\n"
 msgstr ""
 
-#: misc/mke2fs.c:731
+#: misc/mke2fs.c:744
 #, c-format
 msgid "%u inodes, %llu blocks\n"
 msgstr ""
 
-#: misc/mke2fs.c:733
+#: misc/mke2fs.c:746
 #, c-format
 msgid "%llu blocks (%2.2f%%) reserved for the super user\n"
 msgstr ""
 
-#: misc/mke2fs.c:736
+#: misc/mke2fs.c:749
 #, c-format
 msgid "First data block=%u\n"
 msgstr ""
 
-#: misc/mke2fs.c:738
+#: misc/mke2fs.c:751
 #, c-format
 msgid "Root directory owner=%u:%u\n"
 msgstr ""
 
-#: misc/mke2fs.c:740
+#: misc/mke2fs.c:753
 #, c-format
 msgid "Maximum filesystem blocks=%lu\n"
 msgstr ""
 
-#: misc/mke2fs.c:744
+#: misc/mke2fs.c:757
 #, c-format
 msgid "%u block groups\n"
 msgstr ""
 
-#: misc/mke2fs.c:746
+#: misc/mke2fs.c:759
 #, c-format
 msgid "%u block group\n"
 msgstr ""
 
-#: misc/mke2fs.c:748
+#: misc/mke2fs.c:761
 #, c-format
 msgid "%u blocks per group, %u clusters per group\n"
 msgstr ""
 
-#: misc/mke2fs.c:751
+#: misc/mke2fs.c:764
 #, c-format
 msgid "%u blocks per group, %u fragments per group\n"
 msgstr ""
 
-#: misc/mke2fs.c:753
+#: misc/mke2fs.c:766
 #, c-format
 msgid "%u inodes per group\n"
 msgstr ""
 
-#: misc/mke2fs.c:762
+#: misc/mke2fs.c:775
 #, c-format
 msgid "Filesystem UUID: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:763
+#: misc/mke2fs.c:776
 msgid "Superblock backups stored on blocks: "
 msgstr ""
 
-#: misc/mke2fs.c:859
+#: misc/mke2fs.c:869
 #, c-format
 msgid "%s requires '-O 64bit'\n"
 msgstr ""
 
-#: misc/mke2fs.c:865
+#: misc/mke2fs.c:875
 #, c-format
 msgid "'%s' must be before 'resize=%u'\n"
 msgstr ""
 
-#: misc/mke2fs.c:878
+#: misc/mke2fs.c:888
 #, c-format
 msgid "Invalid desc_size: '%s'\n"
 msgstr ""
 
-#: misc/mke2fs.c:892
+#: misc/mke2fs.c:902
 #, c-format
 msgid "Invalid hash seed: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:904
+#: misc/mke2fs.c:914
 #, c-format
 msgid "Invalid offset: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:918 misc/tune2fs.c:2288
+#: misc/mke2fs.c:928 misc/tune2fs.c:2288
 #, c-format
 msgid "Invalid mmp_update_interval: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:935
+#: misc/mke2fs.c:945
 #, c-format
 msgid "Invalid # of backup superblocks: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:957
+#: misc/mke2fs.c:967
 #, c-format
 msgid "Invalid stride parameter: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:972
+#: misc/mke2fs.c:982
 #, c-format
 msgid "Invalid stripe-width parameter: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:995
+#: misc/mke2fs.c:1005
 #, c-format
 msgid "Invalid resize parameter: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:1002
+#: misc/mke2fs.c:1012
 msgid "The resize maximum must be greater than the filesystem size.\n"
 msgstr ""
 
-#: misc/mke2fs.c:1026
+#: misc/mke2fs.c:1036
 msgid "On-line resizing not supported with revision 0 filesystems\n"
 msgstr ""
 
-#: misc/mke2fs.c:1057 misc/mke2fs.c:1066
+#: misc/mke2fs.c:1053
+#, c-format
+msgid "bad revision level - %s"
+msgstr ""
+
+#: misc/mke2fs.c:1058
+#, c-format
+msgid "while trying to create revision %d"
+msgstr ""
+
+#: misc/mke2fs.c:1085 misc/mke2fs.c:1094
 #, c-format
 msgid "Invalid root_owner: '%s'\n"
 msgstr ""
 
-#: misc/mke2fs.c:1111
+#: misc/mke2fs.c:1143
 #, c-format
 msgid "Invalid encoding: %s"
 msgstr ""
 
-#: misc/mke2fs.c:1133 misc/tune2fs.c:2423
+#: misc/mke2fs.c:1165 misc/tune2fs.c:2423
 #, c-format
 msgid "Invalid size of orphan file %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:1144
+#: misc/mke2fs.c:1176
 #, c-format
 msgid ""
 "\n"
@@ -5511,9 +5601,11 @@
 "\tlazy_itable_init=<0 to disable, 1 to enable>\n"
 "\tlazy_journal_init=<0 to disable, 1 to enable>\n"
 "\troot_owner=<uid of root dir>:<gid of root dir>\n"
+"\troot_perms=<octal root directory permissions>\n"
 "\ttest_fs\n"
 "\tdiscard\n"
 "\tnodiscard\n"
+"\trevision=<revision>\n"
 "\tencoding=<encoding>\n"
 "\tencoding_flags=<flags>\n"
 "\tquotatype=<quota type(s) to be enabled>\n"
@@ -5521,7 +5613,7 @@
 "\n"
 msgstr ""
 
-#: misc/mke2fs.c:1172
+#: misc/mke2fs.c:1206
 #, c-format
 msgid ""
 "\n"
@@ -5529,52 +5621,52 @@
 "\n"
 msgstr ""
 
-#: misc/mke2fs.c:1183 misc/tune2fs.c:2439
+#: misc/mke2fs.c:1217 misc/tune2fs.c:2439
 #, c-format
 msgid "error: Invalid encoding flag: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:1189 misc/tune2fs.c:2448
+#: misc/mke2fs.c:1223 misc/tune2fs.c:2448
 #, c-format
 msgid ""
 "error: An encoding must be explicitly specified when passing encoding-flags\n"
 msgstr ""
 
-#: misc/mke2fs.c:1240
+#: misc/mke2fs.c:1274
 #, c-format
 msgid ""
 "Syntax error in mke2fs config file (%s, line #%d)\n"
 "\t%s\n"
 msgstr ""
 
-#: misc/mke2fs.c:1253 misc/tune2fs.c:1182
+#: misc/mke2fs.c:1287 misc/tune2fs.c:1182
 #, c-format
 msgid "Invalid filesystem option set: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:1265 misc/tune2fs.c:459
+#: misc/mke2fs.c:1299 misc/tune2fs.c:459
 #, c-format
 msgid "Invalid mount option set: %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:1401
+#: misc/mke2fs.c:1435
 #, c-format
 msgid ""
 "\n"
 "Your mke2fs.conf file does not define the %s filesystem type.\n"
 msgstr ""
 
-#: misc/mke2fs.c:1405
+#: misc/mke2fs.c:1439
 msgid ""
 "You probably need to install an updated mke2fs.conf file.\n"
 "\n"
 msgstr ""
 
-#: misc/mke2fs.c:1409
+#: misc/mke2fs.c:1443
 msgid "Aborting...\n"
 msgstr ""
 
-#: misc/mke2fs.c:1450
+#: misc/mke2fs.c:1484
 #, c-format
 msgid ""
 "\n"
@@ -5582,164 +5674,169 @@
 "\n"
 msgstr ""
 
-#: misc/mke2fs.c:1640
+#: misc/mke2fs.c:1673
 msgid "Couldn't allocate memory for new PATH.\n"
 msgstr ""
 
-#: misc/mke2fs.c:1680
-#, c-format
-msgid "Couldn't init profile successfully (error: %ld).\n"
-msgstr ""
-
 #: misc/mke2fs.c:1713
 #, c-format
+msgid "Couldn't init profile successfully (error: %ld).\n"
+msgstr ""
+
+#: misc/mke2fs.c:1746
+#, c-format
 msgid "invalid block size - %s"
 msgstr ""
 
-#: misc/mke2fs.c:1717
+#: misc/mke2fs.c:1750
 #, c-format
 msgid "Warning: blocksize %d not usable on most systems.\n"
 msgstr ""
 
-#: misc/mke2fs.c:1733
+#: misc/mke2fs.c:1766
 #, c-format
 msgid "invalid cluster size - %s"
 msgstr ""
 
-#: misc/mke2fs.c:1746
+#: misc/mke2fs.c:1779
 msgid "'-R' is deprecated, use '-E' instead"
 msgstr ""
 
-#: misc/mke2fs.c:1760 misc/tune2fs.c:2014
+#: misc/mke2fs.c:1793 misc/tune2fs.c:2014
 #, c-format
 msgid "bad error behavior - %s"
 msgstr ""
 
-#: misc/mke2fs.c:1772
+#: misc/mke2fs.c:1805
 msgid "Illegal number for blocks per group"
 msgstr ""
 
-#: misc/mke2fs.c:1777
+#: misc/mke2fs.c:1810
 msgid "blocks per group must be multiple of 8"
 msgstr ""
 
-#: misc/mke2fs.c:1785
+#: misc/mke2fs.c:1818
 msgid "Illegal number for flex_bg size"
 msgstr ""
 
-#: misc/mke2fs.c:1791
+#: misc/mke2fs.c:1824
 msgid "flex_bg size must be a power of 2"
 msgstr ""
 
-#: misc/mke2fs.c:1796
+#: misc/mke2fs.c:1829
 #, c-format
 msgid "flex_bg size (%lu) must be less than or equal to 2^31"
 msgstr ""
 
-#: misc/mke2fs.c:1806
+#: misc/mke2fs.c:1839
 #, c-format
 msgid "invalid inode ratio %s (min %d/max %d)"
 msgstr ""
 
-#: misc/mke2fs.c:1816
+#: misc/mke2fs.c:1849
 #, c-format
 msgid "invalid inode size - %s"
 msgstr ""
 
-#: misc/mke2fs.c:1831
+#: misc/mke2fs.c:1864
 msgid ""
 "Warning: -K option is deprecated and should not be used anymore. Use '-E "
 "nodiscard' extended option instead!\n"
 msgstr ""
 
-#: misc/mke2fs.c:1842
+#: misc/mke2fs.c:1875
 msgid "in malloc for bad_blocks_filename"
 msgstr ""
 
-#: misc/mke2fs.c:1851
+#: misc/mke2fs.c:1884
 #, c-format
 msgid ""
 "Warning: label too long; will be truncated to '%s'\n"
 "\n"
 msgstr ""
 
-#: misc/mke2fs.c:1860
+#: misc/mke2fs.c:1893
 #, c-format
 msgid "invalid reserved blocks percent - %s"
 msgstr ""
 
-#: misc/mke2fs.c:1875
+#: misc/mke2fs.c:1908
 #, c-format
 msgid "bad num inodes - %s"
 msgstr ""
 
-#: misc/mke2fs.c:1888
+#: misc/mke2fs.c:1921
 msgid "while allocating fs_feature string"
 msgstr ""
 
-#: misc/mke2fs.c:1905
-#, c-format
-msgid "bad revision level - %s"
+#: misc/mke2fs.c:1936
+msgid ""
+"the -r option has been removed.\n"
+"\n"
+"If you really need compatibility with pre-1995 Linux systems, use the\n"
+"command-line option \"-E revision=0\".\n"
 msgstr ""
 
-#: misc/mke2fs.c:1910
-#, c-format
-msgid "while trying to create revision %d"
+#: misc/mke2fs.c:1942
+msgid ""
+"the -s option has been removed.\n"
+"\n"
+"Use the -O option to set or clear the sparse_super feature.\n"
 msgstr ""
 
-#: misc/mke2fs.c:1924
+#: misc/mke2fs.c:1951
 msgid "The -t option may only be used once"
 msgstr ""
 
-#: misc/mke2fs.c:1932
+#: misc/mke2fs.c:1959
 msgid "The -T option may only be used once"
 msgstr ""
 
-#: misc/mke2fs.c:1988 misc/mke2fs.c:3481
+#: misc/mke2fs.c:2015 misc/mke2fs.c:3505
 #, c-format
 msgid "while trying to open journal device %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:1994
+#: misc/mke2fs.c:2021
 #, c-format
 msgid "Journal dev blocksize (%d) smaller than minimum blocksize %d\n"
 msgstr ""
 
-#: misc/mke2fs.c:2000
+#: misc/mke2fs.c:2027
 #, c-format
 msgid "Using journal device's blocksize: %d\n"
 msgstr ""
 
-#: misc/mke2fs.c:2011
+#: misc/mke2fs.c:2038
 #, c-format
 msgid "invalid blocks '%s' on device '%s'"
 msgstr ""
 
-#: misc/mke2fs.c:2031
+#: misc/mke2fs.c:2058
 msgid "filesystem"
 msgstr ""
 
-#: misc/mke2fs.c:2046 lib/support/plausible.c:184
+#: misc/mke2fs.c:2073 lib/support/plausible.c:184
 #, c-format
 msgid "The file %s does not exist and no size was specified.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2058 lib/support/plausible.c:192
+#: misc/mke2fs.c:2085 lib/support/plausible.c:192
 #, c-format
 msgid "Creating regular file %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:2063 resize/main.c:514
+#: misc/mke2fs.c:2090 resize/main.c:512
 msgid "while trying to determine filesystem size"
 msgstr ""
 
-#: misc/mke2fs.c:2069
+#: misc/mke2fs.c:2096
 msgid ""
 "Couldn't determine device size; you must specify\n"
 "the size of the filesystem\n"
 msgstr ""
 
-#: misc/mke2fs.c:2076
+#: misc/mke2fs.c:2103
 msgid ""
 "Device size reported to be zero.  Invalid partition specified, or\n"
 "\tpartition table wasn't reread after running fdisk, due to\n"
@@ -5747,149 +5844,148 @@
 "\tto re-read your partition table.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2093
+#: misc/mke2fs.c:2120
 msgid "Filesystem larger than apparent device size."
 msgstr ""
 
-#: misc/mke2fs.c:2116
+#: misc/mke2fs.c:2143
 msgid "Failed to parse fs types list\n"
 msgstr ""
 
-#: misc/mke2fs.c:2182
+#: misc/mke2fs.c:2208
 msgid "The HURD does not support the filetype feature.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2187
+#: misc/mke2fs.c:2213
 msgid "The HURD does not support the huge_file feature.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2192
+#: misc/mke2fs.c:2218
 msgid "The HURD does not support the metadata_csum feature.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2197
+#: misc/mke2fs.c:2223
 msgid "The HURD does not support the ea_inode feature.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2207
+#: misc/mke2fs.c:2233
 msgid "while trying to determine hardware sector size"
 msgstr ""
 
-#: misc/mke2fs.c:2213
+#: misc/mke2fs.c:2239
 msgid "while trying to determine physical sector size"
 msgstr ""
 
-#: misc/mke2fs.c:2245
+#: misc/mke2fs.c:2271
 msgid "while setting blocksize; too small for device\n"
 msgstr ""
 
-#: misc/mke2fs.c:2250
+#: misc/mke2fs.c:2276
 #, c-format
 msgid ""
 "Warning: specified blocksize %d is less than device physical sectorsize %d\n"
 msgstr ""
 
-#: misc/mke2fs.c:2274
+#: misc/mke2fs.c:2300
 #, c-format
 msgid ""
 "%s: Size of device (0x%llx blocks) %s too big to be expressed\n"
 "\tin 32 bits using a blocksize of %d.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2288
+#: misc/mke2fs.c:2314
 #, c-format
 msgid ""
 "%s: Size of device (0x%llx blocks) %s too big to create\n"
 "\ta filesystem using a blocksize of %d.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2310
+#: misc/mke2fs.c:2336
 msgid "fs_types for mke2fs.conf resolution: "
 msgstr ""
 
-#: misc/mke2fs.c:2317
-msgid "Filesystem features not supported with revision 0 filesystems\n"
-msgstr ""
-
-#: misc/mke2fs.c:2325
-msgid "Sparse superblocks not supported with revision 0 filesystems\n"
-msgstr ""
-
-#: misc/mke2fs.c:2335
-msgid "Journals not supported with revision 0 filesystems\n"
-msgstr ""
-
-#: misc/mke2fs.c:2348
-#, c-format
+#: misc/mke2fs.c:2349
 msgid "invalid reserved blocks percent - %lf"
 msgstr ""
 
-#: misc/mke2fs.c:2365
+#: misc/mke2fs.c:2366
 msgid ""
 "Extents MUST be enabled for a 64-bit filesystem.  Pass -O extents to "
 "rectify.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2385
+#: misc/mke2fs.c:2386
 msgid "The cluster size may not be smaller than the block size.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2391
+#: misc/mke2fs.c:2392
 msgid "specifying a cluster size requires the bigalloc feature"
 msgstr ""
 
-#: misc/mke2fs.c:2411
+#: misc/mke2fs.c:2412
 #, c-format
 msgid "warning: Unable to get device geometry for %s\n"
 msgstr ""
 
-#: misc/mke2fs.c:2423
+#: misc/mke2fs.c:2424
 #, c-format
 msgid "%s alignment is offset by %lu bytes.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2425
+#: misc/mke2fs.c:2426
 #, c-format
 msgid ""
 "This may result in very poor performance, (re)-partitioning suggested.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2431
+#: misc/mke2fs.c:2432
 #, c-format
 msgid ""
 "%s is capable of DAX but current block size %u is different from system page "
 "size %u so filesystem will not support DAX.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2455
+#: misc/mke2fs.c:2456
 #, c-format
 msgid "%d-byte blocks too big for system (max %d)"
 msgstr ""
 
-#: misc/mke2fs.c:2459
+#: misc/mke2fs.c:2460
 #, c-format
 msgid ""
 "Warning: %d-byte blocks too big for system (max %d), forced to continue\n"
 msgstr ""
 
-#: misc/mke2fs.c:2467
+#: misc/mke2fs.c:2468
 #, c-format
 msgid ""
 "Suggestion: Use Linux kernel >= 3.18 for improved stability of the metadata "
 "and journal checksum features.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2513
+#: misc/mke2fs.c:2514
 #, c-format
 msgid "Unknown filename encoding from profile: %s"
 msgstr ""
 
-#: misc/mke2fs.c:2524
+#: misc/mke2fs.c:2525
 #, c-format
 msgid "Unknown encoding flags from profile: %s"
 msgstr ""
 
 #: misc/mke2fs.c:2549
+msgid "Filesystem features not supported with revision 0 filesystems\n"
+msgstr ""
+
+#: misc/mke2fs.c:2554
+msgid "Journals not supported with revision 0 filesystems\n"
+msgstr ""
+
+#: misc/mke2fs.c:2559
+msgid "Inode size incompatible with revision 0 filesystems\n"
+msgstr ""
+
+#: misc/mke2fs.c:2572
 #, c-format
 msgid ""
 "\n"
@@ -5899,66 +5995,66 @@
 "\n"
 msgstr ""
 
-#: misc/mke2fs.c:2564
+#: misc/mke2fs.c:2587
 #, c-format
 msgid "%d byte inodes are too small for project quota"
 msgstr ""
 
-#: misc/mke2fs.c:2586
+#: misc/mke2fs.c:2609
 msgid "Can't support bigalloc feature without extents feature"
 msgstr ""
 
-#: misc/mke2fs.c:2593
+#: misc/mke2fs.c:2616
 msgid ""
 "The resize_inode and meta_bg features are not compatible.\n"
 "They can not be both enabled simultaneously.\n"
 msgstr ""
 
-#: misc/mke2fs.c:2602
+#: misc/mke2fs.c:2625
 msgid ""
 "\n"
 "Warning: bigalloc file systems with a cluster size greater than\n"
 "16 times the block size is considered experimental\n"
 msgstr ""
 
-#: misc/mke2fs.c:2614
+#: misc/mke2fs.c:2637
 msgid "reserved online resize blocks not supported on non-sparse filesystem"
 msgstr ""
 
-#: misc/mke2fs.c:2623
+#: misc/mke2fs.c:2646
 msgid "blocks per group count out of range"
 msgstr ""
 
-#: misc/mke2fs.c:2645
+#: misc/mke2fs.c:2668
 msgid "Flex_bg feature not enabled, so flex_bg size may not be specified"
 msgstr ""
 
-#: misc/mke2fs.c:2657
+#: misc/mke2fs.c:2680
 #, c-format
 msgid "invalid inode size %d (min %d/max %d)"
 msgstr ""
 
-#: misc/mke2fs.c:2672
+#: misc/mke2fs.c:2695
 #, c-format
 msgid "%d byte inodes are too small for inline data; specify larger size"
 msgstr ""
 
-#: misc/mke2fs.c:2687
+#: misc/mke2fs.c:2710
 #, c-format
 msgid "128-byte inodes cannot handle dates beyond 2038 and are deprecated\n"
 msgstr ""
 
-#: misc/mke2fs.c:2698
+#: misc/mke2fs.c:2721
 #, c-format
 msgid "too many inodes (%llu), raise inode ratio?"
 msgstr ""
 
-#: misc/mke2fs.c:2706
+#: misc/mke2fs.c:2729
 #, c-format
 msgid "too many inodes (%llu), specify < 2^32 inodes"
 msgstr ""
 
-#: misc/mke2fs.c:2720
+#: misc/mke2fs.c:2743
 #, c-format
 msgid ""
 "inode_size (%u) * inodes_count (%u) too big for a\n"
@@ -5966,175 +6062,175 @@
 "\tor lower inode count (-N).\n"
 msgstr ""
 
-#: misc/mke2fs.c:2917
+#: misc/mke2fs.c:2941
 msgid "Discarding device blocks: "
 msgstr ""
 
-#: misc/mke2fs.c:2933
+#: misc/mke2fs.c:2957
 msgid "failed - "
 msgstr ""
 
-#: misc/mke2fs.c:2992
+#: misc/mke2fs.c:3016
 msgid "while initializing quota context"
 msgstr ""
 
-#: misc/mke2fs.c:2999
+#: misc/mke2fs.c:3023
 msgid "while writing quota inodes"
 msgstr ""
 
-#: misc/mke2fs.c:3024
+#: misc/mke2fs.c:3048
 #, c-format
 msgid "bad error behavior in profile - %s"
 msgstr ""
 
-#: misc/mke2fs.c:3103
+#: misc/mke2fs.c:3127
 msgid "in malloc for android_sparse_params"
 msgstr ""
 
-#: misc/mke2fs.c:3117
+#: misc/mke2fs.c:3141
 msgid "while setting up superblock"
 msgstr ""
 
-#: misc/mke2fs.c:3133
+#: misc/mke2fs.c:3157
 msgid ""
 "Extents are not enabled.  The file extent tree can be checksummed, whereas "
 "block maps cannot.  Not enabling extents reduces the coverage of metadata "
 "checksumming.  Pass -O extents to rectify.\n"
 msgstr ""
 
-#: misc/mke2fs.c:3140
+#: misc/mke2fs.c:3164
 msgid ""
 "64-bit filesystem support is not enabled.  The larger fields afforded by "
 "this feature enable full-strength checksumming.  Pass -O 64bit to rectify.\n"
 msgstr ""
 
-#: misc/mke2fs.c:3148
+#: misc/mke2fs.c:3172
 msgid "The metadata_csum_seed feature requires the metadata_csum feature.\n"
 msgstr ""
 
-#: misc/mke2fs.c:3169
+#: misc/mke2fs.c:3193
 msgid ""
 "Assuming the storage device is prezeroed - skipping inode table and journal "
 "wipe\n"
 msgstr ""
 
-#: misc/mke2fs.c:3184
+#: misc/mke2fs.c:3208
 msgid "Discard succeeded and will return 0s - skipping inode table wipe\n"
 msgstr ""
 
-#: misc/mke2fs.c:3283
+#: misc/mke2fs.c:3307
 #, c-format
 msgid "unknown os - %s"
 msgstr ""
 
-#: misc/mke2fs.c:3346
+#: misc/mke2fs.c:3370
 msgid "Allocating group tables: "
 msgstr ""
 
-#: misc/mke2fs.c:3354
+#: misc/mke2fs.c:3378
 msgid "while trying to allocate filesystem tables"
 msgstr ""
 
-#: misc/mke2fs.c:3369
+#: misc/mke2fs.c:3393
 msgid "while unmarking bad blocks"
 msgstr ""
 
-#: misc/mke2fs.c:3380
+#: misc/mke2fs.c:3404
 msgid ""
 "\n"
 "\twhile converting subcluster bitmap"
 msgstr ""
 
-#: misc/mke2fs.c:3389
+#: misc/mke2fs.c:3413
 msgid "while calculating overhead"
 msgstr ""
 
-#: misc/mke2fs.c:3408
+#: misc/mke2fs.c:3432
 #, c-format
 msgid "%s may be further corrupted by superblock rewrite\n"
 msgstr ""
 
-#: misc/mke2fs.c:3449
+#: misc/mke2fs.c:3473
 #, c-format
 msgid "while zeroing block %llu at end of filesystem"
 msgstr ""
 
-#: misc/mke2fs.c:3462
+#: misc/mke2fs.c:3486
 msgid "while reserving blocks for online resize"
 msgstr ""
 
-#: misc/mke2fs.c:3474 misc/tune2fs.c:1710
+#: misc/mke2fs.c:3498 misc/tune2fs.c:1710
 msgid "journal"
 msgstr ""
 
-#: misc/mke2fs.c:3486
+#: misc/mke2fs.c:3510
 #, c-format
 msgid "Adding journal to device %s: "
 msgstr ""
 
-#: misc/mke2fs.c:3493
+#: misc/mke2fs.c:3517
 #, c-format
 msgid ""
 "\n"
 "\twhile trying to add journal to device %s"
 msgstr ""
 
-#: misc/mke2fs.c:3498 misc/mke2fs.c:3531 misc/mke2fs.c:3590
+#: misc/mke2fs.c:3522 misc/mke2fs.c:3555 misc/mke2fs.c:3614
 #: misc/mk_hugefiles.c:486 misc/tune2fs.c:1739 misc/tune2fs.c:1761
 msgid "done\n"
 msgstr ""
 
-#: misc/mke2fs.c:3505
+#: misc/mke2fs.c:3529
 msgid "Skipping journal creation in super-only mode\n"
 msgstr ""
 
-#: misc/mke2fs.c:3518
+#: misc/mke2fs.c:3542
 #, c-format
 msgid "Creating journal (%u blocks): "
 msgstr ""
 
-#: misc/mke2fs.c:3527
+#: misc/mke2fs.c:3551
 msgid ""
 "\n"
 "\twhile trying to create journal"
 msgstr ""
 
-#: misc/mke2fs.c:3539 misc/tune2fs.c:1297
+#: misc/mke2fs.c:3563 misc/tune2fs.c:1297
 msgid ""
 "\n"
 "Error while enabling multiple mount protection feature."
 msgstr ""
 
-#: misc/mke2fs.c:3544
+#: misc/mke2fs.c:3568
 #, c-format
 msgid "Multiple mount protection is enabled with update interval %d seconds.\n"
 msgstr ""
 
-#: misc/mke2fs.c:3559
+#: misc/mke2fs.c:3583
 msgid "cannot set orphan_file feature without a journal."
 msgstr ""
 
-#: misc/mke2fs.c:3570 misc/tune2fs.c:3517
+#: misc/mke2fs.c:3594 misc/tune2fs.c:3522
 msgid "while creating orphan file"
 msgstr ""
 
-#: misc/mke2fs.c:3581
+#: misc/mke2fs.c:3605
 msgid "Copying files into the device: "
 msgstr ""
 
-#: misc/mke2fs.c:3587
+#: misc/mke2fs.c:3611
 msgid "while populating file system"
 msgstr ""
 
-#: misc/mke2fs.c:3594
+#: misc/mke2fs.c:3618
 msgid "Writing superblocks and filesystem accounting information: "
 msgstr ""
 
-#: misc/mke2fs.c:3601 misc/tune2fs.c:3765
+#: misc/mke2fs.c:3625 misc/tune2fs.c:3770
 msgid "while writing out and closing file system"
 msgstr ""
 
-#: misc/mke2fs.c:3604
+#: misc/mke2fs.c:3628
 msgid ""
 "done\n"
 "\n"
@@ -6239,19 +6335,19 @@
 msgid "while trying to open external journal"
 msgstr ""
 
-#: misc/tune2fs.c:327 misc/tune2fs.c:3051
+#: misc/tune2fs.c:327 misc/tune2fs.c:3052
 #, c-format
 msgid "%s is not a journal device.\n"
 msgstr ""
 
-#: misc/tune2fs.c:336 misc/tune2fs.c:3060
+#: misc/tune2fs.c:336 misc/tune2fs.c:3061
 #, c-format
 msgid ""
 "Journal superblock is corrupted, nr_users\n"
 "is too high (%d).\n"
 msgstr ""
 
-#: misc/tune2fs.c:343 misc/tune2fs.c:3067
+#: misc/tune2fs.c:343 misc/tune2fs.c:3068
 msgid "Filesystem's UUID not found on journal device.\n"
 msgstr ""
 
@@ -6346,7 +6442,7 @@
 "orphan_file feature.\n"
 msgstr ""
 
-#: misc/tune2fs.c:1241 misc/tune2fs.c:3510
+#: misc/tune2fs.c:1241 misc/tune2fs.c:3515
 msgid "while loading bitmaps"
 msgstr ""
 
@@ -6711,80 +6807,80 @@
 "\tencoding_flags=<flags>\n"
 msgstr ""
 
-#: misc/tune2fs.c:2869
+#: misc/tune2fs.c:2870
 msgid "Failed to read inode bitmap\n"
 msgstr ""
 
-#: misc/tune2fs.c:2874
+#: misc/tune2fs.c:2875
 msgid "Failed to read block bitmap\n"
 msgstr ""
 
-#: misc/tune2fs.c:2891 resize/resize2fs.c:1368
+#: misc/tune2fs.c:2892 resize/resize2fs.c:1368
 msgid "blocks to be moved"
 msgstr ""
 
-#: misc/tune2fs.c:2894
+#: misc/tune2fs.c:2895
 msgid "Failed to allocate block bitmap when increasing inode size\n"
 msgstr ""
 
-#: misc/tune2fs.c:2900
+#: misc/tune2fs.c:2901
 msgid "Not enough space to increase inode size \n"
 msgstr ""
 
-#: misc/tune2fs.c:2905
+#: misc/tune2fs.c:2906
 msgid "Failed to relocate blocks during inode resize \n"
 msgstr ""
 
-#: misc/tune2fs.c:2937
+#: misc/tune2fs.c:2938
 msgid ""
 "Error in resizing the inode size.\n"
 "Run e2undo to undo the file system changes. \n"
 msgstr ""
 
-#: misc/tune2fs.c:3125
+#: misc/tune2fs.c:3126
 msgid "while trying to get fs label"
 msgstr ""
 
-#: misc/tune2fs.c:3147
+#: misc/tune2fs.c:3148
 msgid "while trying to set fs label"
 msgstr ""
 
-#: misc/tune2fs.c:3237
+#: misc/tune2fs.c:3238
 msgid ""
 "If you are sure the filesystem is not in use on any node, run:\n"
 "'tune2fs -f -E clear_mmp {device}'\n"
 msgstr ""
 
-#: misc/tune2fs.c:3244
+#: misc/tune2fs.c:3245
 #, c-format
 msgid ""
 "MMP block magic is bad. Try to fix it by running:\n"
 "'e2fsck -f %s'\n"
 msgstr ""
 
-#: misc/tune2fs.c:3256
+#: misc/tune2fs.c:3257
 msgid "Cannot modify a journal device.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3269
+#: misc/tune2fs.c:3270
 #, c-format
 msgid "The inode size is already %lu\n"
 msgstr ""
 
-#: misc/tune2fs.c:3276
+#: misc/tune2fs.c:3277
 msgid "Shrinking inode size is not supported\n"
 msgstr ""
 
-#: misc/tune2fs.c:3281
+#: misc/tune2fs.c:3282
 #, c-format
 msgid "Invalid inode size %lu (max %d)\n"
 msgstr ""
 
-#: misc/tune2fs.c:3287
+#: misc/tune2fs.c:3288
 msgid "Resizing inodes could take some time."
 msgstr ""
 
-#: misc/tune2fs.c:3337
+#: misc/tune2fs.c:3338
 #, c-format
 msgid ""
 "Warning: The journal is dirty. You may wish to replay the journal like:\n"
@@ -6795,162 +6891,167 @@
 "by journal recovery.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3346
+#: misc/tune2fs.c:3347
 #, c-format
 msgid "Recovering journal.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3370
+#: misc/tune2fs.c:3371
 #, c-format
 msgid "Setting maximal mount count to %d\n"
 msgstr ""
 
-#: misc/tune2fs.c:3376
+#: misc/tune2fs.c:3377
 #, c-format
 msgid "Setting current mount count to %d\n"
 msgstr ""
 
-#: misc/tune2fs.c:3381
+#: misc/tune2fs.c:3382
 #, c-format
 msgid "Setting error behavior to %d\n"
 msgstr ""
 
-#: misc/tune2fs.c:3386
+#: misc/tune2fs.c:3388
 #, c-format
 msgid "Setting reserved blocks gid to %lu\n"
 msgstr ""
 
-#: misc/tune2fs.c:3391
+#: misc/tune2fs.c:3390
+#, c-format
+msgid "Reserved blocks gid already set to %lu\n"
+msgstr ""
+
+#: misc/tune2fs.c:3396
 #, c-format
 msgid "interval between checks is too big (%lu)"
 msgstr ""
 
-#: misc/tune2fs.c:3398
+#: misc/tune2fs.c:3403
 #, c-format
 msgid "Setting interval between checks to %lu seconds\n"
 msgstr ""
 
-#: misc/tune2fs.c:3405
+#: misc/tune2fs.c:3410
 #, c-format
 msgid "Setting reserved blocks percentage to %g%% (%llu blocks)\n"
 msgstr ""
 
-#: misc/tune2fs.c:3412
+#: misc/tune2fs.c:3417
 #, c-format
 msgid "reserved blocks count is too big (%llu)"
 msgstr ""
 
-#: misc/tune2fs.c:3419
+#: misc/tune2fs.c:3424
 #, c-format
 msgid "Setting reserved blocks count to %llu\n"
 msgstr ""
 
-#: misc/tune2fs.c:3424
+#: misc/tune2fs.c:3429
 msgid ""
 "\n"
 "The filesystem already has sparse superblocks.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3427
+#: misc/tune2fs.c:3432
 msgid ""
 "\n"
 "Setting the sparse superblock flag not supported\n"
 "for filesystems with the meta_bg feature enabled.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3437
+#: misc/tune2fs.c:3442
 #, c-format
 msgid ""
 "\n"
 "Sparse superblock flag set.  %s"
 msgstr ""
 
-#: misc/tune2fs.c:3442
+#: misc/tune2fs.c:3447
 msgid ""
 "\n"
 "Clearing the sparse superblock flag not supported.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3450
+#: misc/tune2fs.c:3455
 #, c-format
 msgid "Setting time filesystem last checked to %s\n"
 msgstr ""
 
-#: misc/tune2fs.c:3456
+#: misc/tune2fs.c:3461
 #, c-format
 msgid "Setting reserved blocks uid to %lu\n"
 msgstr ""
 
-#: misc/tune2fs.c:3488
+#: misc/tune2fs.c:3493
 msgid "Error in using clear_mmp. It must be used with -f\n"
 msgstr ""
 
-#: misc/tune2fs.c:3525
+#: misc/tune2fs.c:3530
 msgid ""
 "The quota feature may only be changed when the filesystem is unmounted and "
 "not in use.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3544
+#: misc/tune2fs.c:3549
 msgid ""
 "Cannot change the UUID of this filesystem because it has the stable_inodes "
 "feature flag.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3554
+#: misc/tune2fs.c:3559
 msgid "Setting the UUID on this filesystem could take some time."
 msgstr ""
 
-#: misc/tune2fs.c:3571
+#: misc/tune2fs.c:3576
 msgid "The UUID may only be changed when the filesystem is unmounted.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3574
+#: misc/tune2fs.c:3579
 msgid ""
 "If you only use kernels newer than v4.4, run 'tune2fs -O metadata_csum_seed' "
 "and re-run this command.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3624
+#: misc/tune2fs.c:3629
 msgid "Invalid UUID format\n"
 msgstr ""
 
-#: misc/tune2fs.c:3658
+#: misc/tune2fs.c:3663
 msgid "Need to update journal superblock.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3678
+#: misc/tune2fs.c:3683
 msgid ""
 "The inode size may only be changed when the filesystem is unmounted and not "
 "in use.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3685
+#: misc/tune2fs.c:3690
 msgid ""
 "Changing the inode size not supported for filesystems with the flex_bg\n"
 "feature enabled.\n"
 msgstr ""
 
-#: misc/tune2fs.c:3703
+#: misc/tune2fs.c:3708
 #, c-format
 msgid "Setting inode size %lu\n"
 msgstr ""
 
-#: misc/tune2fs.c:3707
+#: misc/tune2fs.c:3712
 msgid "Failed to change inode size\n"
 msgstr ""
 
-#: misc/tune2fs.c:3727
-#, c-format
-msgid "Setting stride size to %d\n"
-msgstr ""
-
 #: misc/tune2fs.c:3732
 #, c-format
+msgid "Setting stride size to %d\n"
+msgstr ""
+
+#: misc/tune2fs.c:3737
+#, c-format
 msgid "Setting stripe width to %d\n"
 msgstr ""
 
-#: misc/tune2fs.c:3739
+#: misc/tune2fs.c:3744
 #, c-format
 msgid "Setting extended default mount options to '%s'\n"
 msgstr ""
@@ -7223,51 +7324,51 @@
 "\n"
 msgstr ""
 
-#: resize/main.c:374
+#: resize/main.c:372
 #, c-format
 msgid "while opening %s"
 msgstr ""
 
-#: resize/main.c:382
+#: resize/main.c:380
 #, c-format
 msgid "while getting stat information for %s"
 msgstr ""
 
-#: resize/main.c:465
+#: resize/main.c:463
 #, c-format
 msgid ""
 "Please run 'e2fsck -f %s' first.\n"
 "\n"
 msgstr ""
 
-#: resize/main.c:484
+#: resize/main.c:482
 #, c-format
 msgid "Estimated minimum size of the filesystem: %llu\n"
 msgstr ""
 
-#: resize/main.c:524
+#: resize/main.c:522
 #, c-format
 msgid "Invalid new size: %s\n"
 msgstr ""
 
-#: resize/main.c:543
+#: resize/main.c:541
 msgid "New size too large to be expressed in 32 bits\n"
 msgstr ""
 
-#: resize/main.c:562
+#: resize/main.c:564
 msgid "New size results in too many block group descriptors.\n"
 msgstr ""
 
-#: resize/main.c:569
+#: resize/main.c:572
 #, c-format
 msgid "New size smaller than minimum (%llu)\n"
 msgstr ""
 
-#: resize/main.c:576
+#: resize/main.c:579
 msgid "Invalid stride length"
 msgstr ""
 
-#: resize/main.c:600
+#: resize/main.c:603
 #, c-format
 msgid ""
 "The containing partition (or device) is only %llu (%dk) blocks.\n"
@@ -7275,89 +7376,89 @@
 "\n"
 msgstr ""
 
-#: resize/main.c:607
+#: resize/main.c:610
 #, c-format
 msgid "Cannot set and unset 64bit feature.\n"
 msgstr ""
 
-#: resize/main.c:611
+#: resize/main.c:614
 #, c-format
 msgid ""
 "Cannot change the 64bit feature on a filesystem that is larger than 2^32 "
 "blocks.\n"
 msgstr ""
 
-#: resize/main.c:617
+#: resize/main.c:620
 #, c-format
 msgid "Cannot change the 64bit feature while the filesystem is mounted.\n"
 msgstr ""
 
-#: resize/main.c:623
+#: resize/main.c:626
 #, c-format
 msgid ""
 "Please enable the extents feature with tune2fs before enabling the 64bit "
 "feature.\n"
 msgstr ""
 
-#: resize/main.c:631
+#: resize/main.c:634
 #, c-format
 msgid ""
 "The filesystem is already %llu (%dk) blocks long.  Nothing to do!\n"
 "\n"
 msgstr ""
 
-#: resize/main.c:641
+#: resize/main.c:644
 #, c-format
 msgid "The filesystem is already 64-bit.\n"
 msgstr ""
 
-#: resize/main.c:646
+#: resize/main.c:649
 #, c-format
 msgid "The filesystem is already 32-bit.\n"
 msgstr ""
 
-#: resize/main.c:651
+#: resize/main.c:654
 #, c-format
 msgid ""
 "Cannot shrink this filesystem because it has the stable_inodes feature "
 "flag.\n"
 msgstr ""
 
-#: resize/main.c:660
+#: resize/main.c:663
 #, c-format
 msgid "Converting the filesystem to 64-bit.\n"
 msgstr ""
 
-#: resize/main.c:662
+#: resize/main.c:665
 #, c-format
 msgid "Converting the filesystem to 32-bit.\n"
 msgstr ""
 
-#: resize/main.c:664
+#: resize/main.c:667
 #, c-format
 msgid "Resizing the filesystem on %s to %llu (%dk) blocks.\n"
 msgstr ""
 
-#: resize/main.c:674
+#: resize/main.c:677
 #, c-format
 msgid "while trying to resize %s"
 msgstr ""
 
-#: resize/main.c:677
+#: resize/main.c:680
 #, c-format
 msgid ""
 "Please run 'e2fsck -fy %s' to fix the filesystem\n"
 "after the aborted resize operation.\n"
 msgstr ""
 
-#: resize/main.c:682
+#: resize/main.c:685
 #, c-format
 msgid ""
 "The filesystem on %s is now %llu (%dk) blocks long.\n"
 "\n"
 msgstr ""
 
-#: resize/main.c:697
+#: resize/main.c:700
 #, c-format
 msgid "while trying to truncate %s"
 msgstr ""
@@ -7460,7 +7561,7 @@
 msgstr ""
 
 #: lib/ext2fs/ext2_err.c:11
-msgid "EXT2FS Library version 1.47.1-rc1"
+msgid "EXT2FS Library version 1.47.2-rc1"
 msgstr ""
 
 #: lib/ext2fs/ext2_err.c:12
diff --git a/resize/main.c b/resize/main.c
index f914c05..08a4bba 100644
--- a/resize/main.c
+++ b/resize/main.c
@@ -270,8 +270,6 @@
 	long		sysval;
 	int		len, mount_flags;
 	char		*mtpt, *undo_file = NULL;
-	dgrp_t		new_group_desc_count;
-	unsigned long	new_desc_blocks;
 
 #ifdef ENABLE_NLS
 	setlocale(LC_MESSAGES, "");
@@ -551,17 +549,22 @@
 		new_size &= ~((blk64_t)(1ULL << fs->cluster_ratio_bits) - 1);
 	}
 
-	new_group_desc_count = ext2fs_div64_ceil(new_size -
-				fs->super->s_first_data_block,
-						 EXT2_BLOCKS_PER_GROUP(fs->super));
-	new_desc_blocks = ext2fs_div_ceil(new_group_desc_count,
-					  EXT2_DESC_PER_BLOCK(fs->super));
-	if ((new_desc_blocks + fs->super->s_first_data_block) >
-	    EXT2_BLOCKS_PER_GROUP(fs->super)) {
-		com_err(program_name, 0,
-			_("New size results in too many block group "
-			  "descriptors.\n"));
-		goto errout;
+	if (!ext2fs_has_feature_meta_bg(fs->super)) {
+		dgrp_t		new_group_desc_count;
+		unsigned long	new_desc_blocks;
+
+		new_group_desc_count = ext2fs_div64_ceil(new_size -
+					fs->super->s_first_data_block,
+					EXT2_BLOCKS_PER_GROUP(fs->super));
+		new_desc_blocks = ext2fs_div_ceil(new_group_desc_count,
+					EXT2_DESC_PER_BLOCK(fs->super));
+		if ((new_desc_blocks + fs->super->s_first_data_block) >
+		    EXT2_BLOCKS_PER_GROUP(fs->super)) {
+			com_err(program_name, 0,
+				_("New size results in too many block group "
+				  "descriptors.\n"));
+			goto errout;
+		}
 	}
 
 	if (!force && new_size < min_size) {
diff --git a/tests/f_bad_disconnected_inode/expect.1 b/tests/f_bad_disconnected_inode/expect.1
index d1479ce..39c6958 100644
--- a/tests/f_bad_disconnected_inode/expect.1
+++ b/tests/f_bad_disconnected_inode/expect.1
@@ -1,11 +1,17 @@
 Pass 1: Checking inodes, blocks, and sizes
+Inode 1 has the ea_inode flag set but is not a regular file.  Clear flag? yes
+
 Inode 1 has EXTENTS_FL flag set on filesystem without extents support.
 Clear? yes
 
 Inode 9 has the casefold flag set but is not a directory.  Clear flag? yes
 
+Inode 10 has the ea_inode flag set but is not a regular file.  Clear flag? yes
+
 Inode 14 has the casefold flag set but is not a directory.  Clear flag? yes
 
+Inode 14 has the ea_inode flag set but is not a regular file.  Clear flag? yes
+
 Inode 14 has INLINE_DATA_FL flag on filesystem without inline data support.
 Clear? yes
 
@@ -14,6 +20,8 @@
 
 Inode 16 has the casefold flag set but is not a directory.  Clear flag? yes
 
+Inode 16 has the ea_inode flag set but is not a regular file.  Clear flag? yes
+
 Inode 16 has INLINE_DATA_FL flag on filesystem without inline data support.
 Clear? yes
 
diff --git a/tests/f_bad_fname/expect.1 b/tests/f_bad_fname/expect.1
index 66f87df..60f64f6 100644
--- a/tests/f_bad_fname/expect.1
+++ b/tests/f_bad_fname/expect.1
@@ -1,4 +1,6 @@
 Pass 1: Checking inodes, blocks, and sizes
+Inode 12 has the ea_inode flag set but is not a regular file.  Clear flag? yes
+
 Pass 2: Checking directory structure
 Entry 'AM-^?' in /ci_dir (12) has illegal UTF-8 characters in its name.
 Fix? yes
diff --git a/tests/f_badjour_encrypted/script b/tests/f_badjour_encrypted/script
index e6778f1..07a8b3d 100644
--- a/tests/f_badjour_encrypted/script
+++ b/tests/f_badjour_encrypted/script
@@ -3,9 +3,13 @@
 	return 0
 fi
 
-touch $TMPFILE
-$MKE2FS -t ext4 -b 1024 $TMPFILE 2M
-$DEBUGFS -w -R 'set_inode_field <8> flags 0x80800' $TMPFILE
+LOG=$test_name.log
+
+touch $TMPFILE >> $LOG 2>&1
+$MKE2FS -t ext4 -b 1024 $TMPFILE 2M >> $LOG 2>&1
+$DEBUGFS -w -R 'set_inode_field <8> flags 0x80800' $TMPFILE >> $LOG 2>&1
 
 SKIP_GUNZIP="true"
 . $cmd_dir/run_e2fsck
+
+unset LOG
diff --git a/tests/f_clear_orphan_file/expect.1 b/tests/f_clear_orphan_file/expect.1
new file mode 100644
index 0000000..281b131
--- /dev/null
+++ b/tests/f_clear_orphan_file/expect.1
@@ -0,0 +1,35 @@
+test_filesys: recovering journal
+Clearing orphaned inode 13 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 14 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 15 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 16 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 17 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 18 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 19 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 20 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 21 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 22 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 23 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 24 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 25 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 26 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 27 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 28 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 29 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 30 (uid=0, gid=0, mode=0100644, size=0)
+Clearing orphaned inode 31 (uid=0, gid=0, mode=0100644, size=0)
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+Free inodes count wrong (2055, counted=2005).
+Fix? yes
+
+Orphan file (inode 12) block 0 is not clean.
+Clear? yes
+
+
+test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
+test_filesys: 43/2048 files (2.3% non-contiguous), 1650/8192 blocks
+Exit status is 1
diff --git a/tests/f_clear_orphan_file/expect.2 b/tests/f_clear_orphan_file/expect.2
new file mode 100644
index 0000000..f719dbb
--- /dev/null
+++ b/tests/f_clear_orphan_file/expect.2
@@ -0,0 +1,7 @@
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+test_filesys: 43/2048 files (2.3% non-contiguous), 1650/8192 blocks
+Exit status is 0
diff --git a/tests/f_clear_orphan_file/image.gz b/tests/f_clear_orphan_file/image.gz
new file mode 100644
index 0000000..c93cf75
--- /dev/null
+++ b/tests/f_clear_orphan_file/image.gz
Binary files differ
diff --git a/tests/f_clear_orphan_file/name b/tests/f_clear_orphan_file/name
new file mode 100644
index 0000000..89ba224
--- /dev/null
+++ b/tests/f_clear_orphan_file/name
@@ -0,0 +1 @@
+clear orphan file
diff --git a/tests/f_clear_orphan_file/script b/tests/f_clear_orphan_file/script
new file mode 100644
index 0000000..2210e9d
--- /dev/null
+++ b/tests/f_clear_orphan_file/script
@@ -0,0 +1,2 @@
+FSCK_OPT=-y
+. $cmd_dir/run_e2fsck
diff --git a/tests/f_ea_inode_dir_ref/expect.1 b/tests/f_ea_inode_dir_ref/expect.1
new file mode 100644
index 0000000..fa6a872
--- /dev/null
+++ b/tests/f_ea_inode_dir_ref/expect.1
@@ -0,0 +1,12 @@
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Entry 'xlink' in / (2) references EA inode 13.
+Clear? yes
+
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+
+test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
+test_filesys: 13/128 files (0.0% non-contiguous), 63/1024 blocks
+Exit status is 1
diff --git a/tests/f_ea_inode_dir_ref/expect.2 b/tests/f_ea_inode_dir_ref/expect.2
new file mode 100644
index 0000000..24d059a
--- /dev/null
+++ b/tests/f_ea_inode_dir_ref/expect.2
@@ -0,0 +1,7 @@
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+test_filesys: 13/128 files (0.0% non-contiguous), 63/1024 blocks
+Exit status is 0
diff --git a/tests/f_ea_inode_dir_ref/image.gz b/tests/f_ea_inode_dir_ref/image.gz
new file mode 100644
index 0000000..483cc72
--- /dev/null
+++ b/tests/f_ea_inode_dir_ref/image.gz
Binary files differ
diff --git a/tests/f_ea_inode_dir_ref/name b/tests/f_ea_inode_dir_ref/name
new file mode 100644
index 0000000..e43cd69
--- /dev/null
+++ b/tests/f_ea_inode_dir_ref/name
@@ -0,0 +1 @@
+true ea inode referenced from a directory
diff --git a/tests/f_ea_inode_disconnected/expect.1 b/tests/f_ea_inode_disconnected/expect.1
new file mode 100644
index 0000000..afc77ae
--- /dev/null
+++ b/tests/f_ea_inode_disconnected/expect.1
@@ -0,0 +1,23 @@
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Unattached inode 13
+Connect to /lost+found? yes
+
+Inode 13 ref count is 2, should be 1.  Fix? yes
+
+Pass 5: Checking group summary information
+Inode bitmap differences:  -12
+Fix? yes
+
+Free inodes count wrong for group #0 (115, counted=116).
+Fix? yes
+
+Free inodes count wrong (115, counted=116).
+Fix? yes
+
+
+test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
+test_filesys: 12/128 files (0.0% non-contiguous), 63/1024 blocks
+Exit status is 1
diff --git a/tests/f_ea_inode_disconnected/expect.2 b/tests/f_ea_inode_disconnected/expect.2
new file mode 100644
index 0000000..a67f944
--- /dev/null
+++ b/tests/f_ea_inode_disconnected/expect.2
@@ -0,0 +1,7 @@
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+test_filesys: 12/128 files (0.0% non-contiguous), 63/1024 blocks
+Exit status is 0
diff --git a/tests/f_ea_inode_disconnected/image b/tests/f_ea_inode_disconnected/image
new file mode 100644
index 0000000..f24547c
--- /dev/null
+++ b/tests/f_ea_inode_disconnected/image
Binary files differ
diff --git a/tests/f_ea_inode_disconnected/image.gz b/tests/f_ea_inode_disconnected/image.gz
new file mode 100644
index 0000000..f440f20
--- /dev/null
+++ b/tests/f_ea_inode_disconnected/image.gz
Binary files differ
diff --git a/tests/f_ea_inode_disconnected/name b/tests/f_ea_inode_disconnected/name
new file mode 100644
index 0000000..ce04192
--- /dev/null
+++ b/tests/f_ea_inode_disconnected/name
@@ -0,0 +1 @@
+ea inode that is not connected anywhere
diff --git a/tests/f_ea_inode_no_feature/expect.1 b/tests/f_ea_inode_no_feature/expect.1
new file mode 100644
index 0000000..f6a232b
--- /dev/null
+++ b/tests/f_ea_inode_no_feature/expect.1
@@ -0,0 +1,12 @@
+Pass 1: Checking inodes, blocks, and sizes
+Inode 12 references EA inode but superblock is missing EA_INODE feature
+Fix? yes
+
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+
+test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
+test_filesys: 13/128 files (0.0% non-contiguous), 63/1024 blocks
+Exit status is 1
diff --git a/tests/f_ea_inode_no_feature/expect.2 b/tests/f_ea_inode_no_feature/expect.2
new file mode 100644
index 0000000..24d059a
--- /dev/null
+++ b/tests/f_ea_inode_no_feature/expect.2
@@ -0,0 +1,7 @@
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+test_filesys: 13/128 files (0.0% non-contiguous), 63/1024 blocks
+Exit status is 0
diff --git a/tests/f_ea_inode_no_feature/image.gz b/tests/f_ea_inode_no_feature/image.gz
new file mode 100644
index 0000000..596d69a
--- /dev/null
+++ b/tests/f_ea_inode_no_feature/image.gz
Binary files differ
diff --git a/tests/f_ea_inode_no_feature/name b/tests/f_ea_inode_no_feature/name
new file mode 100644
index 0000000..b357afb
--- /dev/null
+++ b/tests/f_ea_inode_no_feature/name
@@ -0,0 +1 @@
+inode with ea inode but EA_INODE feature is not set
diff --git a/tests/f_ea_inode_self_ref/expect.1 b/tests/f_ea_inode_self_ref/expect.1
index f94c04d..35bea14 100644
--- a/tests/f_ea_inode_self_ref/expect.1
+++ b/tests/f_ea_inode_self_ref/expect.1
@@ -7,6 +7,8 @@
 Pass 2: Checking directory structure
 Pass 3: Checking directory connectivity
 Pass 4: Checking reference counts
+Regular filesystem inode 16 has EA_INODE flag set. Clear? yes
+
 Pass 5: Checking group summary information
 Block bitmap differences:  -20
 Fix? yes
diff --git a/tests/f_ea_inode_spurious_flag_dir/expect.1 b/tests/f_ea_inode_spurious_flag_dir/expect.1
new file mode 100644
index 0000000..19999ab
--- /dev/null
+++ b/tests/f_ea_inode_spurious_flag_dir/expect.1
@@ -0,0 +1,11 @@
+Pass 1: Checking inodes, blocks, and sizes
+Inode 2 has the ea_inode flag set but is not a regular file.  Clear flag? yes
+
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+
+test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
+test_filesys: 11/128 files (0.0% non-contiguous), 58/1024 blocks
+Exit status is 1
diff --git a/tests/f_ea_inode_spurious_flag_dir/expect.2 b/tests/f_ea_inode_spurious_flag_dir/expect.2
new file mode 100644
index 0000000..a354770
--- /dev/null
+++ b/tests/f_ea_inode_spurious_flag_dir/expect.2
@@ -0,0 +1,7 @@
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+test_filesys: 11/128 files (0.0% non-contiguous), 58/1024 blocks
+Exit status is 0
diff --git a/tests/f_ea_inode_spurious_flag_dir/image b/tests/f_ea_inode_spurious_flag_dir/image
new file mode 100644
index 0000000..f323b61
--- /dev/null
+++ b/tests/f_ea_inode_spurious_flag_dir/image
Binary files differ
diff --git a/tests/f_ea_inode_spurious_flag_dir/image.gz b/tests/f_ea_inode_spurious_flag_dir/image.gz
new file mode 100644
index 0000000..af19132
--- /dev/null
+++ b/tests/f_ea_inode_spurious_flag_dir/image.gz
Binary files differ
diff --git a/tests/f_ea_inode_spurious_flag_dir/name b/tests/f_ea_inode_spurious_flag_dir/name
new file mode 100644
index 0000000..8ae52cc
--- /dev/null
+++ b/tests/f_ea_inode_spurious_flag_dir/name
@@ -0,0 +1 @@
+ea inode flag set on a directory
diff --git a/tests/fuzz/ext2fs_image_read_write_fuzzer.cc b/tests/fuzz/ext2fs_image_read_write_fuzzer.cc
index 8aa0cb8..e6e0719 100644
--- a/tests/fuzz/ext2fs_image_read_write_fuzzer.cc
+++ b/tests/fuzz/ext2fs_image_read_write_fuzzer.cc
@@ -130,6 +130,7 @@
     ext2fs_close(fs);
   }
   close(fd);
+  remove_error_table(&et_ext2_error_table);
 
   return 0;
 }
diff --git a/tests/fuzz/ext2fs_read_bitmap_fuzzer.cc b/tests/fuzz/ext2fs_read_bitmap_fuzzer.cc
index fa3d7e7..9118837 100644
--- a/tests/fuzz/ext2fs_read_bitmap_fuzzer.cc
+++ b/tests/fuzz/ext2fs_read_bitmap_fuzzer.cc
@@ -103,6 +103,7 @@
       com_err(progname, retval, "while trying to close file system");
   }
   close(fd);
+  remove_error_table(&et_ext2_error_table);
 
   return 0;
 }
diff --git a/tests/progs/Makefile.in b/tests/progs/Makefile.in
index 47d7adf..1a8e929 100644
--- a/tests/progs/Makefile.in
+++ b/tests/progs/Makefile.in
@@ -73,6 +73,15 @@
 # Makefile dependencies follow.  This must be the last section in
 # the Makefile.in file
 #
+test_icount.o: $(srcdir)/test_icount.c $(top_builddir)/lib/config.h \
+ $(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/ext2fs/ext2_fs.h \
+ $(top_builddir)/lib/ext2fs/ext2_types.h $(top_srcdir)/lib/et/com_err.h \
+ $(top_srcdir)/lib/ss/ss.h $(top_builddir)/lib/ss/ss_err.h \
+ $(top_srcdir)/lib/ext2fs/ext2fs.h $(top_srcdir)/lib/ext2fs/ext3_extents.h \
+ $(top_srcdir)/lib/ext2fs/ext2_io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
+ $(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/hashmap.h \
+ $(top_srcdir)/lib/ext2fs/bitops.h $(top_srcdir)/lib/ext2fs/irel.h \
+ $(top_srcdir)/lib/ext2fs/brel.h $(srcdir)/test_icount.h
 test_rel.o: $(srcdir)/test_rel.c $(top_builddir)/lib/config.h \
  $(top_builddir)/lib/dirpaths.h $(top_srcdir)/lib/et/com_err.h \
  $(top_srcdir)/lib/ss/ss.h $(top_builddir)/lib/ss/ss_err.h \
diff --git a/util/android_config.h b/util/android_config.h
index 90b8f8a..c228860 100644
--- a/util/android_config.h
+++ b/util/android_config.h
@@ -54,6 +54,9 @@
 # define HAVE_SYS_SELECT_H 1
 # define HAVE_SYS_WAIT_H 1
 #endif
+#ifdef __APPLE__
+# define HAVE_GETMNTINFO 1
+#endif
 #if defined(__linux__)
 # define HAVE_EXT2_IOCTLS 1
 # define HAVE_FALLOCATE 1
diff --git a/version.h b/version.h
index 6753cc7..3755d47 100644
--- a/version.h
+++ b/version.h
@@ -4,10 +4,10 @@
  *
  * Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
  * 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014,
- * 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 by Theodore
+ * 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 by Theodore
  * Ts'o.  This file may be redistributed under the GNU General Public
  * License v2.
  */
 
-#define E2FSPROGS_VERSION "1.47.1-rc2"
-#define E2FSPROGS_DATE "01-May-2024"
+#define E2FSPROGS_VERSION "1.47.2-rc1"
+#define E2FSPROGS_DATE "28-Nov-2024"