Skip to content

Commit

Permalink
Enhance e2fsck's reporting for reporting unsupported filesystem features
Browse files Browse the repository at this point in the history
Addresses-Sourceforge-Feature-Request: #1175808

Signed-off-by: "Theodore Ts'o" <[email protected]>
  • Loading branch information
tytso committed Feb 27, 2008
1 parent ab52e12 commit dcc91e1
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 16 deletions.
12 changes: 6 additions & 6 deletions e2fsck/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,18 @@ MANPAGES= e2fsck.8
FMANPAGES= e2fsck.conf.5
XTRA_CFLAGS= -DRESOURCE_TRACK -I.

LIBS= $(LIBEXT2FS) $(LIBCOM_ERR) $(LIBBLKID) $(LIBUUID) $(LIBINTL)
DEPLIBS= $(LIBEXT2FS) $(LIBCOM_ERR) $(DEPLIBBLKID) $(DEPLIBUUID)
LIBS= $(LIBEXT2FS) $(LIBCOM_ERR) $(LIBBLKID) $(LIBUUID) $(LIBINTL) $(LIBE2P)
DEPLIBS= $(LIBEXT2FS) $(LIBCOM_ERR) $(DEPLIBBLKID) $(DEPLIBUUID) $(DEPLIBE2P)

STATIC_LIBS= $(STATIC_LIBEXT2FS) $(STATIC_LIBCOM_ERR) $(STATIC_LIBBLKID) \
$(STATIC_LIBUUID) $(LIBINTL)
$(STATIC_LIBUUID) $(LIBINTL) $(STATIC_LIBE2P)
STATIC_DEPLIBS= $(STATIC_LIBEXT2FS) $(STATIC_LIBCOM_ERR) $(DEPSTATIC_LIBBLKID) \
$(DEPSTATIC_LIBUUID)
$(DEPSTATIC_LIBUUID) $(DEPSTATIC_LIBE2P)

PROFILED_LIBS= $(PROFILED_LIBEXT2FS) $(PROFILED_LIBCOM_ERR) \
$(PROFILED_LIBBLKID) $(PROFILED_LIBUUID) $(LIBINTL)
$(PROFILED_LIBBLKID) $(PROFILED_LIBUUID) $(PROFILED_LIBE2P) $(LIBINTL)
PROFILED_DEPLIBS= $(PROFILED_LIBEXT2FS) $(PROFILED_LIBCOM_ERR) \
$(DEPPROFILED_LIBBLKID) $(DEPPROFILED_LIBUUID)
$(DEPPROFILED_LIBBLKID) $(DEPPROFILED_LIBUUID) $(DEPPROFILED_LIBE2P)

COMPILE_ET=$(top_builddir)/lib/et/compile_et --build-tree

Expand Down
49 changes: 39 additions & 10 deletions e2fsck/unix.c
Original file line number Diff line number Diff line change
Expand Up @@ -884,6 +884,7 @@ int main (int argc, char *argv[])
int flags, run_result;
int journal_size;
int sysval, sys_page_size = 4096;
__u32 features[3];

clear_problem_context(&pctx);
#ifdef MTRACE
Expand Down Expand Up @@ -945,7 +946,7 @@ int main (int argc, char *argv[])
#else
io_ptr = unix_io_manager;
#endif
flags = 0;
flags = EXT2_FLAG_NOFREE_ON_ERROR;
if ((ctx->options & E2F_OPT_READONLY) == 0)
flags |= EXT2_FLAG_RW;
if ((ctx->mount_flags & EXT2_MF_MOUNTED) == 0)
Expand Down Expand Up @@ -974,6 +975,10 @@ int main (int argc, char *argv[])
((retval == EXT2_ET_BAD_MAGIC) ||
(retval == EXT2_ET_CORRUPT_SUPERBLOCK) ||
((retval == 0) && ext2fs_check_desc(fs)))) {
if (fs->flags & EXT2_FLAG_NOFREE_ON_ERROR) {
ext2fs_free(fs);
fs = NULL;
}
if (!fs || (fs->group_desc_count > 1)) {
printf(_("%s: %s trying backup blocks...\n"),
ctx->program_name,
Expand All @@ -986,6 +991,19 @@ int main (int argc, char *argv[])
goto restart;
}
}
if (((retval == EXT2_ET_UNSUPP_FEATURE) ||
(retval == EXT2_ET_RO_UNSUPP_FEATURE)) &&
fs && fs->super) {
sb = fs->super;
features[0] = (sb->s_feature_compat &
~EXT2_LIB_FEATURE_COMPAT_SUPP);
features[1] = (sb->s_feature_incompat &
~EXT2_LIB_FEATURE_INCOMPAT_SUPP);
features[2] = (sb->s_feature_ro_compat &
~EXT2_LIB_FEATURE_RO_COMPAT_SUPP);
if (features[0] || features[1] || features[2])
goto print_unsupp_features;
}
if (retval) {
if (orig_retval)
retval = orig_retval;
Expand Down Expand Up @@ -1141,15 +1159,26 @@ int main (int argc, char *argv[])
* Check for compatibility with the feature sets. We need to
* be more stringent than ext2fs_open().
*/
if ((sb->s_feature_compat & ~EXT2_LIB_FEATURE_COMPAT_SUPP) ||
(sb->s_feature_incompat & ~EXT2_LIB_FEATURE_INCOMPAT_SUPP)) {
com_err(ctx->program_name, EXT2_ET_UNSUPP_FEATURE,
"(%s)", ctx->device_name);
goto get_newer;
}
if (sb->s_feature_ro_compat & ~EXT2_LIB_FEATURE_RO_COMPAT_SUPP) {
com_err(ctx->program_name, EXT2_ET_RO_UNSUPP_FEATURE,
"(%s)", ctx->device_name);
features[0] = sb->s_feature_compat & ~EXT2_LIB_FEATURE_COMPAT_SUPP;
features[1] = sb->s_feature_incompat & ~EXT2_LIB_FEATURE_INCOMPAT_SUPP;
features[2] = (sb->s_feature_ro_compat &
~EXT2_LIB_FEATURE_RO_COMPAT_SUPP);
print_unsupp_features:
if (features[0] || features[1] || features[2]) {
int i, j;
__u32 *mask = features, m;

fprintf(stderr, _("%s has unsupported feature(s):"),
ctx->filesystem_name);

for (i=0; i <3; i++,mask++) {
for (j=0,m=1; j < 32; j++, m<<=1) {
if (*mask & m)
fprintf(stderr, " %s",
e2p_feature2string(i, m));
}
}
putc('\n', stderr);
goto get_newer;
}
#ifdef ENABLE_COMPRESSION
Expand Down

0 comments on commit dcc91e1

Please sign in to comment.