[kernel/f17] Add patch to fix mount hangs (rhbz 835019)
Josh Boyer
jwboyer at fedoraproject.org
Tue Jun 26 15:38:26 UTC 2012
commit 1c5ab3b392f767cb8a0cf137c25396c4ef5f9e60
Author: Josh Boyer <jwboyer at redhat.com>
Date: Tue Jun 26 11:38:02 2012 -0400
Add patch to fix mount hangs (rhbz 835019)
block-fix-infinite-loop-in-__getblk_slow.patch | 153 ++++++++++++++++++++++++
kernel.spec | 11 ++-
2 files changed, 163 insertions(+), 1 deletions(-)
---
diff --git a/block-fix-infinite-loop-in-__getblk_slow.patch b/block-fix-infinite-loop-in-__getblk_slow.patch
new file mode 100644
index 0000000..f075a71
--- /dev/null
+++ b/block-fix-infinite-loop-in-__getblk_slow.patch
@@ -0,0 +1,153 @@
+
+Delivered-To: jwboyer at gmail.com
+Received: by 10.229.191.66 with SMTP id dl2csp36421qcb;
+ Tue, 26 Jun 2012 07:55:48 -0700 (PDT)
+Received: by 10.68.228.136 with SMTP id si8mr53042278pbc.159.1340722548310;
+ Tue, 26 Jun 2012 07:55:48 -0700 (PDT)
+Return-Path: <stable-owner at vger.kernel.org>
+Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67])
+ by mx.google.com with ESMTP id qg1si15735731pbc.300.2012.06.26.07.55.47;
+ Tue, 26 Jun 2012 07:55:48 -0700 (PDT)
+Received-SPF: pass (google.com: best guess record for domain of stable-owner at vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67;
+Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of stable-owner at vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mail=stable-owner at vger.kernel.org
+Received: (majordomo at vger.kernel.org) by vger.kernel.org via listexpand
+ id S1757370Ab2FZOzp (ORCPT <rfc822;aaditya.kumar.30 at gmail.com>
+ + 23 others); Tue, 26 Jun 2012 10:55:45 -0400
+Received: from mx1.redhat.com ([209.132.183.28]:64097 "EHLO mx1.redhat.com"
+ rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP
+ id S1757325Ab2FZOzo (ORCPT <rfc822;stable at vger.kernel.org>);
+ Tue, 26 Jun 2012 10:55:44 -0400
+Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
+ by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q5QEtbK2017450
+ (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
+ Tue, 26 Jun 2012 10:55:38 -0400
+Received: from segfault.boston.devel.redhat.com (segfault.boston.devel.redhat.com [10.16.60.26])
+ by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q5QEtZV9023431;
+ Tue, 26 Jun 2012 10:55:35 -0400
+From: Jeff Moyer <jmoyer at redhat.com>
+To: Jens Axboe <jaxboe at fusionio.com>, Nick Piggin <npiggin at kernel.dk>
+Cc: LKML List <linux-kernel at vger.kernel.org>,
+ torsten.hilbrich at secunet.com, Richard Jones <rjones at redhat.com>,
+ stable at vger.kernel.org, Marcos Mello <marcosfrm at gmail.com>
+Subject: [patch] block: fix infinite loop in __getblk_slow
+X-PGP-KeyID: 1F78E1B4
+X-PGP-CertKey: F6FE 280D 8293 F72C 65FD 5A58 1FF8 A7CA 1F78 E1B4
+X-PCLoadLetter: What the f**k does that mean?
+Date: Tue, 26 Jun 2012 10:55:34 -0400
+Message-ID: <x49r4t2rul5.fsf at segfault.boston.devel.redhat.com>
+User-Agent: Gnus/5.110011 (No Gnus v0.11) Emacs/23.1 (gnu/linux)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
+Sender: stable-owner at vger.kernel.org
+Precedence: bulk
+List-ID: <stable.vger.kernel.org>
+X-Mailing-List: stable at vger.kernel.org
+
+Hi,
+
+This commit:
+
+commit 080399aaaf3531f5b8761ec0ac30ff98891e8686
+Author: Jeff Moyer <jmoyer at redhat.com>
+Date: Fri May 11 16:34:10 2012 +0200
+
+ block: don't mark buffers beyond end of disk as mapped
+
+exposed a bug in __getblk_slow that causes mount to hang as it loops
+infinitely waiting for a buffer that lies beyond the end of the disk to
+become uptodate. The problem was initially reported by Torsten Hilbrich
+here: https://lkml.org/lkml/2012/6/18/54, and also reported
+independently here:
+http://www.sysresccd.org/forums/viewtopic.php?f=13&t=4511, and then
+Richard W.M. Jones and Marcos Mello noted a few separate bugzillas also
+associated with the same issue.
+
+The main problem is here, in __getblk_slow:
+
+ for (;;) {
+ struct buffer_head * bh;
+ int ret;
+
+ bh = __find_get_block(bdev, block, size);
+ if (bh)
+ return bh;
+
+ ret = grow_buffers(bdev, block, size);
+ if (ret < 0)
+ return NULL;
+ if (ret == 0)
+ free_more_memory();
+ }
+
+__find_get_block does not find the block, since it will not be marked as
+mapped, and so grow_buffers is called to fill in the buffers for the
+associated page. I believe the for (;;) loop is there primarily to
+retry in the case of memory pressure keeping grow_buffers from
+succeeding. However, we also continue to loop for other cases, like the
+block lying beond the end of the disk. So, the fix I came up with is to
+only loop when grow_buffers fails due to memory allocation issues
+(return value of 0).
+
+The attached patch was tested by myself, Torsten, and Rich, and was
+found to resolve the problem in call cases.
+
+Comments, as always, are appreciated.
+
+Signed-off-by: Jeff Moyer <jmoyer at redhat.com>
+Reported-and-Tested-by: Torsten Hilbrich <torsten.hilbrich at secunet.com>
+Tested-by: Richard W.M. Jones <rjones at redhat.com>
+Cc: Stable <stable at vger.kernel.org>
+
+--
+Stable Notes: this patch requires backport to 3.0, 3.2 and 3.3.
+
+diff --git a/fs/buffer.c b/fs/buffer.c
+index 838a9cf..c7062c8 100644
+--- a/fs/buffer.c
++++ b/fs/buffer.c
+@@ -1036,6 +1036,9 @@ grow_buffers(struct block_device *bdev, sector_t block, int size)
+ static struct buffer_head *
+ __getblk_slow(struct block_device *bdev, sector_t block, int size)
+ {
++ int ret;
++ struct buffer_head *bh;
++
+ /* Size must be multiple of hard sectorsize */
+ if (unlikely(size & (bdev_logical_block_size(bdev)-1) ||
+ (size < 512 || size > PAGE_SIZE))) {
+@@ -1048,20 +1051,21 @@ __getblk_slow(struct block_device *bdev, sector_t block, int size)
+ return NULL;
+ }
+
+- for (;;) {
+- struct buffer_head * bh;
+- int ret;
++retry:
++ bh = __find_get_block(bdev, block, size);
++ if (bh)
++ return bh;
+
++ ret = grow_buffers(bdev, block, size);
++ if (ret == 0) {
++ free_more_memory();
++ goto retry;
++ } else if (ret > 0) {
+ bh = __find_get_block(bdev, block, size);
+ if (bh)
+ return bh;
+-
+- ret = grow_buffers(bdev, block, size);
+- if (ret < 0)
+- return NULL;
+- if (ret == 0)
+- free_more_memory();
+ }
++ return NULL;
+ }
+
+ /*
+--
+To unsubscribe from this list: send the line "unsubscribe stable" in
+the body of a message to majordomo at vger.kernel.org
+More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/kernel.spec b/kernel.spec
index 9d8d9f9..e5d264f 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -54,7 +54,7 @@ Summary: The Linux kernel
# For non-released -rc kernels, this will be appended after the rcX and
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
#
-%global baserelease 1
+%global baserelease 2
%global fedora_build %{baserelease}
# base_sublevel is the kernel version we're starting with and patching
@@ -789,6 +789,9 @@ Patch22034: usb-storage-try-read_capacity-10-first.patch
#rhbz 828731
Patch22035: ath9k_htc-configure-bssid-on-ASSOC-IBSS-change.patch
+#rhbz 835019
+Patch22036: block-fix-infinite-loop-in-__getblk_slow.patch
+
# END OF PATCH DEFINITIONS
%endif
@@ -1516,6 +1519,9 @@ ApplyPatch usb-storage-try-read_capacity-10-first.patch
#rhbz 828731
ApplyPatch ath9k_htc-configure-bssid-on-ASSOC-IBSS-change.patch
+#rhbz 835019
+ApplyPatch block-fix-infinite-loop-in-__getblk_slow.patch
+
# END OF PATCH APPLICATIONS
%endif
@@ -2370,6 +2376,9 @@ fi
# '-' | |
# '-'
%changelog
+* Tue Jun 26 2012 Josh Boyer <jwboyer at redhat.com>
+- Add patch to fix mount hangs (rhbz 835019)
+
* Tue Jun 26 2012 John W. Linville <linville at redhat.com>
- ath9k_htc: configure bssid on ASSOC/IBSS change (rhbz 828731)
More information about the scm-commits
mailing list