From patchwork Tue May 3 13:08:37 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Surbhi Palande X-Patchwork-Id: 93784 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 DFA9DB6F6C for ; Tue, 3 May 2011 23:08:50 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751060Ab1ECNIs (ORCPT ); Tue, 3 May 2011 09:08:48 -0400 Received: from adelie.canonical.com ([91.189.90.139]:38725 "EHLO adelie.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750740Ab1ECNIs (ORCPT ); Tue, 3 May 2011 09:08:48 -0400 Received: from youngberry.canonical.com ([91.189.89.112]) by adelie.canonical.com with esmtp (Exim 4.71 #1 (Debian)) id 1QHFLF-000318-0v; Tue, 03 May 2011 13:08:41 +0000 Received: from a91-152-95-148.elisa-laajakaista.fi ([91.152.95.148] helo=canonical.com) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1QHFLE-0007ip-OH; Tue, 03 May 2011 13:08:40 +0000 From: Surbhi Palande To: jack@suse.cz Cc: toshi.okajima@jp.fujitsu.com, tytso@mit.edu, m.mizuma@jp.fujitsu.com, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, sandeen@redhat.com Subject: [PATCH] Prevent dirtying a page when ext4 F.S is frozen Date: Tue, 3 May 2011 16:08:37 +0300 Message-Id: <1304428117-6195-2-git-send-email-surbhi.palande@canonical.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <4DBFE09E.5070805@canonical.com> References: <4DBFE09E.5070805@canonical.com> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Prevent dirtying a page when ext4 F.S is frozen. Also take the write semaphore sb->s_umount to prevent a F.S freeze from racing with the page dirtying process. Without this we can end up dirtying a page while a F.S freeze happened because of preemption. Signed-off-by: Surbhi Palande --- fs/ext4/inode.c | 35 ++++++++++++++++++++++++++++++++++- 1 files changed, 34 insertions(+), 1 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index f2fa5e8..db3f99d 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3827,8 +3827,41 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb, */ static int ext4_journalled_set_page_dirty(struct page *page) { + int ret=0; + struct inode * inode = NULL; + struct super_block * sb = NULL; + + if(likely((page->mapping) && (page->mapping->host))){ + inode = page->mapping->host; + if(likely(inode->i_sb)){ + sb = inode->i_sb; + /* we do not want a freeze to start now if F.S is not + * already frozen*/ + down_write(&sb->s_umount); + if(sb->s_frozen != SB_UNFROZEN) { + /* F.S is frozen. + * we dont want to sleep with s_umount held. + * Or else we might race with thaw_super */ + up_write(&sb->s_umount); + vfs_check_frozen(sb, SB_FREEZE_WRITE); + /* F.S is no more frozen. We do not want the + * FS freeze to begin after this point + */ + down_write(&sb->s_umount); + } + } + } SetPageChecked(page); - return __set_page_dirty_nobuffers(page); + ret = __set_page_dirty_nobuffers(page); + if(likely((page->mapping) && (page->mapping->host))){ + if(likely(inode->i_sb)){ + up_write(&sb->s_umount); + /* If we freeze after this point, the dirtied page can + * be flushed out! + */ + } + } + return ret; } static const struct address_space_operations ext4_ordered_aops = {