summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2023-02-06 22:36:16 -0500
committerTheodore Ts'o <tytso@mit.edu>2023-02-06 22:36:16 -0500
commitad2272d065cf12c1b95bddf0f20363ffa8edad7f (patch)
tree857c6abdbd659147d16c5084587f300434a2bb98
parente60074bc73d19cf90a0f2b8cdfefb44d198145f2 (diff)
parent25ad8a431331b4d1d444a70b6079456cc612ac40 (diff)
downloade2fsprogs-ad2272d065cf12c1b95bddf0f20363ffa8edad7f.tar.gz
Merge tag 'v1.47.0' into debian/masterdebian/1.47.0-1archive/debian/1.47.0-1
v1.47.0
-rw-r--r--README2
l---------RELEASE-NOTES2
-rw-r--r--debian/changelog21
-rw-r--r--debian/control2
-rw-r--r--debian/libext2fs2.symbols9
-rw-r--r--debugfs/debugfs.8.in13
-rw-r--r--debugfs/logdump.c42
-rw-r--r--debugfs/set_fields.c1
-rw-r--r--doc/RelNotes/v1.46.6.txt2
-rw-r--r--doc/RelNotes/v1.47.0.txt53
-rw-r--r--doc/libext2fs.texinfo6
-rw-r--r--e2fsck/e2fsck.h1
-rw-r--r--e2fsck/journal.c8
-rw-r--r--e2fsck/pass1.c36
-rw-r--r--e2fsck/pass2.c3
-rw-r--r--e2fsck/pass4.c49
-rw-r--r--e2fsck/problem.c79
-rw-r--r--e2fsck/problem.h46
-rw-r--r--e2fsck/rehash.c6
-rw-r--r--e2fsck/super.c365
-rw-r--r--e2fsck/unix.c72
-rw-r--r--e2fsprogs.lsm8
-rw-r--r--e2fsprogs.spec2
-rw-r--r--lib/e2p/feature.c4
-rw-r--r--lib/e2p/ls.c3
-rw-r--r--lib/ext2fs/Makefile.in2
-rw-r--r--lib/ext2fs/badblocks.c2
-rw-r--r--lib/ext2fs/ext2_fs.h16
-rw-r--r--lib/ext2fs/ext2fs.h39
-rw-r--r--lib/ext2fs/ext_attr.c57
-rw-r--r--lib/ext2fs/ismounted.c6
-rw-r--r--lib/ext2fs/orphan.c273
-rw-r--r--lib/ext2fs/swapfs.c3
-rw-r--r--lib/ext2fs/tst_super_size.c3
-rw-r--r--lib/ext2fs/unix_io.c1
-rw-r--r--lib/support/mkquota.c3
-rw-r--r--misc/e2image.c3
-rw-r--r--misc/e2label.8.in7
-rw-r--r--misc/mke2fs.8.in12
-rw-r--r--misc/mke2fs.c82
-rw-r--r--misc/mke2fs.conf.in2
-rw-r--r--misc/tune2fs.8.in19
-rw-r--r--misc/tune2fs.c344
-rw-r--r--po/e2fsprogs.pot1573
-rw-r--r--tests/filter.sed1
-rw-r--r--tests/m_assume_storage_prezeroed/expect2
-rw-r--r--tests/m_assume_storage_prezeroed/script63
-rw-r--r--version.h4
48 files changed, 2495 insertions, 857 deletions
diff --git a/README b/README
index 31398541..0970deb7 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
- This is the new version (1.46.6) of the second extended file
+ This is the new version (1.47.0) of the second extended file
system management programs.
From time to time, I release new versions of e2fsprogs, to fix
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 0e61bc7f..5fc5f475 120000
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -1 +1 @@
-doc/RelNotes/v1.46.5.txt \ No newline at end of file
+doc/RelNotes/v1.47.0.txt \ No newline at end of file
diff --git a/debian/changelog b/debian/changelog
index 53052428..60a0a9b8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,6 +1,25 @@
+e2fsprogs (1.47.0-1) unstable; urgency=medium
+
+ * New upstream version
+ * Add support for the new orphan_file feature, which speeds up workloads
+ that are deleting or truncating a large number files in parallel.
+ * Mke2fs now enables the orphan_file and metadata_csum_seed feature.
+ * Mke2fs now supports the extended option "assume_storage_prezeroed"
+ which causes mke2fs to skip zeroing the journal and inode tables and
+ to mark the inode tables as zeroed.
+ * Tune2fs and e2label will more reliably modify the label and UUID for a
+ mounted file system using new kernel ioctls.
+ * Tune2fs can now disable the casefold feature after scanning all of the
+ directories do not have the casefold flag set.
+ * Fix a potential unbalanced mutex unlock when there is a short read
+ while using the bounce buffer when using direct I/O.
+ * Update to standards 4.6.2
+
+ -- Theodore Y. Ts'o <tytso@mit.edu> Mon, 06 Feb 2023 22:07:49 -0500
+
e2fsprogs (1.46.6-1) unstable; urgency=medium
- * Upstream version
+ * New upstream version
* NMU acknowledge (Closes: #1022096)
* In line with v6.2 and later Linux kernel, the extended xattribute hash
may be calculated using either the signed or unsigned char variant,
diff --git a/debian/control b/debian/control
index 671a6011..77019870 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: required
Maintainer: Theodore Y. Ts'o <tytso@mit.edu>
Build-Depends: gettext, texinfo, pkg-config, libfuse-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.6.1
+Standards-Version: 4.6.2
Homepage: http://e2fsprogs.sourceforge.net
Vcs-Browser: https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
Vcs-Git: https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git -b debian/master
diff --git a/debian/libext2fs2.symbols b/debian/libext2fs2.symbols
index 46c48adf..6a97cf1e 100644
--- a/debian/libext2fs2.symbols
+++ b/debian/libext2fs2.symbols
@@ -159,6 +159,7 @@ libext2fs.so.2 libext2fs2 #MINVER#
ext2fs_create_inode_cache@Base 1.43
ext2fs_create_journal_superblock2@Base 1.46.0
ext2fs_create_journal_superblock@Base 1.37
+ ext2fs_create_orphan_file@Base 1.47.0
ext2fs_create_resize_inode@Base 1.37
ext2fs_dblist_count2@Base 1.42
ext2fs_dblist_count@Base 1.37
@@ -173,6 +174,7 @@ libext2fs.so.2 libext2fs2 #MINVER#
ext2fs_dblist_sort@Base 1.37
ext2fs_decode_extent@Base 1.46.0
ext2fs_default_journal_size@Base 1.40
+ ext2fs_default_orphan_file_blocks@Base 1.47.0
ext2fs_descriptor_block_loc2@Base 1.42
ext2fs_descriptor_block_loc@Base 1.37
ext2fs_dir_block_csum_set@Base 1.43
@@ -194,6 +196,7 @@ libext2fs.so.2 libext2fs2 #MINVER#
ext2fs_div64_ceil@Base 1.42
ext2fs_div_ceil@Base 1.40
ext2fs_djb2_hash@Base 1.44.3~rc1
+ ext2fs_do_orphan_file_block_csum@Base 1.47.0
ext2fs_dup_handle@Base 1.37
ext2fs_dx_csum@Base 1.46~WIP.2019.10.09
ext2fs_expand_dir@Base 1.37
@@ -406,6 +409,7 @@ libext2fs.so.2 libext2fs2 #MINVER#
ext2fs_inode_size_set@Base 1.42.12
ext2fs_inode_table_loc@Base 1.42
ext2fs_inode_table_loc_set@Base 1.42
+ ext2fs_inodes_per_orphan_block@Base 1.47.0
ext2fs_is_fast_symlink@Base 1.44.0~rc1
ext2fs_journal_sb_start@Base 1.42.12
ext2fs_link@Base 1.37
@@ -458,6 +462,9 @@ libext2fs.so.2 libext2fs2 #MINVER#
ext2fs_open@Base 1.37
ext2fs_open_file@Base 1.42
ext2fs_open_inode_scan@Base 1.37
+ ext2fs_orphan_block_tail@Base 1.47.0
+ ext2fs_orphan_file_block_csum_set@Base 1.47.0
+ ext2fs_orphan_file_block_csum_verify@Base 1.47.0
ext2fs_parse_version_string@Base 1.37
ext2fs_process_dir_block@Base 1.37
ext2fs_punch@Base 1.42
@@ -611,6 +618,7 @@ libext2fs.so.2 libext2fs2 #MINVER#
ext2fs_test_inode_bitmap@Base 1.37
ext2fs_test_inode_bitmap_range@Base 1.41.8
ext2fs_test_valid@Base 1.37
+ ext2fs_truncate_orphan_file@Base 1.47.0
ext2fs_u32_copy@Base 1.37
ext2fs_u32_list_add@Base 1.37
ext2fs_u32_list_count@Base 1.37
@@ -665,6 +673,7 @@ libext2fs.so.2 libext2fs2 #MINVER#
ext2fs_xattrs_iterate@Base 1.43
ext2fs_xattrs_open@Base 1.43
ext2fs_xattrs_read@Base 1.43
+ ext2fs_xattrs_read_inode@Base 1.47.0
ext2fs_xattrs_write@Base 1.43
ext2fs_zero_blocks2@Base 1.42
ext2fs_zero_blocks@Base 1.41.0
diff --git a/debugfs/debugfs.8.in b/debugfs/debugfs.8.in
index 637d22b3..5b5329c3 100644
--- a/debugfs/debugfs.8.in
+++ b/debugfs/debugfs.8.in
@@ -505,7 +505,7 @@ which is a hard link to
.IR filespec .
Note this does not adjust the inode reference counts.
.TP
-.BI logdump " [-acsOS] [-b block] [-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
@@ -528,7 +528,7 @@ The
.I \-a
option causes the
.B logdump
-program to print the contents of all of the descriptor blocks.
+to print the contents of all of the descriptor blocks.
The
.I \-b
option causes
@@ -548,6 +548,15 @@ The
option causes logdump to display old (checkpointed) journal entries.
This can be used to try to track down journal problems even after the
journal has been replayed.
+.IP
+The
+.I \-n
+option causes
+.B logdump
+to continue past a journal block which is missing a magic number.
+Instead, it will stop only when the entire log is printed or after
+.I num_trans
+transactions.
.TP
.BI ls " [-l] [-c] [-d] [-p] [-r] filespec"
Print a listing of the files in the directory
diff --git a/debugfs/logdump.c b/debugfs/logdump.c
index 6b0133e0..b600228e 100644
--- a/debugfs/logdump.c
+++ b/debugfs/logdump.c
@@ -48,6 +48,7 @@ enum journal_location {JOURNAL_IS_INTERNAL, JOURNAL_IS_EXTERNAL};
#define ANY_BLOCK ((blk64_t) -1)
static int dump_all, dump_super, dump_old, dump_contents, dump_descriptors;
+static int64_t dump_counts;
static blk64_t block_to_dump, bitmap_to_dump, inode_block_to_dump;
static unsigned int group_to_dump, inode_offset_to_dump;
static ext2_ino_t inode_to_dump;
@@ -113,9 +114,10 @@ void do_logdump(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
bitmap_to_dump = -1;
inode_block_to_dump = ANY_BLOCK;
inode_to_dump = -1;
+ dump_counts = -1;
reset_getopt();
- while ((c = getopt (argc, argv, "ab:ci:f:OsS")) != EOF) {
+ while ((c = getopt (argc, argv, "ab:ci:f:OsSn:")) != EOF) {
switch (c) {
case 'a':
dump_all++;
@@ -148,6 +150,14 @@ void do_logdump(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
case 'S':
dump_super++;
break;
+ case 'n':
+ dump_counts = strtol(optarg, &tmp, 10);
+ if (*tmp) {
+ com_err(argv[0], 0,
+ "Bad log counts number - %s", optarg);
+ return;
+ }
+ break;
default:
goto print_usage;
}
@@ -289,7 +299,7 @@ cleanup:
return;
print_usage:
- fprintf(stderr, "%s: Usage: logdump [-acsOS] [-b<block>] [-i<filespec>]\n\t"
+ fprintf(stderr, "%s: Usage: logdump [-acsOS] [-n<num_trans>] [-b<block>] [-i<filespec>]\n\t"
"[-f<journal_file>] [output_file]\n", argv[0]);
}
@@ -366,9 +376,12 @@ static void dump_journal(char *cmdname, FILE *out_file,
journal_header_t *header;
tid_t transaction;
unsigned int blocknr = 0;
+ unsigned int first_transaction_blocknr;
int fc_done;
__u64 total_len;
__u32 maxlen;
+ int64_t cur_counts = 0;
+ bool exist_no_magic = false;
/* First, check to see if there's an ext2 superblock header */
retval = read_journal_block(cmdname, source, 0, buf, 2048);
@@ -458,7 +471,19 @@ static void dump_journal(char *cmdname, FILE *out_file,
blocknr = 1;
}
+ first_transaction_blocknr = blocknr;
+
while (1) {
+ if (dump_old && (dump_counts != -1) && (cur_counts >= dump_counts))
+ break;
+
+ if ((blocknr == first_transaction_blocknr) &&
+ (cur_counts != 0) && dump_old && (dump_counts != -1)) {
+ fprintf(out_file, "Dump all %lld journal records.\n",
+ (long long) cur_counts);
+ break;
+ }
+
retval = read_journal_block(cmdname, source,
((ext2_loff_t) blocknr) * blocksize,
buf, blocksize);
@@ -472,8 +497,16 @@ static void dump_journal(char *cmdname, FILE *out_file,
blocktype = be32_to_cpu(header->h_blocktype);
if (magic != JBD2_MAGIC_NUMBER) {
- fprintf (out_file, "No magic number at block %u: "
- "end of journal.\n", blocknr);
+ if (exist_no_magic == false) {
+ exist_no_magic = true;
+ fprintf(out_file, "No magic number at block %u: "
+ "end of journal.\n", blocknr);
+ }
+ if (dump_old && (dump_counts != -1)) {
+ blocknr++;
+ WRAP(jsb, blocknr, maxlen);
+ continue;
+ }
break;
}
@@ -500,6 +533,7 @@ static void dump_journal(char *cmdname, FILE *out_file,
continue;
case JBD2_COMMIT_BLOCK:
+ cur_counts++;
transaction++;
blocknr++;
WRAP(jsb, blocknr, maxlen);
diff --git a/debugfs/set_fields.c b/debugfs/set_fields.c
index b0015794..f916deab 100644
--- a/debugfs/set_fields.c
+++ b/debugfs/set_fields.c
@@ -183,6 +183,7 @@ static struct field_set_info super_fields[] = {
{ "lpf_ino", &set_sb.s_lpf_ino, NULL, 4, parse_uint },
{ "checksum_seed", &set_sb.s_checksum_seed, NULL, 4, parse_uint },
{ "encoding", &set_sb.s_encoding, NULL, 2, parse_encoding },
+ { "orphan_file_inum", &set_sb.s_orphan_file_inum, NULL, 4, parse_uint },
{ 0, 0, 0, 0 }
};
diff --git a/doc/RelNotes/v1.46.6.txt b/doc/RelNotes/v1.46.6.txt
index 3e8c9f47..223a2e29 100644
--- a/doc/RelNotes/v1.46.6.txt
+++ b/doc/RelNotes/v1.46.6.txt
@@ -1,4 +1,4 @@
-E2fsprogs 1.46.6 (September 12, 2022)
+E2fsprogs 1.46.6 (February 1, 2023)
=====================================
Updates/Fixes since v1.46.5:
diff --git a/doc/RelNotes/v1.47.0.txt b/doc/RelNotes/v1.47.0.txt
new file mode 100644
index 00000000..8af28b9e
--- /dev/null
+++ b/doc/RelNotes/v1.47.0.txt
@@ -0,0 +1,53 @@
+E2fsprogs 1.47.0 (February 5, 2023)
+===================================
+
+Updates/Fixes since v1.46.6:
+
+UI and Features
+---------------
+
+Add support for the orphan_file feature, which speeds up workloads that
+are deleting or truncating a large number files in parallel. This
+compat feature was first supported in the v5.15 Linux kernel.
+
+The mke2fs program (via the mke2fs.conf file) now enables the
+metadata_csum_seed and orphan_file features by default. The
+metadata_csum_seed feature is an incompat feature which is first
+supported in the Linux kernel starting in the 4.4 kernel and e2fsprogs
+1.43.
+
+Mke2fs now supports the extended option "assume_storage_prezeroed" which
+causes mke2fs to skip zeroing the journal and inode tables and to mark
+the inode tables as zeroed.
+
+Add support to tune2fs and e2label to set the label and UUID for a
+mounted file system using a ioctl, which is more reliable than modifying
+the superblock via writing to the block device. The kernel support for
+setting the label landed in v5.17, while the support for adding the UUID
+landed in v6.0. If the ioctls are not supported, tune2fs and e2label
+will fall back old strategy of directly modifying the superblock.
+
+Allow tune2fs to disable the casefold feature after scanning all of the
+directories do not have the Casefold flag set.
+
+
+Fixes
+-----
+
+Fix a potential unbalanced mutex unlock when there is a short read while
+using the bounce buffer when using direct I/O.
+
+
+Performance, Internal Implementation, Development Support etc.
+--------------------------------------------------------------
+
+Fix various Coverity and compiler warnings.
+
+Add the new function ext2fs_xattrs_read_inode() which takes an in-memory
+inode to avoid needing to reread an inode that was already read into
+memory.
+
+Teach debugfs logdump command the -n option which forces printing a
+specified number of transactions, even when a block missing a magic
+number would have stopped the logdump. (This is for debugging
+journalling problems.)
diff --git a/doc/libext2fs.texinfo b/doc/libext2fs.texinfo
index 5300604a..5d4b0537 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.46.6)
+@settitle The EXT2FS Library (version 1.47.0)
@synindex tp fn
@comment %**end of header
@@ -60,7 +60,7 @@ by the author.
@title The EXT2FS Library
@subtitle The EXT2FS Library
-@subtitle Version 1.46.6
+@subtitle Version 1.47.0
@subtitle February 2023
@author by Theodore Ts'o
@@ -101,7 +101,7 @@ by the Foundation.
@top The EXT2FS Library
-This manual documents the EXT2FS Library, version 1.46.6.
+This manual documents the EXT2FS Library, version 1.47.0.
@menu
* Introduction to the EXT2FS Library::
diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h
index b8caa43b..3f2dc308 100644
--- a/e2fsck/e2fsck.h
+++ b/e2fsck/e2fsck.h
@@ -656,6 +656,7 @@ void sigcatcher_setup(void);
void check_super_block(e2fsck_t ctx);
int check_backup_super_block(e2fsck_t ctx);
void check_resize_inode(e2fsck_t ctx);
+int check_init_orphan_file(e2fsck_t ctx);
/* util.c */
extern void *e2fsck_allocate_memory(e2fsck_t ctx, unsigned long size,
diff --git a/e2fsck/journal.c b/e2fsck/journal.c
index 8ae89bf7..c7868d89 100644
--- a/e2fsck/journal.c
+++ b/e2fsck/journal.c
@@ -610,10 +610,10 @@ static void ext4_fc_flush_extents(e2fsck_t ctx, ext2_ino_t ino)
/* Helper struct for dentry replay routines */
struct dentry_info_args {
- ext2_ino_t parent_ino;
- int dname_len;
- ext2_ino_t ino;
- char *dname;
+ ext2_ino_t parent_ino;
+ ext2_ino_t ino;
+ int dname_len;
+ char *dname;
};
static inline int tl_to_darg(struct dentry_info_args *darg,
diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index 78540119..a341c72a 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -918,6 +918,7 @@ static void reserve_block_for_lnf_repair(e2fsck_t ctx)
}
static errcode_t get_inline_data_ea_size(ext2_filsys fs, ext2_ino_t ino,
+ struct ext2_inode *inode,
size_t *sz)
{
void *p;
@@ -928,7 +929,8 @@ static errcode_t get_inline_data_ea_size(ext2_filsys fs, ext2_ino_t ino,
if (retval)
return retval;
- retval = ext2fs_xattrs_read(handle);
+ retval = ext2fs_xattrs_read_inode(handle,
+ (struct ext2_inode_large *)inode);
if (retval)
goto err;
@@ -1515,7 +1517,8 @@ void e2fsck_pass1(e2fsck_t ctx)
(ino >= EXT2_FIRST_INODE(fs->super))) {
size_t size = 0;
- pctx.errcode = get_inline_data_ea_size(fs, ino, &size);
+ pctx.errcode = get_inline_data_ea_size(fs, ino, inode,
+ &size);
if (!pctx.errcode &&
fix_problem(ctx, PR_1_INLINE_DATA_FEATURE, &pctx)) {
ext2fs_set_feature_inline_data(sb);
@@ -1538,7 +1541,7 @@ void e2fsck_pass1(e2fsck_t ctx)
flags = fs->flags;
if (failed_csum)
fs->flags |= EXT2_FLAG_IGNORE_CSUM_ERRORS;
- err = get_inline_data_ea_size(fs, ino, &size);
+ err = get_inline_data_ea_size(fs, ino, inode, &size);
fs->flags = (flags & EXT2_FLAG_IGNORE_CSUM_ERRORS) |
(fs->flags & ~EXT2_FLAG_IGNORE_CSUM_ERRORS);
@@ -1785,6 +1788,32 @@ void e2fsck_pass1(e2fsck_t ctx)
inode_size, "pass1");
failed_csum = 0;
}
+ } else if (ino == fs->super->s_orphan_file_inum) {
+ ext2fs_mark_inode_bitmap2(ctx->inode_used_map, ino);
+ if (ext2fs_has_feature_orphan_file(fs->super)) {
+ if (!LINUX_S_ISREG(inode->i_mode) &&
+ fix_problem(ctx, PR_1_ORPHAN_FILE_BAD_MODE,
+ &pctx)) {
+ inode->i_mode = LINUX_S_IFREG;
+ e2fsck_write_inode(ctx, ino, inode,
+ "pass1");
+ failed_csum = 0;
+ }
+ check_blocks(ctx, &pctx, block_buf, NULL);
+ FINISH_INODE_LOOP(ctx, ino, &pctx, failed_csum);
+ continue;
+ }
+ if ((inode->i_links_count ||
+ inode->i_blocks || inode->i_block[0]) &&
+ fix_problem(ctx, PR_1_ORPHAN_FILE_NOT_CLEAR,
+ &pctx)) {
+ memset(inode, 0, inode_size);
+ ext2fs_icount_store(ctx->inode_link_info, ino,
+ 0);
+ e2fsck_write_inode_full(ctx, ino, inode,
+ inode_size, "pass1");
+ failed_csum = 0;
+ }
} else if (ino < EXT2_FIRST_INODE(fs->super)) {
problem_t problem = 0;
@@ -3494,6 +3523,7 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
}
if (ino != quota_type2inum(PRJQUOTA, fs->super) &&
+ ino != fs->super->s_orphan_file_inum &&
(ino == EXT2_ROOT_INO || ino >= EXT2_FIRST_INODE(ctx->fs->super)) &&
!(inode->i_flags & EXT4_EA_INODE_FL)) {
quota_data_add(ctx->qctx, (struct ext2_inode_large *) inode,
diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c
index 28736094..410edd11 100644
--- a/e2fsck/pass2.c
+++ b/e2fsck/pass2.c
@@ -1446,7 +1446,8 @@ skip_checksum:
(dirent->inode > fs->super->s_inodes_count) ||
(dirent->inode == fs->super->s_usr_quota_inum) ||
(dirent->inode == fs->super->s_grp_quota_inum) ||
- (dirent->inode == fs->super->s_prj_quota_inum)) {
+ (dirent->inode == fs->super->s_prj_quota_inum) ||
+ (dirent->inode == fs->super->s_orphan_file_inum)) {
problem = PR_2_BAD_INO;
} else if (ctx->inode_bb_map &&
(ext2fs_test_inode_bitmap2(ctx->inode_bb_map,
diff --git a/e2fsck/pass4.c b/e2fsck/pass4.c
index 8c2d2f1f..d2dda02a 100644
--- a/e2fsck/pass4.c
+++ b/e2fsck/pass4.c
@@ -26,7 +26,7 @@
* This subroutine returns 1 then the caller shouldn't bother with the
* rest of the pass 4 tests.
*/
-static int disconnect_inode(e2fsck_t ctx, ext2_ino_t i,
+static int disconnect_inode(e2fsck_t ctx, ext2_ino_t i, ext2_ino_t *last_ino,
struct ext2_inode_large *inode)
{
ext2_filsys fs = ctx->fs;
@@ -34,9 +34,12 @@ static int disconnect_inode(e2fsck_t ctx, ext2_ino_t i,
__u32 eamagic = 0;
int extra_size = 0;
- e2fsck_read_inode_full(ctx, i, EXT2_INODE(inode),
- EXT2_INODE_SIZE(fs->super),
- "pass4: disconnect_inode");
+ if (*last_ino != i) {
+ e2fsck_read_inode_full(ctx, i, EXT2_INODE(inode),
+ EXT2_INODE_SIZE(fs->super),
+ "pass4: disconnect_inode");
+ *last_ino = i;
+ }
if (EXT2_INODE_SIZE(fs->super) > EXT2_GOOD_OLD_INODE_SIZE)
extra_size = inode->i_extra_isize;
@@ -75,6 +78,7 @@ static int disconnect_inode(e2fsck_t ctx, ext2_ino_t i,
if (fix_problem(ctx, PR_4_UNATTACHED_INODE, &pctx)) {
if (e2fsck_reconnect_file(ctx, i))
ext2fs_unmark_valid(fs);
+ *last_ino = 0;
} else {
/*
* If we don't attach the inode, then skip the
@@ -87,20 +91,22 @@ static int disconnect_inode(e2fsck_t ctx, ext2_ino_t i,
return 0;
}
-static void check_ea_inode(e2fsck_t ctx, ext2_ino_t i,
+/*
+ * This function is called when link_counted is zero. So this may not be
+ * 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)
{
__u64 actual_refs = 0;
__u64 ref_count;
- /*
- * This function is called when link_counted is zero. So this may not
- * be an xattr inode at all. Return immediately if EA_INODE flag is not
- * set.
- */
- e2fsck_read_inode_full(ctx, i, EXT2_INODE(inode),
- EXT2_INODE_SIZE(ctx->fs->super),
- "pass4: check_ea_inode");
+ if (*last_ino != i) {
+ e2fsck_read_inode_full(ctx, i, EXT2_INODE(inode),
+ EXT2_INODE_SIZE(ctx->fs->super),
+ "pass4: check_ea_inode");
+ *last_ino = i;
+ }
if (!(inode->i_flags & EXT4_EA_INODE_FL))
return;
@@ -180,7 +186,8 @@ void e2fsck_pass4(e2fsck_t ctx)
inode = e2fsck_allocate_memory(ctx, inode_size, "scratch inode");
/* Protect loop from wrap-around if s_inodes_count maxed */
- for (i=1; i <= fs->super->s_inodes_count && i > 0; i++) {
+ for (i = 1; i <= fs->super->s_inodes_count && i > 0; i++) {
+ ext2_ino_t last_ino = 0;
int isdir;
if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
@@ -192,7 +199,7 @@ void e2fsck_pass4(e2fsck_t ctx)
goto errout;
}
if (i == quota_type2inum(PRJQUOTA, ctx->fs->super) ||
- i == EXT2_BAD_INO ||
+ i == fs->super->s_orphan_file_inum || i == EXT2_BAD_INO ||
(i > EXT2_ROOT_INO && i < EXT2_FIRST_INODE(fs->super)))
continue;
if (!(ext2fs_test_inode_bitmap2(ctx->inode_used_map, i)) ||
@@ -210,7 +217,7 @@ void e2fsck_pass4(e2fsck_t ctx)
* check_ea_inode() will update link_counted if
* necessary.
*/
- check_ea_inode(ctx, i, inode, &link_counted);
+ check_ea_inode(ctx, i, &last_ino, inode, &link_counted);
}
if (link_counted == 0) {
@@ -219,7 +226,7 @@ void e2fsck_pass4(e2fsck_t ctx)
fs->blocksize, "bad_inode buffer");
if (e2fsck_process_bad_inode(ctx, 0, i, buf))
continue;
- if (disconnect_inode(ctx, i, inode))
+ if (disconnect_inode(ctx, i, &last_ino, inode))
continue;
ext2fs_icount_fetch(ctx->inode_link_info, i,
&link_count);
@@ -239,8 +246,12 @@ void e2fsck_pass4(e2fsck_t ctx)
if (link_counted != link_count) {
int fix_nlink = 0;
- e2fsck_read_inode_full(ctx, i, EXT2_INODE(inode),
- inode_size, "pass4");
+ if (last_ino != i) {
+ e2fsck_read_inode_full(ctx, i,
+ EXT2_INODE(inode),
+ inode_size, "pass4");
+ last_ino = i;
+ }
pctx.ino = i;
pctx.inode = EXT2_INODE(inode);
if ((link_count != inode->i_links_count) && !isdir &&
diff --git a/e2fsck/problem.c b/e2fsck/problem.c
index e2572f59..6ad6fb84 100644
--- a/e2fsck/problem.c
+++ b/e2fsck/problem.c
@@ -526,6 +526,26 @@ static struct e2fsck_problem problem_table[] = {
"not compatible. Resize @i should be disabled. "),
PROMPT_FIX, 0, 0, 0, 0 },
+ /* Orphan file contains holes */
+ { PR_0_ORPHAN_FILE_HOLE,
+ N_("Orphan file (@i %i) contains hole at @b %b. Terminating orphan file recovery.\n"),
+ PROMPT_NONE, 0 },
+
+ /* Orphan file block has wrong magic */
+ { PR_0_ORPHAN_FILE_BAD_MAGIC,
+ N_("Orphan file (@i %i) @b %b contains wrong magic. Terminating orphan file recovery.\n"),
+ PROMPT_NONE, 0 },
+
+ /* Orphan file block has wrong checksum */
+ { PR_0_ORPHAN_FILE_BAD_CHECKSUM,
+ N_("Orphan file (@i %i) @b %b contains wrong checksum. Terminating orphan file recovery.\n"),
+ PROMPT_NONE, 0 },
+
+ /* Orphan file size isn't multiple of blocks size */
+ { PR_0_ORPHAN_FILE_WRONG_SIZE,
+ N_("Orphan file (@i %i) size is not multiple of block size. Terminating orphan file recovery.\n"),
+ PROMPT_NONE, 0 },
+
/* Pass 1 errors */
/* Pass 1: Checking inodes, blocks, and sizes */
@@ -1279,6 +1299,15 @@ static struct e2fsck_problem problem_table[] = {
N_("@h %i uses SipHash, but should not. "),
PROMPT_CLEAR_HTREE, PR_PREEN_OK, 0, 0, 0 },
+ /* Orphan file has bad mode */
+ { PR_1_ORPHAN_FILE_BAD_MODE,
+ N_("Orphan file @i %i is not regular file. "),
+ PROMPT_CLEAR, PR_PREEN_OK },
+
+ /* Orphan file inode is not in use, but contains data */
+ { PR_1_ORPHAN_FILE_NOT_CLEAR,
+ N_("Orphan file @i %i is not in use, but contains data. "),
+ PROMPT_CLEAR, PR_PREEN_OK },
/* Pass 1b errors */
@@ -2265,6 +2294,56 @@ static struct e2fsck_problem problem_table[] = {
N_("Error writing quota info for quota type %N: %m\n"),
PROMPT_NULL, 0, 0, 0, 0 },
+ /* Orphan file without a journal */
+ { PR_6_ORPHAN_FILE_WITHOUT_JOURNAL,
+ N_("@S has orphan file without @j.\n"),
+ PROMPT_CLEAR, PR_PREEN_OK },
+
+ /* Orphan file truncation failed */
+ { PR_6_ORPHAN_FILE_TRUNC_FAILED,
+ N_("Failed to truncate orphan file.\n"),
+ PROMPT_NONE, 0 },
+
+ /* Failed to initialize orphan file */
+ { PR_6_ORPHAN_FILE_CORRUPTED,
+ N_("Failed to initialize orphan file.\n"),
+ PROMPT_RECREATE, PR_PREEN_OK },
+
+ /* Cannot fix corrupted orphan file with invalid bitmaps */
+ { PR_6_ORPHAN_FILE_BITMAP_INVALID,
+ N_("Cannot fix corrupted orphan file with invalid bitmaps.\n"),
+ PROMPT_NONE, 0 },
+
+ /* Orphan file creation failed */
+ { PR_6_ORPHAN_FILE_CREATE_FAILED,
+ N_("Failed to truncate orphan file (@i %i).\n"),
+ PROMPT_NONE, 0 },
+
+ /* Orphan file block contains data */
+ { PR_6_ORPHAN_BLOCK_DIRTY,
+ N_("Orphan file (@i %i) @b %b is not clean.\n"),
+ PROMPT_CLEAR, PR_PREEN_OK },
+
+ /* orphan_present set but orphan file is empty */
+ { PR_6_ORPHAN_PRESENT_CLEAN_FILE,
+ N_("Feature orphan_present is set but orphan file is clean.\n"),
+ PROMPT_CLEAR, PR_PREEN_OK },
+
+ /* orphan_present set but orphan_file is not */
+ { PR_6_ORPHAN_PRESENT_NO_FILE,
+ N_("Feature orphan_present is set but feature orphan_file is not.\n"),
+ PROMPT_CLEAR, PR_PREEN_OK },
+
+ /* Orphan file size isn't multiple of blocks size */
+ { PR_6_ORPHAN_FILE_WRONG_SIZE,
+ N_("Orphan file (@i %i) size is not multiple of block size.\n"),
+ PROMPT_NONE, 0 },
+
+ /* Orphan file contains holes */
+ { PR_6_ORPHAN_FILE_HOLE,
+ N_("Orphan file (@i %i) contains hole at @b %b.\n"),
+ PROMPT_NONE, 0 },
+
{ 0 }
};
diff --git a/e2fsck/problem.h b/e2fsck/problem.h
index e86bc889..b47b0c63 100644
--- a/e2fsck/problem.h
+++ b/e2fsck/problem.h
@@ -288,6 +288,18 @@ struct problem_context {
/* Meta_bg and resize_inode are not compatible, remove resize_inode*/
#define PR_0_DISABLE_RESIZE_INODE 0x000051
+/* Orphan file contains holes */
+#define PR_0_ORPHAN_FILE_HOLE 0x000052
+
+/* Orphan file block has wrong magic */
+#define PR_0_ORPHAN_FILE_BAD_MAGIC 0x000053
+
+/* Orphan file block has wrong checksum */
+#define PR_0_ORPHAN_FILE_BAD_CHECKSUM 0x000054
+
+/* Orphan file size isn't multiple of blocks size */
+#define PR_0_ORPHAN_FILE_WRONG_SIZE 0x000055
+
/*
* Pass 1 errors
*/
@@ -716,6 +728,11 @@ struct problem_context {
/* Htree directory uses SipHash but should not */
#define PR_1_HTREE_CANNOT_SIPHASH 0x01008E
+/* Orphan file inode is not a regular file */
+#define PR_1_ORPHAN_FILE_BAD_MODE 0x01008F
+
+/* Orphan file inode is not in use, but contains data */
+#define PR_1_ORPHAN_FILE_NOT_CLEAR 0x010090
/*
* Pass 1b errors
@@ -1296,6 +1313,35 @@ struct problem_context {
/* Error updating quota information */
#define PR_6_WRITE_QUOTAS 0x060006
+/* Orphan file without a journal */
+#define PR_6_ORPHAN_FILE_WITHOUT_JOURNAL 0x060007
+
+/* Orphan file truncation failed */
+#define PR_6_ORPHAN_FILE_TRUNC_FAILED 0x060008
+
+/* Failed to initialize orphan file */
+#define PR_6_ORPHAN_FILE_CORRUPTED 0x060009
+
+/* Cannot fix corrupted orphan file with invalid bitmaps */
+#define PR_6_ORPHAN_FILE_BITMAP_INVALID 0x06000A
+
+/* Orphan file creation failed */
+#define PR_6_ORPHAN_FILE_CREATE_FAILED 0x06000B
+
+/* Orphan file block contains data */
+#define PR_6_ORPHAN_BLOCK_DIRTY 0x06000C
+
+/* orphan_present set but orphan file is empty */
+#define PR_6_ORPHAN_PRESENT_CLEAN_FILE 0x06000D
+
+/* orphan_present set but orphan_file is not */
+#define PR_6_ORPHAN_PRESENT_NO_FILE 0x06000E
+
+/* Orphan file size isn't multiple of blocks size */
+#define PR_6_ORPHAN_FILE_WRONG_SIZE 0x06000F
+
+/* Orphan file contains holes */
+#define PR_6_ORPHAN_FILE_HOLE 0x060010
/*
* Function declarations
diff --git a/e2fsck/rehash.c b/e2fsck/rehash.c
index 8235e468..c1da7d52 100644
--- a/e2fsck/rehash.c
+++ b/e2fsck/rehash.c
@@ -89,9 +89,9 @@ struct fill_dir_struct {
};
struct hash_entry {
- ext2_dirhash_t hash;
- ext2_dirhash_t minor_hash;
- ext2_ino_t ino;
+ ext2_dirhash_t hash;
+ ext2_dirhash_t minor_hash;
+ ext2_ino_t ino;
struct ext2_dir_entry *dir;
};
diff --git a/e2fsck/super.c b/e2fsck/super.c
index 123813be..9495e029 100644
--- a/e2fsck/super.c
+++ b/e2fsck/super.c
@@ -314,6 +314,180 @@ static errcode_t e2fsck_write_all_quotas(e2fsck_t ctx)
return pctx.errcode;
}
+static int release_orphan_inode(e2fsck_t ctx, ext2_ino_t *ino, char *block_buf)
+{
+ ext2_filsys fs = ctx->fs;
+ struct problem_context pctx;
+ struct ext2_inode_large inode;
+ ext2_ino_t next_ino;
+
+ e2fsck_read_inode_full(ctx, *ino, EXT2_INODE(&inode),
+ sizeof(inode), "release_orphan_inode");
+ clear_problem_context(&pctx);
+ pctx.ino = *ino;
+ pctx.inode = EXT2_INODE(&inode);
+ pctx.str = inode.i_links_count ? _("Truncating") : _("Clearing");
+
+ fix_problem(ctx, PR_0_ORPHAN_CLEAR_INODE, &pctx);
+
+ next_ino = inode.i_dtime;
+ if (next_ino &&
+ ((next_ino < EXT2_FIRST_INODE(fs->super)) ||
+ (next_ino > fs->super->s_inodes_count))) {
+ pctx.ino = next_ino;
+ fix_problem(ctx, PR_0_ORPHAN_ILLEGAL_INODE, &pctx);
+ return 1;
+ }
+
+ if (release_inode_blocks(ctx, *ino, &inode, block_buf, &pctx))
+ return 1;
+
+ if (!inode.i_links_count) {
+ if (ctx->qctx)
+ quota_data_inodes(ctx->qctx, &inode, *ino, -1);
+ ext2fs_inode_alloc_stats2(fs, *ino, -1,
+ LINUX_S_ISDIR(inode.i_mode));
+ ctx->free_inodes++;
+ inode.i_dtime = ctx->now;
+ } else {
+ inode.i_dtime = 0;
+ }
+ e2fsck_write_inode_full(ctx, *ino, EXT2_INODE(&inode),
+ sizeof(inode), "delete_file");
+ *ino = next_ino;
+ return 0;
+}
+
+struct process_orphan_block_data {
+ e2fsck_t ctx;
+ char *buf;
+ char *block_buf;
+ e2_blkcnt_t blocks;
+ int abort;
+ int clear;
+ errcode_t errcode;
+ ext2_ino_t ino;
+ __u32 generation;
+};
+
+static int process_orphan_block(ext2_filsys fs,
+ blk64_t *block_nr,
+ e2_blkcnt_t blockcnt,
+ blk64_t ref_blk EXT2FS_ATTR((unused)),
+ int ref_offset EXT2FS_ATTR((unused)),
+ void *priv_data)
+{
+ struct process_orphan_block_data *pd;
+ e2fsck_t ctx;
+ struct problem_context pctx;
+ blk64_t blk = *block_nr;
+ struct ext4_orphan_block_tail *tail;
+ int j;
+ int inodes_per_ob;
+ __u32 *bdata;
+ ext2_ino_t ino;
+
+ pd = priv_data;
+ ctx = pd->ctx;
+ clear_problem_context(&pctx);
+ pctx.ino = fs->super->s_orphan_file_inum;
+ pctx.blk = blockcnt;
+
+ /* Orphan file must not have holes */
+ if (!blk) {
+ if (blockcnt == pd->blocks)
+ return BLOCK_ABORT;
+ fix_problem(ctx, PR_0_ORPHAN_FILE_HOLE, &pctx);
+return_abort:
+ pd->abort = 1;
+ return BLOCK_ABORT;
+ }
+ inodes_per_ob = ext2fs_inodes_per_orphan_block(fs);
+ pd->errcode = io_channel_read_blk64(fs->io, blk, 1, pd->buf);
+ if (pd->errcode)
+ goto return_abort;
+ tail = ext2fs_orphan_block_tail(fs, pd->buf);
+ if (ext2fs_le32_to_cpu(tail->ob_magic) !=
+ EXT4_ORPHAN_BLOCK_MAGIC) {
+ fix_problem(ctx, PR_0_ORPHAN_FILE_BAD_MAGIC, &pctx);
+ goto return_abort;
+ }
+ if (!ext2fs_orphan_file_block_csum_verify(fs,
+ fs->super->s_orphan_file_inum, blk, pd->buf)) {
+ fix_problem(ctx, PR_0_ORPHAN_FILE_BAD_CHECKSUM, &pctx);
+ goto return_abort;
+ }
+ bdata = (__u32 *)pd->buf;
+ for (j = 0; j < inodes_per_ob; j++) {
+ if (!bdata[j])
+ continue;
+ ino = ext2fs_le32_to_cpu(bdata[j]);
+ if (release_orphan_inode(ctx, &ino, pd->block_buf))
+ goto return_abort;
+ }
+ return 0;
+}
+
+static int process_orphan_file(e2fsck_t ctx, char *block_buf)
+{
+ ext2_filsys fs = ctx->fs;
+ char *orphan_buf;
+ struct process_orphan_block_data pd;
+ int ret = 0;
+ ext2_ino_t orphan_inum = fs->super->s_orphan_file_inum;
+ struct ext2_inode orphan_inode;
+ struct problem_context pctx;
+ errcode_t retval;
+
+ if (!ext2fs_has_feature_orphan_file(fs->super))
+ return 0;
+
+ clear_problem_context(&pctx);
+ pctx.ino = orphan_inum;
+
+ orphan_buf = (char *) e2fsck_allocate_memory(ctx, fs->blocksize * 4,
+ "orphan block buffer");
+ retval = ext2fs_read_inode(fs, orphan_inum, &orphan_inode);
+ if (retval < 0) {
+ com_err("process_orphan_file", retval,
+ _("while reading inode %d"), orphan_inum);
+ ret = 1;
+ goto out;
+ }
+ if (EXT2_I_SIZE(&orphan_inode) & (fs->blocksize - 1)) {
+ fix_problem(ctx, PR_0_ORPHAN_FILE_WRONG_SIZE, &pctx);
+ ret = 1;
+ goto out;
+ }
+ pd.buf = orphan_buf + 3 * fs->blocksize;
+ pd.block_buf = block_buf;
+ pd.blocks = EXT2_I_SIZE(&orphan_inode) / fs->blocksize;
+ pd.ctx = ctx;
+ pd.abort = 0;
+ pd.errcode = 0;
+ retval = ext2fs_block_iterate3(fs, orphan_inum,
+ BLOCK_FLAG_DATA_ONLY | BLOCK_FLAG_HOLE,
+ orphan_buf, process_orphan_block, &pd);
+ if (retval) {
+ com_err("process_orphan_block", retval,
+ _("while calling ext2fs_block_iterate for inode %d"),
+ orphan_inum);
+ ret = 1;
+ goto out;
+ }
+ if (pd.abort) {
+ if (pd.errcode) {
+ com_err("process_orphan_block", pd.errcode,
+ _("while reading blocks of inode %d"),
+ orphan_inum);
+ }
+ ret = 1;
+ }
+out:
+ ext2fs_free_mem(&orphan_buf);
+ return ret;
+}
+
/*
* This function releases all of the orphan inodes. It returns 1 if
* it hit some error, and 0 on success.
@@ -321,15 +495,17 @@ static errcode_t e2fsck_write_all_quotas(e2fsck_t ctx)
static int release_orphan_inodes(e2fsck_t ctx)
{
ext2_filsys fs = ctx->fs;
- ext2_ino_t ino, next_ino;
- struct ext2_inode_large inode;
+ ext2_ino_t ino;
struct problem_context pctx;
char *block_buf;
- if ((ino = fs->super->s_last_orphan) == 0)
+ if (fs->super->s_last_orphan == 0 &&
+ !ext2fs_has_feature_orphan_present(fs->super))
return 0;
clear_problem_context(&pctx);
+ ino = fs->super->s_last_orphan;
+ pctx.ino = ino;
pctx.errcode = e2fsck_read_all_quotas(ctx);
if (pctx.errcode) {
fix_problem(ctx, PR_0_QUOTA_INIT_CTX, &pctx);
@@ -344,9 +520,10 @@ static int release_orphan_inodes(e2fsck_t ctx)
ext2fs_mark_super_dirty(fs);
/*
- * If the filesystem contains errors, don't run the orphan
- * list, since the orphan list can't be trusted; and we're
- * going to be running a full e2fsck run anyway...
+ * If the filesystem contains errors, don't process the orphan list
+ * or orphan file, since neither can be trusted; and we're going to
+ * be running a full e2fsck run anyway... We clear orphan file contents
+ * after filesystem is checked to avoid clearing someone else's data.
*/
if (fs->super->s_state & EXT2_ERROR_FS) {
if (ctx->qctx)
@@ -354,10 +531,8 @@ static int release_orphan_inodes(e2fsck_t ctx)
return 0;
}
- if ((ino < EXT2_FIRST_INODE(fs->super)) ||
- (ino > fs->super->s_inodes_count)) {
- clear_problem_context(&pctx);
- pctx.ino = ino;
+ if (ino && ((ino < EXT2_FIRST_INODE(fs->super)) ||
+ (ino > fs->super->s_inodes_count))) {
fix_problem(ctx, PR_0_ORPHAN_ILLEGAL_HEAD_INODE, &pctx);
goto err_qctx;
}
@@ -366,43 +541,19 @@ static int release_orphan_inodes(e2fsck_t ctx)
"block iterate buffer");
e2fsck_read_bitmaps(ctx);
+ /* First process orphan list */
while (ino) {
- e2fsck_read_inode_full(ctx, ino, EXT2_INODE(&inode),
- sizeof(inode), "release_orphan_inodes");
- clear_problem_context(&pctx);
- pctx.ino = ino;
- pctx.inode = EXT2_INODE(&inode);
- pctx.str = inode.i_links_count ? _("Truncating") :
- _("Clearing");
-
- fix_problem(ctx, PR_0_ORPHAN_CLEAR_INODE, &pctx);
-
- next_ino = inode.i_dtime;
- if (next_ino &&
- ((next_ino < EXT2_FIRST_INODE(fs->super)) ||
- (next_ino > fs->super->s_inodes_count))) {
- pctx.ino = next_ino;
- fix_problem(ctx, PR_0_ORPHAN_ILLEGAL_INODE, &pctx);
+ if (release_orphan_inode(ctx, &ino, block_buf))
goto err_buf;
- }
+ }
- if (release_inode_blocks(ctx, ino, &inode, block_buf, &pctx))
- goto err_buf;
+ /* Next process orphan file */
+ if (ext2fs_has_feature_orphan_present(fs->super) &&
+ !ext2fs_has_feature_orphan_file(fs->super))
+ goto err_buf;
+ if (process_orphan_file(ctx, block_buf))
+ goto err_buf;
- if (!inode.i_links_count) {
- if (ctx->qctx)
- quota_data_inodes(ctx->qctx, &inode, ino, -1);
- ext2fs_inode_alloc_stats2(fs, ino, -1,
- LINUX_S_ISDIR(inode.i_mode));
- ctx->free_inodes++;
- inode.i_dtime = ctx->now;
- } else {
- inode.i_dtime = 0;
- }
- e2fsck_write_inode_full(ctx, ino, EXT2_INODE(&inode),
- sizeof(inode), "delete_file");
- ino = next_ino;
- }
ext2fs_free_mem(&block_buf);
pctx.errcode = e2fsck_write_all_quotas(ctx);
if (pctx.errcode)
@@ -417,6 +568,134 @@ err:
return 1;
}
+static int reinit_orphan_block(ext2_filsys fs,
+ blk64_t *block_nr,
+ e2_blkcnt_t blockcnt,
+ blk64_t ref_blk EXT2FS_ATTR((unused)),
+ int ref_offset EXT2FS_ATTR((unused)),
+ void *priv_data)
+{
+ struct process_orphan_block_data *pd;
+ e2fsck_t ctx;
+ blk64_t blk = *block_nr;
+ struct problem_context pctx;
+
+ pd = priv_data;
+ ctx = pd->ctx;
+
+ /* Orphan file must not have holes */
+ if (!blk) {
+ if (blockcnt == pd->blocks)
+ return BLOCK_ABORT;
+
+ clear_problem_context(&pctx);
+ pctx.ino = fs->super->s_orphan_file_inum;
+ pctx.blk = blockcnt;
+ fix_problem(ctx, PR_6_ORPHAN_FILE_HOLE, &pctx);
+return_abort:
+ pd->abort = 1;
+ return BLOCK_ABORT;
+ }
+
+ if (ext2fs_has_feature_metadata_csum(fs->super)) {
+ struct ext4_orphan_block_tail *tail;
+
+ tail = ext2fs_orphan_block_tail(fs, pd->buf);
+ /*
+ * 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);
+ }
+ if (!pd->clear) {
+ pd->errcode = io_channel_read_blk64(fs->io, blk, 1,
+ pd->block_buf);
+ /* Block is already cleanly initialized? */
+ if (!memcmp(pd->block_buf, pd->buf, fs->blocksize))
+ return 0;
+
+ clear_problem_context(&pctx);
+ pctx.ino = fs->super->s_orphan_file_inum;
+ pctx.blk = blockcnt;
+ if (!fix_problem(ctx, PR_6_ORPHAN_BLOCK_DIRTY, &pctx))
+ goto return_abort;
+ pd->clear = 1;
+ }
+ pd->errcode = io_channel_write_blk64(fs->io, blk, 1, pd->buf);
+ if (pd->errcode)
+ goto return_abort;
+ return 0;
+}
+
+/*
+ * Check and clear orphan file. We just return non-zero if we hit some
+ * inconsistency. Caller will truncate & recreate new orphan file.
+ */
+int check_init_orphan_file(e2fsck_t ctx)
+{
+ ext2_filsys fs = ctx->fs;
+ char *orphan_buf;
+ struct process_orphan_block_data pd;
+ struct ext4_orphan_block_tail *tail;
+ ext2_ino_t orphan_inum = fs->super->s_orphan_file_inum;
+ struct ext2_inode orphan_inode;
+ int ret = 0;
+ errcode_t retval;
+
+ orphan_buf = (char *) e2fsck_allocate_memory(ctx, fs->blocksize * 5,
+ "orphan block buffer");
+ e2fsck_read_inode(ctx, orphan_inum, &orphan_inode, "orphan inode");
+ if (EXT2_I_SIZE(&orphan_inode) & (fs->blocksize - 1)) {
+ struct problem_context pctx;
+
+ clear_problem_context(&pctx);
+ pctx.ino = orphan_inum;
+ fix_problem(ctx, PR_6_ORPHAN_FILE_WRONG_SIZE, &pctx);
+ ret = 1;
+ goto out;
+ }
+ pd.buf = orphan_buf + 3 * fs->blocksize;
+ pd.block_buf = orphan_buf + 4 * fs->blocksize;
+ pd.blocks = EXT2_I_SIZE(&orphan_inode) / fs->blocksize;
+ pd.ctx = ctx;
+ pd.abort = 0;
+ pd.clear = 0;
+ pd.errcode = 0;
+ pd.ino = orphan_inum;
+ pd.generation = orphan_inode.i_generation;
+ /* Initialize buffer to write */
+ memset(pd.buf, 0, fs->blocksize);
+ tail = ext2fs_orphan_block_tail(fs, pd.buf);
+ tail->ob_magic = ext2fs_cpu_to_le32(EXT4_ORPHAN_BLOCK_MAGIC);
+
+ retval = ext2fs_block_iterate3(fs, orphan_inum,
+ BLOCK_FLAG_DATA_ONLY | BLOCK_FLAG_HOLE,
+ orphan_buf, reinit_orphan_block, &pd);
+ if (retval) {
+ com_err("reinit_orphan_block", retval,
+ _("while calling ext2fs_block_iterate for inode %d"),
+ orphan_inum);
+ ret = 1;
+ goto out;
+ }
+ if (pd.abort) {
+ if (pd.errcode) {
+ com_err("process_orphan_block", pd.errcode,
+ _("while reading blocks of inode %d"),
+ orphan_inum);
+ }
+ ret = 1;
+ }
+
+ /* We had to clear some blocks. Report it up. */
+ if (ret == 0 && pd.clear)
+ ret = 2;
+out:
+ ext2fs_free_mem(&orphan_buf);
+ return ret;
+}
+
/*
* Check the resize inode to make sure it is sane. We check both for
* the case where on-line resizing is not enabled (in which case the
diff --git a/e2fsck/unix.c b/e2fsck/unix.c
index 853eb296..e5b672a2 100644
--- a/e2fsck/unix.c
+++ b/e2fsck/unix.c
@@ -1954,15 +1954,82 @@ print_unsupp_features:
_("\n*** journal has been regenerated ***\n"));
}
}
-no_journal:
+no_journal:
if (run_result & E2F_FLAG_ABORT) {
fatal_error(ctx, _("aborted"));
} else if (run_result & E2F_FLAG_CANCEL) {
log_out(ctx, _("%s: e2fsck canceled.\n"), ctx->device_name ?
ctx->device_name : ctx->filesystem_name);
exit_value |= FSCK_CANCELED;
- } else if (ctx->qctx && !ctx->invalid_bitmaps) {
+ goto cleanup;
+ }
+
+ if (ext2fs_has_feature_orphan_file(fs->super)) {
+ int ret;
+
+ /* No point in orphan file without a journal... */
+ if (!ext2fs_has_feature_journal(fs->super) &&
+ fix_problem(ctx, PR_6_ORPHAN_FILE_WITHOUT_JOURNAL, &pctx)) {
+ retval = ext2fs_truncate_orphan_file(fs);
+ if (retval) {
+ /* Huh, failed to delete file */
+ fix_problem(ctx, PR_6_ORPHAN_FILE_TRUNC_FAILED,
+ &pctx);
+ goto check_quotas;
+ }
+ ext2fs_clear_feature_orphan_file(fs->super);
+ ext2fs_mark_super_dirty(fs);
+ goto check_quotas;
+ }
+ ret = check_init_orphan_file(ctx);
+ if (ret == 2 ||
+ (ret == 0 && ext2fs_has_feature_orphan_present(fs->super) &&
+ fix_problem(ctx, PR_6_ORPHAN_PRESENT_CLEAN_FILE, &pctx))) {
+ ext2fs_clear_feature_orphan_present(fs->super);
+ ext2fs_mark_super_dirty(fs);
+ } else if (ret == 1 &&
+ fix_problem(ctx, PR_6_ORPHAN_FILE_CORRUPTED, &pctx)) {
+ int orphan_file_blocks;
+
+ if (ctx->invalid_bitmaps) {
+ fix_problem(ctx,
+ PR_6_ORPHAN_FILE_BITMAP_INVALID,
+ &pctx);
+ goto check_quotas;
+ }
+
+ retval = ext2fs_truncate_orphan_file(fs);
+ if (retval) {
+ /* Huh, failed to truncate file */
+ fix_problem(ctx, PR_6_ORPHAN_FILE_TRUNC_FAILED,
+ &pctx);
+ goto check_quotas;
+ }
+
+ orphan_file_blocks =
+ ext2fs_default_orphan_file_blocks(fs);
+ log_out(ctx, _("Creating orphan file (%d blocks): "),
+ orphan_file_blocks);
+ fflush(stdout);
+ retval = ext2fs_create_orphan_file(fs,
+ orphan_file_blocks);
+ if (retval) {
+ log_out(ctx, "%s: while trying to create "
+ "orphan file\n", error_message(retval));
+ fix_problem(ctx, PR_6_ORPHAN_FILE_CREATE_FAILED,
+ &pctx);
+ goto check_quotas;
+ }
+ log_out(ctx, "%s", _(" Done.\n"));
+ }
+ } else if (ext2fs_has_feature_orphan_present(fs->super) &&
+ fix_problem(ctx, PR_6_ORPHAN_PRESENT_NO_FILE, &pctx)) {
+ ext2fs_clear_feature_orphan_present(fs->super);
+ ext2fs_mark_super_dirty(fs);
+ }
+check_quotas:
+ if (ctx->qctx && !ctx->invalid_bitmaps) {
int needs_writeout;
for (qtype = 0; qtype < MAXQUOTAS; qtype++) {
@@ -1997,6 +2064,7 @@ no_journal:
goto restart;
}
+cleanup:
#ifdef MTRACE
mtrace_print("Cleanup");
#endif
diff --git a/e2fsprogs.lsm b/e2fsprogs.lsm
index 72ee4c81..3dec8c9e 100644
--- a/e2fsprogs.lsm
+++ b/e2fsprogs.lsm
@@ -1,15 +1,15 @@
Begin3
Title: EXT2 Filesystem utilities
-Version: 1.46.6
-Entered-date: 2023-02-01
+Version: 1.47.0
+Entered-date: 2023-02-05
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
- 9400kB e2fsprogs-1.46.6.tar.gz
- 1kB e2fsprogs-1.46.6.lsm
+ 9400kB e2fsprogs-1.46.7.tar.gz
+ 1kB e2fsprogs-1.46.7.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 417be490..bdcf7613 100644
--- a/e2fsprogs.spec
+++ b/e2fsprogs.spec
@@ -5,7 +5,7 @@
Summary: Utilities for managing ext2/ext3/ext4 filesystems
Name: e2fsprogs
-Version: 1.46.6
+Version: 1.47.0
Release: 0
License: GPLv2
Group: System Environment/Base
diff --git a/lib/e2p/feature.c b/lib/e2p/feature.c
index 22910602..29b7b151 100644
--- a/lib/e2p/feature.c
+++ b/lib/e2p/feature.c
@@ -49,6 +49,8 @@ static struct feature feature_list[] = {
"fast_commit" },
{ E2P_FEATURE_COMPAT, EXT4_FEATURE_COMPAT_STABLE_INODES,
"stable_inodes" },
+ { E2P_FEATURE_COMPAT, EXT4_FEATURE_COMPAT_ORPHAN_FILE,
+ "orphan_file" },
{ E2P_FEATURE_RO_INCOMPAT, EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER,
"sparse_super" },
@@ -80,6 +82,8 @@ static struct feature feature_list[] = {
"shared_blocks"},
{ E2P_FEATURE_RO_INCOMPAT, EXT4_FEATURE_RO_COMPAT_VERITY,
"verity"},
+ { E2P_FEATURE_RO_INCOMPAT, EXT4_FEATURE_RO_COMPAT_ORPHAN_PRESENT,
+ "orphan_present" },
{ E2P_FEATURE_INCOMPAT, EXT2_FEATURE_INCOMPAT_COMPRESSION,
"compression" },
diff --git a/lib/e2p/ls.c b/lib/e2p/ls.c
index 9511d2c7..0b74aea2 100644
--- a/lib/e2p/ls.c
+++ b/lib/e2p/ls.c
@@ -482,6 +482,9 @@ void list_super2(struct ext2_super_block * sb, FILE *f)
if (ext2fs_has_feature_casefold(sb))
fprintf(f, "Character encoding: %s\n",
e2p_encoding2str(sb->s_encoding));
+ if (ext2fs_has_feature_orphan_file(sb))
+ fprintf(f, "Orphan file inode: %u\n",
+ sb->s_orphan_file_inum);
}
void list_super (struct ext2_super_block * s)
diff --git a/lib/ext2fs/Makefile.in b/lib/ext2fs/Makefile.in
index 1b6a74b8..798ff609 100644
--- a/lib/ext2fs/Makefile.in
+++ b/lib/ext2fs/Makefile.in
@@ -115,6 +115,7 @@ OBJS= $(DEBUGFS_LIB_OBJS) $(RESIZE_LIB_OBJS) $(E2IMAGE_LIB_OBJS) \
newdir.o \
nls_utf8.o \
openfs.o \
+ orphan.o \
progress.o \
punch.o \
qcow2.o \
@@ -198,6 +199,7 @@ SRCS= ext2_err.c \
$(srcdir)/newdir.c \
$(srcdir)/nls_utf8.c \
$(srcdir)/openfs.c \
+ $(srcdir)/orphan.c \
$(srcdir)/progress.c \
$(srcdir)/punch.c \
$(srcdir)/qcow2.c \
diff --git a/lib/ext2fs/badblocks.c b/lib/ext2fs/badblocks.c
index 0f23983b..a306bc06 100644
--- a/lib/ext2fs/badblocks.c
+++ b/lib/ext2fs/badblocks.c
@@ -103,7 +103,7 @@ errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
/*
- * This procedure adds a block to a badblocks list.
+ * This procedure adds an item to a tracking list (e.g. badblocks or casefold).
*/
errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk)
{
diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
index 01d2573b..0fc9c09a 100644
--- a/lib/ext2fs/ext2_fs.h
+++ b/lib/ext2fs/ext2_fs.h
@@ -773,7 +773,8 @@ struct ext2_super_block {
__u8 s_last_error_errcode;
/*27c*/ __le16 s_encoding; /* Filename charset encoding */
__le16 s_encoding_flags; /* Filename charset encoding flags */
- __le32 s_reserved[95]; /* Padding to the end of the block */
+ __le32 s_orphan_file_inum; /* Inode for tracking orphan inodes */
+ __le32 s_reserved[94]; /* Padding to the end of the block */
/*3fc*/ __u32 s_checksum; /* crc32c(superblock) */
};
@@ -828,7 +829,7 @@ struct ext2_super_block {
#define EXT4_FEATURE_COMPAT_SPARSE_SUPER2 0x0200
#define EXT4_FEATURE_COMPAT_FAST_COMMIT 0x0400
#define EXT4_FEATURE_COMPAT_STABLE_INODES 0x0800
-
+#define EXT4_FEATURE_COMPAT_ORPHAN_FILE 0x1000
#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
@@ -851,6 +852,7 @@ struct ext2_super_block {
#define EXT4_FEATURE_RO_COMPAT_PROJECT 0x2000 /* Project quota */
#define EXT4_FEATURE_RO_COMPAT_SHARED_BLOCKS 0x4000
#define EXT4_FEATURE_RO_COMPAT_VERITY 0x8000
+#define EXT4_FEATURE_RO_COMPAT_ORPHAN_PRESENT 0x10000
#define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001
#define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002
@@ -931,6 +933,7 @@ EXT4_FEATURE_COMPAT_FUNCS(exclude_bitmap, 2, EXCLUDE_BITMAP)
EXT4_FEATURE_COMPAT_FUNCS(sparse_super2, 4, SPARSE_SUPER2)
EXT4_FEATURE_COMPAT_FUNCS(fast_commit, 4, FAST_COMMIT)
EXT4_FEATURE_COMPAT_FUNCS(stable_inodes, 4, STABLE_INODES)
+EXT4_FEATURE_COMPAT_FUNCS(orphan_file, 4, ORPHAN_FILE)
EXT4_FEATURE_RO_COMPAT_FUNCS(sparse_super, 2, SPARSE_SUPER)
EXT4_FEATURE_RO_COMPAT_FUNCS(large_file, 2, LARGE_FILE)
@@ -947,6 +950,7 @@ EXT4_FEATURE_RO_COMPAT_FUNCS(readonly, 4, READONLY)
EXT4_FEATURE_RO_COMPAT_FUNCS(project, 4, PROJECT)
EXT4_FEATURE_RO_COMPAT_FUNCS(shared_blocks, 4, SHARED_BLOCKS)
EXT4_FEATURE_RO_COMPAT_FUNCS(verity, 4, VERITY)
+EXT4_FEATURE_RO_COMPAT_FUNCS(orphan_present, 4, ORPHAN_PRESENT)
EXT4_FEATURE_INCOMPAT_FUNCS(compression, 2, COMPRESSION)
EXT4_FEATURE_INCOMPAT_FUNCS(filetype, 2, FILETYPE)
@@ -1114,6 +1118,14 @@ static inline unsigned int ext2fs_dir_rec_len(__u8 name_len,
return rec_len;
}
+#define EXT4_ORPHAN_BLOCK_MAGIC 0x0b10ca04
+
+/* Structure at the tail of orphan block */
+struct ext4_orphan_block_tail {
+ __u32 ob_magic;
+ __u32 ob_checksum;
+};
+
/*
* Constants for ext4's extended time encoding
*/
diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h
index b5477c10..72c60d2b 100644
--- a/lib/ext2fs/ext2fs.h
+++ b/lib/ext2fs/ext2fs.h
@@ -532,6 +532,7 @@ typedef struct ext2_struct_inode_scan *ext2_inode_scan;
#define EXT2_MF_READONLY 4
#define EXT2_MF_SWAP 8
#define EXT2_MF_BUSY 16
+#define EXT2_MF_EXTFS 32
/*
* Ext2/linux mode flags. We define them here so that we don't need
@@ -633,7 +634,8 @@ typedef struct ext2_icount *ext2_icount_t;
EXT2_FEATURE_COMPAT_EXT_ATTR|\
EXT4_FEATURE_COMPAT_SPARSE_SUPER2|\
EXT4_FEATURE_COMPAT_FAST_COMMIT|\
- EXT4_FEATURE_COMPAT_STABLE_INODES)
+ EXT4_FEATURE_COMPAT_STABLE_INODES|\
+ EXT4_FEATURE_COMPAT_ORPHAN_FILE)
#ifdef CONFIG_MMP
#define EXT4_LIB_INCOMPAT_MMP EXT4_FEATURE_INCOMPAT_MMP
@@ -668,7 +670,8 @@ typedef struct ext2_icount *ext2_icount_t;
EXT4_FEATURE_RO_COMPAT_READONLY |\
EXT4_FEATURE_RO_COMPAT_PROJECT |\
EXT4_FEATURE_RO_COMPAT_SHARED_BLOCKS |\
- EXT4_FEATURE_RO_COMPAT_VERITY)
+ EXT4_FEATURE_RO_COMPAT_VERITY |\
+ EXT4_FEATURE_RO_COMPAT_ORPHAN_PRESENT)
/*
* These features are only allowed if EXT2_FLAG_SOFTSUPP_FEATURES is passed
@@ -1295,6 +1298,8 @@ extern errcode_t ext2fs_adjust_ea_refcount3(ext2_filsys fs, blk64_t blk,
ext2_ino_t inum);
errcode_t ext2fs_xattrs_write(struct ext2_xattr_handle *handle);
errcode_t ext2fs_xattrs_read(struct ext2_xattr_handle *handle);
+errcode_t ext2fs_xattrs_read_inode(struct ext2_xattr_handle *handle,
+ struct ext2_inode_large *inode);
errcode_t ext2fs_xattrs_iterate(struct ext2_xattr_handle *h,
int (*func)(char *name, char *value,
size_t value_len, void *data),
@@ -1706,6 +1711,19 @@ errcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io);
errcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io);
errcode_t ext2fs_rewrite_to_io(ext2_filsys fs, io_channel new_io);
+/* orphan.c */
+extern errcode_t ext2fs_create_orphan_file(ext2_filsys fs, blk_t num_blocks);
+extern errcode_t ext2fs_truncate_orphan_file(ext2_filsys fs);
+extern e2_blkcnt_t ext2fs_default_orphan_file_blocks(ext2_filsys fs);
+extern __u32 ext2fs_do_orphan_file_block_csum(ext2_filsys fs, ext2_ino_t ino,
+ __u32 gen, blk64_t blk,
+ char *buf);
+extern errcode_t ext2fs_orphan_file_block_csum_set(ext2_filsys fs,
+ ext2_ino_t ino, blk64_t blk,
+ char *buf);
+extern int ext2fs_orphan_file_block_csum_verify(ext2_filsys fs, ext2_ino_t ino,
+ blk64_t blk, char *buf);
+
/* get_pathname.c */
extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino,
char **name);
@@ -1859,7 +1877,9 @@ extern int ext2fs_dirent_file_type(const struct ext2_dir_entry *entry);
extern void ext2fs_dirent_set_file_type(struct ext2_dir_entry *entry, int type);
extern struct ext2_inode *ext2fs_inode(struct ext2_inode_large * large_inode);
extern const struct ext2_inode *ext2fs_const_inode(const struct ext2_inode_large * large_inode);
-
+extern int ext2fs_inodes_per_orphan_block(ext2_filsys fs);
+extern struct ext4_orphan_block_tail *ext2fs_orphan_block_tail(ext2_filsys fs,
+ char *buf);
#endif
/*
@@ -2169,6 +2189,19 @@ ext2fs_const_inode(const struct ext2_inode_large * large_inode)
return (const struct ext2_inode *) large_inode;
}
+_INLINE_ int ext2fs_inodes_per_orphan_block(ext2_filsys fs)
+{
+ return (fs->blocksize - sizeof(struct ext4_orphan_block_tail)) /
+ sizeof(__u32);
+}
+
+_INLINE_ struct ext4_orphan_block_tail *
+ext2fs_orphan_block_tail(ext2_filsys fs, char *buf)
+{
+ return (struct ext4_orphan_block_tail *)(buf + fs->blocksize -
+ sizeof(struct ext4_orphan_block_tail));
+}
+
#undef _INLINE_
#endif
diff --git a/lib/ext2fs/ext_attr.c b/lib/ext2fs/ext_attr.c
index 5525045c..34940463 100644
--- a/lib/ext2fs/ext_attr.c
+++ b/lib/ext2fs/ext_attr.c
@@ -1043,30 +1043,18 @@ static void xattrs_free_keys(struct ext2_xattr_handle *h)
h->ibody_count = 0;
}
-errcode_t ext2fs_xattrs_read(struct ext2_xattr_handle *handle)
+/* fetch xattrs from an already-loaded inode */
+errcode_t ext2fs_xattrs_read_inode(struct ext2_xattr_handle *handle,
+ struct ext2_inode_large *inode)
{
- struct ext2_inode_large *inode;
struct ext2_ext_attr_header *header;
__u32 ea_inode_magic;
unsigned int storage_size;
char *start, *block_buf = NULL;
blk64_t blk;
- size_t i;
- errcode_t err;
+ errcode_t err = 0;
EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EA_HANDLE);
- i = EXT2_INODE_SIZE(handle->fs->super);
- if (i < sizeof(*inode))
- i = sizeof(*inode);
- err = ext2fs_get_memzero(i, &inode);
- if (err)
- return err;
-
- err = ext2fs_read_inode_full(handle->fs, handle->ino,
- (struct ext2_inode *)inode,
- EXT2_INODE_SIZE(handle->fs->super));
- if (err)
- goto out;
xattrs_free_keys(handle);
@@ -1102,7 +1090,7 @@ errcode_t ext2fs_xattrs_read(struct ext2_xattr_handle *handle)
read_ea_block:
/* Look for EA in a separate EA block */
- blk = ext2fs_file_acl_block(handle->fs, (struct ext2_inode *)inode);
+ blk = ext2fs_file_acl_block(handle->fs, EXT2_INODE(inode));
if (blk != 0) {
if ((blk < handle->fs->super->s_first_data_block) ||
(blk >= ext2fs_blocks_count(handle->fs->super))) {
@@ -1133,20 +1121,39 @@ read_ea_block:
err = read_xattrs_from_buffer(handle, inode,
(struct ext2_ext_attr_entry *) start,
storage_size, block_buf);
- if (err)
- goto out3;
+ }
+out3:
+ if (block_buf)
ext2fs_free_mem(&block_buf);
- }
+out:
+ return err;
+}
- ext2fs_free_mem(&block_buf);
- ext2fs_free_mem(&inode);
- return 0;
+errcode_t ext2fs_xattrs_read(struct ext2_xattr_handle *handle)
+{
+ struct ext2_inode_large *inode;
+ size_t inode_size = EXT2_INODE_SIZE(handle->fs->super);
+ errcode_t err;
+
+ EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EA_HANDLE);
+
+ if (inode_size < sizeof(*inode))
+ inode_size = sizeof(*inode);
+ err = ext2fs_get_memzero(inode_size, &inode);
+ if (err)
+ return err;
+
+ err = ext2fs_read_inode_full(handle->fs, handle->ino, EXT2_INODE(inode),
+ EXT2_INODE_SIZE(handle->fs->super));
+ if (err)
+ goto out;
+
+ err = ext2fs_xattrs_read_inode(handle, inode);
-out3:
- ext2fs_free_mem(&block_buf);
out:
ext2fs_free_mem(&inode);
+
return err;
}
diff --git a/lib/ext2fs/ismounted.c b/lib/ext2fs/ismounted.c
index 8fc0b99d..a7db1a5c 100644
--- a/lib/ext2fs/ismounted.c
+++ b/lib/ext2fs/ismounted.c
@@ -213,6 +213,12 @@ is_root:
close(fd);
(void) unlink(TEST_FILE);
}
+
+ if (mnt && mnt->mnt_type &&
+ (!strcmp(mnt->mnt_type, "ext4") ||
+ !strcmp(mnt->mnt_type, "ext3") ||
+ !strcmp(mnt->mnt_type, "ext2")))
+ *mount_flags |= EXT2_MF_EXTFS;
retval = 0;
errout:
endmntent (f);
diff --git a/lib/ext2fs/orphan.c b/lib/ext2fs/orphan.c
new file mode 100644
index 00000000..e25f20ca
--- /dev/null
+++ b/lib/ext2fs/orphan.c
@@ -0,0 +1,273 @@
+/*
+ * orphan.c --- utility function to handle orphan file
+ *
+ * Copyright (C) 2015 Jan Kara.
+ *
+ * %Begin-Header%
+ * This file may be redistributed under the terms of the GNU Library
+ * General Public License, version 2.
+ * %End-Header%
+ */
+
+#include "config.h"
+#include <string.h>
+
+#include "ext2_fs.h"
+#include "ext2fsP.h"
+
+errcode_t ext2fs_truncate_orphan_file(ext2_filsys fs)
+{
+ struct ext2_inode inode;
+ errcode_t err;
+ ext2_ino_t ino = fs->super->s_orphan_file_inum;
+
+ err = ext2fs_read_inode(fs, ino, &inode);
+ if (err)
+ return err;
+
+ err = ext2fs_punch(fs, ino, &inode, NULL, 0, ~0ULL);
+ if (err)
+ return err;
+
+ fs->flags &= ~EXT2_FLAG_SUPER_ONLY;
+ memset(&inode, 0, sizeof(struct ext2_inode));
+ err = ext2fs_write_inode(fs, ino, &inode);
+
+ ext2fs_clear_feature_orphan_file(fs->super);
+ ext2fs_clear_feature_orphan_present(fs->super);
+ ext2fs_mark_super_dirty(fs);
+ /* Need to update group descriptors as well */
+ fs->flags &= ~EXT2_FLAG_SUPER_ONLY;
+
+ return err;
+}
+
+__u32 ext2fs_do_orphan_file_block_csum(ext2_filsys fs, ext2_ino_t ino,
+ __u32 gen, blk64_t blk, char *buf)
+{
+ int inodes_per_ob = ext2fs_inodes_per_orphan_block(fs);
+ __u32 crc;
+
+ ino = ext2fs_cpu_to_le32(ino);
+ gen = ext2fs_cpu_to_le32(gen);
+ blk = ext2fs_cpu_to_le64(blk);
+ crc = ext2fs_crc32c_le(fs->csum_seed, (unsigned char *)&ino,
+ sizeof(ino));
+ crc = ext2fs_crc32c_le(crc, (unsigned char *)&gen, sizeof(gen));
+ crc = ext2fs_crc32c_le(crc, (unsigned char *)&blk, sizeof(blk));
+ crc = ext2fs_crc32c_le(crc, (unsigned char *)buf,
+ inodes_per_ob * sizeof(__u32));
+
+ return ext2fs_cpu_to_le32(crc);
+}
+
+struct mkorphan_info {
+ char *buf;
+ char *zerobuf;
+ blk_t num_blocks;
+ blk_t alloc_blocks;
+ blk64_t last_blk;
+ errcode_t err;
+ ext2_ino_t ino;
+ __u32 generation;
+};
+
+static int mkorphan_proc(ext2_filsys fs,
+ blk64_t *blocknr,
+ e2_blkcnt_t blockcnt,
+ blk64_t ref_block EXT2FS_ATTR((unused)),
+ int ref_offset EXT2FS_ATTR((unused)),
+ void *priv_data)
+{
+ struct mkorphan_info *oi = (struct mkorphan_info *)priv_data;
+ blk64_t new_blk;
+ errcode_t err;
+
+ /* Can we just continue in currently allocated cluster? */
+ if (blockcnt &&
+ EXT2FS_B2C(fs, oi->last_blk) == EXT2FS_B2C(fs, oi->last_blk + 1)) {
+ new_blk = oi->last_blk + 1;
+ } else {
+ err = ext2fs_new_block2(fs, oi->last_blk, 0, &new_blk);
+ if (err) {
+ oi->err = err;
+ return BLOCK_ABORT;
+ }
+ ext2fs_block_alloc_stats2(fs, new_blk, +1);
+ oi->alloc_blocks++;
+ }
+ if (blockcnt >= 0) {
+ if (ext2fs_has_feature_metadata_csum(fs->super)) {
+ 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);
+ }
+ err = io_channel_write_blk64(fs->io, new_blk, 1, oi->buf);
+ } else /* zerobuf is used to initialize new indirect blocks... */
+ err = io_channel_write_blk64(fs->io, new_blk, 1, oi->zerobuf);
+ if (err) {
+ oi->err = err;
+ return BLOCK_ABORT;
+ }
+ oi->last_blk = new_blk;
+ *blocknr = new_blk;
+ if (blockcnt >= 0 && --oi->num_blocks == 0)
+ return BLOCK_CHANGED | BLOCK_ABORT;
+ return BLOCK_CHANGED;
+}
+
+errcode_t ext2fs_create_orphan_file(ext2_filsys fs, blk_t num_blocks)
+{
+ struct ext2_inode inode;
+ ext2_ino_t ino = fs->super->s_orphan_file_inum;
+ errcode_t err;
+ char *buf = NULL, *zerobuf = NULL;
+ struct mkorphan_info oi;
+ struct ext4_orphan_block_tail *ob_tail;
+
+ if (!ino) {
+ err = ext2fs_new_inode(fs, EXT2_ROOT_INO, LINUX_S_IFREG | 0600,
+ 0, &ino);
+ if (err)
+ return err;
+ ext2fs_inode_alloc_stats2(fs, ino, +1, 0);
+ ext2fs_mark_ib_dirty(fs);
+ }
+
+ err = ext2fs_read_inode(fs, ino, &inode);
+ if (err)
+ return err;
+ if (EXT2_I_SIZE(&inode)) {
+ err = ext2fs_truncate_orphan_file(fs);
+ if (err)
+ return err;
+ }
+
+ memset(&inode, 0, sizeof(struct ext2_inode));
+ if (ext2fs_has_feature_extents(fs->super)) {
+ inode.i_flags |= EXT4_EXTENTS_FL;
+ err = ext2fs_write_inode(fs, ino, &inode);
+ if (err)
+ return err;
+ }
+
+ err = ext2fs_get_mem(fs->blocksize, &buf);
+ if (err)
+ return err;
+ err = ext2fs_get_mem(fs->blocksize, &zerobuf);
+ if (err)
+ goto out;
+ memset(buf, 0, fs->blocksize);
+ memset(zerobuf, 0, fs->blocksize);
+ ob_tail = ext2fs_orphan_block_tail(fs, buf);
+ ob_tail->ob_magic = ext2fs_cpu_to_le32(EXT4_ORPHAN_BLOCK_MAGIC);
+ oi.num_blocks = num_blocks;
+ oi.alloc_blocks = 0;
+ oi.last_blk = 0;
+ oi.generation = inode.i_generation;
+ oi.ino = ino;
+ oi.buf = buf;
+ oi.zerobuf = zerobuf;
+ oi.err = 0;
+ err = ext2fs_block_iterate3(fs, ino, BLOCK_FLAG_APPEND,
+ 0, mkorphan_proc, &oi);
+ if (err)
+ goto out;
+ if (oi.err) {
+ err = oi.err;
+ goto out;
+ }
+
+ /* Reread inode after blocks were allocated */
+ err = ext2fs_read_inode(fs, ino, &inode);
+ if (err)
+ goto out;
+ ext2fs_iblk_set(fs, &inode, 0);
+ inode.i_atime = inode.i_mtime =
+ inode.i_ctime = fs->now ? fs->now : time(0);
+ inode.i_links_count = 1;
+ inode.i_mode = LINUX_S_IFREG | 0600;
+ ext2fs_iblk_add_blocks(fs, &inode, oi.alloc_blocks);
+ err = ext2fs_inode_size_set(fs, &inode,
+ (unsigned long long)fs->blocksize * num_blocks);
+ if (err)
+ goto out;
+ err = ext2fs_write_new_inode(fs, ino, &inode);
+ if (err)
+ goto out;
+
+ fs->super->s_orphan_file_inum = ino;
+ ext2fs_set_feature_orphan_file(fs->super);
+ ext2fs_mark_super_dirty(fs);
+ /* Need to update group descriptors as well */
+ fs->flags &= ~EXT2_FLAG_SUPER_ONLY;
+out:
+ if (buf)
+ ext2fs_free_mem(&buf);
+ if (zerobuf)
+ ext2fs_free_mem(&zerobuf);
+ return err;
+}
+
+/*
+ * Find reasonable size for orphan file. We choose orphan file size to be
+ * between 32 and 512 filesystem blocks and not more than 1/4096 of the
+ * filesystem unless it is really small.
+ */
+e2_blkcnt_t ext2fs_default_orphan_file_blocks(ext2_filsys fs)
+{
+ __u64 num_blocks = ext2fs_blocks_count(fs->super);
+ e2_blkcnt_t blks = 512;
+
+ if (num_blocks < 128 * 1024)
+ blks = 32;
+ else if (num_blocks < 2 * 1024 * 1024)
+ blks = num_blocks / 4096;
+ return (blks + EXT2FS_CLUSTER_MASK(fs)) & ~EXT2FS_CLUSTER_MASK(fs);
+}
+
+static errcode_t ext2fs_orphan_file_block_csum(ext2_filsys fs, ext2_ino_t ino,
+ blk64_t blk, char *buf,
+ __u32 *crcp)
+{
+ struct ext2_inode inode;
+ errcode_t retval;
+
+ retval = ext2fs_read_inode(fs, ino, &inode);
+ if (retval)
+ return retval;
+ *crcp = ext2fs_do_orphan_file_block_csum(fs, ino, inode.i_generation,
+ blk, buf);
+ return 0;
+}
+
+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;
+
+ 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);
+}
+
+int ext2fs_orphan_file_block_csum_verify(ext2_filsys fs, ext2_ino_t ino,
+ blk64_t blk, char *buf)
+{
+ struct ext4_orphan_block_tail *tail;
+ __u32 crc;
+ errcode_t retval;
+
+ if (!ext2fs_has_feature_metadata_csum(fs->super))
+ return 1;
+ retval = ext2fs_orphan_file_block_csum(fs, ino, blk, buf, &crc);
+ if (retval)
+ return 0;
+ tail = ext2fs_orphan_block_tail(fs, buf);
+ return ext2fs_le32_to_cpu(tail->ob_checksum) == crc;
+}
diff --git a/lib/ext2fs/swapfs.c b/lib/ext2fs/swapfs.c
index 5e6b22f4..fe764b9e 100644
--- a/lib/ext2fs/swapfs.c
+++ b/lib/ext2fs/swapfs.c
@@ -131,8 +131,9 @@ void ext2fs_swap_super(struct ext2_super_block * sb)
/* s_*_time_hi are __u8 and does not need swabbing */
sb->s_encoding = ext2fs_swab16(sb->s_encoding);
sb->s_encoding_flags = ext2fs_swab16(sb->s_encoding_flags);
+ sb->s_orphan_file_inum = ext2fs_swab32(sb->s_orphan_file_inum);
/* catch when new fields are used from s_reserved */
- EXT2FS_BUILD_BUG_ON(sizeof(sb->s_reserved) != 95 * sizeof(__le32));
+ EXT2FS_BUILD_BUG_ON(sizeof(sb->s_reserved) != 94 * sizeof(__le32));
sb->s_checksum = ext2fs_swab32(sb->s_checksum);
}
diff --git a/lib/ext2fs/tst_super_size.c b/lib/ext2fs/tst_super_size.c
index 80a5269b..ad452dee 100644
--- a/lib/ext2fs/tst_super_size.c
+++ b/lib/ext2fs/tst_super_size.c
@@ -152,7 +152,8 @@ int main(int argc, char **argv)
check_field(s_last_error_errcode, 1);
check_field(s_encoding, 2);
check_field(s_encoding_flags, 2);
- check_field(s_reserved, 95 * 4);
+ check_field(s_orphan_file_inum, 4);
+ check_field(s_reserved, 94 * 4);
check_field(s_checksum, 4);
do_field("Superblock end", 0, 0, cur_offset, 1024);
#endif
diff --git a/lib/ext2fs/unix_io.c b/lib/ext2fs/unix_io.c
index 353d85af..3171c736 100644
--- a/lib/ext2fs/unix_io.c
+++ b/lib/ext2fs/unix_io.c
@@ -306,7 +306,6 @@ bounce_read:
while (size > 0) {
actual = read(data->dev, data->bounce, align_size);
if (actual != align_size) {
- mutex_unlock(data, BOUNCE_MTX);
actual = really_read;
buf -= really_read;
size += really_read;
diff --git a/lib/support/mkquota.c b/lib/support/mkquota.c
index c89f8959..9339c994 100644
--- a/lib/support/mkquota.c
+++ b/lib/support/mkquota.c
@@ -509,7 +509,8 @@ errcode_t quota_compute_usage(quota_ctx_t qctx)
continue;
if (ino == EXT2_ROOT_INO ||
(ino >= EXT2_FIRST_INODE(fs->super) &&
- ino != quota_type2inum(PRJQUOTA, fs->super))) {
+ ino != quota_type2inum(PRJQUOTA, fs->super) &&
+ ino != fs->super->s_orphan_file_inum)) {
space = ext2fs_get_stat_i_blocks(fs,
EXT2_INODE(inode)) << 9;
quota_data_add(qctx, inode, ino, space);
diff --git a/misc/e2image.c b/misc/e2image.c
index 8b4c0677..1ae03001 100644
--- a/misc/e2image.c
+++ b/misc/e2image.c
@@ -1370,7 +1370,8 @@ static void write_raw_image_file(ext2_filsys fs, int fd, int type, int flags,
ino == fs->super->s_journal_inum ||
ino == quota_type2inum(USRQUOTA, fs->super) ||
ino == quota_type2inum(GRPQUOTA, fs->super) ||
- ino == quota_type2inum(PRJQUOTA, fs->super)) {
+ ino == quota_type2inum(PRJQUOTA, fs->super) ||
+ ino == fs->super->s_orphan_file_inum) {
retval = ext2fs_block_iterate3(fs, ino,
BLOCK_FLAG_READ_ONLY, block_buf,
process_dir_block, &pb);
diff --git a/misc/e2label.8.in b/misc/e2label.8.in
index 1dc96199..fa5294c4 100644
--- a/misc/e2label.8.in
+++ b/misc/e2label.8.in
@@ -33,7 +33,12 @@ Ext2 volume labels can be at most 16 characters long; if
.I volume-label
is longer than 16 characters,
.B e2label
-will truncate it and print a warning message.
+will truncate it and print a warning message. For other file systems that
+support online label manipulation and are mounted
+.B e2label
+will work as well, but it will not attempt to truncate the
+.I volume-label
+at all.
.PP
It is also possible to set the volume label using the
.B \-L
diff --git a/misc/mke2fs.8.in b/misc/mke2fs.8.in
index c0b53245..30f97bb5 100644
--- a/misc/mke2fs.8.in
+++ b/misc/mke2fs.8.in
@@ -365,6 +365,13 @@ 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
@@ -403,6 +410,11 @@ file system to change based on the user running \fBmke2fs\fR.
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
diff --git a/misc/mke2fs.c b/misc/mke2fs.c
index ba5f179a..4a9c1b09 100644
--- a/misc/mke2fs.c
+++ b/misc/mke2fs.c
@@ -94,7 +94,9 @@ static gid_t root_gid;
int journal_size;
int journal_flags;
int journal_fc_size;
+static e2_blkcnt_t orphan_file_blocks;
static int lazy_itable_init;
+static int assume_storage_prezeroed;
static int packed_meta_blocks;
int no_copy_xattrs;
static char *bad_blocks_filename = NULL;
@@ -1012,6 +1014,11 @@ static void parse_extended_opts(struct ext2_super_block *param,
lazy_itable_init = strtoul(arg, &p, 0);
else
lazy_itable_init = 1;
+ } else if (!strcmp(token, "assume_storage_prezeroed")) {
+ if (arg)
+ assume_storage_prezeroed = strtoul(arg, &p, 0);
+ else
+ assume_storage_prezeroed = 1;
} else if (!strcmp(token, "lazy_journal_init")) {
if (arg)
journal_flags |= strtoul(arg, &p, 0) ?
@@ -1089,6 +1096,21 @@ static void parse_extended_opts(struct ext2_super_block *param,
continue;
}
encoding_flags = arg;
+ } else if (!strcmp(token, "orphan_file_size")) {
+ if (!arg) {
+ r_usage++;
+ badopt = token;
+ continue;
+ }
+ orphan_file_blocks = parse_num_blocks2(arg,
+ fs_param.s_log_block_size);
+ if (orphan_file_blocks == 0) {
+ fprintf(stderr,
+ _("Invalid size of orphan file %s\n"),
+ arg);
+ r_usage++;
+ continue;
+ }
} else {
r_usage++;
badopt = token;
@@ -1115,7 +1137,8 @@ static void parse_extended_opts(struct ext2_super_block *param,
"\tnodiscard\n"
"\tencoding=<encoding>\n"
"\tencoding_flags=<flags>\n"
- "\tquotatype=<quota type(s) to be enabled>\n\n"),
+ "\tquotatype=<quota type(s) to be enabled>\n"
+ "\tassume_storage_prezeroed=<0 to disable, 1 to enable>\n\n"),
badopt ? badopt : "");
free(buf);
exit(1);
@@ -1156,7 +1179,8 @@ static __u32 ok_features[3] = {
EXT2_FEATURE_COMPAT_EXT_ATTR |
EXT4_FEATURE_COMPAT_SPARSE_SUPER2 |
EXT4_FEATURE_COMPAT_FAST_COMMIT |
- EXT4_FEATURE_COMPAT_STABLE_INODES,
+ EXT4_FEATURE_COMPAT_STABLE_INODES |
+ EXT4_FEATURE_COMPAT_ORPHAN_FILE,
/* Incompat */
EXT2_FEATURE_INCOMPAT_FILETYPE|
EXT3_FEATURE_INCOMPAT_EXTENTS|
@@ -1551,6 +1575,8 @@ static void PRS(int argc, char *argv[])
int lsector_size = 0, psector_size = 0;
int show_version_only = 0, is_device = 0;
unsigned long long num_inodes = 0; /* unsigned long long to catch too-large input */
+ int default_orphan_file = 0;
+ int default_csum_seed = 0;
errcode_t retval;
char * oldpath = getenv("PATH");
char * extended_opts = 0;
@@ -2103,8 +2129,24 @@ profile_error:
ext2fs_clear_feature_ea_inode(&fs_param);
ext2fs_clear_feature_casefold(&fs_param);
}
- edit_feature(fs_features ? fs_features : tmp,
- &fs_param.s_feature_compat);
+ if (!fs_features && tmp)
+ edit_feature(tmp, &fs_param.s_feature_compat);
+ /*
+ * Now all the defaults are incorporated in fs_param. Check the state
+ * of orphan_file feature so that we know whether we should silently
+ * disabled in case journal gets disabled.
+ */
+ if (ext2fs_has_feature_orphan_file(&fs_param))
+ default_orphan_file = 1;
+ if (ext2fs_has_feature_csum_seed(&fs_param))
+ default_csum_seed = 1;
+ if (fs_features)
+ edit_feature(fs_features, &fs_param.s_feature_compat);
+ /* Silently disable orphan_file if user chose fs without journal */
+ if (default_orphan_file && !ext2fs_has_feature_journal(&fs_param))
+ ext2fs_clear_feature_orphan_file(&fs_param);
+ if (default_csum_seed && !ext2fs_has_feature_metadata_csum(&fs_param))
+ ext2fs_clear_feature_csum_seed(&fs_param);
if (tmp)
free(tmp);
(void) ext2fs_free_mem(&fs_features);
@@ -3097,6 +3139,18 @@ int main (int argc, char *argv[])
io_channel_set_options(fs->io, opt_string);
}
+ if (assume_storage_prezeroed) {
+ if (verbose)
+ printf("%s",
+ _("Assuming the storage device is prezeroed "
+ "- skipping inode table and journal wipe\n"));
+
+ lazy_itable_init = 1;
+ itable_zeroed = 1;
+ zero_hugefile = 0;
+ journal_flags |= EXT2_MKJOURNAL_LAZYINIT;
+ }
+
/* Can't undo discard ... */
if (!noaction && discard && dev_size && (io_ptr != undo_io_manager)) {
retval = mke2fs_discard_device(fs);
@@ -3431,6 +3485,9 @@ int main (int argc, char *argv[])
if (!jparams.num_journal_blocks) {
ext2fs_clear_feature_journal(fs->super);
+ ext2fs_clear_feature_orphan_file(fs->super);
+ ext2fs_clear_feature_journal(&fs_param);
+ ext2fs_clear_feature_orphan_file(&fs_param);
goto no_journal;
}
if (!quiet) {
@@ -3473,6 +3530,23 @@ no_journal:
fix_cluster_bg_counts(fs);
if (ext2fs_has_feature_quota(&fs_param))
create_quota_inodes(fs);
+ if (ext2fs_has_feature_orphan_file(&fs_param)) {
+ if (!ext2fs_has_feature_journal(&fs_param)) {
+ com_err(program_name, 0, _("cannot set orphan_file "
+ "feature without a journal."));
+ exit(1);
+ }
+ if (!orphan_file_blocks) {
+ orphan_file_blocks =
+ ext2fs_default_orphan_file_blocks(fs);
+ }
+ retval = ext2fs_create_orphan_file(fs, orphan_file_blocks);
+ if (retval) {
+ com_err(program_name, retval,
+ _("while creating orphan file"));
+ exit(1);
+ }
+ }
retval = mk_hugefiles(fs, device_name);
if (retval)
diff --git a/misc/mke2fs.conf.in b/misc/mke2fs.conf.in
index 05680992..b7fc95df 100644
--- a/misc/mke2fs.conf.in
+++ b/misc/mke2fs.conf.in
@@ -11,7 +11,7 @@
features = has_journal
}
ext4 = {
- features = has_journal,extent,huge_file,flex_bg,metadata_csum,64bit,dir_nlink,extra_isize
+ features = has_journal,extent,huge_file,flex_bg,metadata_csum,metadata_csum_seed,64bit,dir_nlink,extra_isize,orphan_file
}
small = {
blocksize = 1024
diff --git a/misc/tune2fs.8.in b/misc/tune2fs.8.in
index 979f6c5f..dcf108c1 100644
--- a/misc/tune2fs.8.in
+++ b/misc/tune2fs.8.in
@@ -257,6 +257,11 @@ program.
This superblock setting is only honored in 2.6.35+ kernels;
and not at all by the ext2 and ext3 file system drivers.
.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 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.
@@ -452,8 +457,12 @@ Ext2 file system labels can be at most 16 characters long; if
.I volume-label
is longer than 16 characters,
.B tune2fs
-will truncate it and print a warning. The volume label can be used
-by
+will truncate it and print a warning. For other file systems that
+support online label manipulation and are mounted
+.B tune2fs
+will work as well, but it will not attempt to truncate the
+.I volume-label
+at all. The volume label can be used by
.BR mount (8),
.BR fsck (8),
and
@@ -584,8 +593,10 @@ Enable the file system to be larger than 2^32 blocks.
.TP
.B casefold
Enable support for file system level casefolding.
-.B Tune2fs
-currently only supports setting this file system feature.
+The option can be cleared only if filesystem has no
+directories with
+.B F
+attribute.
.TP
.B dir_index
Use hashed b-trees to speed up lookups for large directories.
diff --git a/misc/tune2fs.c b/misc/tune2fs.c
index cb5f575a..458f7cf6 100644
--- a/misc/tune2fs.c
+++ b/misc/tune2fs.c
@@ -52,6 +52,9 @@ extern int optind;
#include <sys/types.h>
#include <libgen.h>
#include <limits.h>
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
#include "ext2fs/ext2_fs.h"
#include "ext2fs/ext2fs.h"
@@ -71,11 +74,34 @@ extern int optind;
#define QOPT_ENABLE (1)
#define QOPT_DISABLE (-1)
+#ifndef FS_IOC_SETFSLABEL
+#define FSLABEL_MAX 256
+#define FS_IOC_SETFSLABEL _IOW(0x94, 50, char[FSLABEL_MAX])
+#endif
+
+#ifndef FS_IOC_GETFSLABEL
+#define FS_IOC_GETFSLABEL _IOR(0x94, 49, char[FSLABEL_MAX])
+#endif
+
+struct fsuuid {
+ __u32 fsu_len;
+ __u32 fsu_flags;
+ __u8 fsu_uuid[];
+};
+
+#ifndef EXT4_IOC_GETFSUUID
+#define EXT4_IOC_GETFSUUID _IOR('f', 44, struct fsuuid)
+#endif
+
+#ifndef EXT4_IOC_SETFSUUID
+#define EXT4_IOC_SETFSUUID _IOW('f', 44, struct fsuuid)
+#endif
+
extern int ask_yn(const char *string, int def);
const char *program_name = "tune2fs";
char *device_name;
-char *new_label, *new_last_mounted, *new_UUID;
+char *new_label, *new_last_mounted, *requested_uuid;
char *io_options;
static int c_flag, C_flag, e_flag, f_flag, g_flag, i_flag, l_flag, L_flag;
static int m_flag, M_flag, Q_flag, r_flag, s_flag = -1, u_flag, U_flag, T_flag;
@@ -107,6 +133,7 @@ int enabling_casefold;
int journal_size, journal_fc_size, journal_flags;
char *journal_device;
static blk64_t journal_location = ~0LL;
+static e2_blkcnt_t orphan_file_blocks;
static struct list_head blk_move_list;
@@ -153,7 +180,8 @@ static __u32 ok_features[3] = {
EXT3_FEATURE_COMPAT_HAS_JOURNAL |
EXT2_FEATURE_COMPAT_DIR_INDEX |
EXT4_FEATURE_COMPAT_FAST_COMMIT |
- EXT4_FEATURE_COMPAT_STABLE_INODES,
+ EXT4_FEATURE_COMPAT_STABLE_INODES |
+ EXT4_FEATURE_COMPAT_ORPHAN_FILE,
/* Incompat */
EXT2_FEATURE_INCOMPAT_FILETYPE |
EXT3_FEATURE_INCOMPAT_EXTENTS |
@@ -184,13 +212,15 @@ static __u32 clear_ok_features[3] = {
EXT3_FEATURE_COMPAT_HAS_JOURNAL |
EXT2_FEATURE_COMPAT_RESIZE_INODE |
EXT2_FEATURE_COMPAT_DIR_INDEX |
- EXT4_FEATURE_COMPAT_FAST_COMMIT,
+ EXT4_FEATURE_COMPAT_FAST_COMMIT |
+ EXT4_FEATURE_COMPAT_ORPHAN_FILE,
/* Incompat */
EXT2_FEATURE_INCOMPAT_FILETYPE |
EXT4_FEATURE_INCOMPAT_FLEX_BG |
EXT4_FEATURE_INCOMPAT_MMP |
EXT4_FEATURE_INCOMPAT_64BIT |
- EXT4_FEATURE_INCOMPAT_CSUM_SEED,
+ EXT4_FEATURE_INCOMPAT_CSUM_SEED |
+ EXT4_FEATURE_INCOMPAT_CASEFOLD,
/* R/O compat */
EXT2_FEATURE_RO_COMPAT_LARGE_FILE |
EXT4_FEATURE_RO_COMPAT_HUGE_FILE|
@@ -1009,6 +1039,41 @@ out:
return retval;
}
+static int has_casefold_inode(ext2_filsys fs)
+{
+ int length = EXT2_INODE_SIZE(fs->super);
+ struct ext2_inode *inode = NULL;
+ ext2_inode_scan scan;
+ errcode_t retval;
+ ext2_ino_t ino;
+ int found_casefold = 0;
+
+ retval = ext2fs_get_mem(length, &inode);
+ if (retval)
+ fatal_err(retval, "while allocating memory");
+
+ retval = ext2fs_open_inode_scan(fs, 0, &scan);
+ if (retval)
+ fatal_err(retval, "while opening inode scan");
+
+ do {
+ retval = ext2fs_get_next_inode_full(scan, &ino, inode, length);
+ if (retval)
+ fatal_err(retval, "while getting next inode");
+ if (!ino)
+ break;
+
+ if(inode->i_flags & EXT4_CASEFOLD_FL) {
+ found_casefold = 1;
+ break;
+ }
+ } while(1);
+
+ ext2fs_free_mem(&inode);
+ ext2fs_close_inode_scan(scan);
+ return found_casefold;
+}
+
static errcode_t disable_uninit_bg(ext2_filsys fs, __u32 csum_feature_flag)
{
struct ext2_group_desc *gd;
@@ -1149,6 +1214,56 @@ static int update_feature_set(ext2_filsys fs, char *features)
}
}
+ if (FEATURE_OFF(E2P_FEATURE_COMPAT, EXT4_FEATURE_COMPAT_ORPHAN_FILE)) {
+ ext2_ino_t ino;
+
+ if (mount_flags & EXT2_MF_MOUNTED) {
+ fputs(_("The orphan_file feature may only be cleared "
+ "when the filesystem is unmounted.\n"), stderr);
+ return 1;
+ }
+ if (ext2fs_has_feature_orphan_present(sb) && f_flag < 2) {
+ fputs(_("The orphan_present feature is set. Please "
+ "run e2fsck before clearing orphan_file "
+ "feature.\n"),
+ stderr);
+ return 1;
+ }
+ err = ext2fs_read_bitmaps(fs);
+ if (err) {
+ com_err(program_name, err, "%s",
+ _("while loading bitmaps"));
+ return 1;
+ }
+ err = ext2fs_truncate_orphan_file(fs);
+ if (err) {
+ com_err(program_name, err,
+ _("\n\twhile trying to delete orphan file\n"));
+ return 1;
+ }
+ ino = sb->s_orphan_file_inum;
+ sb->s_orphan_file_inum = 0;
+ ext2fs_inode_alloc_stats2(fs, ino, -1, 0);
+ ext2fs_clear_feature_orphan_file(sb);
+ ext2fs_clear_feature_orphan_present(sb);
+ ext2fs_mark_super_dirty(fs);
+ }
+
+ if (FEATURE_ON(E2P_FEATURE_COMPAT, EXT4_FEATURE_COMPAT_ORPHAN_FILE)) {
+ if (!ext2fs_has_feature_journal(sb)) {
+ fputs(_("orphan_file feature can be set only for "
+ "filesystems with journal.\n"), stderr);
+ return 1;
+ }
+ /*
+ * If adding an orphan file, let the create orphan file
+ * code below handle setting the flag and creating it.
+ * We supply a default size if necessary.
+ */
+ orphan_file_blocks = ext2fs_default_orphan_file_blocks(fs);
+ ext2fs_set_feature_orphan_file(sb);
+ }
+
if (FEATURE_ON(E2P_FEATURE_RO_INCOMPAT,
EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)) {
if (ext2fs_has_feature_meta_bg(sb)) {
@@ -1493,6 +1608,22 @@ mmp_error:
enabling_casefold = 1;
}
+ if (FEATURE_OFF(E2P_FEATURE_INCOMPAT, EXT4_FEATURE_INCOMPAT_CASEFOLD)) {
+ if (mount_flags & EXT2_MF_MOUNTED) {
+ fputs(_("The casefold feature may only be disabled when "
+ "the filesystem is unmounted.\n"), stderr);
+ return 1;
+ }
+ if (has_casefold_inode(fs)) {
+ fputs(_("The casefold feature can't be cleared when "
+ "there are inodes with +F flag.\n"), stderr);
+ return 1;
+ }
+ fs->super->s_encoding = 0;
+ fs->super->s_encoding_flags = 0;
+ enabling_casefold = 0;
+ }
+
if (FEATURE_ON(E2P_FEATURE_INCOMPAT,
EXT4_FEATURE_INCOMPAT_CSUM_SEED)) {
if (!ext2fs_has_feature_metadata_csum(sb)) {
@@ -2041,7 +2172,7 @@ static void parse_tune2fs_options(int argc, char **argv)
open_flag = EXT2_FLAG_RW;
break;
case 'U':
- new_UUID = optarg;
+ requested_uuid = optarg;
U_flag = 1;
open_flag = EXT2_FLAG_RW |
EXT2_FLAG_JOURNAL_DEV_OK;
@@ -2273,6 +2404,21 @@ static int parse_extended_opts(ext2_filsys fs, const char *opts)
continue;
}
encoding_flags = arg;
+ } else if (!strcmp(token, "orphan_file_size")) {
+ if (!arg) {
+ r_usage++;
+ continue;
+ }
+ orphan_file_blocks = parse_num_blocks2(arg,
+ fs->super->s_log_block_size);
+
+ if (orphan_file_blocks < 1) {
+ fprintf(stderr,
+ _("Invalid size of orphan file %s\n"),
+ arg);
+ r_usage++;
+ continue;
+ }
} else
r_usage++;
}
@@ -2933,6 +3079,80 @@ fs_update_journal_user(struct ext2_super_block *sb, __u8 old_uuid[UUID_SIZE])
return 0;
}
+/*
+ * Use FS_IOC_SETFSLABEL or FS_IOC_GETFSLABEL to set/get file system label
+ * Return: 0 on success
+ * 1 on error
+ * -1 when the old method should be used
+ */
+static int handle_fslabel(int setlabel)
+{
+#ifdef __linux__
+ errcode_t ret;
+ int mnt_flags, fd;
+ char label[FSLABEL_MAX];
+ int maxlen = FSLABEL_MAX - 1;
+ char mntpt[PATH_MAX + 1];
+
+ ret = ext2fs_check_mount_point(device_name, &mnt_flags,
+ mntpt, sizeof(mntpt));
+ if (ret) {
+ com_err(device_name, ret, _("while checking mount status"));
+ return 1;
+ }
+ if (!(mnt_flags & EXT2_MF_MOUNTED) ||
+ (setlabel && (mnt_flags & EXT2_MF_READONLY)))
+ return -1;
+
+ if (!mntpt[0]) {
+ fprintf(stderr,_("Unknown mount point for %s\n"), device_name);
+ return 1;
+ }
+
+ fd = open(mntpt, O_RDONLY);
+ if (fd < 0) {
+ com_err(mntpt, errno, _("while opening mount point"));
+ return 1;
+ }
+
+ /* Get fs label */
+ if (!setlabel) {
+ if (ioctl(fd, FS_IOC_GETFSLABEL, &label)) {
+ close(fd);
+ if (errno == ENOTTY)
+ return -1;
+ com_err(mntpt, errno, _("while trying to get fs label"));
+ return 1;
+ }
+ close(fd);
+ printf("%.*s\n", EXT2_LEN_STR(label));
+ return 0;
+ }
+
+ /* If it's extN file system, truncate the label to appropriate size */
+ if (mnt_flags & EXT2_MF_EXTFS)
+ maxlen = EXT2_LABEL_LEN;
+ if (strlen(new_label) > maxlen) {
+ fputs(_("Warning: label too long, truncating.\n"),
+ stderr);
+ new_label[maxlen] = '\0';
+ }
+
+ /* Set fs label */
+ if (ioctl(fd, FS_IOC_SETFSLABEL, new_label)) {
+ close(fd);
+ if (errno == ENOTTY)
+ return -1;
+ com_err(mntpt, errno, _("while trying to set fs label"));
+ return 1;
+ }
+ close(fd);
+ return 0;
+#else
+ return -1;
+#endif
+}
+
#ifndef BUILD_AS_LIB
int main(int argc, char **argv)
#else
@@ -2945,6 +3165,9 @@ int tune2fs_main(int argc, char **argv)
io_manager io_ptr, io_ptr_orig = NULL;
int rc = 0;
char default_undo_file[1] = { 0 };
+ char mntpt[PATH_MAX + 1] = { 0 };
+ int fd = -1;
+ struct fsuuid *fsuuid = NULL;
#ifdef ENABLE_NLS
setlocale(LC_MESSAGES, "");
@@ -2976,6 +3199,21 @@ int tune2fs_main(int argc, char **argv)
#endif
io_ptr = unix_io_manager;
+ /*
+ * Try the get/set fs label using ioctls before we even attempt
+ * to open the file system.
+ */
+ if (L_flag || print_label) {
+ rc = handle_fslabel(L_flag);
+ if (rc != -1) {
+#ifndef BUILD_AS_LIB
+ exit(rc);
+#endif
+ return rc;
+ }
+ rc = 0;
+ }
+
retry_open:
if ((open_flag & EXT2_FLAG_RW) == 0 || f_flag)
open_flag |= EXT2_FLAG_SKIP_MMP;
@@ -3079,9 +3317,10 @@ retry_open:
goto closefs;
}
- retval = ext2fs_check_if_mounted(device_name, &mount_flags);
+ retval = ext2fs_check_mount_point(device_name, &mount_flags,
+ mntpt, sizeof(mntpt));
if (retval) {
- com_err("ext2fs_check_if_mount", retval,
+ com_err("ext2fs_check_mount_point", retval,
_("while determining whether %s is mounted."),
device_name);
rc = 1;
@@ -3261,6 +3500,24 @@ _("Warning: The journal is dirty. You may wish to replay the journal like:\n\n"
if (rc)
goto closefs;
}
+ if (orphan_file_blocks) {
+ errcode_t err;
+
+ err = ext2fs_read_bitmaps(fs);
+ if (err) {
+ com_err(program_name, err, "%s",
+ _("while loading bitmaps"));
+ rc = 1;
+ goto closefs;
+ }
+ err = ext2fs_create_orphan_file(fs, orphan_file_blocks);
+ if (err) {
+ com_err(program_name, err, "%s",
+ _("while creating orphan file"));
+ rc = 1;
+ goto closefs;
+ }
+ }
if (Q_flag) {
if (mount_flags & EXT2_MF_MOUNTED) {
@@ -3279,6 +3536,8 @@ _("Warning: The journal is dirty. You may wish to replay the journal like:\n\n"
dgrp_t i;
char buf[SUPERBLOCK_SIZE] __attribute__ ((aligned(8)));
__u8 old_uuid[UUID_SIZE];
+ uuid_t new_uuid;
+ errcode_t ret = -1;
if (ext2fs_has_feature_stable_inodes(fs->super)) {
fputs(_("Cannot change the UUID of this filesystem "
@@ -3332,25 +3591,62 @@ _("Warning: The journal is dirty. You may wish to replay the journal like:\n\n"
set_csum = 1;
}
- memcpy(old_uuid, sb->s_uuid, UUID_SIZE);
- if ((strcasecmp(new_UUID, "null") == 0) ||
- (strcasecmp(new_UUID, "clear") == 0)) {
- uuid_clear(sb->s_uuid);
- } else if (strcasecmp(new_UUID, "time") == 0) {
- uuid_generate_time(sb->s_uuid);
- } else if (strcasecmp(new_UUID, "random") == 0) {
- uuid_generate(sb->s_uuid);
- } else if (uuid_parse(new_UUID, sb->s_uuid)) {
+#ifdef __linux__
+ if ((mount_flags & EXT2_MF_MOUNTED) &&
+ !(mount_flags & EXT2_MF_READONLY) && mntpt[0]) {
+ fd = open(mntpt, O_RDONLY);
+ if (fd >= 0)
+ fsuuid = malloc(sizeof(*fsuuid) + UUID_SIZE);
+ if (fsuuid) {
+ fsuuid->fsu_len = UUID_SIZE;
+ fsuuid->fsu_flags = 0;
+ ret = ioctl(fd, EXT4_IOC_GETFSUUID, fsuuid);
+ if (ret || fsuuid->fsu_len != UUID_SIZE) {
+ free(fsuuid);
+ fsuuid = NULL;
+ }
+ }
+ }
+#endif
+
+ memcpy(old_uuid, fsuuid ? fsuuid->fsu_uuid : sb->s_uuid,
+ UUID_SIZE);
+ if ((strcasecmp(requested_uuid, "null") == 0) ||
+ (strcasecmp(requested_uuid, "clear") == 0)) {
+ uuid_clear(new_uuid);
+ } else if (strcasecmp(requested_uuid, "time") == 0) {
+ uuid_generate_time(new_uuid);
+ } else if (strcasecmp(requested_uuid, "random") == 0) {
+ uuid_generate(new_uuid);
+ } else if (uuid_parse(requested_uuid, new_uuid)) {
com_err(program_name, 0, "%s",
_("Invalid UUID format\n"));
rc = 1;
goto closefs;
}
- ext2fs_init_csum_seed(fs);
- if (set_csum) {
- for (i = 0; i < fs->group_desc_count; i++)
- ext2fs_group_desc_csum_set(fs, i);
- fs->flags &= ~EXT2_FLAG_SUPER_ONLY;
+
+ ret = -1;
+#ifdef __linux__
+ if (fsuuid) {
+ fsuuid->fsu_len = UUID_SIZE;
+ fsuuid->fsu_flags = 0;
+ memcpy(&fsuuid->fsu_uuid, new_uuid, UUID_SIZE);
+ ret = ioctl(fd, EXT4_IOC_SETFSUUID, fsuuid);
+ }
+#endif
+ /*
+ * If we can't set the UUID via the ioctl, fall
+ * back to directly modifying the superblock
+ .*/
+ if (ret) {
+ memcpy(sb->s_uuid, new_uuid, UUID_SIZE);
+ ext2fs_init_csum_seed(fs);
+ if (set_csum) {
+ for (i = 0; i < fs->group_desc_count; i++)
+ ext2fs_group_desc_csum_set(fs, i);
+ fs->flags &= ~EXT2_FLAG_SUPER_ONLY;
+ }
+ ext2fs_mark_super_dirty(fs);
}
/* If this is a journal dev, we need to copy UUID into jsb */
@@ -3374,8 +3670,6 @@ _("Warning: The journal is dirty. You may wish to replay the journal like:\n\n"
if ((rc = fs_update_journal_user(sb, old_uuid)))
goto closefs;
}
-
- ext2fs_mark_super_dirty(fs);
}
if (I_flag) {
@@ -3450,6 +3744,10 @@ _("Warning: The journal is dirty. You may wish to replay the journal like:\n\n"
remove_error_table(&et_ext2_error_table);
closefs:
+ if (fd >= 0)
+ close(fd);
+ if (fsuuid)
+ free(fsuuid);
if (rc) {
ext2fs_mmp_stop(fs);
#ifndef BUILD_AS_LIB
diff --git a/po/e2fsprogs.pot b/po/e2fsprogs.pot
index 013ee52c..6e03e971 100644
--- a/po/e2fsprogs.pot
+++ b/po/e2fsprogs.pot
@@ -78,9 +78,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: e2fsprogs 1.46.6\n"
+"Project-Id-Version: e2fsprogs 1.47.0\n"
"Report-Msgid-Bugs-To: tytso@alum.mit.edu\n"
-"POT-Creation-Date: 2023-02-01 15:29-0500\n"
+"POT-Creation-Date: 2023-02-05 15:05-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 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: e2fsck/badblocks.c:23 misc/mke2fs.c:221
+#: e2fsck/badblocks.c:23 misc/mke2fs.c:223
#, c-format
msgid "Bad block %u out of range; ignored.\n"
msgstr ""
@@ -106,9 +106,9 @@ msgstr ""
#: e2fsck/badblocks.c:72 e2fsck/scantest.c:107 e2fsck/unix.c:1592
#: e2fsck/unix.c:1707 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:1440
-#: misc/e2image.c:1640 misc/e2image.c:1661 misc/mke2fs.c:237
-#: misc/tune2fs.c:2891 misc/tune2fs.c:2993 resize/main.c:422
+#: 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:3037 misc/tune2fs.c:3231 resize/main.c:422
#, c-format
msgid "while trying to open %s"
msgstr ""
@@ -118,7 +118,7 @@ msgstr ""
msgid "while trying popen '%s'"
msgstr ""
-#: e2fsck/badblocks.c:95 misc/mke2fs.c:244
+#: e2fsck/badblocks.c:95 misc/mke2fs.c:246
msgid "while reading in list of bad blocks from file"
msgstr ""
@@ -504,81 +504,81 @@ msgstr ""
msgid "reading directory block"
msgstr ""
-#: e2fsck/pass1.c:1173
+#: e2fsck/pass1.c:1175
msgid "getting next inode from scan"
msgstr ""
-#: e2fsck/pass1.c:1225
+#: e2fsck/pass1.c:1227
msgid "in-use inode map"
msgstr ""
-#: e2fsck/pass1.c:1236
+#: e2fsck/pass1.c:1238
msgid "directory inode map"
msgstr ""
-#: e2fsck/pass1.c:1246
+#: e2fsck/pass1.c:1248
msgid "regular file inode map"
msgstr ""
-#: e2fsck/pass1.c:1255 misc/e2image.c:1290
+#: e2fsck/pass1.c:1257 misc/e2image.c:1290
msgid "in-use block map"
msgstr ""
-#: e2fsck/pass1.c:1264
+#: e2fsck/pass1.c:1266
msgid "metadata block map"
msgstr ""
-#: e2fsck/pass1.c:1275
+#: e2fsck/pass1.c:1277
msgid "inode casefold map"
msgstr ""
-#: e2fsck/pass1.c:1340
+#: e2fsck/pass1.c:1342
msgid "opening inode scan"
msgstr ""
-#: e2fsck/pass1.c:2108
+#: e2fsck/pass1.c:2137
msgid "Pass 1"
msgstr ""
-#: e2fsck/pass1.c:2169
+#: e2fsck/pass1.c:2198
#, c-format
msgid "reading indirect blocks of inode %u"
msgstr ""
-#: e2fsck/pass1.c:2220
+#: e2fsck/pass1.c:2249
msgid "bad inode map"
msgstr ""
-#: e2fsck/pass1.c:2260
+#: e2fsck/pass1.c:2289
msgid "inode in bad block map"
msgstr ""
-#: e2fsck/pass1.c:2280
+#: e2fsck/pass1.c:2309
msgid "imagic inode map"
msgstr ""
-#: e2fsck/pass1.c:2311
+#: e2fsck/pass1.c:2340
msgid "multiply claimed block map"
msgstr ""
-#: e2fsck/pass1.c:2436
+#: e2fsck/pass1.c:2465
msgid "ext attr block map"
msgstr ""
-#: e2fsck/pass1.c:3736
+#: e2fsck/pass1.c:3766
#, c-format
msgid "%6lu(%c): expecting %6lu got phys %6lu (blkcnt %lld)\n"
msgstr ""
-#: e2fsck/pass1.c:4157
+#: e2fsck/pass1.c:4187
msgid "block bitmap"
msgstr ""
-#: e2fsck/pass1.c:4163
+#: e2fsck/pass1.c:4193
msgid "inode bitmap"
msgstr ""
-#: e2fsck/pass1.c:4169
+#: e2fsck/pass1.c:4199
msgid "inode table"
msgstr ""
@@ -610,7 +610,7 @@ msgstr ""
msgid "inode loop detection bitmap"
msgstr ""
-#: e2fsck/pass4.c:289
+#: e2fsck/pass4.c:300
msgid "Pass 4"
msgstr ""
@@ -974,7 +974,7 @@ msgstr ""
msgid "Clear @j"
msgstr ""
-#: e2fsck/problem.c:263 e2fsck/problem.c:799
+#: e2fsck/problem.c:263 e2fsck/problem.c:819
#. @-expanded: filesystem has feature flag(s) set, but is a revision 0 filesystem.
msgid "@f has feature flag(s) set, but is a revision 0 @f. "
msgstr ""
@@ -1270,122 +1270,155 @@ msgid ""
"not compatible. Resize @i should be disabled. "
msgstr ""
-#: e2fsck/problem.c:533
+#: e2fsck/problem.c:531
+#. @-expanded: Orphan file (inode %i) contains hole at block %b. Terminating orphan file
+#. @-expanded: recovery.\n
+msgid ""
+"Orphan file (@i %i) contains hole at @b %b. Terminating orphan file "
+"recovery.\n"
+msgstr ""
+
+#: e2fsck/problem.c:536
+#. @-expanded: Orphan file (inode %i) block %b contains wrong magic. Terminating orphan file
+#. @-expanded: recovery.\n
+msgid ""
+"Orphan file (@i %i) @b %b contains wrong magic. Terminating orphan file "
+"recovery.\n"
+msgstr ""
+
+#: e2fsck/problem.c:541
+#. @-expanded: Orphan file (inode %i) block %b contains wrong checksum. Terminating orphan file
+#. @-expanded: recovery.\n
+msgid ""
+"Orphan file (@i %i) @b %b contains wrong checksum. Terminating orphan file "
+"recovery.\n"
+msgstr ""
+
+#: e2fsck/problem.c:546
+#, c-format
+#. @-expanded: Orphan file (inode %i) size is not multiple of block size. Terminating orphan
+#. @-expanded: file recovery.\n
+msgid ""
+"Orphan file (@i %i) size is not multiple of block size. Terminating orphan "
+"file recovery.\n"
+msgstr ""
+
+#: e2fsck/problem.c:553
#. @-expanded: Pass 1: Checking inodes, blocks, and sizes\n
msgid "Pass 1: Checking @is, @bs, and sizes\n"
msgstr ""
-#: e2fsck/problem.c:537
+#: e2fsck/problem.c:557
#. @-expanded: root inode is not a directory.
msgid "@r is not a @d. "
msgstr ""
-#: e2fsck/problem.c:542
+#: e2fsck/problem.c:562
#. @-expanded: root inode has dtime set (probably due to old mke2fs).
msgid "@r has dtime set (probably due to old mke2fs). "
msgstr ""
-#: e2fsck/problem.c:547
+#: e2fsck/problem.c:567
#. @-expanded: Reserved inode %i (%Q) has invalid mode.
msgid "Reserved @i %i (%Q) has @n mode. "
msgstr ""
-#: e2fsck/problem.c:553
+#: e2fsck/problem.c:573
#, no-c-format
#. @-expanded: deleted inode %i has zero dtime.
msgid "@D @i %i has zero dtime. "
msgstr ""
-#: e2fsck/problem.c:559
+#: e2fsck/problem.c:579
#, no-c-format
#. @-expanded: inode %i is in use, but has dtime set.
msgid "@i %i is in use, but has dtime set. "
msgstr ""
-#: e2fsck/problem.c:565
+#: e2fsck/problem.c:585
#, no-c-format
#. @-expanded: inode %i is a zero-length directory.
msgid "@i %i is a @z @d. "
msgstr ""
-#: e2fsck/problem.c:570
+#: e2fsck/problem.c:590
#. @-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:575
+#: e2fsck/problem.c:595
#. @-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:580
+#: e2fsck/problem.c:600
#. @-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:585
+#: e2fsck/problem.c:605
#. @-expanded: group %g's block bitmap (%b) is bad.
msgid "@g %g's @b @B (%b) is bad. "
msgstr ""
-#: e2fsck/problem.c:590
+#: e2fsck/problem.c:610
#. @-expanded: group %g's inode bitmap (%b) is bad.
msgid "@g %g's @i @B (%b) is bad. "
msgstr ""
-#: e2fsck/problem.c:595
+#: e2fsck/problem.c:615
#. @-expanded: inode %i, i_size is %Is, should be %N.
msgid "@i %i, i_size is %Is, @s %N. "
msgstr ""
-#: e2fsck/problem.c:600
+#: e2fsck/problem.c:620
#. @-expanded: inode %i, i_blocks is %Ib, should be %N.
msgid "@i %i, i_@bs is %Ib, @s %N. "
msgstr ""
-#: e2fsck/problem.c:605
+#: e2fsck/problem.c:625
#. @-expanded: illegal %B (%b) in inode %i.
msgid "@I %B (%b) in @i %i. "
msgstr ""
-#: e2fsck/problem.c:610
+#: e2fsck/problem.c:630
#. @-expanded: %B (%b) overlaps filesystem metadata in inode %i.
msgid "%B (%b) overlaps @f metadata in @i %i. "
msgstr ""
-#: e2fsck/problem.c:616
+#: e2fsck/problem.c:636
#, no-c-format
#. @-expanded: inode %i has illegal block(s).
msgid "@i %i has illegal @b(s). "
msgstr ""
-#: e2fsck/problem.c:622
+#: e2fsck/problem.c:642
#, no-c-format
#. @-expanded: Too many illegal blocks in inode %i.\n
msgid "Too many illegal @bs in @i %i.\n"
msgstr ""
-#: e2fsck/problem.c:627
+#: e2fsck/problem.c:647
#. @-expanded: illegal %B (%b) in bad block inode.
msgid "@I %B (%b) in bad @b @i. "
msgstr ""
-#: e2fsck/problem.c:632
+#: e2fsck/problem.c:652
#. @-expanded: Bad block inode has illegal block(s).
msgid "Bad @b @i has illegal @b(s). "
msgstr ""
-#: e2fsck/problem.c:637
+#: e2fsck/problem.c:657
#. @-expanded: Duplicate or bad block in use!\n
msgid "Duplicate or bad @b in use!\n"
msgstr ""
-#: e2fsck/problem.c:642
+#: e2fsck/problem.c:662
#. @-expanded: Bad block %b used as bad block inode indirect block.
msgid "Bad @b %b used as bad @b @i indirect @b. "
msgstr ""
-#: e2fsck/problem.c:647
+#: e2fsck/problem.c:667
#. @-expanded: \n
#. @-expanded: The bad block inode has probably been corrupted. You probably\n
#. @-expanded: should stop now and run e2fsck -c to scan for bad blocks\n
@@ -1397,7 +1430,7 @@ msgid ""
"in the @f.\n"
msgstr ""
-#: e2fsck/problem.c:654
+#: e2fsck/problem.c:674
#. @-expanded: \n
#. @-expanded: If the block is really bad, the filesystem can not be fixed.\n
msgid ""
@@ -1405,7 +1438,7 @@ msgid ""
"If the @b is really bad, the @f can not be fixed.\n"
msgstr ""
-#: e2fsck/problem.c:659
+#: e2fsck/problem.c:679
#. @-expanded: You can remove this block from the bad block list and hope\n
#. @-expanded: that the block is really OK. But there are no guarantees.\n
#. @-expanded: \n
@@ -1415,120 +1448,120 @@ msgid ""
"\n"
msgstr ""
-#: e2fsck/problem.c:665
+#: e2fsck/problem.c:685
#. @-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:670
+#: e2fsck/problem.c:690
#. @-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:676
+#: e2fsck/problem.c:696
#. @-expanded: Warning: Group %g's superblock (%b) is bad.\n
msgid "Warning: Group %g's @S (%b) is bad.\n"
msgstr ""
-#: e2fsck/problem.c:682
+#: e2fsck/problem.c:702
#. @-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:688
+#: e2fsck/problem.c:708
#. @-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 ""
-#: e2fsck/problem.c:694
+#: e2fsck/problem.c:714
#. @-expanded: error allocating %N contiguous block(s) in block group %g for %s: %m\n
msgid "@A %N contiguous @b(s) in @b @g %g for %s: %m\n"
msgstr ""
-#: e2fsck/problem.c:700
+#: e2fsck/problem.c:720
#, no-c-format
#. @-expanded: error allocating block buffer for relocating %s\n
msgid "@A @b buffer for relocating %s\n"
msgstr ""
-#: e2fsck/problem.c:705
+#: e2fsck/problem.c:725
#. @-expanded: Relocating group %g's %s from %b to %c...\n
msgid "Relocating @g %g's %s from %b to %c...\n"
msgstr ""
-#: e2fsck/problem.c:711
+#: e2fsck/problem.c:731
#, no-c-format
#. @-expanded: Relocating group %g's %s to %c...\n
msgid "Relocating @g %g's %s to %c...\n"
msgstr ""
-#: e2fsck/problem.c:716
+#: e2fsck/problem.c:736
#. @-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:721
+#: e2fsck/problem.c:741
#. @-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:726 e2fsck/problem.c:1936
+#: e2fsck/problem.c:746 e2fsck/problem.c:1965
#. @-expanded: error allocating inode bitmap (%N): %m\n
msgid "@A @i @B (%N): %m\n"
msgstr ""
-#: e2fsck/problem.c:731
+#: e2fsck/problem.c:751
#. @-expanded: error allocating block bitmap (%N): %m\n
msgid "@A @b @B (%N): %m\n"
msgstr ""
-#: e2fsck/problem.c:737
+#: e2fsck/problem.c:757
#, no-c-format
#. @-expanded: error allocating icount link information: %m\n
msgid "@A icount link information: %m\n"
msgstr ""
-#: e2fsck/problem.c:743
+#: e2fsck/problem.c:763
#, no-c-format
#. @-expanded: error allocating directory block array: %m\n
msgid "@A @d @b array: %m\n"
msgstr ""
-#: e2fsck/problem.c:749
+#: e2fsck/problem.c:769
#, no-c-format
#. @-expanded: Error while scanning inodes (%i): %m\n
msgid "Error while scanning @is (%i): %m\n"
msgstr ""
-#: e2fsck/problem.c:755
+#: e2fsck/problem.c:775
#, no-c-format
#. @-expanded: Error while iterating over blocks in inode %i: %m\n
msgid "Error while iterating over @bs in @i %i: %m\n"
msgstr ""
-#: e2fsck/problem.c:760
+#: e2fsck/problem.c:780
#. @-expanded: Error storing inode count information (inode=%i, count=%N): %m\n
msgid "Error storing @i count information (@i=%i, count=%N): %m\n"
msgstr ""
-#: e2fsck/problem.c:765
+#: e2fsck/problem.c:785
#. @-expanded: Error storing directory block information (inode=%i, block=%b, num=%N): %m\n
msgid "Error storing @d @b information (@i=%i, @b=%b, num=%N): %m\n"
msgstr ""
-#: e2fsck/problem.c:772
+#: e2fsck/problem.c:792
#, no-c-format
#. @-expanded: Error reading inode %i: %m\n
msgid "Error reading @i %i: %m\n"
msgstr ""
-#: e2fsck/problem.c:781
+#: e2fsck/problem.c:801
#, no-c-format
#. @-expanded: inode %i has imagic flag set.
msgid "@i %i has imagic flag set. "
msgstr ""
-#: e2fsck/problem.c:787
+#: e2fsck/problem.c:807
#, no-c-format
#. @-expanded: Special (device/socket/fifo/symlink) file (inode %i) has immutable\n
#. @-expanded: or append-only flag set.
@@ -1537,142 +1570,142 @@ msgid ""
"or append-only flag set. "
msgstr ""
-#: e2fsck/problem.c:794
+#: e2fsck/problem.c:814
#, no-c-format
#. @-expanded: Special (device/socket/fifo) inode %i has non-zero size.
msgid "Special (@v/socket/fifo) @i %i has non-zero size. "
msgstr ""
-#: e2fsck/problem.c:804
+#: e2fsck/problem.c:824
#. @-expanded: journal inode is not in use, but contains data.
msgid "@j @i is not in use, but contains data. "
msgstr ""
-#: e2fsck/problem.c:809
+#: e2fsck/problem.c:829
#. @-expanded: journal is not regular file.
msgid "@j is not regular file. "
msgstr ""
-#: e2fsck/problem.c:815
+#: e2fsck/problem.c:835
#, no-c-format
#. @-expanded: inode %i was part of the orphaned inode list.
msgid "@i %i was part of the @o @i list. "
msgstr ""
-#: e2fsck/problem.c:821
+#: e2fsck/problem.c:841
#. @-expanded: inodes that were part of a corrupted orphan linked list found.
msgid "@is that were part of a corrupted orphan linked list found. "
msgstr ""
-#: e2fsck/problem.c:826
+#: e2fsck/problem.c:846
#. @-expanded: error allocating refcount structure (%N): %m\n
msgid "@A refcount structure (%N): %m\n"
msgstr ""
-#: e2fsck/problem.c:831
+#: e2fsck/problem.c:851
#. @-expanded: Error reading extended attribute block %b for inode %i.
msgid "Error reading @a @b %b for @i %i. "
msgstr ""
-#: e2fsck/problem.c:836
+#: e2fsck/problem.c:856
#. @-expanded: inode %i has a bad extended attribute block %b.
msgid "@i %i has a bad @a @b %b. "
msgstr ""
-#: e2fsck/problem.c:841
+#: e2fsck/problem.c:861
#. @-expanded: Error reading extended attribute block %b (%m).
msgid "Error reading @a @b %b (%m). "
msgstr ""
-#: e2fsck/problem.c:846
+#: e2fsck/problem.c:866
#. @-expanded: extended attribute block %b has reference count %r, should be %N.
msgid "@a @b %b has reference count %r, @s %N. "
msgstr ""
-#: e2fsck/problem.c:851
+#: e2fsck/problem.c:871
#. @-expanded: Error writing extended attribute block %b (%m).
msgid "Error writing @a @b %b (%m). "
msgstr ""
-#: e2fsck/problem.c:856
+#: e2fsck/problem.c:876
#. @-expanded: extended attribute block %b has h_blocks > 1.
msgid "@a @b %b has h_@bs > 1. "
msgstr ""
-#: e2fsck/problem.c:861
+#: e2fsck/problem.c:881
#. @-expanded: error allocating extended attribute region allocation structure.
msgid "@A @a region allocation structure. "
msgstr ""
-#: e2fsck/problem.c:866
+#: e2fsck/problem.c:886
#. @-expanded: extended attribute block %b is corrupt (allocation collision).
msgid "@a @b %b is corrupt (allocation collision). "
msgstr ""
-#: e2fsck/problem.c:871
+#: e2fsck/problem.c:891
#. @-expanded: extended attribute block %b is corrupt (invalid name).
msgid "@a @b %b is corrupt (@n name). "
msgstr ""
-#: e2fsck/problem.c:876
+#: e2fsck/problem.c:896
#. @-expanded: extended attribute block %b is corrupt (invalid value).
msgid "@a @b %b is corrupt (@n value). "
msgstr ""
-#: e2fsck/problem.c:882
+#: e2fsck/problem.c:902
#, no-c-format
#. @-expanded: inode %i is too big.
msgid "@i %i is too big. "
msgstr ""
-#: e2fsck/problem.c:886
+#: e2fsck/problem.c:906
#. @-expanded: %B (%b) causes directory to be too big.
msgid "%B (%b) causes @d to be too big. "
msgstr ""
-#: e2fsck/problem.c:891
+#: e2fsck/problem.c:911
msgid "%B (%b) causes file to be too big. "
msgstr ""
-#: e2fsck/problem.c:896
+#: e2fsck/problem.c:916
msgid "%B (%b) causes symlink to be too big. "
msgstr ""
-#: e2fsck/problem.c:902
+#: e2fsck/problem.c:922
#, no-c-format
#. @-expanded: inode %i has INDEX_FL flag set on filesystem without htree support.\n
msgid "@i %i has INDEX_FL flag set on @f without htree support.\n"
msgstr ""
-#: e2fsck/problem.c:908
+#: e2fsck/problem.c:928
#, no-c-format
#. @-expanded: inode %i has INDEX_FL flag set but is not a directory.\n
msgid "@i %i has INDEX_FL flag set but is not a @d.\n"
msgstr ""
-#: e2fsck/problem.c:914
+#: e2fsck/problem.c:934
#, no-c-format
#. @-expanded: HTREE directory inode %i has an invalid root node.\n
msgid "@h %i has an @n root node.\n"
msgstr ""
-#: e2fsck/problem.c:919
+#: e2fsck/problem.c:939
#. @-expanded: HTREE directory inode %i has an unsupported hash version (%N)\n
msgid "@h %i has an unsupported hash version (%N)\n"
msgstr ""
-#: e2fsck/problem.c:925
+#: e2fsck/problem.c:945
#, no-c-format
#. @-expanded: HTREE directory inode %i uses an incompatible htree root node flag.\n
msgid "@h %i uses an incompatible htree root node flag.\n"
msgstr ""
-#: e2fsck/problem.c:930
+#: e2fsck/problem.c:950
#. @-expanded: HTREE directory inode %i has a tree depth (%N) which is too big\n
msgid "@h %i has a tree depth (%N) which is too big\n"
msgstr ""
-#: e2fsck/problem.c:936
+#: e2fsck/problem.c:956
#. @-expanded: Bad block inode has an indirect block (%b) that conflicts with\n
#. @-expanded: filesystem metadata.
msgid ""
@@ -1680,54 +1713,54 @@ msgid ""
"@f metadata. "
msgstr ""
-#: e2fsck/problem.c:943
+#: e2fsck/problem.c:963
#, no-c-format
#. @-expanded: Resize inode (re)creation failed: %m.
msgid "Resize @i (re)creation failed: %m."
msgstr ""
-#: e2fsck/problem.c:948
+#: e2fsck/problem.c:968
#. @-expanded: inode %i has a extra size (%IS) which is invalid\n
msgid "@i %i has a extra size (%IS) which is @n\n"
msgstr ""
-#: e2fsck/problem.c:953
+#: e2fsck/problem.c:973
#. @-expanded: extended attribute in inode %i has a namelen (%N) which is invalid\n
msgid "@a in @i %i has a namelen (%N) which is @n\n"
msgstr ""
-#: e2fsck/problem.c:958
+#: e2fsck/problem.c:978
#. @-expanded: extended attribute in inode %i has a value offset (%N) which is invalid\n
msgid "@a in @i %i has a value offset (%N) which is @n\n"
msgstr ""
-#: e2fsck/problem.c:963
+#: e2fsck/problem.c:983
#. @-expanded: extended attribute in inode %i has a value block (%N) which is invalid (must be 0)\n
msgid "@a in @i %i has a value @b (%N) which is @n (must be 0)\n"
msgstr ""
-#: e2fsck/problem.c:968
+#: e2fsck/problem.c:988
#. @-expanded: extended attribute in inode %i has a value size (%N) which is invalid\n
msgid "@a in @i %i has a value size (%N) which is @n\n"
msgstr ""
-#: e2fsck/problem.c:973
+#: e2fsck/problem.c:993
#. @-expanded: extended attribute in inode %i has a hash (%N) which is invalid\n
msgid "@a in @i %i has a hash (%N) which is @n\n"
msgstr ""
-#: e2fsck/problem.c:978
+#: e2fsck/problem.c:998
#. @-expanded: inode %i is a %It but it looks like it is really a directory.\n
msgid "@i %i is a %It but it looks like it is really a directory.\n"
msgstr ""
-#: e2fsck/problem.c:984
+#: e2fsck/problem.c:1004
#, no-c-format
#. @-expanded: Error while reading over extent tree in inode %i: %m\n
msgid "Error while reading over @x tree in @i %i: %m\n"
msgstr ""
-#: e2fsck/problem.c:989
+#: e2fsck/problem.c:1009
#. @-expanded: Failed to iterate extents in inode %i\n
#. @-expanded: \t(op %s, blk %b, lblk %c): %m\n
msgid ""
@@ -1735,7 +1768,7 @@ msgid ""
"\t(op %s, blk %b, lblk %c): %m\n"
msgstr ""
-#: e2fsck/problem.c:995
+#: e2fsck/problem.c:1015
#. @-expanded: inode %i has an invalid extent\n
#. @-expanded: \t(logical block %c, invalid physical block %b, len %N)\n
msgid ""
@@ -1743,7 +1776,7 @@ msgid ""
"\t(logical @b %c, @n physical @b %b, len %N)\n"
msgstr ""
-#: e2fsck/problem.c:1000
+#: e2fsck/problem.c:1020
#. @-expanded: inode %i has an invalid extent\n
#. @-expanded: \t(logical block %c, physical block %b, invalid len %N)\n
msgid ""
@@ -1751,30 +1784,30 @@ msgid ""
"\t(logical @b %c, physical @b %b, @n len %N)\n"
msgstr ""
-#: e2fsck/problem.c:1006
+#: e2fsck/problem.c:1026
#, no-c-format
#. @-expanded: inode %i has EXTENTS_FL flag set on filesystem without extents support.\n
msgid "@i %i has EXTENTS_FL flag set on @f without extents support.\n"
msgstr ""
-#: e2fsck/problem.c:1012
+#: e2fsck/problem.c:1032
#, no-c-format
#. @-expanded: inode %i is in extent format, but superblock is missing EXTENTS feature\n
msgid "@i %i is in extent format, but @S is missing EXTENTS feature\n"
msgstr ""
-#: e2fsck/problem.c:1018
+#: e2fsck/problem.c:1038
#, no-c-format
#. @-expanded: inode %i missing EXTENT_FL, but is in extents format\n
msgid "@i %i missing EXTENT_FL, but is in extents format\n"
msgstr ""
-#: e2fsck/problem.c:1024
+#: e2fsck/problem.c:1044
#, no-c-format
msgid "Fast symlink %i has EXTENT_FL set. "
msgstr ""
-#: e2fsck/problem.c:1029
+#: e2fsck/problem.c:1049
#. @-expanded: inode %i has out of order extents\n
#. @-expanded: \t(invalid logical block %c, physical block %b, len %N)\n
msgid ""
@@ -1782,38 +1815,38 @@ msgid ""
"\t(@n logical @b %c, physical @b %b, len %N)\n"
msgstr ""
-#: e2fsck/problem.c:1033
+#: e2fsck/problem.c:1053
#. @-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 ""
-#: e2fsck/problem.c:1039
+#: e2fsck/problem.c:1059
#, no-c-format
#. @-expanded: Error converting subcluster block bitmap: %m\n
msgid "Error converting subcluster @b @B: %m\n"
msgstr ""
-#: e2fsck/problem.c:1044
+#: e2fsck/problem.c:1064
#. @-expanded: quota inode is not a regular file.
msgid "@q @i is not a regular file. "
msgstr ""
-#: e2fsck/problem.c:1049
+#: e2fsck/problem.c:1069
#. @-expanded: quota inode is not in use, but contains data.
msgid "@q @i is not in use, but contains data. "
msgstr ""
-#: e2fsck/problem.c:1054
+#: e2fsck/problem.c:1074
#. @-expanded: quota inode is visible to the user.
msgid "@q @i is visible to the user. "
msgstr ""
-#: e2fsck/problem.c:1059
+#: e2fsck/problem.c:1079
#. @-expanded: The bad block inode looks invalid.
msgid "The bad @b @i looks @n. "
msgstr ""
-#: e2fsck/problem.c:1064
+#: e2fsck/problem.c:1084
#. @-expanded: inode %i has zero length extent\n
#. @-expanded: \t(invalid logical block %c, physical block %b)\n
msgid ""
@@ -1821,25 +1854,25 @@ msgid ""
"\t(@n logical @b %c, physical @b %b)\n"
msgstr ""
-#: e2fsck/problem.c:1070
+#: e2fsck/problem.c:1090
#, no-c-format
#. @-expanded: inode %i seems to contain garbage.
msgid "@i %i seems to contain garbage. "
msgstr ""
-#: e2fsck/problem.c:1076
+#: e2fsck/problem.c:1096
#, no-c-format
#. @-expanded: inode %i passes checks, but checksum does not match inode.
msgid "@i %i passes checks, but checksum does not match @i. "
msgstr ""
-#: e2fsck/problem.c:1082
+#: e2fsck/problem.c:1102
#, no-c-format
#. @-expanded: inode %i extended attribute is corrupt (allocation collision).
msgid "@i %i @a is corrupt (allocation collision). "
msgstr ""
-#: e2fsck/problem.c:1090
+#: e2fsck/problem.c:1110
#. @-expanded: inode %i extent block passes checks, but checksum does not match extent\n
#. @-expanded: \t(logical block %c, physical block %b, len %N)\n
msgid ""
@@ -1847,12 +1880,12 @@ msgid ""
"\t(logical @b %c, physical @b %b, len %N)\n"
msgstr ""
-#: e2fsck/problem.c:1099
+#: e2fsck/problem.c:1119
#. @-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 ""
-#: e2fsck/problem.c:1104
+#: e2fsck/problem.c:1124
#. @-expanded: Interior extent node level %N of inode %i:\n
#. @-expanded: Logical start %b does not match logical start %c at next level.
msgid ""
@@ -1860,7 +1893,7 @@ msgid ""
"Logical start %b does not match logical start %c at next level. "
msgstr ""
-#: e2fsck/problem.c:1110
+#: e2fsck/problem.c:1130
#. @-expanded: inode %i, end of extent exceeds allowed value\n
#. @-expanded: \t(logical block %c, physical block %b, len %N)\n
msgid ""
@@ -1868,37 +1901,37 @@ msgid ""
"\t(logical @b %c, physical @b %b, len %N)\n"
msgstr ""
-#: e2fsck/problem.c:1116
+#: e2fsck/problem.c:1136
#, no-c-format
#. @-expanded: inode %i has inline data, but superblock is missing INLINE_DATA feature\n
msgid "@i %i has inline data, but @S is missing INLINE_DATA feature\n"
msgstr ""
-#: e2fsck/problem.c:1122
+#: e2fsck/problem.c:1142
#, no-c-format
#. @-expanded: inode %i has INLINE_DATA_FL flag on filesystem without inline data support.\n
msgid "@i %i has INLINE_DATA_FL flag on @f without inline data support.\n"
msgstr ""
-#: e2fsck/problem.c:1130
+#: e2fsck/problem.c:1150
#, no-c-format
#. @-expanded: inode %i block %b conflicts with critical metadata, skipping block checks.\n
msgid ""
"@i %i block %b conflicts with critical metadata, skipping block checks.\n"
msgstr ""
-#: e2fsck/problem.c:1135
+#: e2fsck/problem.c:1155
#. @-expanded: directory inode %i block %b should be at block %c.
msgid "@d @i %i @b %b should be at @b %c. "
msgstr ""
-#: e2fsck/problem.c:1141
+#: e2fsck/problem.c:1161
#, no-c-format
#. @-expanded: directory inode %i has extent marked uninitialized at block %c.
msgid "@d @i %i has @x marked uninitialized at @b %c. "
msgstr ""
-#: e2fsck/problem.c:1146
+#: e2fsck/problem.c:1166
#. @-expanded: inode %i logical block %b (physical block %c) violates cluster allocation rules.\n
#. @-expanded: Will fix in pass 1B.\n
msgid ""
@@ -1906,13 +1939,13 @@ msgid ""
"Will fix in pass 1B.\n"
msgstr ""
-#: e2fsck/problem.c:1152
+#: e2fsck/problem.c:1172
#, no-c-format
#. @-expanded: inode %i has INLINE_DATA_FL flag but extended attribute not found.
msgid "@i %i has INLINE_DATA_FL flag but @a not found. "
msgstr ""
-#: e2fsck/problem.c:1159
+#: e2fsck/problem.c:1179
#, no-c-format
#. @-expanded: Special (device/socket/fifo) file (inode %i) has extents\n
#. @-expanded: or inline-data flag set.
@@ -1921,41 +1954,41 @@ msgid ""
"or inline-data flag set. "
msgstr ""
-#: e2fsck/problem.c:1166
+#: e2fsck/problem.c:1186
#, no-c-format
#. @-expanded: inode %i has extent header but inline data flag is set.\n
msgid "@i %i has @x header but inline data flag is set.\n"
msgstr ""
-#: e2fsck/problem.c:1172
+#: e2fsck/problem.c:1192
#, no-c-format
#. @-expanded: inode %i seems to have inline data but extent flag is set.\n
msgid "@i %i seems to have inline data but @x flag is set.\n"
msgstr ""
-#: e2fsck/problem.c:1178
+#: e2fsck/problem.c:1198
#, no-c-format
#. @-expanded: inode %i seems to have block map but inline data and extent flags set.\n
msgid "@i %i seems to have @b map but inline data and @x flags set.\n"
msgstr ""
-#: e2fsck/problem.c:1184
+#: e2fsck/problem.c:1204
#, no-c-format
#. @-expanded: inode %i has inline data and extent flags set but i_block contains junk.\n
msgid "@i %i has inline data and @x flags set but i_block contains junk.\n"
msgstr ""
-#: e2fsck/problem.c:1189
+#: e2fsck/problem.c:1209
#. @-expanded: Bad block list says the bad block list inode is bad.
msgid "Bad block list says the bad block list @i is bad. "
msgstr ""
-#: e2fsck/problem.c:1194
+#: e2fsck/problem.c:1214
#. @-expanded: error allocating extent region allocation structure.
msgid "@A @x region allocation structure. "
msgstr ""
-#: e2fsck/problem.c:1199
+#: e2fsck/problem.c:1219
#. @-expanded: inode %i has a duplicate extent mapping\n
#. @-expanded: \t(logical block %c, invalid physical block %b, len %N)\n
msgid ""
@@ -1963,45 +1996,45 @@ msgid ""
"\t(logical @b %c, @n physical @b %b, len %N)\n"
msgstr ""
-#: e2fsck/problem.c:1204
+#: e2fsck/problem.c:1224
#. @-expanded: error allocating %N bytes of memory for encrypted inode list\n
msgid "@A %N bytes of memory for encrypted @i list\n"
msgstr ""
-#: e2fsck/problem.c:1209
+#: e2fsck/problem.c:1229
#. @-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 ""
-#: e2fsck/problem.c:1215
+#: e2fsck/problem.c:1235
#, no-c-format
#. @-expanded: inode %i on bigalloc filesystem cannot be block mapped.
msgid "@i %i on bigalloc @f cannot be @b mapped. "
msgstr ""
-#: e2fsck/problem.c:1221
+#: e2fsck/problem.c:1241
#, no-c-format
#. @-expanded: inode %i has corrupt extent header.
msgid "@i %i has corrupt @x header. "
msgstr ""
-#: e2fsck/problem.c:1227
+#: e2fsck/problem.c:1247
#, no-c-format
#. @-expanded: Timestamp(s) on inode %i beyond 2310-04-04 are likely pre-1970.\n
msgid "Timestamp(s) on @i %i beyond 2310-04-04 are likely pre-1970.\n"
msgstr ""
-#: e2fsck/problem.c:1232
+#: e2fsck/problem.c:1252
#. @-expanded: inode %i has illegal extended attribute value inode %N.\n
msgid "@i %i has @I @a value @i %N.\n"
msgstr ""
-#: e2fsck/problem.c:1238
+#: e2fsck/problem.c:1258
#. @-expanded: inode %i has invalid extended attribute. EA inode %N missing EA_INODE flag.\n
msgid "@i %i has @n @a. EA @i %N missing EA_INODE flag.\n"
msgstr ""
-#: e2fsck/problem.c:1243
+#: e2fsck/problem.c:1263
#. @-expanded: EA inode %N for parent inode %i missing EA_INODE flag.\n
#. @-expanded:
msgid ""
@@ -2009,19 +2042,19 @@ msgid ""
" "
msgstr ""
-#: e2fsck/problem.c:1249
+#: e2fsck/problem.c:1269
#, no-c-format
#. @-expanded: inode %i has extent marked uninitialized at block %c (len %N).
msgid "@i %i has @x marked uninitialized at @b %c (len %N). "
msgstr ""
-#: e2fsck/problem.c:1254
+#: e2fsck/problem.c:1274
#, c-format
#. @-expanded: inode %i has the casefold flag set but is not a directory.
msgid "@i %i has the casefold flag set but is not a directory. "
msgstr ""
-#: e2fsck/problem.c:1259
+#: e2fsck/problem.c:1279
#, c-format
#. @-expanded: directory %p has the casefold flag, but the\n
#. @-expanded: casefold feature is not enabled.
@@ -2030,30 +2063,42 @@ msgid ""
"casefold feature is not enabled. "
msgstr ""
-#: e2fsck/problem.c:1264
+#: e2fsck/problem.c:1284
#, c-format
#. @-expanded: inode %i has encrypt flag but no encryption extended attribute.\n
msgid "@i %i has encrypt flag but no encryption @a.\n"
msgstr ""
-#: e2fsck/problem.c:1269
+#: e2fsck/problem.c:1289
#, c-format
#. @-expanded: Encrypted inode %i has corrupt encryption extended attribute.\n
msgid "Encrypted @i %i has corrupt encryption @a.\n"
msgstr ""
-#: e2fsck/problem.c:1274
+#: e2fsck/problem.c:1294
#. @-expanded: HTREE directory inode %i uses hash version (%N), but should use SipHash (6) \n
msgid "@h %i uses hash version (%N), but should use SipHash (6) \n"
msgstr ""
-#: e2fsck/problem.c:1279
+#: e2fsck/problem.c:1299
#, c-format
#. @-expanded: HTREE directory inode %i uses SipHash, but should not.
msgid "@h %i uses SipHash, but should not. "
msgstr ""
-#: e2fsck/problem.c:1287
+#: e2fsck/problem.c:1304
+#, c-format
+#. @-expanded: Orphan file inode %i is not regular file.
+msgid "Orphan file @i %i is not regular file. "
+msgstr ""
+
+#: e2fsck/problem.c:1309
+#, c-format
+#. @-expanded: Orphan file inode %i is not in use, but contains data.
+msgid "Orphan file @i %i is not in use, but contains data. "
+msgstr ""
+
+#: e2fsck/problem.c:1316
#. @-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
@@ -2063,45 +2108,45 @@ msgid ""
"Pass 1B: Rescanning for @m @bs\n"
msgstr ""
-#: e2fsck/problem.c:1294
+#: e2fsck/problem.c:1323
#, no-c-format
#. @-expanded: multiply-claimed block(s) in inode %i:
msgid "@m @b(s) in @i %i:"
msgstr ""
-#: e2fsck/problem.c:1310
+#: e2fsck/problem.c:1339
#, no-c-format
msgid "Error while scanning inodes (%i): %m\n"
msgstr ""
-#: e2fsck/problem.c:1316
+#: e2fsck/problem.c:1345
#, 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:1322
+#: e2fsck/problem.c:1351
#, 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:1327 e2fsck/problem.c:1707
+#: e2fsck/problem.c:1356 e2fsck/problem.c:1736
#. @-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:1337
+#: e2fsck/problem.c:1366
#. @-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:1343
+#: e2fsck/problem.c:1372
#. @-expanded: Pass 1D: Reconciling multiply-claimed blocks\n
msgid "Pass 1D: Reconciling @m @bs\n"
msgstr ""
-#: e2fsck/problem.c:1348
+#: e2fsck/problem.c:1377
#. @-expanded: File %Q (inode #%i, mod time %IM) \n
#. @-expanded: has %r multiply-claimed block(s), shared with %N file(s):\n
msgid ""
@@ -2109,17 +2154,17 @@ msgid ""
" has %r @m @b(s), shared with %N file(s):\n"
msgstr ""
-#: e2fsck/problem.c:1354
+#: e2fsck/problem.c:1383
#. @-expanded: \t%Q (inode #%i, mod time %IM)\n
msgid "\t%Q (@i #%i, mod time %IM)\n"
msgstr ""
-#: e2fsck/problem.c:1359
+#: e2fsck/problem.c:1388
#. @-expanded: \t<filesystem metadata>\n
msgid "\t<@f metadata>\n"
msgstr ""
-#: e2fsck/problem.c:1364
+#: e2fsck/problem.c:1393
#. @-expanded: (There are %N inodes containing multiply-claimed blocks.)\n
#. @-expanded: \n
msgid ""
@@ -2127,7 +2172,7 @@ msgid ""
"\n"
msgstr ""
-#: e2fsck/problem.c:1369
+#: e2fsck/problem.c:1398
#. @-expanded: multiply-claimed blocks already reassigned or cloned.\n
#. @-expanded: \n
msgid ""
@@ -2135,348 +2180,348 @@ msgid ""
"\n"
msgstr ""
-#: e2fsck/problem.c:1383
+#: e2fsck/problem.c:1412
#, no-c-format
msgid "Couldn't clone file: %m\n"
msgstr ""
-#: e2fsck/problem.c:1389
+#: e2fsck/problem.c:1418
#. @-expanded: Pass 1E: Optimizing extent trees\n
msgid "Pass 1E: Optimizing @x trees\n"
msgstr ""
-#: e2fsck/problem.c:1395
+#: e2fsck/problem.c:1424
#, 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:1400
+#: e2fsck/problem.c:1429
#. @-expanded: Optimizing extent trees:
msgid "Optimizing @x trees: "
msgstr ""
-#: e2fsck/problem.c:1415
+#: e2fsck/problem.c:1444
msgid "Internal error: max extent tree depth too large (%b; expected=%c).\n"
msgstr ""
-#: e2fsck/problem.c:1420
+#: e2fsck/problem.c:1449
#. @-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:1425
+#: e2fsck/problem.c:1454
#. @-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:1432
+#: e2fsck/problem.c:1461
#. @-expanded: Pass 2: Checking directory structure\n
msgid "Pass 2: Checking @d structure\n"
msgstr ""
-#: e2fsck/problem.c:1438
+#: e2fsck/problem.c:1467
#, 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:1443
+#: e2fsck/problem.c:1472
#. @-expanded: entry '%Dn' in %p (%i) has invalid inode #: %Di.\n
msgid "@E has @n @i #: %Di.\n"
msgstr ""
-#: e2fsck/problem.c:1448
+#: e2fsck/problem.c:1477
#. @-expanded: entry '%Dn' in %p (%i) has deleted/unused inode %Di.
msgid "@E has @D/unused @i %Di. "
msgstr ""
-#: e2fsck/problem.c:1453
+#: e2fsck/problem.c:1482
#. @-expanded: entry '%Dn' in %p (%i) is a link to '.'
msgid "@E @L to '.' "
msgstr ""
-#: e2fsck/problem.c:1458
+#: e2fsck/problem.c:1487
#. @-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:1463
+#: e2fsck/problem.c:1492
#. @-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:1468
+#: e2fsck/problem.c:1497
#. @-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:1473
+#: e2fsck/problem.c:1502
#. @-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:1479
+#: e2fsck/problem.c:1508
#, no-c-format
#. @-expanded: Missing '.' in directory inode %i.\n
msgid "Missing '.' in @d @i %i.\n"
msgstr ""
-#: e2fsck/problem.c:1485
+#: e2fsck/problem.c:1514
#, no-c-format
#. @-expanded: Missing '..' in directory inode %i.\n
msgid "Missing '..' in @d @i %i.\n"
msgstr ""
-#: e2fsck/problem.c:1490
+#: e2fsck/problem.c:1519
#. @-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:1495
+#: e2fsck/problem.c:1524
#. @-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:1500
+#: e2fsck/problem.c:1529
#. @-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:1505
+#: e2fsck/problem.c:1534
#. @-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:1510
+#: e2fsck/problem.c:1539
#. @-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:1515
+#: e2fsck/problem.c:1544
#. @-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:1520
+#: e2fsck/problem.c:1549
#. @-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:1525
+#: e2fsck/problem.c:1554
#. @-expanded: inode %i (%Q) has invalid mode (%Im).\n
msgid "@i %i (%Q) has @n mode (%Im).\n"
msgstr ""
-#: e2fsck/problem.c:1530
+#: e2fsck/problem.c:1559
#. @-expanded: directory inode %i, %B, offset %N: directory corrupted\n
msgid "@d @i %i, %B, offset %N: @d corrupted\n"
msgstr ""
-#: e2fsck/problem.c:1535
+#: e2fsck/problem.c:1564
#. @-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:1540
+#: e2fsck/problem.c:1569
#. @-expanded: directory inode %i has an unallocated %B.
msgid "@d @i %i has an unallocated %B. "
msgstr ""
-#: e2fsck/problem.c:1546
+#: e2fsck/problem.c:1575
#, 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:1552
+#: e2fsck/problem.c:1581
#, 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:1557
+#: e2fsck/problem.c:1586
#. @-expanded: inode %i (%Q) is an illegal character device.\n
msgid "@i %i (%Q) is an @I character @v.\n"
msgstr ""
-#: e2fsck/problem.c:1562
+#: e2fsck/problem.c:1591
#. @-expanded: inode %i (%Q) is an illegal block device.\n
msgid "@i %i (%Q) is an @I @b @v.\n"
msgstr ""
-#: e2fsck/problem.c:1567
+#: e2fsck/problem.c:1596
#. @-expanded: entry '%Dn' in %p (%i) is duplicate '.' entry.\n
msgid "@E is duplicate '.' @e.\n"
msgstr ""
-#: e2fsck/problem.c:1572
+#: e2fsck/problem.c:1601
#. @-expanded: entry '%Dn' in %p (%i) is duplicate '..' entry.\n
msgid "@E is duplicate '..' @e.\n"
msgstr ""
-#: e2fsck/problem.c:1578 e2fsck/problem.c:1963
+#: e2fsck/problem.c:1607 e2fsck/problem.c:1992
#, no-c-format
msgid "Internal error: couldn't find dir_info for %i.\n"
msgstr ""
-#: e2fsck/problem.c:1583
+#: e2fsck/problem.c:1612
#. @-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:1589
+#: e2fsck/problem.c:1618
#, no-c-format
#. @-expanded: error allocating icount structure: %m\n
msgid "@A icount structure: %m\n"
msgstr ""
-#: e2fsck/problem.c:1595
+#: e2fsck/problem.c:1624
#, no-c-format
#. @-expanded: Error iterating over directory blocks: %m\n
msgid "Error iterating over @d @bs: %m\n"
msgstr ""
-#: e2fsck/problem.c:1600
+#: e2fsck/problem.c:1629
#. @-expanded: Error reading directory block %b (inode %i): %m\n
msgid "Error reading @d @b %b (@i %i): %m\n"
msgstr ""
-#: e2fsck/problem.c:1605
+#: e2fsck/problem.c:1634
#. @-expanded: Error writing directory block %b (inode %i): %m\n
msgid "Error writing @d @b %b (@i %i): %m\n"
msgstr ""
-#: e2fsck/problem.c:1611
+#: e2fsck/problem.c:1640
#, 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:1617
+#: e2fsck/problem.c:1646
#, no-c-format
#. @-expanded: Error deallocating inode %i: %m\n
msgid "Error deallocating @i %i: %m\n"
msgstr ""
-#: e2fsck/problem.c:1623
+#: e2fsck/problem.c:1652
#, 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:1628
+#: e2fsck/problem.c:1657
#. @-expanded: inode %i (%Q) is an illegal FIFO.\n
msgid "@i %i (%Q) is an @I FIFO.\n"
msgstr ""
-#: e2fsck/problem.c:1633
+#: e2fsck/problem.c:1662
#. @-expanded: inode %i (%Q) is an illegal socket.\n
msgid "@i %i (%Q) is an @I socket.\n"
msgstr ""
-#: e2fsck/problem.c:1638
+#: e2fsck/problem.c:1667
#. @-expanded: Setting filetype for entry '%Dn' in %p (%i) to %N.\n
msgid "Setting filetype for @E to %N.\n"
msgstr ""
-#: e2fsck/problem.c:1643
+#: e2fsck/problem.c:1672
#. @-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:1648
+#: e2fsck/problem.c:1677
#. @-expanded: entry '%Dn' in %p (%i) has filetype set.\n
msgid "@E has filetype set.\n"
msgstr ""
-#: e2fsck/problem.c:1653
+#: e2fsck/problem.c:1682
#. @-expanded: entry '%Dn' in %p (%i) has a zero-length name.\n
msgid "@E has a @z name.\n"
msgstr ""
-#: e2fsck/problem.c:1658
+#: e2fsck/problem.c:1687
#. @-expanded: Symlink %Q (inode #%i) is invalid.\n
msgid "Symlink %Q (@i #%i) is @n.\n"
msgstr ""
-#: e2fsck/problem.c:1663
+#: e2fsck/problem.c:1692
#. @-expanded: extended attribute block for inode %i (%Q) is invalid (%If).\n
msgid "@a @b @F @n (%If).\n"
msgstr ""
-#: e2fsck/problem.c:1668
+#: e2fsck/problem.c:1697
#. @-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:1673
+#: e2fsck/problem.c:1702
#. @-expanded: problem in HTREE directory inode %d: %B not referenced\n
msgid "@p @h %d: %B not referenced\n"
msgstr ""
-#: e2fsck/problem.c:1678
+#: e2fsck/problem.c:1707
#. @-expanded: problem in HTREE directory inode %d: %B referenced twice\n
msgid "@p @h %d: %B referenced twice\n"
msgstr ""
-#: e2fsck/problem.c:1683
+#: e2fsck/problem.c:1712
#. @-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:1688
+#: e2fsck/problem.c:1717
#. @-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:1693
+#: e2fsck/problem.c:1722
#. @-expanded: invalid HTREE directory inode %d (%q).
msgid "@n @h %d (%q). "
msgstr ""
-#: e2fsck/problem.c:1697
+#: e2fsck/problem.c:1726
#. @-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:1702
+#: e2fsck/problem.c:1731
#. @-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:1713
+#: e2fsck/problem.c:1742
#, 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:1718
+#: e2fsck/problem.c:1747
#. @-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:1723
+#: e2fsck/problem.c:1752
#. @-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:1728
+#: e2fsck/problem.c:1757
#. @-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:1733
+#: e2fsck/problem.c:1762
#. @-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:1738
+#: e2fsck/problem.c:1767
#. @-expanded: Duplicate entry '%Dn' in %p (%i) found.
msgid "Duplicate @E found. "
msgstr ""
-#: e2fsck/problem.c:1743
+#: e2fsck/problem.c:1772
#, no-c-format
#. @-expanded: entry '%Dn' in %p (%i) has a non-unique filename.\n
#. @-expanded: Rename to %s
@@ -2485,7 +2530,7 @@ msgid ""
"Rename to %s"
msgstr ""
-#: e2fsck/problem.c:1748
+#: e2fsck/problem.c:1777
#. @-expanded: Duplicate entry '%Dn' found.\n
#. @-expanded: \tMarking %p (%i) to be rebuilt.\n
#. @-expanded: \n
@@ -2495,175 +2540,175 @@ msgid ""
"\n"
msgstr ""
-#: e2fsck/problem.c:1753
+#: e2fsck/problem.c:1782
#. @-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:1758
+#: e2fsck/problem.c:1787
#. @-expanded: Unexpected block in HTREE directory inode %d (%q).\n
msgid "Unexpected @b in @h %d (%q).\n"
msgstr ""
-#: e2fsck/problem.c:1763
+#: e2fsck/problem.c:1792
#. @-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:1768
+#: e2fsck/problem.c:1797
#. @-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:1773
+#: e2fsck/problem.c:1802
#. @-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:1779
+#: e2fsck/problem.c:1808
#, 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:1785
+#: e2fsck/problem.c:1814
#, 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:1790
+#: e2fsck/problem.c:1819
#. @-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:1795
+#: e2fsck/problem.c:1824
#. @-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:1800
+#: e2fsck/problem.c:1829
#. @-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:1806
+#: e2fsck/problem.c:1835
#, 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:1811
+#: e2fsck/problem.c:1840
#. @-expanded: Encrypted entry '%Dn' in %p (%i) is too short.\n
msgid "Encrypted @E is too short.\n"
msgstr ""
-#: e2fsck/problem.c:1816
+#: e2fsck/problem.c:1845
#. @-expanded: Encrypted entry '%Dn' in %p (%i) references unencrypted inode %Di.\n
msgid "Encrypted @E references unencrypted @i %Di.\n"
msgstr ""
-#: e2fsck/problem.c:1821
+#: e2fsck/problem.c:1850
#. @-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:1826
+#: e2fsck/problem.c:1855
#. @-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:1831
+#: e2fsck/problem.c:1860
#. @-expanded: Duplicate filename entry '%Dn' in %p (%i) found.
msgid "Duplicate filename @E found. "
msgstr ""
-#: e2fsck/problem.c:1839
+#: e2fsck/problem.c:1868
#. @-expanded: Pass 3: Checking directory connectivity\n
msgid "Pass 3: Checking @d connectivity\n"
msgstr ""
-#: e2fsck/problem.c:1844
+#: e2fsck/problem.c:1873
#. @-expanded: root inode not allocated.
msgid "@r not allocated. "
msgstr ""
-#: e2fsck/problem.c:1849
+#: e2fsck/problem.c:1878
#. @-expanded: No room in lost+found directory.
msgid "No room in @l @d. "
msgstr ""
-#: e2fsck/problem.c:1855
+#: e2fsck/problem.c:1884
#, 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:1860
+#: e2fsck/problem.c:1889
#. @-expanded: /lost+found not found.
msgid "/@l not found. "
msgstr ""
-#: e2fsck/problem.c:1865
+#: e2fsck/problem.c:1894
#. @-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:1871
+#: e2fsck/problem.c:1900
#, 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:1877
+#: e2fsck/problem.c:1906
#, no-c-format
#. @-expanded: Could not expand /lost+found: %m\n
msgid "Could not expand /@l: %m\n"
msgstr ""
-#: e2fsck/problem.c:1883
+#: e2fsck/problem.c:1912
#, no-c-format
msgid "Could not reconnect %i: %m\n"
msgstr ""
-#: e2fsck/problem.c:1889
+#: e2fsck/problem.c:1918
#, 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:1895
+#: e2fsck/problem.c:1924
#, 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:1901
+#: e2fsck/problem.c:1930
#, 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:1907
+#: e2fsck/problem.c:1936
#, 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:1913
+#: e2fsck/problem.c:1942
#, 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:1919
+#: e2fsck/problem.c:1948
#, 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:1925
+#: e2fsck/problem.c:1954
#, no-c-format
#. @-expanded: Couldn't fix parent of inode %i: %m\n
#. @-expanded: \n
@@ -2672,7 +2717,7 @@ msgid ""
"\n"
msgstr ""
-#: e2fsck/problem.c:1931
+#: e2fsck/problem.c:1960
#, no-c-format
#. @-expanded: Couldn't fix parent of inode %i: Couldn't find parent directory entry\n
#. @-expanded: \n
@@ -2681,40 +2726,40 @@ msgid ""
"\n"
msgstr ""
-#: e2fsck/problem.c:1942
+#: e2fsck/problem.c:1971
#, no-c-format
#. @-expanded: Error creating root directory (%s): %m\n
msgid "Error creating root @d (%s): %m\n"
msgstr ""
-#: e2fsck/problem.c:1948
+#: e2fsck/problem.c:1977
#, no-c-format
#. @-expanded: Error creating /lost+found directory (%s): %m\n
msgid "Error creating /@l @d (%s): %m\n"
msgstr ""
-#: e2fsck/problem.c:1953
+#: e2fsck/problem.c:1982
#. @-expanded: root inode is not a directory; aborting.\n
msgid "@r is not a @d; aborting.\n"
msgstr ""
-#: e2fsck/problem.c:1958
+#: e2fsck/problem.c:1987
#. @-expanded: Cannot proceed without a root inode.\n
msgid "Cannot proceed without a @r.\n"
msgstr ""
-#: e2fsck/problem.c:1969
+#: e2fsck/problem.c:1998
#, 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:1974
+#: e2fsck/problem.c:2003
#. @-expanded: /lost+found has inline data\n
msgid "/@l has inline data\n"
msgstr ""
-#: e2fsck/problem.c:1979
+#: e2fsck/problem.c:2008
#. @-expanded: Cannot allocate space for /lost+found.\n
#. @-expanded: Place lost files in root directory instead
msgid ""
@@ -2722,7 +2767,7 @@ msgid ""
"Place lost files in root directory instead"
msgstr ""
-#: e2fsck/problem.c:1984
+#: e2fsck/problem.c:2013
#. @-expanded: Insufficient space to recover lost files!\n
#. @-expanded: Move data off the filesystem and re-run e2fsck.\n
#. @-expanded: \n
@@ -2732,56 +2777,56 @@ msgid ""
"\n"
msgstr ""
-#: e2fsck/problem.c:1989
+#: e2fsck/problem.c:2018
#. @-expanded: /lost+found is encrypted\n
msgid "/@l is encrypted\n"
msgstr ""
-#: e2fsck/problem.c:1995
+#: e2fsck/problem.c:2024
#, no-c-format
#. @-expanded: Recursively looped directory inode %i (%p)\n
msgid "Recursively looped @d @i %i (%p)\n"
msgstr ""
-#: e2fsck/problem.c:2002
+#: e2fsck/problem.c:2031
msgid "Pass 3A: Optimizing directories\n"
msgstr ""
-#: e2fsck/problem.c:2008
+#: e2fsck/problem.c:2037
#, no-c-format
msgid "Failed to create dirs_to_hash iterator: %m\n"
msgstr ""
-#: e2fsck/problem.c:2013
+#: e2fsck/problem.c:2042
msgid "Failed to optimize directory %q (%d): %m\n"
msgstr ""
-#: e2fsck/problem.c:2018
+#: e2fsck/problem.c:2047
msgid "Optimizing directories: "
msgstr ""
-#: e2fsck/problem.c:2035
+#: e2fsck/problem.c:2064
msgid "Pass 4: Checking reference counts\n"
msgstr ""
-#: e2fsck/problem.c:2041
+#: e2fsck/problem.c:2070
#, no-c-format
#. @-expanded: unattached zero-length inode %i.
msgid "@u @z @i %i. "
msgstr ""
-#: e2fsck/problem.c:2047
+#: e2fsck/problem.c:2076
#, no-c-format
#. @-expanded: unattached inode %i\n
msgid "@u @i %i\n"
msgstr ""
-#: e2fsck/problem.c:2052
+#: e2fsck/problem.c:2081
#. @-expanded: inode %i ref count is %Il, should be %N.
msgid "@i %i ref count is %Il, @s %N. "
msgstr ""
-#: e2fsck/problem.c:2056
+#: e2fsck/problem.c:2085
#. @-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
@@ -2791,72 +2836,72 @@ msgid ""
"@i_link_info[%i] is %N, @i.i_links_count is %Il. They @s the same!\n"
msgstr ""
-#: e2fsck/problem.c:2063
+#: e2fsck/problem.c:2092
#. @-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:2068
+#: e2fsck/problem.c:2097
#. @-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:2073
+#: e2fsck/problem.c:2102
#. @-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:2080
+#: e2fsck/problem.c:2109
#. @-expanded: Pass 5: Checking group summary information\n
msgid "Pass 5: Checking @g summary information\n"
msgstr ""
-#: e2fsck/problem.c:2085
+#: e2fsck/problem.c:2114
#. @-expanded: Padding at end of inode bitmap is not set.
msgid "Padding at end of @i @B is not set. "
msgstr ""
-#: e2fsck/problem.c:2090
+#: e2fsck/problem.c:2119
#. @-expanded: Padding at end of block bitmap is not set.
msgid "Padding at end of @b @B is not set. "
msgstr ""
-#: e2fsck/problem.c:2095
+#: e2fsck/problem.c:2124
#. @-expanded: block bitmap differences:
msgid "@b @B differences: "
msgstr ""
-#: e2fsck/problem.c:2117
+#: e2fsck/problem.c:2146
#. @-expanded: inode bitmap differences:
msgid "@i @B differences: "
msgstr ""
-#: e2fsck/problem.c:2139
+#: e2fsck/problem.c:2168
#. @-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:2144
+#: e2fsck/problem.c:2173
#. @-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:2149
+#: e2fsck/problem.c:2178
#. @-expanded: Free inodes count wrong (%i, counted=%j).\n
msgid "Free @is count wrong (%i, counted=%j).\n"
msgstr ""
-#: e2fsck/problem.c:2154
+#: e2fsck/problem.c:2183
#. @-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:2159
+#: e2fsck/problem.c:2188
#. @-expanded: Free blocks count wrong (%b, counted=%c).\n
msgid "Free @bs count wrong (%b, counted=%c).\n"
msgstr ""
-#: e2fsck/problem.c:2164
+#: e2fsck/problem.c:2193
#. @-expanded: PROGRAMMING ERROR: filesystem (#%N) bitmap endpoints (%b, %c) don't match calculated bitmap
#. @-expanded: endpoints (%i, %j)\n
msgid ""
@@ -2864,81 +2909,128 @@ msgid ""
"endpoints (%i, %j)\n"
msgstr ""
-#: e2fsck/problem.c:2170
+#: e2fsck/problem.c:2199
msgid "Internal error: fudging end of bitmap (%N)\n"
msgstr ""
-#: e2fsck/problem.c:2176
+#: e2fsck/problem.c:2205
#, 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:2182
+#: e2fsck/problem.c:2211
#, 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:2212
+#: e2fsck/problem.c:2241
#, 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:2218
+#: e2fsck/problem.c:2247
#, 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:2224
+#: e2fsck/problem.c:2253
#, 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:2230
+#: e2fsck/problem.c:2259
#, 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:2237
+#: e2fsck/problem.c:2266
#. @-expanded: Recreate journal
msgid "Recreate @j"
msgstr ""
-#: e2fsck/problem.c:2242
+#: e2fsck/problem.c:2271
msgid "Update quota info for quota type %N"
msgstr ""
-#: e2fsck/problem.c:2248
+#: e2fsck/problem.c:2277
#, 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:2254
+#: e2fsck/problem.c:2283
#, no-c-format
msgid "Error writing file system info: %m\n"
msgstr ""
-#: e2fsck/problem.c:2260
+#: e2fsck/problem.c:2289
#, no-c-format
msgid "Error flushing writes to storage device: %m\n"
msgstr ""
-#: e2fsck/problem.c:2265
+#: e2fsck/problem.c:2294
msgid "Error writing quota info for quota type %N: %m\n"
msgstr ""
-#: e2fsck/problem.c:2430
+#: e2fsck/problem.c:2299
+#. @-expanded: superblock has orphan file without journal.\n
+msgid "@S has orphan file without @j.\n"
+msgstr ""
+
+#: e2fsck/problem.c:2304
+msgid "Failed to truncate orphan file.\n"
+msgstr ""
+
+#: e2fsck/problem.c:2309
+msgid "Failed to initialize orphan file.\n"
+msgstr ""
+
+#: e2fsck/problem.c:2314
+msgid "Cannot fix corrupted orphan file with invalid bitmaps.\n"
+msgstr ""
+
+#: e2fsck/problem.c:2319
+#, 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
+#. @-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
+msgid "Feature orphan_present is set but orphan file is clean.\n"
+msgstr ""
+
+#: e2fsck/problem.c:2334
+msgid "Feature orphan_present is set but feature orphan_file is not.\n"
+msgstr ""
+
+#: e2fsck/problem.c:2339
+#, 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
+#. @-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
#, c-format
msgid "Unhandled error code (0x%x)!\n"
msgstr ""
-#: e2fsck/problem.c:2558 e2fsck/problem.c:2562
+#: e2fsck/problem.c:2637 e2fsck/problem.c:2641
msgid "IGNORED"
msgstr ""
@@ -2978,14 +3070,29 @@ msgstr ""
msgid "while calling ext2fs_adjust_ea_refcount2 for inode %u"
msgstr ""
-#: e2fsck/super.c:375
+#: e2fsck/super.c:329
msgid "Truncating"
msgstr ""
-#: e2fsck/super.c:376
+#: e2fsck/super.c:329
msgid "Clearing"
msgstr ""
+#: e2fsck/super.c:453
+#, c-format
+msgid "while reading inode %d"
+msgstr ""
+
+#: e2fsck/super.c:473 e2fsck/super.c:677
+#, c-format
+msgid "while calling ext2fs_block_iterate for inode %d"
+msgstr ""
+
+#: e2fsck/super.c:481 e2fsck/super.c:685
+#, c-format
+msgid "while reading blocks of inode %d"
+msgstr ""
+
#: e2fsck/unix.c:79
#, c-format
msgid ""
@@ -3151,7 +3258,7 @@ msgid_plural "%12u files\n"
msgstr[0] ""
msgstr[1] ""
-#: e2fsck/unix.c:241 misc/badblocks.c:1001 misc/tune2fs.c:3085 misc/util.c:135
+#: e2fsck/unix.c:241 misc/badblocks.c:1001 misc/tune2fs.c:3324 misc/util.c:135
#: resize/main.c:359
#, c-format
msgid "while determining whether %s is mounted."
@@ -3312,7 +3419,7 @@ msgid "The -t option is not supported on this version of e2fsck.\n"
msgstr ""
#: e2fsck/unix.c:947 e2fsck/unix.c:1025 misc/e2initrd_helper.c:331
-#: misc/tune2fs.c:1783 misc/tune2fs.c:2083 misc/tune2fs.c:2101
+#: misc/tune2fs.c:1914 misc/tune2fs.c:2214 misc/tune2fs.c:2232
#, c-format
msgid "Unable to resolve '%s'"
msgstr ""
@@ -3389,8 +3496,8 @@ msgid "while reading MMP block"
msgstr ""
#: e2fsck/unix.c:1322 e2fsck/unix.c:1374 misc/e2undo.c:240 misc/e2undo.c:285
-#: misc/mke2fs.c:2760 misc/mke2fs.c:2811 misc/tune2fs.c:2808
-#: misc/tune2fs.c:2853 resize/main.c:188 resize/main.c:233
+#: misc/mke2fs.c:2802 misc/mke2fs.c:2853 misc/tune2fs.c:2954
+#: misc/tune2fs.c:2999 resize/main.c:188 resize/main.c:233
#, c-format
msgid ""
"Overwriting existing filesystem; this can be undone using the command:\n"
@@ -3398,13 +3505,13 @@ msgid ""
"\n"
msgstr ""
-#: e2fsck/unix.c:1363 misc/e2undo.c:274 misc/mke2fs.c:2800 misc/tune2fs.c:2842
+#: e2fsck/unix.c:1363 misc/e2undo.c:274 misc/mke2fs.c:2842 misc/tune2fs.c:2988
#: resize/main.c:222
#, c-format
msgid "while trying to delete %s"
msgstr ""
-#: e2fsck/unix.c:1389 misc/mke2fs.c:2826 resize/main.c:243
+#: e2fsck/unix.c:1389 misc/mke2fs.c:2868 resize/main.c:243
msgid "while trying to setup undo file\n"
msgstr ""
@@ -3550,7 +3657,7 @@ msgstr ""
msgid "Creating journal (%d blocks): "
msgstr ""
-#: e2fsck/unix.c:1952
+#: e2fsck/unix.c:1952 e2fsck/unix.c:2024
msgid " Done.\n"
msgstr ""
@@ -3569,39 +3676,44 @@ msgstr ""
msgid "%s: e2fsck canceled.\n"
msgstr ""
-#: e2fsck/unix.c:1989
+#: e2fsck/unix.c:2012
+#, c-format
+msgid "Creating orphan file (%d blocks): "
+msgstr ""
+
+#: e2fsck/unix.c:2056
msgid "Restarting e2fsck from the beginning...\n"
msgstr ""
-#: e2fsck/unix.c:1993
+#: e2fsck/unix.c:2060
msgid "while resetting context"
msgstr ""
-#: e2fsck/unix.c:2052
+#: e2fsck/unix.c:2120
#, c-format
msgid ""
"\n"
"%s: ***** FILE SYSTEM ERRORS CORRECTED *****\n"
msgstr ""
-#: e2fsck/unix.c:2054
+#: e2fsck/unix.c:2122
#, c-format
msgid "%s: File system was modified.\n"
msgstr ""
-#: e2fsck/unix.c:2058 e2fsck/util.c:67
+#: e2fsck/unix.c:2126 e2fsck/util.c:67
#, c-format
msgid ""
"\n"
"%s: ***** FILE SYSTEM WAS MODIFIED *****\n"
msgstr ""
-#: e2fsck/unix.c:2063
+#: e2fsck/unix.c:2131
#, c-format
msgid "%s: ***** REBOOT SYSTEM *****\n"
msgstr ""
-#: e2fsck/unix.c:2073 e2fsck/util.c:73
+#: e2fsck/unix.c:2141 e2fsck/util.c:73
#, c-format
msgid ""
"\n"
@@ -4063,7 +4175,7 @@ msgstr ""
#: misc/create_inode.c:180 misc/create_inode.c:207 misc/create_inode.c:1064
#: misc/e2undo.c:186 misc/e2undo.c:483 misc/e2undo.c:489 misc/e2undo.c:495
-#: misc/mke2fs.c:361
+#: misc/mke2fs.c:363
msgid "while allocating memory"
msgstr ""
@@ -4301,7 +4413,7 @@ msgstr ""
msgid "Bad blocks: %u"
msgstr ""
-#: misc/dumpe2fs.c:375 misc/tune2fs.c:379
+#: misc/dumpe2fs.c:375 misc/tune2fs.c:409
msgid "while reading journal inode"
msgstr ""
@@ -4317,7 +4429,7 @@ msgstr ""
msgid "Journal superblock magic number invalid!\n"
msgstr ""
-#: misc/dumpe2fs.c:414 misc/tune2fs.c:222
+#: misc/dumpe2fs.c:414 misc/tune2fs.c:252
msgid "while reading journal superblock"
msgstr ""
@@ -4334,7 +4446,7 @@ msgstr ""
msgid "reading MMP block %llu from '%s'\n"
msgstr ""
-#: misc/dumpe2fs.c:520 misc/mke2fs.c:811 misc/tune2fs.c:2123
+#: misc/dumpe2fs.c:520 misc/mke2fs.c:813 misc/tune2fs.c:2254
msgid "Couldn't allocate memory to parse options!\n"
msgstr ""
@@ -4362,12 +4474,12 @@ msgid ""
"\tblocksize=<blocksize>\n"
msgstr ""
-#: misc/dumpe2fs.c:663 misc/mke2fs.c:1913
+#: misc/dumpe2fs.c:663 misc/mke2fs.c:1939
#, c-format
msgid "\tUsing %s\n"
msgstr ""
-#: misc/dumpe2fs.c:710 misc/e2image.c:1642 misc/tune2fs.c:3011
+#: misc/dumpe2fs.c:710 misc/e2image.c:1643 misc/tune2fs.c:3249
#: resize/main.c:424
msgid "Couldn't find valid filesystem superblock.\n"
msgstr ""
@@ -4539,52 +4651,52 @@ msgstr ""
msgid "while getting next inode"
msgstr ""
-#: misc/e2image.c:1379 misc/e2image.c:1393
+#: misc/e2image.c:1380 misc/e2image.c:1394
#, c-format
msgid "while iterating over inode %u"
msgstr ""
-#: misc/e2image.c:1425
+#: misc/e2image.c:1426
msgid "Raw and qcow2 images cannot be installed"
msgstr ""
-#: misc/e2image.c:1447
+#: misc/e2image.c:1448
msgid "error reading bitmaps"
msgstr ""
-#: misc/e2image.c:1459
+#: misc/e2image.c:1460
msgid "while opening device file"
msgstr ""
-#: misc/e2image.c:1470
+#: misc/e2image.c:1471
msgid "while restoring the image table"
msgstr ""
-#: misc/e2image.c:1578
+#: misc/e2image.c:1579
msgid "-a option can only be used with raw or QCOW2 images."
msgstr ""
-#: misc/e2image.c:1583
+#: misc/e2image.c:1584
msgid "-b option can only be used with raw or QCOW2 images."
msgstr ""
-#: misc/e2image.c:1589
+#: misc/e2image.c:1590
msgid "Offsets are only allowed with raw images."
msgstr ""
-#: misc/e2image.c:1594
+#: misc/e2image.c:1595
msgid "Move mode is only allowed with raw images."
msgstr ""
-#: misc/e2image.c:1599
+#: misc/e2image.c:1600
msgid "Move mode requires all data mode."
msgstr ""
-#: misc/e2image.c:1609
+#: misc/e2image.c:1610
msgid "checking if mounted"
msgstr ""
-#: misc/e2image.c:1616
+#: misc/e2image.c:1617
msgid ""
"\n"
"Running e2image on a R/W mounted filesystem can result in an\n"
@@ -4592,51 +4704,51 @@ msgid ""
"Use -f option if you really want to do that.\n"
msgstr ""
-#: misc/e2image.c:1670
+#: misc/e2image.c:1671
msgid "QCOW2 image can not be written to the stdout!\n"
msgstr ""
-#: misc/e2image.c:1676
+#: misc/e2image.c:1677
msgid "Can not stat output\n"
msgstr ""
-#: misc/e2image.c:1686
+#: misc/e2image.c:1687
#, c-format
msgid "Image (%s) is compressed\n"
msgstr ""
-#: misc/e2image.c:1689
+#: misc/e2image.c:1690
#, c-format
msgid "Image (%s) is encrypted\n"
msgstr ""
-#: misc/e2image.c:1692
+#: misc/e2image.c:1693
#, c-format
msgid "Image (%s) is corrupted\n"
msgstr ""
-#: misc/e2image.c:1696
+#: misc/e2image.c:1697
#, c-format
msgid "while trying to convert qcow2 image (%s) into raw image (%s)"
msgstr ""
-#: misc/e2image.c:1706
+#: misc/e2image.c:1707
msgid "The -c option only supported in raw mode\n"
msgstr ""
-#: misc/e2image.c:1711
+#: misc/e2image.c:1712
msgid "The -c option not supported when writing to stdout\n"
msgstr ""
-#: misc/e2image.c:1718
+#: misc/e2image.c:1719
msgid "while allocating check_buf"
msgstr ""
-#: misc/e2image.c:1724
+#: misc/e2image.c:1725
msgid "The -p option only supported in raw mode\n"
msgstr ""
-#: misc/e2image.c:1734
+#: misc/e2image.c:1735
#, c-format
msgid "%d blocks already contained the data to be copied\n"
msgstr ""
@@ -4666,7 +4778,7 @@ msgstr ""
msgid "e2label: not an ext2 filesystem\n"
msgstr ""
-#: misc/e2label.c:97 misc/tune2fs.c:3220
+#: misc/e2label.c:97 misc/tune2fs.c:3136 misc/tune2fs.c:3459
#, c-format
msgid "Warning: label too long, truncating.\n"
msgstr ""
@@ -4681,7 +4793,7 @@ msgstr ""
msgid "e2label: error writing superblock\n"
msgstr ""
-#: misc/e2label.c:117 misc/tune2fs.c:1775
+#: misc/e2label.c:117 misc/tune2fs.c:1906
#, c-format
msgid "Usage: e2label device [newlabel]\n"
msgstr ""
@@ -5001,7 +5113,7 @@ msgstr ""
msgid "%s: %s.\n"
msgstr ""
-#: misc/fuse2fs.c:3789 misc/fuse2fs.c:3808 misc/tune2fs.c:3111
+#: misc/fuse2fs.c:3789 misc/fuse2fs.c:3808 misc/tune2fs.c:3350
#, c-format
msgid "Please run e2fsck -fy %s.\n"
msgstr ""
@@ -5064,7 +5176,7 @@ msgstr ""
msgid "Couldn't allocate path variable in lsattr_dir_proc\n"
msgstr ""
-#: misc/mke2fs.c:131
+#: misc/mke2fs.c:133
#, c-format
msgid ""
"Usage: %s [-c|-l filename] [-b block-size] [-C cluster-size]\n"
@@ -5078,35 +5190,35 @@ msgid ""
"\t[-jnqvDFSV] device [blocks-count]\n"
msgstr ""
-#: misc/mke2fs.c:263
+#: misc/mke2fs.c:265
#, c-format
msgid "Running command: %s\n"
msgstr ""
-#: misc/mke2fs.c:267
+#: misc/mke2fs.c:269
#, c-format
msgid "while trying to run '%s'"
msgstr ""
-#: misc/mke2fs.c:274
+#: misc/mke2fs.c:276
msgid "while processing list of bad blocks from program"
msgstr ""
-#: misc/mke2fs.c:301
+#: misc/mke2fs.c:303
#, c-format
msgid "Block %d in primary superblock/group descriptor area bad.\n"
msgstr ""
-#: misc/mke2fs.c:303
+#: misc/mke2fs.c:305
#, c-format
msgid "Blocks %u through %u must be good in order to build a filesystem.\n"
msgstr ""
-#: misc/mke2fs.c:306
+#: misc/mke2fs.c:308
msgid "Aborting....\n"
msgstr ""
-#: misc/mke2fs.c:326
+#: misc/mke2fs.c:328
#, c-format
msgid ""
"Warning: the backup superblock/group descriptors at block %u contain\n"
@@ -5114,263 +5226,268 @@ msgid ""
"\n"
msgstr ""
-#: misc/mke2fs.c:345 misc/mke2fs.c:3320
+#: misc/mke2fs.c:347 misc/mke2fs.c:3374
msgid "while marking bad blocks as used"
msgstr ""
-#: misc/mke2fs.c:370
+#: misc/mke2fs.c:372
msgid "while writing reserved inodes"
msgstr ""
-#: misc/mke2fs.c:422
+#: misc/mke2fs.c:424
msgid "Writing inode tables: "
msgstr ""
-#: misc/mke2fs.c:444
+#: misc/mke2fs.c:446
#, c-format
msgid ""
"\n"
"Could not write %d blocks in inode table starting at %llu: %s\n"
msgstr ""
-#: misc/mke2fs.c:459 misc/mke2fs.c:2872 misc/mke2fs.c:3280
+#: misc/mke2fs.c:461 misc/mke2fs.c:2914 misc/mke2fs.c:3334
msgid "done \n"
msgstr ""
-#: misc/mke2fs.c:474
+#: misc/mke2fs.c:476
msgid "while creating root dir"
msgstr ""
-#: misc/mke2fs.c:481
+#: misc/mke2fs.c:483
msgid "while reading root inode"
msgstr ""
-#: misc/mke2fs.c:493
+#: misc/mke2fs.c:495
msgid "while setting root inode ownership"
msgstr ""
-#: misc/mke2fs.c:511
+#: misc/mke2fs.c:513
msgid "while creating /lost+found"
msgstr ""
-#: misc/mke2fs.c:518
+#: misc/mke2fs.c:520
msgid "while looking up /lost+found"
msgstr ""
-#: misc/mke2fs.c:531
+#: misc/mke2fs.c:533
msgid "while expanding /lost+found"
msgstr ""
-#: misc/mke2fs.c:546
+#: misc/mke2fs.c:548
msgid "while setting bad block inode"
msgstr ""
-#: misc/mke2fs.c:573
+#: misc/mke2fs.c:575
#, c-format
msgid "Out of memory erasing sectors %d-%d\n"
msgstr ""
-#: misc/mke2fs.c:583
+#: misc/mke2fs.c:585
#, c-format
msgid "Warning: could not read block 0: %s\n"
msgstr ""
-#: misc/mke2fs.c:601
+#: misc/mke2fs.c:603
#, c-format
msgid "Warning: could not erase sector %d: %s\n"
msgstr ""
-#: misc/mke2fs.c:617
+#: misc/mke2fs.c:619
msgid "while splitting the journal size"
msgstr ""
-#: misc/mke2fs.c:624
+#: misc/mke2fs.c:626
msgid "while initializing journal superblock"
msgstr ""
-#: misc/mke2fs.c:632
+#: misc/mke2fs.c:634
msgid "Zeroing journal device: "
msgstr ""
-#: misc/mke2fs.c:644
+#: misc/mke2fs.c:646
#, c-format
msgid "while zeroing journal device (block %llu, count %d)"
msgstr ""
-#: misc/mke2fs.c:662
+#: misc/mke2fs.c:664
msgid "while writing journal superblock"
msgstr ""
-#: misc/mke2fs.c:676
+#: misc/mke2fs.c:678
#, c-format
msgid "Creating filesystem with %llu %dk blocks and %u inodes\n"
msgstr ""
-#: misc/mke2fs.c:684
+#: misc/mke2fs.c:686
#, c-format
msgid ""
"warning: %llu blocks unused.\n"
"\n"
msgstr ""
-#: misc/mke2fs.c:688
+#: misc/mke2fs.c:690
#, c-format
msgid "Filesystem label=%.*s\n"
msgstr ""
-#: misc/mke2fs.c:692
+#: misc/mke2fs.c:694
#, c-format
msgid "OS type: %s\n"
msgstr ""
-#: misc/mke2fs.c:694
+#: misc/mke2fs.c:696
#, c-format
msgid "Block size=%u (log=%u)\n"
msgstr ""
-#: misc/mke2fs.c:697
+#: misc/mke2fs.c:699
#, c-format
msgid "Cluster size=%u (log=%u)\n"
msgstr ""
-#: misc/mke2fs.c:701
+#: misc/mke2fs.c:703
#, c-format
msgid "Fragment size=%u (log=%u)\n"
msgstr ""
-#: misc/mke2fs.c:703
+#: misc/mke2fs.c:705
#, c-format
msgid "Stride=%u blocks, Stripe width=%u blocks\n"
msgstr ""
-#: misc/mke2fs.c:705
+#: misc/mke2fs.c:707
#, c-format
msgid "%u inodes, %llu blocks\n"
msgstr ""
-#: misc/mke2fs.c:707
+#: misc/mke2fs.c:709
#, c-format
msgid "%llu blocks (%2.2f%%) reserved for the super user\n"
msgstr ""
-#: misc/mke2fs.c:710
+#: misc/mke2fs.c:712
#, c-format
msgid "First data block=%u\n"
msgstr ""
-#: misc/mke2fs.c:712
+#: misc/mke2fs.c:714
#, c-format
msgid "Root directory owner=%u:%u\n"
msgstr ""
-#: misc/mke2fs.c:714
+#: misc/mke2fs.c:716
#, c-format
msgid "Maximum filesystem blocks=%lu\n"
msgstr ""
-#: misc/mke2fs.c:718
+#: misc/mke2fs.c:720
#, c-format
msgid "%u block groups\n"
msgstr ""
-#: misc/mke2fs.c:720
+#: misc/mke2fs.c:722
#, c-format
msgid "%u block group\n"
msgstr ""
-#: misc/mke2fs.c:722
+#: misc/mke2fs.c:724
#, c-format
msgid "%u blocks per group, %u clusters per group\n"
msgstr ""
-#: misc/mke2fs.c:725
+#: misc/mke2fs.c:727
#, c-format
msgid "%u blocks per group, %u fragments per group\n"
msgstr ""
-#: misc/mke2fs.c:727
+#: misc/mke2fs.c:729
#, c-format
msgid "%u inodes per group\n"
msgstr ""
-#: misc/mke2fs.c:736
+#: misc/mke2fs.c:738
#, c-format
msgid "Filesystem UUID: %s\n"
msgstr ""
-#: misc/mke2fs.c:737
+#: misc/mke2fs.c:739
msgid "Superblock backups stored on blocks: "
msgstr ""
-#: misc/mke2fs.c:833
+#: misc/mke2fs.c:835
#, c-format
msgid "%s requires '-O 64bit'\n"
msgstr ""
-#: misc/mke2fs.c:839
+#: misc/mke2fs.c:841
#, c-format
msgid "'%s' must be before 'resize=%u'\n"
msgstr ""
-#: misc/mke2fs.c:852
+#: misc/mke2fs.c:854
#, c-format
msgid "Invalid desc_size: '%s'\n"
msgstr ""
-#: misc/mke2fs.c:866
+#: misc/mke2fs.c:868
#, c-format
msgid "Invalid hash seed: %s\n"
msgstr ""
-#: misc/mke2fs.c:878
+#: misc/mke2fs.c:880
#, c-format
msgid "Invalid offset: %s\n"
msgstr ""
-#: misc/mke2fs.c:892 misc/tune2fs.c:2151
+#: misc/mke2fs.c:894 misc/tune2fs.c:2282
#, c-format
msgid "Invalid mmp_update_interval: %s\n"
msgstr ""
-#: misc/mke2fs.c:909
+#: misc/mke2fs.c:911
#, c-format
msgid "Invalid # of backup superblocks: %s\n"
msgstr ""
-#: misc/mke2fs.c:931
+#: misc/mke2fs.c:933
#, c-format
msgid "Invalid stride parameter: %s\n"
msgstr ""
-#: misc/mke2fs.c:946
+#: misc/mke2fs.c:948
#, c-format
msgid "Invalid stripe-width parameter: %s\n"
msgstr ""
-#: misc/mke2fs.c:969
+#: misc/mke2fs.c:971
#, c-format
msgid "Invalid resize parameter: %s\n"
msgstr ""
-#: misc/mke2fs.c:976
+#: misc/mke2fs.c:978
msgid "The resize maximum must be greater than the filesystem size.\n"
msgstr ""
-#: misc/mke2fs.c:1000
+#: misc/mke2fs.c:1002
msgid "On-line resizing not supported with revision 0 filesystems\n"
msgstr ""
-#: misc/mke2fs.c:1026 misc/mke2fs.c:1035
+#: misc/mke2fs.c:1033 misc/mke2fs.c:1042
#, c-format
msgid "Invalid root_owner: '%s'\n"
msgstr ""
-#: misc/mke2fs.c:1080
+#: misc/mke2fs.c:1087
#, c-format
msgid "Invalid encoding: %s"
msgstr ""
-#: misc/mke2fs.c:1098
+#: misc/mke2fs.c:1109 misc/tune2fs.c:2417
+#, c-format
+msgid "Invalid size of orphan file %s\n"
+msgstr ""
+
+#: misc/mke2fs.c:1120
#, c-format
msgid ""
"\n"
@@ -5396,10 +5513,11 @@ msgid ""
"\tencoding=<encoding>\n"
"\tencoding_flags=<flags>\n"
"\tquotatype=<quota type(s) to be enabled>\n"
+"\tassume_storage_prezeroed=<0 to disable, 1 to enable>\n"
"\n"
msgstr ""
-#: misc/mke2fs.c:1125
+#: misc/mke2fs.c:1148
#, c-format
msgid ""
"\n"
@@ -5407,52 +5525,52 @@ msgid ""
"\n"
msgstr ""
-#: misc/mke2fs.c:1136 misc/tune2fs.c:2287
+#: misc/mke2fs.c:1159 misc/tune2fs.c:2433
#, c-format
msgid "error: Invalid encoding flag: %s\n"
msgstr ""
-#: misc/mke2fs.c:1142 misc/tune2fs.c:2296
+#: misc/mke2fs.c:1165 misc/tune2fs.c:2442
#, c-format
msgid ""
"error: An encoding must be explicitly specified when passing encoding-flags\n"
msgstr ""
-#: misc/mke2fs.c:1192
+#: misc/mke2fs.c:1216
#, c-format
msgid ""
"Syntax error in mke2fs config file (%s, line #%d)\n"
"\t%s\n"
msgstr ""
-#: misc/mke2fs.c:1205 misc/tune2fs.c:1111
+#: misc/mke2fs.c:1229 misc/tune2fs.c:1176
#, c-format
msgid "Invalid filesystem option set: %s\n"
msgstr ""
-#: misc/mke2fs.c:1217 misc/tune2fs.c:425
+#: misc/mke2fs.c:1241 misc/tune2fs.c:455
#, c-format
msgid "Invalid mount option set: %s\n"
msgstr ""
-#: misc/mke2fs.c:1353
+#: misc/mke2fs.c:1377
#, c-format
msgid ""
"\n"
"Your mke2fs.conf file does not define the %s filesystem type.\n"
msgstr ""
-#: misc/mke2fs.c:1357
+#: misc/mke2fs.c:1381
msgid ""
"You probably need to install an updated mke2fs.conf file.\n"
"\n"
msgstr ""
-#: misc/mke2fs.c:1361
+#: misc/mke2fs.c:1385
msgid "Aborting...\n"
msgstr ""
-#: misc/mke2fs.c:1402
+#: misc/mke2fs.c:1426
#, c-format
msgid ""
"\n"
@@ -5460,164 +5578,164 @@ msgid ""
"\n"
msgstr ""
-#: misc/mke2fs.c:1590
+#: misc/mke2fs.c:1616
msgid "Couldn't allocate memory for new PATH.\n"
msgstr ""
-#: misc/mke2fs.c:1630
+#: misc/mke2fs.c:1656
#, c-format
msgid "Couldn't init profile successfully (error: %ld).\n"
msgstr ""
-#: misc/mke2fs.c:1663
+#: misc/mke2fs.c:1689
#, c-format
msgid "invalid block size - %s"
msgstr ""
-#: misc/mke2fs.c:1667
+#: misc/mke2fs.c:1693
#, c-format
msgid "Warning: blocksize %d not usable on most systems.\n"
msgstr ""
-#: misc/mke2fs.c:1683
+#: misc/mke2fs.c:1709
#, c-format
msgid "invalid cluster size - %s"
msgstr ""
-#: misc/mke2fs.c:1696
+#: misc/mke2fs.c:1722
msgid "'-R' is deprecated, use '-E' instead"
msgstr ""
-#: misc/mke2fs.c:1710 misc/tune2fs.c:1877
+#: misc/mke2fs.c:1736 misc/tune2fs.c:2008
#, c-format
msgid "bad error behavior - %s"
msgstr ""
-#: misc/mke2fs.c:1722
+#: misc/mke2fs.c:1748
msgid "Illegal number for blocks per group"
msgstr ""
-#: misc/mke2fs.c:1727
+#: misc/mke2fs.c:1753
msgid "blocks per group must be multiple of 8"
msgstr ""
-#: misc/mke2fs.c:1735
+#: misc/mke2fs.c:1761
msgid "Illegal number for flex_bg size"
msgstr ""
-#: misc/mke2fs.c:1741
+#: misc/mke2fs.c:1767
msgid "flex_bg size must be a power of 2"
msgstr ""
-#: misc/mke2fs.c:1746
+#: misc/mke2fs.c:1772
#, c-format
msgid "flex_bg size (%lu) must be less than or equal to 2^31"
msgstr ""
-#: misc/mke2fs.c:1756
+#: misc/mke2fs.c:1782
#, c-format
msgid "invalid inode ratio %s (min %d/max %d)"
msgstr ""
-#: misc/mke2fs.c:1766
+#: misc/mke2fs.c:1792
#, c-format
msgid "invalid inode size - %s"
msgstr ""
-#: misc/mke2fs.c:1781
+#: misc/mke2fs.c:1807
msgid ""
"Warning: -K option is deprecated and should not be used anymore. Use '-E "
"nodiscard' extended option instead!\n"
msgstr ""
-#: misc/mke2fs.c:1792
+#: misc/mke2fs.c:1818
msgid "in malloc for bad_blocks_filename"
msgstr ""
-#: misc/mke2fs.c:1801
+#: misc/mke2fs.c:1827
#, c-format
msgid ""
"Warning: label too long; will be truncated to '%s'\n"
"\n"
msgstr ""
-#: misc/mke2fs.c:1810
+#: misc/mke2fs.c:1836
#, c-format
msgid "invalid reserved blocks percent - %s"
msgstr ""
-#: misc/mke2fs.c:1825
+#: misc/mke2fs.c:1851
#, c-format
msgid "bad num inodes - %s"
msgstr ""
-#: misc/mke2fs.c:1838
+#: misc/mke2fs.c:1864
msgid "while allocating fs_feature string"
msgstr ""
-#: misc/mke2fs.c:1855
+#: misc/mke2fs.c:1881
#, c-format
msgid "bad revision level - %s"
msgstr ""
-#: misc/mke2fs.c:1860
+#: misc/mke2fs.c:1886
#, c-format
msgid "while trying to create revision %d"
msgstr ""
-#: misc/mke2fs.c:1874
+#: misc/mke2fs.c:1900
msgid "The -t option may only be used once"
msgstr ""
-#: misc/mke2fs.c:1882
+#: misc/mke2fs.c:1908
msgid "The -T option may only be used once"
msgstr ""
-#: misc/mke2fs.c:1938 misc/mke2fs.c:3403
+#: misc/mke2fs.c:1964 misc/mke2fs.c:3457
#, c-format
msgid "while trying to open journal device %s\n"
msgstr ""
-#: misc/mke2fs.c:1944
+#: misc/mke2fs.c:1970
#, c-format
msgid "Journal dev blocksize (%d) smaller than minimum blocksize %d\n"
msgstr ""
-#: misc/mke2fs.c:1950
+#: misc/mke2fs.c:1976
#, c-format
msgid "Using journal device's blocksize: %d\n"
msgstr ""
-#: misc/mke2fs.c:1961
+#: misc/mke2fs.c:1987
#, c-format
msgid "invalid blocks '%s' on device '%s'"
msgstr ""
-#: misc/mke2fs.c:1981
+#: misc/mke2fs.c:2007
msgid "filesystem"
msgstr ""
-#: misc/mke2fs.c:1996 lib/support/plausible.c:187
+#: misc/mke2fs.c:2022 lib/support/plausible.c:187
#, c-format
msgid "The file %s does not exist and no size was specified.\n"
msgstr ""
-#: misc/mke2fs.c:2008 lib/support/plausible.c:195
+#: misc/mke2fs.c:2034 lib/support/plausible.c:195
#, c-format
msgid "Creating regular file %s\n"
msgstr ""
-#: misc/mke2fs.c:2013 resize/main.c:512
+#: misc/mke2fs.c:2039 resize/main.c:512
msgid "while trying to determine filesystem size"
msgstr ""
-#: misc/mke2fs.c:2019
+#: misc/mke2fs.c:2045
msgid ""
"Couldn't determine device size; you must specify\n"
"the size of the filesystem\n"
msgstr ""
-#: misc/mke2fs.c:2026
+#: misc/mke2fs.c:2052
msgid ""
"Device size reported to be zero. Invalid partition specified, or\n"
"\tpartition table wasn't reread after running fdisk, due to\n"
@@ -5625,149 +5743,149 @@ msgid ""
"\tto re-read your partition table.\n"
msgstr ""
-#: misc/mke2fs.c:2043
+#: misc/mke2fs.c:2069
msgid "Filesystem larger than apparent device size."
msgstr ""
-#: misc/mke2fs.c:2066
+#: misc/mke2fs.c:2092
msgid "Failed to parse fs types list\n"
msgstr ""
-#: misc/mke2fs.c:2116
+#: misc/mke2fs.c:2158
msgid "The HURD does not support the filetype feature.\n"
msgstr ""
-#: misc/mke2fs.c:2121
+#: misc/mke2fs.c:2163
msgid "The HURD does not support the huge_file feature.\n"
msgstr ""
-#: misc/mke2fs.c:2126
+#: misc/mke2fs.c:2168
msgid "The HURD does not support the metadata_csum feature.\n"
msgstr ""
-#: misc/mke2fs.c:2131
+#: misc/mke2fs.c:2173
msgid "The HURD does not support the ea_inode feature.\n"
msgstr ""
-#: misc/mke2fs.c:2141
+#: misc/mke2fs.c:2183
msgid "while trying to determine hardware sector size"
msgstr ""
-#: misc/mke2fs.c:2147
+#: misc/mke2fs.c:2189
msgid "while trying to determine physical sector size"
msgstr ""
-#: misc/mke2fs.c:2179
+#: misc/mke2fs.c:2221
msgid "while setting blocksize; too small for device\n"
msgstr ""
-#: misc/mke2fs.c:2184
+#: misc/mke2fs.c:2226
#, c-format
msgid ""
"Warning: specified blocksize %d is less than device physical sectorsize %d\n"
msgstr ""
-#: misc/mke2fs.c:2208
+#: misc/mke2fs.c:2250
#, 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:2222
+#: misc/mke2fs.c:2264
#, 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:2244
+#: misc/mke2fs.c:2286
msgid "fs_types for mke2fs.conf resolution: "
msgstr ""
-#: misc/mke2fs.c:2251
+#: misc/mke2fs.c:2293
msgid "Filesystem features not supported with revision 0 filesystems\n"
msgstr ""
-#: misc/mke2fs.c:2259
+#: misc/mke2fs.c:2301
msgid "Sparse superblocks not supported with revision 0 filesystems\n"
msgstr ""
-#: misc/mke2fs.c:2269
+#: misc/mke2fs.c:2311
msgid "Journals not supported with revision 0 filesystems\n"
msgstr ""
-#: misc/mke2fs.c:2282
+#: misc/mke2fs.c:2324
#, c-format
msgid "invalid reserved blocks percent - %lf"
msgstr ""
-#: misc/mke2fs.c:2299
+#: misc/mke2fs.c:2341
msgid ""
"Extents MUST be enabled for a 64-bit filesystem. Pass -O extents to "
"rectify.\n"
msgstr ""
-#: misc/mke2fs.c:2319
+#: misc/mke2fs.c:2361
msgid "The cluster size may not be smaller than the block size.\n"
msgstr ""
-#: misc/mke2fs.c:2325
+#: misc/mke2fs.c:2367
msgid "specifying a cluster size requires the bigalloc feature"
msgstr ""
-#: misc/mke2fs.c:2345
+#: misc/mke2fs.c:2387
#, c-format
msgid "warning: Unable to get device geometry for %s\n"
msgstr ""
-#: misc/mke2fs.c:2357
+#: misc/mke2fs.c:2399
#, c-format
msgid "%s alignment is offset by %lu bytes.\n"
msgstr ""
-#: misc/mke2fs.c:2359
+#: misc/mke2fs.c:2401
#, c-format
msgid ""
"This may result in very poor performance, (re)-partitioning suggested.\n"
msgstr ""
-#: misc/mke2fs.c:2365
+#: misc/mke2fs.c:2407
#, 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:2389
+#: misc/mke2fs.c:2431
#, c-format
msgid "%d-byte blocks too big for system (max %d)"
msgstr ""
-#: misc/mke2fs.c:2393
+#: misc/mke2fs.c:2435
#, c-format
msgid ""
"Warning: %d-byte blocks too big for system (max %d), forced to continue\n"
msgstr ""
-#: misc/mke2fs.c:2401
+#: misc/mke2fs.c:2443
#, c-format
msgid ""
"Suggestion: Use Linux kernel >= 3.18 for improved stability of the metadata "
"and journal checksum features.\n"
msgstr ""
-#: misc/mke2fs.c:2447
+#: misc/mke2fs.c:2489
#, c-format
msgid "Unknown filename encoding from profile: %s"
msgstr ""
-#: misc/mke2fs.c:2458
+#: misc/mke2fs.c:2500
#, c-format
msgid "Unknown encoding flags from profile: %s"
msgstr ""
-#: misc/mke2fs.c:2483
+#: misc/mke2fs.c:2525
#, c-format
msgid ""
"\n"
@@ -5777,66 +5895,66 @@ msgid ""
"\n"
msgstr ""
-#: misc/mke2fs.c:2498
+#: misc/mke2fs.c:2540
#, c-format
msgid "%d byte inodes are too small for project quota"
msgstr ""
-#: misc/mke2fs.c:2520
+#: misc/mke2fs.c:2562
msgid "Can't support bigalloc feature without extents feature"
msgstr ""
-#: misc/mke2fs.c:2527
+#: misc/mke2fs.c:2569
msgid ""
"The resize_inode and meta_bg features are not compatible.\n"
"They can not be both enabled simultaneously.\n"
msgstr ""
-#: misc/mke2fs.c:2536
+#: misc/mke2fs.c:2578
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:2548
+#: misc/mke2fs.c:2590
msgid "reserved online resize blocks not supported on non-sparse filesystem"
msgstr ""
-#: misc/mke2fs.c:2557
+#: misc/mke2fs.c:2599
msgid "blocks per group count out of range"
msgstr ""
-#: misc/mke2fs.c:2579
+#: misc/mke2fs.c:2621
msgid "Flex_bg feature not enabled, so flex_bg size may not be specified"
msgstr ""
-#: misc/mke2fs.c:2591
+#: misc/mke2fs.c:2633
#, c-format
msgid "invalid inode size %d (min %d/max %d)"
msgstr ""
-#: misc/mke2fs.c:2606
+#: misc/mke2fs.c:2648
#, c-format
msgid "%d byte inodes are too small for inline data; specify larger size"
msgstr ""
-#: misc/mke2fs.c:2621
+#: misc/mke2fs.c:2663
#, c-format
msgid "128-byte inodes cannot handle dates beyond 2038 and are deprecated\n"
msgstr ""
-#: misc/mke2fs.c:2632
+#: misc/mke2fs.c:2674
#, c-format
msgid "too many inodes (%llu), raise inode ratio?"
msgstr ""
-#: misc/mke2fs.c:2640
+#: misc/mke2fs.c:2682
#, c-format
msgid "too many inodes (%llu), specify < 2^32 inodes"
msgstr ""
-#: misc/mke2fs.c:2654
+#: misc/mke2fs.c:2696
#, c-format
msgid ""
"inode_size (%u) * inodes_count (%u) too big for a\n"
@@ -5844,161 +5962,175 @@ msgid ""
"\tor lower inode count (-N).\n"
msgstr ""
-#: misc/mke2fs.c:2851
+#: misc/mke2fs.c:2893
msgid "Discarding device blocks: "
msgstr ""
-#: misc/mke2fs.c:2867
+#: misc/mke2fs.c:2909
msgid "failed - "
msgstr ""
-#: misc/mke2fs.c:2926
+#: misc/mke2fs.c:2968
msgid "while initializing quota context"
msgstr ""
-#: misc/mke2fs.c:2933
+#: misc/mke2fs.c:2975
msgid "while writing quota inodes"
msgstr ""
-#: misc/mke2fs.c:2958
+#: misc/mke2fs.c:3000
#, c-format
msgid "bad error behavior in profile - %s"
msgstr ""
-#: misc/mke2fs.c:3037
+#: misc/mke2fs.c:3079
msgid "in malloc for android_sparse_params"
msgstr ""
-#: misc/mke2fs.c:3051
+#: misc/mke2fs.c:3093
msgid "while setting up superblock"
msgstr ""
-#: misc/mke2fs.c:3067
+#: misc/mke2fs.c:3109
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:3074
+#: misc/mke2fs.c:3116
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:3082
+#: misc/mke2fs.c:3124
msgid "The metadata_csum_seed feature requires the metadata_csum feature.\n"
msgstr ""
-#: misc/mke2fs.c:3106
+#: misc/mke2fs.c:3145
+msgid ""
+"Assuming the storage device is prezeroed - skipping inode table and journal "
+"wipe\n"
+msgstr ""
+
+#: misc/mke2fs.c:3160
msgid "Discard succeeded and will return 0s - skipping inode table wipe\n"
msgstr ""
-#: misc/mke2fs.c:3205
+#: misc/mke2fs.c:3259
#, c-format
msgid "unknown os - %s"
msgstr ""
-#: misc/mke2fs.c:3268
+#: misc/mke2fs.c:3322
msgid "Allocating group tables: "
msgstr ""
-#: misc/mke2fs.c:3276
+#: misc/mke2fs.c:3330
msgid "while trying to allocate filesystem tables"
msgstr ""
-#: misc/mke2fs.c:3291
+#: misc/mke2fs.c:3345
msgid "while unmarking bad blocks"
msgstr ""
-#: misc/mke2fs.c:3302
+#: misc/mke2fs.c:3356
msgid ""
"\n"
"\twhile converting subcluster bitmap"
msgstr ""
-#: misc/mke2fs.c:3311
+#: misc/mke2fs.c:3365
msgid "while calculating overhead"
msgstr ""
-#: misc/mke2fs.c:3330
+#: misc/mke2fs.c:3384
#, c-format
msgid "%s may be further corrupted by superblock rewrite\n"
msgstr ""
-#: misc/mke2fs.c:3371
+#: misc/mke2fs.c:3425
#, c-format
msgid "while zeroing block %llu at end of filesystem"
msgstr ""
-#: misc/mke2fs.c:3384
+#: misc/mke2fs.c:3438
msgid "while reserving blocks for online resize"
msgstr ""
-#: misc/mke2fs.c:3396 misc/tune2fs.c:1573
+#: misc/mke2fs.c:3450 misc/tune2fs.c:1704
msgid "journal"
msgstr ""
-#: misc/mke2fs.c:3408
+#: misc/mke2fs.c:3462
#, c-format
msgid "Adding journal to device %s: "
msgstr ""
-#: misc/mke2fs.c:3415
+#: misc/mke2fs.c:3469
#, c-format
msgid ""
"\n"
"\twhile trying to add journal to device %s"
msgstr ""
-#: misc/mke2fs.c:3420 misc/mke2fs.c:3450 misc/mke2fs.c:3492
-#: misc/mk_hugefiles.c:486 misc/tune2fs.c:1602 misc/tune2fs.c:1624
+#: misc/mke2fs.c:3474 misc/mke2fs.c:3507 misc/mke2fs.c:3566
+#: misc/mk_hugefiles.c:486 misc/tune2fs.c:1733 misc/tune2fs.c:1755
msgid "done\n"
msgstr ""
-#: misc/mke2fs.c:3427
+#: misc/mke2fs.c:3481
msgid "Skipping journal creation in super-only mode\n"
msgstr ""
-#: misc/mke2fs.c:3437
+#: misc/mke2fs.c:3494
#, c-format
msgid "Creating journal (%u blocks): "
msgstr ""
-#: misc/mke2fs.c:3446
+#: misc/mke2fs.c:3503
msgid ""
"\n"
"\twhile trying to create journal"
msgstr ""
-#: misc/mke2fs.c:3458 misc/tune2fs.c:1176
+#: misc/mke2fs.c:3515 misc/tune2fs.c:1291
msgid ""
"\n"
"Error while enabling multiple mount protection feature."
msgstr ""
-#: misc/mke2fs.c:3463
+#: misc/mke2fs.c:3520
#, c-format
msgid "Multiple mount protection is enabled with update interval %d seconds.\n"
msgstr ""
-#: misc/mke2fs.c:3483
+#: misc/mke2fs.c:3535
+msgid "cannot set orphan_file feature without a journal."
+msgstr ""
+
+#: misc/mke2fs.c:3546 misc/tune2fs.c:3516
+msgid "while creating orphan file"
+msgstr ""
+
+#: misc/mke2fs.c:3557
msgid "Copying files into the device: "
msgstr ""
-#: misc/mke2fs.c:3489
+#: misc/mke2fs.c:3563
msgid "while populating file system"
msgstr ""
-#: misc/mke2fs.c:3496
+#: misc/mke2fs.c:3570
msgid "Writing superblocks and filesystem accounting information: "
msgstr ""
-#: misc/mke2fs.c:3503 misc/tune2fs.c:3466
+#: misc/mke2fs.c:3577 misc/tune2fs.c:3764
msgid "while writing out and closing file system"
msgstr ""
-#: misc/mke2fs.c:3506
+#: misc/mke2fs.c:3580
msgid ""
"done\n"
"\n"
@@ -6068,21 +6200,21 @@ msgstr ""
msgid "%s: h=%3d s=%3d c=%4d start=%8d size=%8lu end=%8d\n"
msgstr ""
-#: misc/tune2fs.c:121
+#: misc/tune2fs.c:148
msgid ""
"\n"
"This operation requires a freshly checked filesystem.\n"
msgstr ""
-#: misc/tune2fs.c:123
+#: misc/tune2fs.c:150
msgid "Please run e2fsck -f on the filesystem.\n"
msgstr ""
-#: misc/tune2fs.c:125
+#: misc/tune2fs.c:152
msgid "Please run e2fsck -fD on the filesystem.\n"
msgstr ""
-#: misc/tune2fs.c:138
+#: misc/tune2fs.c:165
#, c-format
msgid ""
"Usage: %s [-c max_mounts_count] [-e errors_behavior] [-f] [-g group]\n"
@@ -6095,304 +6227,340 @@ msgid ""
"\t[-I new_inode_size] [-z undo_file] device\n"
msgstr ""
-#: misc/tune2fs.c:229
+#: misc/tune2fs.c:259
msgid "Journal superblock not found!\n"
msgstr ""
-#: misc/tune2fs.c:287
+#: misc/tune2fs.c:317
msgid "while trying to open external journal"
msgstr ""
-#: misc/tune2fs.c:293 misc/tune2fs.c:2899
+#: misc/tune2fs.c:323 misc/tune2fs.c:3045
#, c-format
msgid "%s is not a journal device.\n"
msgstr ""
-#: misc/tune2fs.c:302 misc/tune2fs.c:2908
+#: misc/tune2fs.c:332 misc/tune2fs.c:3054
#, c-format
msgid ""
"Journal superblock is corrupted, nr_users\n"
"is too high (%d).\n"
msgstr ""
-#: misc/tune2fs.c:309 misc/tune2fs.c:2915
+#: misc/tune2fs.c:339 misc/tune2fs.c:3061
msgid "Filesystem's UUID not found on journal device.\n"
msgstr ""
-#: misc/tune2fs.c:333
+#: misc/tune2fs.c:363
msgid ""
"Cannot locate journal device. It was NOT removed\n"
"Use -f option to remove missing journal device.\n"
msgstr ""
-#: misc/tune2fs.c:342
+#: misc/tune2fs.c:372
msgid "Journal removed\n"
msgstr ""
-#: misc/tune2fs.c:386
+#: misc/tune2fs.c:416
msgid "while reading bitmaps"
msgstr ""
-#: misc/tune2fs.c:394
+#: misc/tune2fs.c:424
msgid "while clearing journal inode"
msgstr ""
-#: misc/tune2fs.c:407
+#: misc/tune2fs.c:437
msgid "while writing journal inode"
msgstr ""
-#: misc/tune2fs.c:443 misc/tune2fs.c:468 misc/tune2fs.c:481
+#: misc/tune2fs.c:473 misc/tune2fs.c:498 misc/tune2fs.c:511
msgid "(and reboot afterwards!)\n"
msgstr ""
-#: misc/tune2fs.c:496
+#: misc/tune2fs.c:526
#, c-format
msgid "After running e2fsck, please run `resize2fs %s %s"
msgstr ""
-#: misc/tune2fs.c:499
+#: misc/tune2fs.c:529
#, c-format
msgid "Please run `resize2fs %s %s"
msgstr ""
-#: misc/tune2fs.c:503
+#: misc/tune2fs.c:533
#, c-format
msgid " -z \"%s\""
msgstr ""
-#: misc/tune2fs.c:505
+#: misc/tune2fs.c:535
#, c-format
msgid "' to enable 64-bit mode.\n"
msgstr ""
-#: misc/tune2fs.c:507
+#: misc/tune2fs.c:537
#, c-format
msgid "' to disable 64-bit mode.\n"
msgstr ""
-#: misc/tune2fs.c:1078
+#: misc/tune2fs.c:1143
msgid ""
"WARNING: Could not confirm kernel support for metadata_csum_seed.\n"
" This requires Linux >= v4.4.\n"
msgstr ""
-#: misc/tune2fs.c:1114
+#: misc/tune2fs.c:1179
#, c-format
msgid "Clearing filesystem feature '%s' not supported.\n"
msgstr ""
-#: misc/tune2fs.c:1120
+#: misc/tune2fs.c:1185
#, c-format
msgid "Setting filesystem feature '%s' not supported.\n"
msgstr ""
-#: misc/tune2fs.c:1129
+#: misc/tune2fs.c:1194
msgid ""
"The has_journal feature may only be cleared when the filesystem is\n"
"unmounted or mounted read-only.\n"
msgstr ""
-#: misc/tune2fs.c:1137
+#: misc/tune2fs.c:1202
msgid ""
"The needs_recovery flag is set. Please run e2fsck before clearing\n"
"the has_journal flag.\n"
msgstr ""
-#: misc/tune2fs.c:1155
+#: misc/tune2fs.c:1221
+msgid ""
+"The orphan_file feature may only be cleared when the filesystem is "
+"unmounted.\n"
+msgstr ""
+
+#: misc/tune2fs.c:1226
+msgid ""
+"The orphan_present feature is set. Please run e2fsck before clearing "
+"orphan_file feature.\n"
+msgstr ""
+
+#: misc/tune2fs.c:1235 misc/tune2fs.c:3509
+msgid "while loading bitmaps"
+msgstr ""
+
+#: misc/tune2fs.c:1241
+msgid ""
+"\n"
+"\twhile trying to delete orphan file\n"
+msgstr ""
+
+#: misc/tune2fs.c:1254
+msgid "orphan_file feature can be set only for filesystems with journal.\n"
+msgstr ""
+
+#: misc/tune2fs.c:1270
msgid ""
"Setting filesystem feature 'sparse_super' not supported\n"
"for filesystems with the meta_bg feature enabled.\n"
msgstr ""
-#: misc/tune2fs.c:1168
+#: misc/tune2fs.c:1283
msgid ""
"The multiple mount protection feature can't\n"
"be set if the filesystem is mounted or\n"
"read-only.\n"
msgstr ""
-#: misc/tune2fs.c:1186
+#: misc/tune2fs.c:1301
#, c-format
msgid "Multiple mount protection has been enabled with update interval %ds.\n"
msgstr ""
-#: misc/tune2fs.c:1195
+#: misc/tune2fs.c:1310
msgid ""
"The multiple mount protection feature cannot\n"
"be disabled if the filesystem is readonly.\n"
msgstr ""
-#: misc/tune2fs.c:1203
+#: misc/tune2fs.c:1318
msgid "Error while reading bitmaps\n"
msgstr ""
-#: misc/tune2fs.c:1212
+#: misc/tune2fs.c:1327
#, c-format
msgid "Magic number in MMP block does not match. expected: %x, actual: %x\n"
msgstr ""
-#: misc/tune2fs.c:1217
+#: misc/tune2fs.c:1332
msgid "while reading MMP block."
msgstr ""
-#: misc/tune2fs.c:1250
+#: misc/tune2fs.c:1365
msgid ""
"Disabling directory index on filesystem with checksums could take some time."
msgstr ""
-#: misc/tune2fs.c:1254
+#: misc/tune2fs.c:1369
msgid "Cannot disable dir_index on a mounted filesystem!\n"
msgstr ""
-#: misc/tune2fs.c:1267
+#: misc/tune2fs.c:1382
msgid ""
"Clearing the flex_bg flag would cause the the filesystem to be\n"
"inconsistent.\n"
msgstr ""
-#: misc/tune2fs.c:1278
+#: misc/tune2fs.c:1393
msgid ""
"The huge_file feature may only be cleared when the filesystem is\n"
"unmounted or mounted read-only.\n"
msgstr ""
-#: misc/tune2fs.c:1289
+#: misc/tune2fs.c:1404
msgid "Enabling checksums could take some time."
msgstr ""
-#: misc/tune2fs.c:1292
+#: misc/tune2fs.c:1407
msgid "Cannot enable metadata_csum on a mounted filesystem!\n"
msgstr ""
-#: misc/tune2fs.c:1298
+#: misc/tune2fs.c:1413
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. Re-run with -O extent to rectify.\n"
msgstr ""
-#: misc/tune2fs.c:1305
+#: misc/tune2fs.c:1420
msgid ""
"64-bit filesystem support is not enabled. The larger fields afforded by "
"this feature enable full-strength checksumming. Run resize2fs -b to "
"rectify.\n"
msgstr ""
-#: misc/tune2fs.c:1331
+#: misc/tune2fs.c:1446
msgid "Disabling checksums could take some time."
msgstr ""
-#: misc/tune2fs.c:1334
+#: misc/tune2fs.c:1449
msgid "Cannot disable metadata_csum on a mounted filesystem!\n"
msgstr ""
-#: misc/tune2fs.c:1375
+#: misc/tune2fs.c:1490
msgid "Cannot enable uninit_bg on a mounted filesystem!\n"
msgstr ""
-#: misc/tune2fs.c:1390
+#: misc/tune2fs.c:1505
msgid "Cannot disable uninit_bg on a mounted filesystem!\n"
msgstr ""
-#: misc/tune2fs.c:1409
+#: misc/tune2fs.c:1524
#, c-format
msgid "Cannot enable 64-bit mode while mounted!\n"
msgstr ""
-#: misc/tune2fs.c:1419
+#: misc/tune2fs.c:1534
#, c-format
msgid "Cannot disable 64-bit mode while mounted!\n"
msgstr ""
-#: misc/tune2fs.c:1449
+#: misc/tune2fs.c:1564
#, c-format
msgid "Cannot enable project feature; inode size too small.\n"
msgstr ""
-#: misc/tune2fs.c:1470
+#: misc/tune2fs.c:1585
msgid ""
"\n"
"Warning: '^quota' option overrides '-Q'arguments.\n"
msgstr ""
-#: misc/tune2fs.c:1487 misc/tune2fs.c:2249
+#: misc/tune2fs.c:1602 misc/tune2fs.c:2380
msgid ""
"The casefold feature may only be enabled when the filesystem is unmounted.\n"
msgstr ""
-#: misc/tune2fs.c:1499
+#: misc/tune2fs.c:1613
+msgid ""
+"The casefold feature may only be disabled when the filesystem is unmounted.\n"
+msgstr ""
+
+#: misc/tune2fs.c:1618
+msgid ""
+"The casefold feature can't be cleared when there are inodes with +F flag.\n"
+msgstr ""
+
+#: misc/tune2fs.c:1630
msgid ""
"Setting feature 'metadata_csum_seed' is only supported\n"
"on filesystems with the metadata_csum feature enabled.\n"
msgstr ""
-#: misc/tune2fs.c:1517
+#: misc/tune2fs.c:1648
msgid ""
"UUID has changed since enabling metadata_csum. Filesystem must be "
"unmounted \n"
"to safely rewrite all metadata to match the new UUID.\n"
msgstr ""
-#: misc/tune2fs.c:1523
+#: misc/tune2fs.c:1654
msgid "Recalculating checksums could take some time."
msgstr ""
-#: misc/tune2fs.c:1566
+#: misc/tune2fs.c:1697
msgid "The filesystem already has a journal.\n"
msgstr ""
-#: misc/tune2fs.c:1586
+#: misc/tune2fs.c:1717
#, c-format
msgid ""
"\n"
"\twhile trying to open journal on %s\n"
msgstr ""
-#: misc/tune2fs.c:1590
+#: misc/tune2fs.c:1721
#, c-format
msgid "Creating journal on device %s: "
msgstr ""
-#: misc/tune2fs.c:1598
+#: misc/tune2fs.c:1729
#, c-format
msgid "while adding filesystem to journal on %s"
msgstr ""
-#: misc/tune2fs.c:1604
+#: misc/tune2fs.c:1735
msgid "Creating journal inode: "
msgstr ""
-#: misc/tune2fs.c:1618
+#: misc/tune2fs.c:1749
msgid ""
"\n"
"\twhile trying to create journal file"
msgstr ""
-#: misc/tune2fs.c:1660
+#: misc/tune2fs.c:1791
#, c-format
msgid "Cannot enable project quota; inode size too small.\n"
msgstr ""
-#: misc/tune2fs.c:1673
+#: misc/tune2fs.c:1804
msgid "while initializing quota context in support library"
msgstr ""
-#: misc/tune2fs.c:1689
+#: misc/tune2fs.c:1820
#, c-format
msgid "while updating quota limits (%d)"
msgstr ""
-#: misc/tune2fs.c:1699
+#: misc/tune2fs.c:1830
#, c-format
msgid "while writing quota file (%d)"
msgstr ""
-#: misc/tune2fs.c:1717
+#: misc/tune2fs.c:1848
#, c-format
msgid "while removing quota file (%d)"
msgstr ""
-#: misc/tune2fs.c:1760
+#: misc/tune2fs.c:1891
msgid ""
"\n"
"Bad quota options specified.\n"
@@ -6406,65 +6574,65 @@ msgid ""
"\n"
msgstr ""
-#: misc/tune2fs.c:1818
+#: misc/tune2fs.c:1949
#, c-format
msgid "Couldn't parse date/time specifier: %s"
msgstr ""
-#: misc/tune2fs.c:1850 misc/tune2fs.c:1861
+#: misc/tune2fs.c:1981 misc/tune2fs.c:1992
#, c-format
msgid "bad mounts count - %s"
msgstr ""
-#: misc/tune2fs.c:1904
+#: misc/tune2fs.c:2035
#, c-format
msgid "bad gid/group name - %s"
msgstr ""
-#: misc/tune2fs.c:1937
+#: misc/tune2fs.c:2068
#, c-format
msgid "bad interval - %s"
msgstr ""
-#: misc/tune2fs.c:1966
+#: misc/tune2fs.c:2097
#, c-format
msgid "bad reserved block ratio - %s"
msgstr ""
-#: misc/tune2fs.c:1981
+#: misc/tune2fs.c:2112
msgid "-o may only be specified once"
msgstr ""
-#: misc/tune2fs.c:1990
+#: misc/tune2fs.c:2121
msgid "-O may only be specified once"
msgstr ""
-#: misc/tune2fs.c:2007
+#: misc/tune2fs.c:2138
#, c-format
msgid "bad reserved blocks count - %s"
msgstr ""
-#: misc/tune2fs.c:2036
+#: misc/tune2fs.c:2167
#, c-format
msgid "bad uid/user name - %s"
msgstr ""
-#: misc/tune2fs.c:2053
+#: misc/tune2fs.c:2184
#, c-format
msgid "bad inode size - %s"
msgstr ""
-#: misc/tune2fs.c:2060
+#: misc/tune2fs.c:2191
#, c-format
msgid "Inode size must be a power of two- %s"
msgstr ""
-#: misc/tune2fs.c:2160
+#: misc/tune2fs.c:2291
#, c-format
msgid "mmp_update_interval too big: %lu\n"
msgstr ""
-#: misc/tune2fs.c:2165
+#: misc/tune2fs.c:2296
#, c-format
msgid "Setting multiple mount protection update interval to %lu second\n"
msgid_plural ""
@@ -6472,52 +6640,52 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: misc/tune2fs.c:2174
+#: misc/tune2fs.c:2305
#, c-format
msgid "Setting filesystem error flag to force fsck.\n"
msgstr ""
-#: misc/tune2fs.c:2192
+#: misc/tune2fs.c:2323
#, c-format
msgid "Invalid RAID stride: %s\n"
msgstr ""
-#: misc/tune2fs.c:2207
+#: misc/tune2fs.c:2338
#, c-format
msgid "Invalid RAID stripe-width: %s\n"
msgstr ""
-#: misc/tune2fs.c:2222
+#: misc/tune2fs.c:2353
#, c-format
msgid "Invalid hash algorithm: %s\n"
msgstr ""
-#: misc/tune2fs.c:2228
+#: misc/tune2fs.c:2359
#, c-format
msgid "Setting default hash algorithm to %s (%d)\n"
msgstr ""
-#: misc/tune2fs.c:2255
+#: misc/tune2fs.c:2386
#, c-format
msgid "Cannot alter existing encoding\n"
msgstr ""
-#: misc/tune2fs.c:2261
+#: misc/tune2fs.c:2392
#, c-format
msgid "Invalid encoding: %s\n"
msgstr ""
-#: misc/tune2fs.c:2267
+#: misc/tune2fs.c:2398
#, c-format
msgid "Setting encoding to '%s'\n"
msgstr ""
-#: misc/tune2fs.c:2291
+#: misc/tune2fs.c:2437
#, c-format
msgid "Setting encoding_flags to '%s'\n"
msgstr ""
-#: misc/tune2fs.c:2301
+#: misc/tune2fs.c:2447
msgid ""
"\n"
"Bad options specified.\n"
@@ -6539,72 +6707,93 @@ msgid ""
"\tencoding_flags=<flags>\n"
msgstr ""
-#: misc/tune2fs.c:2717
+#: misc/tune2fs.c:2863
msgid "Failed to read inode bitmap\n"
msgstr ""
-#: misc/tune2fs.c:2722
+#: misc/tune2fs.c:2868
msgid "Failed to read block bitmap\n"
msgstr ""
-#: misc/tune2fs.c:2739 resize/resize2fs.c:1368
+#: misc/tune2fs.c:2885 resize/resize2fs.c:1368
msgid "blocks to be moved"
msgstr ""
-#: misc/tune2fs.c:2742
+#: misc/tune2fs.c:2888
msgid "Failed to allocate block bitmap when increasing inode size\n"
msgstr ""
-#: misc/tune2fs.c:2748
+#: misc/tune2fs.c:2894
msgid "Not enough space to increase inode size \n"
msgstr ""
-#: misc/tune2fs.c:2753
+#: misc/tune2fs.c:2899
msgid "Failed to relocate blocks during inode resize \n"
msgstr ""
-#: misc/tune2fs.c:2785
+#: misc/tune2fs.c:2931
msgid ""
"Error in resizing the inode size.\n"
"Run e2undo to undo the file system changes. \n"
msgstr ""
-#: misc/tune2fs.c:2998
+#: misc/tune2fs.c:3100
+msgid "while checking mount status"
+msgstr ""
+
+#: misc/tune2fs.c:3108
+#, c-format
+msgid "Unknown mount point for %s\n"
+msgstr ""
+
+#: misc/tune2fs.c:3114
+msgid "while opening mount point"
+msgstr ""
+
+#: misc/tune2fs.c:3124
+msgid "while trying to get fs label"
+msgstr ""
+
+#: misc/tune2fs.c:3146
+msgid "while trying to set fs label"
+msgstr ""
+
+#: misc/tune2fs.c:3236
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:3005
+#: misc/tune2fs.c:3243
#, c-format
msgid ""
"MMP block magic is bad. Try to fix it by running:\n"
"'e2fsck -f %s'\n"
msgstr ""
-#: misc/tune2fs.c:3017
+#: misc/tune2fs.c:3255
msgid "Cannot modify a journal device.\n"
msgstr ""
-#: misc/tune2fs.c:3030
+#: misc/tune2fs.c:3268
#, c-format
msgid "The inode size is already %lu\n"
msgstr ""
-#: misc/tune2fs.c:3037
+#: misc/tune2fs.c:3275
msgid "Shrinking inode size is not supported\n"
msgstr ""
-#: misc/tune2fs.c:3042
+#: misc/tune2fs.c:3280
#, c-format
msgid "Invalid inode size %lu (max %d)\n"
msgstr ""
-#: misc/tune2fs.c:3048
+#: misc/tune2fs.c:3286
msgid "Resizing inodes could take some time."
msgstr ""
-#: misc/tune2fs.c:3097
+#: misc/tune2fs.c:3336
#, c-format
msgid ""
"Warning: The journal is dirty. You may wish to replay the journal like:\n"
@@ -6615,159 +6804,159 @@ msgid ""
"by journal recovery.\n"
msgstr ""
-#: misc/tune2fs.c:3106
+#: misc/tune2fs.c:3345
#, c-format
msgid "Recovering journal.\n"
msgstr ""
-#: misc/tune2fs.c:3130
+#: misc/tune2fs.c:3369
#, c-format
msgid "Setting maximal mount count to %d\n"
msgstr ""
-#: misc/tune2fs.c:3136
+#: misc/tune2fs.c:3375
#, c-format
msgid "Setting current mount count to %d\n"
msgstr ""
-#: misc/tune2fs.c:3141
+#: misc/tune2fs.c:3380
#, c-format
msgid "Setting error behavior to %d\n"
msgstr ""
-#: misc/tune2fs.c:3146
+#: misc/tune2fs.c:3385
#, c-format
msgid "Setting reserved blocks gid to %lu\n"
msgstr ""
-#: misc/tune2fs.c:3151
+#: misc/tune2fs.c:3390
#, c-format
msgid "interval between checks is too big (%lu)"
msgstr ""
-#: misc/tune2fs.c:3158
+#: misc/tune2fs.c:3397
#, c-format
msgid "Setting interval between checks to %lu seconds\n"
msgstr ""
-#: misc/tune2fs.c:3165
+#: misc/tune2fs.c:3404
#, c-format
msgid "Setting reserved blocks percentage to %g%% (%llu blocks)\n"
msgstr ""
-#: misc/tune2fs.c:3172
+#: misc/tune2fs.c:3411
#, c-format
msgid "reserved blocks count is too big (%llu)"
msgstr ""
-#: misc/tune2fs.c:3179
+#: misc/tune2fs.c:3418
#, c-format
msgid "Setting reserved blocks count to %llu\n"
msgstr ""
-#: misc/tune2fs.c:3184
+#: misc/tune2fs.c:3423
msgid ""
"\n"
"The filesystem already has sparse superblocks.\n"
msgstr ""
-#: misc/tune2fs.c:3187
+#: misc/tune2fs.c:3426
msgid ""
"\n"
"Setting the sparse superblock flag not supported\n"
"for filesystems with the meta_bg feature enabled.\n"
msgstr ""
-#: misc/tune2fs.c:3197
+#: misc/tune2fs.c:3436
#, c-format
msgid ""
"\n"
"Sparse superblock flag set. %s"
msgstr ""
-#: misc/tune2fs.c:3202
+#: misc/tune2fs.c:3441
msgid ""
"\n"
"Clearing the sparse superblock flag not supported.\n"
msgstr ""
-#: misc/tune2fs.c:3210
+#: misc/tune2fs.c:3449
#, c-format
msgid "Setting time filesystem last checked to %s\n"
msgstr ""
-#: misc/tune2fs.c:3216
+#: misc/tune2fs.c:3455
#, c-format
msgid "Setting reserved blocks uid to %lu\n"
msgstr ""
-#: misc/tune2fs.c:3248
+#: misc/tune2fs.c:3487
msgid "Error in using clear_mmp. It must be used with -f\n"
msgstr ""
-#: misc/tune2fs.c:3267
+#: misc/tune2fs.c:3524
msgid ""
"The quota feature may only be changed when the filesystem is unmounted.\n"
msgstr ""
-#: misc/tune2fs.c:3284
+#: misc/tune2fs.c:3543
msgid ""
"Cannot change the UUID of this filesystem because it has the stable_inodes "
"feature flag.\n"
msgstr ""
-#: misc/tune2fs.c:3294
+#: misc/tune2fs.c:3553
msgid "Setting the UUID on this filesystem could take some time."
msgstr ""
-#: misc/tune2fs.c:3311
+#: misc/tune2fs.c:3570
msgid "The UUID may only be changed when the filesystem is unmounted.\n"
msgstr ""
-#: misc/tune2fs.c:3314
+#: misc/tune2fs.c:3573
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:3345
+#: misc/tune2fs.c:3623
msgid "Invalid UUID format\n"
msgstr ""
-#: misc/tune2fs.c:3361
+#: misc/tune2fs.c:3657
msgid "Need to update journal superblock.\n"
msgstr ""
-#: misc/tune2fs.c:3383
+#: misc/tune2fs.c:3677
msgid "The inode size may only be changed when the filesystem is unmounted.\n"
msgstr ""
-#: misc/tune2fs.c:3390
+#: misc/tune2fs.c:3684
msgid ""
"Changing the inode size not supported for filesystems with the flex_bg\n"
"feature enabled.\n"
msgstr ""
-#: misc/tune2fs.c:3408
+#: misc/tune2fs.c:3702
#, c-format
msgid "Setting inode size %lu\n"
msgstr ""
-#: misc/tune2fs.c:3412
+#: misc/tune2fs.c:3706
msgid "Failed to change inode size\n"
msgstr ""
-#: misc/tune2fs.c:3432
+#: misc/tune2fs.c:3726
#, c-format
msgid "Setting stride size to %d\n"
msgstr ""
-#: misc/tune2fs.c:3437
+#: misc/tune2fs.c:3731
#, c-format
msgid "Setting stripe width to %d\n"
msgstr ""
-#: misc/tune2fs.c:3444
+#: misc/tune2fs.c:3738
#, c-format
msgid "Setting extended default mount options to '%s'\n"
msgstr ""
@@ -7277,7 +7466,7 @@ msgid "Should never happen: resize inode corrupt!\n"
msgstr ""
#: lib/ext2fs/ext2_err.c:11
-msgid "EXT2FS Library version 1.46.6"
+msgid "EXT2FS Library version 1.47.0"
msgstr ""
#: lib/ext2fs/ext2_err.c:12
diff --git a/tests/filter.sed b/tests/filter.sed
index 5fd68f34..265f458c 100644
--- a/tests/filter.sed
+++ b/tests/filter.sed
@@ -28,6 +28,7 @@ s/\\015//g
s/, csum 0x\([0-9a-f]*\)//g
s/ csum 0x\([0-9a-f]*\)//g
/^Checksum:/d
+/^Checksum seed:/d
s/while trying to open [^ ]*/while trying to open test.img/
s/he filesystem on [^ ]* /he filesystem on test.img /
s/^[^ ]* contains a \([a-z]*\) file system /test.img contains a \1 file system /
diff --git a/tests/m_assume_storage_prezeroed/expect b/tests/m_assume_storage_prezeroed/expect
new file mode 100644
index 00000000..b735e242
--- /dev/null
+++ b/tests/m_assume_storage_prezeroed/expect
@@ -0,0 +1,2 @@
+> 10000
+224
diff --git a/tests/m_assume_storage_prezeroed/script b/tests/m_assume_storage_prezeroed/script
new file mode 100644
index 00000000..1a8d8463
--- /dev/null
+++ b/tests/m_assume_storage_prezeroed/script
@@ -0,0 +1,63 @@
+test_description="test prezeroed storage metadata allocation"
+FILE_SIZE=16M
+
+LOG=$test_name.log
+OUT=$test_name.out
+EXP=$test_dir/expect
+
+if test "$(id -u)" -ne 0 ; then
+ echo "$test_name: $test_description: skipped (not root)"
+elif ! command -v losetup >/dev/null ; then
+ echo "$test_name: $test_description: skipped (no losetup)"
+else
+ dd if=/dev/zero of=$TMPFILE.1 bs=1 count=0 seek=$FILE_SIZE >> $LOG 2>&1
+ dd if=/dev/zero of=$TMPFILE.2 bs=1 count=0 seek=$FILE_SIZE >> $LOG 2>&1
+
+ LOOP1=$(losetup --show --sector-size 4096 -f $TMPFILE.1)
+ if [ ! -b "$LOOP1" ]; then
+ echo "$test_name: $DESCRIPTION: skipped (no loop devices)"
+ rm -f $TMPFILE.1 $TMPFILE.2
+ exit 0
+ fi
+ LOOP2=$(losetup --show --sector-size 4096 -f $TMPFILE.2)
+ if [ ! -b "$LOOP2" ]; then
+ echo "$test_name: $DESCRIPTION: skipped (no loop devices)"
+ rm -f $TMPFILE.1 $TMPFILE.2
+ losetup -d $LOOP1
+ exit 0
+ fi
+
+ echo $MKE2FS -o Linux -t ext4 $LOOP1 >> $LOG 2>&1
+ $MKE2FS -o Linux -t ext4 $LOOP1 >> $LOG 2>&1
+ sync
+ stat $TMPFILE.1 >> $LOG 2>&1
+ SZ=$(stat -c "%b" $TMPFILE.1)
+ if test $SZ -gt 10000 ; then
+ echo "> 10000" > $OUT
+ else
+ echo "$SZ" > $OUT
+ fi
+
+ echo $MKE2FS -o Linux -t ext4 -E assume_storage_prezeroed=1 $LOOP2 >> $LOG 2>&1
+ $MKE2FS -o Linux -t ext4 -E assume_storage_prezeroed=1 $LOOP2 >> $LOG 2>&1
+ sync
+ stat $TMPFILE.2 >> $LOG 2>&1
+ stat -c "%b" $TMPFILE.2 >> $OUT
+
+ losetup -d $LOOP1
+ losetup -d $LOOP2
+ rm -f $TMPFILE.1 $TMPFILE.2
+
+ cmp -s $OUT $EXP
+ status=$?
+
+ if [ "$status" = 0 ] ; then
+ echo "$test_name: $test_description: ok"
+ touch $test_name.ok
+ else
+ echo "$test_name: $test_description: failed"
+ cat $LOG > $test_name.failed
+ diff $EXP $OUT >> $test_name.failed
+ fi
+fi
+unset LOG OUT EXP FILE_SIZE LOOP1 LOOP2
diff --git a/version.h b/version.h
index 5a8863ae..db245cee 100644
--- a/version.h
+++ b/version.h
@@ -9,5 +9,5 @@
* License v2.
*/
-#define E2FSPROGS_VERSION "1.46.6"
-#define E2FSPROGS_DATE "1-Feb-2023"
+#define E2FSPROGS_VERSION "1.47.0"
+#define E2FSPROGS_DATE "5-Feb-2023"