From patchwork Wed Aug 5 09:51:20 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Hocko X-Patchwork-Id: 503951 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 179DF14029D for ; Wed, 5 Aug 2015 19:55:56 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752615AbbHEJv4 (ORCPT ); Wed, 5 Aug 2015 05:51:56 -0400 Received: from mail-wi0-f172.google.com ([209.85.212.172]:35693 "EHLO mail-wi0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752544AbbHEJvx (ORCPT ); Wed, 5 Aug 2015 05:51:53 -0400 Received: by wibxm9 with SMTP id xm9so200911382wib.0; Wed, 05 Aug 2015 02:51:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gyiXEG/lD1ID3pqNFP+V9vTPFrjSlxPRwa0RzHEIcc0=; b=DCJRkpCCT47mciLq7tM+ttdy68XP9Cu2oyaPPgZe0QmGiuVUCirXzAsv/fO7YOZbZr gaSSP46CqDuZD8FVeIchddC0VisFU8gyjh/pcmgakTeSAg7XcFtfiN6BO9mmOWjyRv9+ wu/dIIM/cAj1EOUZF3GvQKtT3TeAyD6ADIyKf6Gcmo2e8Uy4h80Sikw5TUi4E7vEZ4t+ sxasTATPoL6k7iVWHWx0e4W+DQi4kAUYlviuombBznC5NJMGD9lx1btk4YTz1QPC3ric g7VQ6ZbJ9CUfJ3R0nVashw39NuCuYeGSuhVRB31RIid+XonOlJCMLJG/Xt5MOXhdo8Bk I8UQ== X-Received: by 10.180.109.106 with SMTP id hr10mr8737296wib.58.1438768311646; Wed, 05 Aug 2015 02:51:51 -0700 (PDT) Received: from tiehlicka.suse.cz (nat1.scz.suse.com. [213.151.88.250]) by smtp.gmail.com with ESMTPSA id yu4sm3229106wjc.43.2015.08.05.02.51.50 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 05 Aug 2015 02:51:51 -0700 (PDT) From: mhocko@kernel.org To: LKML Cc: , , Andrew Morton , Johannes Weiner , Tetsuo Handa , Dave Chinner , "Theodore Ts'o" , linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, Jan Kara , Michal Hocko Subject: [RFC 4/8] jbd, jbd2: Do not fail journal because of frozen_buffer allocation failure Date: Wed, 5 Aug 2015 11:51:20 +0200 Message-Id: <1438768284-30927-5-git-send-email-mhocko@kernel.org> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1438768284-30927-1-git-send-email-mhocko@kernel.org> References: <1438768284-30927-1-git-send-email-mhocko@kernel.org> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Michal Hocko Journal transaction might fail prematurely because the frozen_buffer is allocated by GFP_NOFS request: [ 72.440013] do_get_write_access: OOM for frozen_buffer [ 72.440014] EXT4-fs: ext4_reserve_inode_write:4729: aborting transaction: Out of memory in __ext4_journal_get_write_access [ 72.440015] EXT4-fs error (device sda1) in ext4_reserve_inode_write:4735: Out of memory (...snipped....) [ 72.495559] do_get_write_access: OOM for frozen_buffer [ 72.495560] EXT4-fs: ext4_reserve_inode_write:4729: aborting transaction: Out of memory in __ext4_journal_get_write_access [ 72.496839] do_get_write_access: OOM for frozen_buffer [ 72.496841] EXT4-fs: ext4_reserve_inode_write:4729: aborting transaction: Out of memory in __ext4_journal_get_write_access [ 72.505766] Aborting journal on device sda1-8. [ 72.505851] EXT4-fs (sda1): Remounting filesystem read-only This wasn't a problem until "mm: page_alloc: do not lock up GFP_NOFS allocations upon OOM" because small GPF_NOFS allocations never failed. This allocation seems essential for the journal and GFP_NOFS is too restrictive to the memory allocator so let's use __GFP_NOFAIL here to emulate the previous behavior. jbd code has the very same issue so let's do the same there as well. Signed-off-by: Michal Hocko Reviewed-by: Jan Kara --- fs/jbd/transaction.c | 11 +---------- fs/jbd2/transaction.c | 14 +++----------- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index 1695ba8334a2..bf7474deda2f 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c @@ -673,16 +673,7 @@ do_get_write_access(handle_t *handle, struct journal_head *jh, jbd_unlock_bh_state(bh); frozen_buffer = jbd_alloc(jh2bh(jh)->b_size, - GFP_NOFS); - if (!frozen_buffer) { - printk(KERN_ERR - "%s: OOM for frozen_buffer\n", - __func__); - JBUFFER_TRACE(jh, "oom!"); - error = -ENOMEM; - jbd_lock_bh_state(bh); - goto done; - } + GFP_NOFS|__GFP_NOFAIL); goto repeat; } jh->b_frozen_data = frozen_buffer; diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index ff2f2e6ad311..bff071e21553 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c @@ -923,16 +923,7 @@ do_get_write_access(handle_t *handle, struct journal_head *jh, jbd_unlock_bh_state(bh); frozen_buffer = jbd2_alloc(jh2bh(jh)->b_size, - GFP_NOFS); - if (!frozen_buffer) { - printk(KERN_ERR - "%s: OOM for frozen_buffer\n", - __func__); - JBUFFER_TRACE(jh, "oom!"); - error = -ENOMEM; - jbd_lock_bh_state(bh); - goto done; - } + GFP_NOFS|__GFP_NOFAIL); goto repeat; } jh->b_frozen_data = frozen_buffer; @@ -1157,7 +1148,8 @@ int jbd2_journal_get_undo_access(handle_t *handle, struct buffer_head *bh) repeat: if (!jh->b_committed_data) { - committed_data = jbd2_alloc(jh2bh(jh)->b_size, GFP_NOFS); + committed_data = jbd2_alloc(jh2bh(jh)->b_size, + GFP_NOFS|__GFP_NOFAIL); if (!committed_data) { printk(KERN_ERR "%s: No memory for committed data\n", __func__);