mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ben Hutchings <ben@decadent.org.uk>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk, Josh Cartwright <joshc@linux.com>,
	Artem Bityutskiy <artem.bityutskiy@linux.intel.com>,
	David Woodhouse <David.Woodhouse@intel.com>
Subject: [ 27/53] jffs2: Fix lock acquisition order bug in gc path
Date: Fri, 18 May 2012 03:33:21 +0100	[thread overview]
Message-ID: <20120518023258.031023376@decadent.org.uk> (raw)
In-Reply-To: <20120518023254.339945758@decadent.org.uk>

3.2.18-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Josh Cartwright <joshc@linux.com>

commit 226bb7df3d22bcf4a1c0fe8206c80cc427498eae upstream.

The locking policy is such that the erase_complete_block spinlock is
nested within the alloc_sem mutex.  This fixes a case in which the
acquisition order was erroneously reversed.  This issue was caught by
the following lockdep splat:

   =======================================================
   [ INFO: possible circular locking dependency detected ]
   3.0.5 #1
   -------------------------------------------------------
   jffs2_gcd_mtd6/299 is trying to acquire lock:
    (&c->alloc_sem){+.+.+.}, at: [<c01f7714>] jffs2_garbage_collect_pass+0x314/0x890

   but task is already holding lock:
    (&(&c->erase_completion_lock)->rlock){+.+...}, at: [<c01f7708>] jffs2_garbage_collect_pass+0x308/0x890

   which lock already depends on the new lock.

   the existing dependency chain (in reverse order) is:

   -> #1 (&(&c->erase_completion_lock)->rlock){+.+...}:
          [<c008bec4>] validate_chain+0xe6c/0x10bc
          [<c008c660>] __lock_acquire+0x54c/0xba4
          [<c008d240>] lock_acquire+0xa4/0x114
          [<c046780c>] _raw_spin_lock+0x3c/0x4c
          [<c01f744c>] jffs2_garbage_collect_pass+0x4c/0x890
          [<c01f937c>] jffs2_garbage_collect_thread+0x1b4/0x1cc
          [<c0071a68>] kthread+0x98/0xa0
          [<c000f264>] kernel_thread_exit+0x0/0x8

   -> #0 (&c->alloc_sem){+.+.+.}:
          [<c008ad2c>] print_circular_bug+0x70/0x2c4
          [<c008c08c>] validate_chain+0x1034/0x10bc
          [<c008c660>] __lock_acquire+0x54c/0xba4
          [<c008d240>] lock_acquire+0xa4/0x114
          [<c0466628>] mutex_lock_nested+0x74/0x33c
          [<c01f7714>] jffs2_garbage_collect_pass+0x314/0x890
          [<c01f937c>] jffs2_garbage_collect_thread+0x1b4/0x1cc
          [<c0071a68>] kthread+0x98/0xa0
          [<c000f264>] kernel_thread_exit+0x0/0x8

   other info that might help us debug this:

    Possible unsafe locking scenario:

          CPU0                    CPU1
          ----                    ----
     lock(&(&c->erase_completion_lock)->rlock);
                                  lock(&c->alloc_sem);
                                  lock(&(&c->erase_completion_lock)->rlock);
     lock(&c->alloc_sem);

    *** DEADLOCK ***

   1 lock held by jffs2_gcd_mtd6/299:
    #0:  (&(&c->erase_completion_lock)->rlock){+.+...}, at: [<c01f7708>] jffs2_garbage_collect_pass+0x308/0x890

   stack backtrace:
   [<c00155dc>] (unwind_backtrace+0x0/0x100) from [<c0463dc0>] (dump_stack+0x20/0x24)
   [<c0463dc0>] (dump_stack+0x20/0x24) from [<c008ae84>] (print_circular_bug+0x1c8/0x2c4)
   [<c008ae84>] (print_circular_bug+0x1c8/0x2c4) from [<c008c08c>] (validate_chain+0x1034/0x10bc)
   [<c008c08c>] (validate_chain+0x1034/0x10bc) from [<c008c660>] (__lock_acquire+0x54c/0xba4)
   [<c008c660>] (__lock_acquire+0x54c/0xba4) from [<c008d240>] (lock_acquire+0xa4/0x114)
   [<c008d240>] (lock_acquire+0xa4/0x114) from [<c0466628>] (mutex_lock_nested+0x74/0x33c)
   [<c0466628>] (mutex_lock_nested+0x74/0x33c) from [<c01f7714>] (jffs2_garbage_collect_pass+0x314/0x890)
   [<c01f7714>] (jffs2_garbage_collect_pass+0x314/0x890) from [<c01f937c>] (jffs2_garbage_collect_thread+0x1b4/0x1cc)
   [<c01f937c>] (jffs2_garbage_collect_thread+0x1b4/0x1cc) from [<c0071a68>] (kthread+0x98/0xa0)
   [<c0071a68>] (kthread+0x98/0xa0) from [<c000f264>] (kernel_thread_exit+0x0/0x8)

This was introduce in '81cfc9f jffs2: Fix serious write stall due to erase'.

Signed-off-by: Josh Cartwright <joshc@linux.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
[bwh: Backported to 3.2: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
---
 fs/jffs2/gc.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- linux.orig/fs/jffs2/gc.c
+++ linux/fs/jffs2/gc.c
@@ -225,8 +225,8 @@
 			return 0;
 
 		D1(printk(KERN_DEBUG "No progress from erasing blocks; doing GC anyway\n"));
-		spin_lock(&c->erase_completion_lock);
 		mutex_lock(&c->alloc_sem);
+		spin_lock(&c->erase_completion_lock);
 	}
 
 	/* First, work out which block we're garbage-collecting */




  parent reply	other threads:[~2012-05-18  2:58 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-18  2:32 [ 00/53] 3.2.18-stable review Ben Hutchings
2012-05-18  2:32 ` [ 01/53] regulator: Fix the logic to ensure new voltage setting in valid range Ben Hutchings
2012-05-18  2:32 ` [ 02/53] ARM: OMAP: Revert "ARM: OMAP: ctrl: Fix CONTROL_DSIPHY register fields" Ben Hutchings
2012-05-18  2:32 ` [ 03/53] ALSA: echoaudio: Remove incorrect part of assertion Ben Hutchings
2012-05-18  2:32 ` [ 04/53] ARM: orion5x: Fix GPIO enable bits for MPP9 Ben Hutchings
2012-05-18  2:32 ` [ 05/53] ALSA: HDA: Lessen CPU usage when waiting for chip to respond Ben Hutchings
2012-05-18  2:33 ` [ 06/53] percpu: pcpu_embed_first_chunk() should free unused parts after all allocs are complete Ben Hutchings
2012-05-18  2:33 ` [ 07/53] hugetlb: prevent BUG_ON in hugetlb_fault() -> hugetlb_cow() Ben Hutchings
2012-05-18  2:33 ` [ 08/53] namespaces, pid_ns: fix leakage on fork() failure Ben Hutchings
2012-05-18  2:33 ` [ 09/53] mm: nobootmem: fix sign extend problem in __free_pages_memory() Ben Hutchings
2012-05-18  2:33 ` [ 10/53] asix: Fix tx transfer padding for full-speed USB Ben Hutchings
2012-05-18  2:33 ` [ 11/53] netem: fix possible skb leak Ben Hutchings
2012-05-18  2:33 ` [ 12/53] net: In unregister_netdevice_notifier unregister the netdevices Ben Hutchings
2012-05-18  5:09   ` Herton Ronaldo Krzesinski
2012-05-18  5:41     ` David Miller
2012-05-19  0:31       ` Ben Hutchings
2012-05-19  3:43         ` David Miller
2012-05-18  2:33 ` [ 13/53] net: l2tp: unlock socket lock before returning from l2tp_ip_sendmsg Ben Hutchings
2012-05-18  2:33 ` [ 14/53] sky2: propogate rx hash when packet is copied Ben Hutchings
2012-05-18  2:33 ` [ 15/53] sky2: fix receive length error in mixed non-VLAN/VLAN traffic Ben Hutchings
2012-05-18  2:33 ` [ 16/53] sungem: Fix WakeOnLan Ben Hutchings
2012-05-18  2:33 ` [ 17/53] tg3: Avoid panic from reserved statblk field access Ben Hutchings
2012-05-18  2:33 ` [ 18/53] tcp: fix infinite cwnd in tcp_complete_cwr() Ben Hutchings
2012-05-18  2:33 ` [ 19/53] tcp: change tcp_adv_win_scale and tcp_rmem[2] Ben Hutchings
2012-05-18  2:33 ` [ 20/53] brcm80211: smac: pass missing argument to brcms_b_mute Ben Hutchings
2012-05-18  2:33 ` [ 21/53] phy:icplus:fix Auto Power Saving in ip101a_config_init Ben Hutchings
2012-05-18  2:33 ` [ 22/53] NFSv4: Revalidate uid/gid after open Ben Hutchings
2012-05-18  2:33 ` [ 23/53] target: Drop incorrect se_lun_acl release for dynamic -> explict ACL conversion Ben Hutchings
2012-05-18  2:33 ` [ 24/53] [media] marvell-cam: fix an ARM build error Ben Hutchings
2012-05-18  2:33 ` [ 25/53] [media] rc: Postpone ISR registration Ben Hutchings
2012-05-18  2:33 ` [ 26/53] cdc_ether: Ignore bogus union descriptor for RNDIS devices Ben Hutchings
2012-05-18  2:33 ` Ben Hutchings [this message]
2012-05-18  2:33 ` [ 28/53] [media] s5p-fimc: Fix locking in subdev set_crop op Ben Hutchings
2012-05-18  2:33 ` [ 29/53] dm mpath: check if scsi_dh module already loaded before trying to load Ben Hutchings
2012-05-18  2:33 ` [ 30/53] sparc64: Do not clobber %g2 in xcall_fetch_glob_regs() Ben Hutchings
2012-05-18  2:33 ` [ 31/53] gpio: Add missing spin_lock_init in gpio-ml-ioh driver Ben Hutchings
2012-05-18  2:33 ` [ 32/53] spi-topcliff-pch: Modify pci-bus number dynamically to get DMA device info Ben Hutchings
2012-05-18  2:33 ` [ 33/53] spi-topcliff-pch: Fix issue for transmitting over 4KByte Ben Hutchings
2012-05-18  2:33 ` [ 34/53] spi-topcliff-pch: supports a spi mode setup and bit order setup by IO control Ben Hutchings
2012-05-18  2:33 ` [ 35/53] spi-topcliff-pch: add recovery processing in case wait-event timeout Ben Hutchings
2012-05-18  2:33 ` [ 36/53] ext4: avoid deadlock on sync-mounted FS w/o journal Ben Hutchings
2012-05-18  2:33 ` [ 37/53] ia64: Add accept4() syscall Ben Hutchings
2012-05-18  2:33 ` [ 38/53] brcm80211: smac: fix endless retry of A-MPDU transmissions Ben Hutchings
2012-05-18  2:33 ` [ 39/53] ARM: 7417/1: vfp: ensure preemption is disabled when enabling VFP access Ben Hutchings
2012-05-18  2:33 ` [ 40/53] target: Fix SPC-2 RELEASE bug for multi-session iSCSI client setups Ben Hutchings
2012-05-18  2:33 ` [ 41/53] crypto: mv_cesa requires on CRYPTO_HASH to build Ben Hutchings
2012-05-18  2:33 ` [ 42/53] ALSA: hda/idt - Fix power-map for speaker-pins with some HP laptops Ben Hutchings
2012-05-18  2:33 ` [ 43/53] ASoC: wm8994: Fix AIF2ADC power down Ben Hutchings
2012-05-18  2:33 ` [ 44/53] usbnet: fix skb traversing races during unlink(v2) Ben Hutchings
2012-05-18  2:33 ` [ 45/53] cdc_ether: add Novatel USB551L device IDs for FLAG_WWAN Ben Hutchings
2012-05-18  2:33 ` [ 46/53] ARM: prevent VM_GROWSDOWN mmaps extending below FIRST_USER_ADDRESS Ben Hutchings
2012-05-18  2:33 ` [ 47/53] arch/tile: apply commit 74fca9da0 to the compat signal handling as well Ben Hutchings
2012-05-18  2:33 ` [ 48/53] MD: Add del_timer_sync to mddev_suspend (fix nasty panic) Ben Hutchings
2012-05-18  2:33 ` [ 49/53] target: Fix bug in handling of FILEIO + block_device resize ops Ben Hutchings
2012-05-18  2:33 ` [ 50/53] tcp: do_tcp_sendpages() must try to push data out on oom conditions Ben Hutchings
2012-05-18  2:33 ` [ 51/53] e1000: Prevent reset task killing itself Ben Hutchings
2012-05-18  2:33 ` [ 52/53] mtd: map.h: fix arm cross-build failure Ben Hutchings
2012-05-18  2:33 ` [ 53/53] stmmac: Fix compilation error in mmc_core.c Ben Hutchings
2012-05-18 14:46 ` [ 00/53] 3.2.18-stable review Steven Rostedt
2012-05-18 18:22   ` Greg KH
2012-05-18 22:00     ` Ben Hutchings
2012-05-18 22:04       ` Willy Tarreau
2012-05-19  0:48       ` Steven Rostedt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120518023258.031023376@decadent.org.uk \
    --to=ben@decadent.org.uk \
    --cc=David.Woodhouse@intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=artem.bityutskiy@linux.intel.com \
    --cc=joshc@linux.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome