From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dmitry Monakhov Subject: [PATCH 5/6] ext4: handle errors in orphan_cleanup Date: Thu, 8 Apr 2010 22:04:24 +0400 Message-ID: <1270749865-25441-6-git-send-email-dmonakhov@openvz.org> References: <1270749865-25441-1-git-send-email-dmonakhov@openvz.org> <1270749865-25441-2-git-send-email-dmonakhov@openvz.org> <1270749865-25441-3-git-send-email-dmonakhov@openvz.org> <1270749865-25441-4-git-send-email-dmonakhov@openvz.org> <1270749865-25441-5-git-send-email-dmonakhov@openvz.org> Cc: jack@suse.cz, hch@infradead.org, sandeen@redhat.com, Dmitry Monakhov To: linux-fsdevel@vger.kernel.org Return-path: Received: from mail-bw0-f209.google.com ([209.85.218.209]:64715 "EHLO mail-bw0-f209.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932979Ab0DHSFg (ORCPT ); Thu, 8 Apr 2010 14:05:36 -0400 Received: by mail-bw0-f209.google.com with SMTP id 1so1996475bwz.21 for ; Thu, 08 Apr 2010 11:05:36 -0700 (PDT) In-Reply-To: <1270749865-25441-5-git-send-email-dmonakhov@openvz.org> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Orphan cleanup procedure is complex task and may fail due to number of reasons. Handle errors from orphan_cleanp according to predefined per-sb errors behavior flags. Signed-off-by: Dmitry Monakhov --- fs/ext4/super.c | 30 ++++++++++++++++++++++-------- 1 files changed, 22 insertions(+), 8 deletions(-) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index edcf3b0..230b71c 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1873,23 +1873,24 @@ static int ext4_check_descriptors(struct super_block *sb) * e2fsck was run on this filesystem, and it must have already done the orphan * inode cleanup for us, so we can safely abort without any further action. */ -static void ext4_orphan_cleanup(struct super_block *sb, +static int ext4_orphan_cleanup(struct super_block *sb, struct ext4_super_block *es) { unsigned int s_flags = sb->s_flags; int nr_orphans = 0, nr_truncates = 0; + int ret = 0; #ifdef CONFIG_QUOTA int i; #endif if (!es->s_last_orphan) { jbd_debug(4, "no orphan inodes to clean up\n"); - return; + return 0; } if (bdev_read_only(sb->s_bdev)) { ext4_msg(sb, KERN_ERR, "write access " "unavailable, skipping orphan cleanup"); - return; + return 0; } if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) { @@ -1898,7 +1899,7 @@ static void ext4_orphan_cleanup(struct super_block *sb, "clearing orphan list.\n"); es->s_last_orphan = 0; jbd_debug(1, "Skipping orphan recovery on fs with errors.\n"); - return; + return 0; } if (s_flags & MS_RDONLY) { @@ -1911,11 +1912,14 @@ static void ext4_orphan_cleanup(struct super_block *sb, /* Turn on quotas so that they are updated correctly */ for (i = 0; i < MAXQUOTAS; i++) { if (EXT4_SB(sb)->s_qf_names[i]) { - int ret = ext4_quota_on_mount(sb, i); - if (ret < 0) + ret = ext4_quota_on_mount(sb, i); + if (ret < 0) { ext4_msg(sb, KERN_ERR, "Cannot turn on journaled " "quota: error %d", ret); + if (!test_opt (sb, ERRORS_CONT)) + goto out; + } } } #endif @@ -1951,13 +1955,16 @@ static void ext4_orphan_cleanup(struct super_block *sb, } #define PLURAL(x) (x), ((x) == 1) ? "" : "s" - +out: if (nr_orphans) ext4_msg(sb, KERN_INFO, "%d orphan inode%s deleted", PLURAL(nr_orphans)); if (nr_truncates) ext4_msg(sb, KERN_INFO, "%d truncate%s cleaned up", PLURAL(nr_truncates)); + if (ret) + ext4_msg(sb, KERN_ERR, "Error %d wile orphan cleanup", ret); + #ifdef CONFIG_QUOTA /* Turn quotas off */ for (i = 0; i < MAXQUOTAS; i++) { @@ -1966,6 +1973,7 @@ static void ext4_orphan_cleanup(struct super_block *sb, } #endif sb->s_flags = s_flags; /* Restore MS_RDONLY status */ + return ret; } /* @@ -2915,7 +2923,13 @@ no_journal: }; EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS; - ext4_orphan_cleanup(sb, es); + ret = ext4_orphan_cleanup(sb, es); + if (err) { + ext4_mb_release(sb); + ext4_ext_release(sb); + goto failed_mount4; + } + EXT4_SB(sb)->s_mount_state &= ~EXT4_ORPHAN_FS; if (needs_recovery) { ext4_msg(sb, KERN_INFO, "recovery complete"); -- 1.6.6.1