jbd2: If a journal checksum error is detected, propagate the error to ext4 From: Theodore Ts'o If a journal checksum error is detected, the ext4 filesystem will call ext4_error(), and the mount will either continue, become a read-only mount, or cause a kernel panic based on the superblock flags indicating the user's preference of what to do in case of filesystem corruption being detected. Signed-off-by: "Theodore Ts'o" --- fs/ext4/super.c | 6 ++ fs/jbd2/recovery.c | 11 ++--- include/linux/jbd2.h | 3 + scripts/package/Makefile | 100 +----------------------------------- scripts/package/builddeb | 126 ---------------------------------------------- 5 files changed, 15 insertions(+), 231 deletions(-) delete mode 100644 scripts/package/builddeb diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 09d9359..dd56c45 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -2189,6 +2189,12 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent) EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) { if (ext4_load_journal(sb, es, journal_devnum)) goto failed_mount3; + if (!(sb->s_flags & MS_RDONLY) && + EXT4_SB(sb)->s_journal->j_failed_commit) { + ext4_error(sb, "ext4_fill_super", + "Journal transaction %u is corrupt", + EXT4_SB(sb)->s_journal->j_failed_commit); + } } else if (journal_inum) { if (ext4_create_journal(sb, es, journal_inum)) goto failed_mount3; diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c index 7199db5..9cfd097 100644 --- a/fs/jbd2/recovery.c +++ b/fs/jbd2/recovery.c @@ -611,9 +611,8 @@ static int do_one_pass(journal_t *journal, chksum_err = chksum_seen = 0; if (info->end_transaction) { - printk(KERN_ERR "JBD: Transaction %u " - "found to be corrupt.\n", - next_commit_ID - 1); + journal->j_failed_commit = + info->end_transaction; brelse(bh); break; } @@ -644,10 +643,8 @@ static int do_one_pass(journal_t *journal, if (!JBD2_HAS_INCOMPAT_FEATURE(journal, JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)){ - printk(KERN_ERR - "JBD: Transaction %u " - "found to be corrupt.\n", - next_commit_ID); + journal->j_failed_commit = + next_commit_ID; brelse(bh); break; } diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 05e2b30..d147f0f 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -919,6 +919,9 @@ struct journal_s struct proc_dir_entry *j_proc_entry; struct transaction_stats_s j_stats; + /* Failed journal commit ID */ + unsigned int j_failed_commit; + /* * An opaque pointer to fs-private information. ext3 puts its * superblock pointer here diff --git a/scripts/package/Makefile b/scripts/package/Makefile index 5e32607..f758b75 100644 --- a/scripts/package/Makefile +++ b/scripts/package/Makefile @@ -1,98 +1,2 @@ -# Makefile for the different targets used to generate full packages of a kernel -# It uses the generic clean infrastructure of kbuild - -# Ignore the following files/directories during tar operation -TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS - - -# RPM target -# --------------------------------------------------------------------------- -# The rpm target generates two rpm files: -# /usr/src/packages/SRPMS/kernel-2.6.7rc2-1.src.rpm -# /usr/src/packages/RPMS/i386/kernel-2.6.7rc2-1..rpm -# The src.rpm files includes all source for the kernel being built -# The .rpm includes kernel configuration, modules etc. -# -# Process to create the rpm files -# a) clean the kernel -# b) Generate .spec file -# c) Build a tar ball, using symlink to make kernel version -# first entry in the path -# d) and pack the result to a tar.gz file -# e) generate the rpm files, based on kernel.spec -# - Use /. to avoid tar packing just the symlink - -# Do we have rpmbuild, otherwise fall back to the older rpm -RPM := $(shell if [ -x "/usr/bin/rpmbuild" ]; then echo rpmbuild; \ - else echo rpm; fi) - -# Remove hyphens since they have special meaning in RPM filenames -KERNELPATH := kernel-$(subst -,,$(KERNELRELEASE)) -MKSPEC := $(srctree)/scripts/package/mkspec -PREV := set -e; cd ..; - -# rpm-pkg -# --------------------------------------------------------------------------- -$(objtree)/kernel.spec: $(MKSPEC) $(srctree)/Makefile - $(CONFIG_SHELL) $(MKSPEC) > $@ - -rpm-pkg rpm: $(objtree)/kernel.spec FORCE - $(MAKE) clean - $(PREV) ln -sf $(srctree) $(KERNELPATH) - $(PREV) tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/. - $(PREV) rm $(KERNELPATH) - - set -e; \ - $(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version - set -e; \ - mv -f $(objtree)/.tmp_version $(objtree)/.version - - $(RPM) --target $(UTS_MACHINE) -ta ../$(KERNELPATH).tar.gz - rm ../$(KERNELPATH).tar.gz - -clean-files := $(objtree)/kernel.spec - -# binrpm-pkg -# --------------------------------------------------------------------------- -$(objtree)/binkernel.spec: $(MKSPEC) $(srctree)/Makefile - $(CONFIG_SHELL) $(MKSPEC) prebuilt > $@ - -binrpm-pkg: $(objtree)/binkernel.spec FORCE - $(MAKE) KBUILD_SRC= - set -e; \ - $(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version - set -e; \ - mv -f $(objtree)/.tmp_version $(objtree)/.version - - $(RPM) --define "_builddir $(srctree)" --target $(UTS_MACHINE) -bb $< - -clean-files += $(objtree)/binkernel.spec - -# Deb target -# --------------------------------------------------------------------------- -deb-pkg: FORCE - $(MAKE) KBUILD_SRC= - $(CONFIG_SHELL) $(srctree)/scripts/package/builddeb - -clean-dirs += $(objtree)/debian/ - - -# tarball targets -# --------------------------------------------------------------------------- -tar%pkg: FORCE - $(MAKE) KBUILD_SRC= - $(CONFIG_SHELL) $(srctree)/scripts/package/buildtar $@ - -clean-dirs += $(objtree)/tar-install/ - - -# Help text displayed when executing 'make help' -# --------------------------------------------------------------------------- -help: FORCE - @echo ' rpm-pkg - Build both source and binary RPM kernel packages' - @echo ' binrpm-pkg - Build only the binary kernel package' - @echo ' deb-pkg - Build the kernel as an deb package' - @echo ' tar-pkg - Build the kernel as an uncompressed tarball' - @echo ' targz-pkg - Build the kernel as a gzip compressed tarball' - @echo ' tarbz2-pkg - Build the kernel as a bzip2 compressed tarball' - +# Dummy file +help: diff --git a/scripts/package/builddeb b/scripts/package/builddeb deleted file mode 100644 index ba6bf5d..0000000 --- a/scripts/package/builddeb +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/sh -# -# builddeb 1.2 -# Copyright 2003 Wichert Akkerman -# -# Simple script to generate a deb package for a Linux kernel. All the -# complexity of what to do with a kernel after it is installer or removed -# is left to other scripts and packages: they can install scripts in the -# /etc/kernel/{pre,post}{inst,rm}.d/ directories that will be called on -# package install and removal. - -set -e - -# Some variables and settings used throughout the script -version=$KERNELRELEASE -revision=`cat .version` -tmpdir="$objtree/debian/tmp" -packagename=linux-$version - -if [ "$ARCH" == "um" ] ; then - packagename=user-mode-linux-$version -fi - -# Setup the directory structure -rm -rf "$tmpdir" -mkdir -p "$tmpdir/DEBIAN" "$tmpdir/lib" "$tmpdir/boot" -if [ "$ARCH" == "um" ] ; then - mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/share/doc/$packagename" "$tmpdir/usr/bin" -fi - -# Build and install the kernel -if [ "$ARCH" == "um" ] ; then - $MAKE linux - cp System.map "$tmpdir/usr/lib/uml/modules/$version/System.map" - cp .config "$tmpdir/usr/share/doc/$packagename/config" - gzip "$tmpdir/usr/share/doc/$packagename/config" - cp $KBUILD_IMAGE "$tmpdir/usr/bin/linux-$version" -else - cp System.map "$tmpdir/boot/System.map-$version" - cp .config "$tmpdir/boot/config-$version" - cp $KBUILD_IMAGE "$tmpdir/boot/vmlinuz-$version" -fi - -if grep -q '^CONFIG_MODULES=y' .config ; then - INSTALL_MOD_PATH="$tmpdir" make KBUILD_SRC= modules_install - if [ "$ARCH" == "um" ] ; then - mv "$tmpdir/lib/modules/$version"/* "$tmpdir/usr/lib/uml/modules/$version/" - rmdir "$tmpdir/lib/modules/$version" - fi -fi - -# Install the maintainer scripts -for script in postinst postrm preinst prerm ; do - mkdir -p "$tmpdir/etc/kernel/$script.d" - cat < "$tmpdir/DEBIAN/$script" -#!/bin/sh - -set -e - -test -d /etc/kernel/$script.d && run-parts --arg="$version" /etc/kernel/$script.d -exit 0 -EOF - chmod 755 "$tmpdir/DEBIAN/$script" -done - -name="Kernel Compiler <$(id -nu)@$(hostname -f)>" -# Generate a simple changelog template -cat < debian/changelog -linux ($version-$revision) unstable; urgency=low - - * A standard release - - -- $name $(date -R) -EOF - -# Generate a control file -if [ "$ARCH" == "um" ]; then - -cat < debian/control -Source: linux -Section: base -Priority: optional -Maintainer: $name -Standards-Version: 3.6.1 - -Package: $packagename -Provides: kernel-image-$version, linux-image-$version -Architecture: any -Description: User Mode Linux kernel, version $version - User-mode Linux is a port of the Linux kernel to its own system call - interface. It provides a kind of virtual machine, which runs Linux - as a user process under another Linux kernel. This is useful for - kernel development, sandboxes, jails, experimentation, and - many other things. - . - This package contains the Linux kernel, modules and corresponding other - files version $version -EOF - -else -cat < debian/control -Source: linux -Section: base -Priority: optional -Maintainer: $name -Standards-Version: 3.6.1 - -Package: $packagename -Provides: kernel-image-$version, linux-image-$version -Architecture: any -Description: Linux kernel, version $version - This package contains the Linux kernel, modules and corresponding other - files version $version -EOF -fi - -# Fix some ownership and permissions -chown -R root:root "$tmpdir" -chmod -R go-w "$tmpdir" - -# Perform the final magic -dpkg-gencontrol -isp -dpkg --build "$tmpdir" .. - -exit 0 - -- 1.5.4.1.144.gdfee-dirty