From patchwork Thu Dec 8 20:28:35 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kara X-Patchwork-Id: 130223 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id D250E1007D1 for ; Fri, 9 Dec 2011 07:28:50 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751405Ab1LHU2t (ORCPT ); Thu, 8 Dec 2011 15:28:49 -0500 Received: from cantor2.suse.de ([195.135.220.15]:41154 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750988Ab1LHU2t (ORCPT ); Thu, 8 Dec 2011 15:28:49 -0500 Received: from relay1.suse.de (nat.nue.novell.com [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id D11978B013; Thu, 8 Dec 2011 21:28:48 +0100 (CET) Received: by quack.suse.cz (Postfix, from userid 1000) id 72B85205C8; Thu, 8 Dec 2011 21:28:48 +0100 (CET) From: Jan Kara To: linux-ext4@vger.kernel.org Cc: Ted Tso , Jan Kara Subject: [PATCH] ext3: Fix error handling on inode bitmap corruption Date: Thu, 8 Dec 2011 21:28:35 +0100 Message-Id: <1323376115-23881-2-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1323376115-23881-1-git-send-email-jack@suse.cz> References: <1323376115-23881-1-git-send-email-jack@suse.cz> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org When insert_inode_locked() fails in ext3_new_inode() it most likely means inode bitmap got corrupted and we allocated again inode which is already in use. Also doing unlock_new_inode() during error recovery is wrong since inode does not have I_NEW set. Fix the problem by jumping to fail: (instead of fail_drop:) which declares filesystem error and does not call unlock_new_inode(). Signed-off-by: Jan Kara Reviewed-by: Eric Sandeen --- fs/ext3/ialloc.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c index 5c866e0..adae962 100644 --- a/fs/ext3/ialloc.c +++ b/fs/ext3/ialloc.c @@ -525,8 +525,12 @@ got: if (IS_DIRSYNC(inode)) handle->h_sync = 1; if (insert_inode_locked(inode) < 0) { - err = -EINVAL; - goto fail_drop; + /* + * Likely a bitmap corruption causing inode to be allocated + * twice. + */ + err = -EIO; + goto fail; } spin_lock(&sbi->s_next_gen_lock); inode->i_generation = sbi->s_next_generation++;