05 Jan, 2010
13 commits
-
In bbc_envctrl_init() we have to unlink the fan and temp instances
from the lists because our caller is going to free up the 'bp' object
if we return an error.We can't rely upon bbc_envctrl_cleanup() to do this work for us in
this case.Reported-by: Patrick Finnegan
Signed-off-by: David S. Miller -
* 'limits_cleanup' of git://decibel.fi.muni.cz/~xslaby/linux:
resource: add helpers for fetching rlimits
resource: move kernel function inside __KERNEL__
SECURITY: selinux, fix update_rlimit_cpu parameter -
* 'for-linus/samsung' of git://git.fluff.org/bjdooks/linux:
ARM: S3C: Fix NAND device registration by s3c_nand_set_platdata().
ARM: S3C24XX: touchscreen device definition
ARM: mach-bast: add NAND_SCAN_SILENT_NODEV to optional devices
ARM: mach-osiris: add NAND_SCAN_SILENT_NODEV to optional devices
ARM: S3C24XX: touchscreen device definition -
Holding locks over device_del -> kobject_del -> sysfs_deactivate can
cause deadlocks if those same locks are grabbed in sysfs show or store
methods.The I model s_active count + completion as a sleeping read/write lock.
I describe to lockdep sysfs_get_active as a read_trylock,
sysfs_put_active as a read_unlock, and sysfs_deactivate as a
write_lock and write_unlock pair. This seems to capture the essence
for purposes of finding deadlocks, and in my testing gives finds real
issues and ignores non-issues.This brings us back to holding locks over kobject_del is a problem
that ideally we should find a way of addressing, but at least lockdep
can tell us about the problems instead of requiring developers to debug
rare strange system deadlocks, that happen when sysfs files are removed
while being written to.Signed-off-by: Eric W. Biederman
Acked-by: Tejun Heo
Signed-off-by: Linus Torvalds -
We kill the guest, but then we blatt random stuff.
Reported-by: Dan Carpenter
Signed-off-by: Rusty Russell
Cc: stable@kernel.org
Signed-off-by: Linus Torvalds -
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6:
[S390] Update default configuration.
[S390] Have param.h simply include .
[S390] qdio: convert global statistics to per-device stats -
* 'sh/for-2.6.33' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6:
binfmt_elf_fdpic: Fix build breakage introduced by coredump changes.
sh: update defconfigs.
sh: Don't default enable PMB support.
sh: Disable PMB for SH4AL-DSP CPUs.
sh: Only provide a PCLK definition for legacy CPG CPUs. -
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
ext4: Calculate metadata requirements more accurately
ext4: Fix accounting of reserved metadata blocks -
We wrap the smm calls and other bits with the BKL push down as a
precaution but they can probably goSigned-off-by: Alan Cox
Signed-off-by: Linus Torvalds -
Nobody seems to want to own I2O patches so sending this one directly.
Signed-off-by: Alan Cox
Signed-off-by: Linus Torvalds -
The BKL is in this function because of the BKL pushdown (see commit
f8f2c79d594463427f7114cedb1555110d547d89)It is not needed here because the mutex_lock sonypi_device.lock provides
the necessary locking.sonypi_misc_ioctl can be converted to unlocked ioctls since it relies on
its own locking (the mutex sonypi_device.lock) and not the bklDocument that llseek is not needed by explictly setting it to no_llseek
LKML-Reference:
Signed-off-by: John Kacur
Acked-by: Arnd Bergmann
Signed-off-by: Linus Torvalds -
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2:
nilfs2: update mailing list address
nilfs2: Storage class should be before const qualifier
nilfs2: trivial coding style fix
04 Jan, 2010
12 commits
-
We want to be sure that compiler fetches the limit variable only
once, so add helpers for fetching current and maximal resource
limits which do that.Add them to sched.h (instead of resource.h) due to circular dependency
sched.h->resource.h->task_struct
Alternative would be to create a separate res_access.h or similar.Signed-off-by: Jiri Slaby
Cc: James Morris
Cc: Heiko Carstens
Cc: Andrew Morton
Cc: Ingo Molnar -
It is an internal function. Move it inside __KERNEL__ ifdef, along
with task_struct declaration.Then we get:
--- /usr/include/linux/resource.h 2009-09-14 15:09:29.000000000 +0200
+++ usr/include/linux/resource.h 2010-01-04 11:30:54.000000000 +0100
@@ -3,8 +3,6 @@#include
-struct task_struct;
-
/*
* Resource control/accounting header file for linux
*/
@@ -70,6 +68,5 @@
*/
#include-int getrusage(struct task_struct *p, int who, struct rusage *ru);
#endif
***********
include/linux/Kbuild is untouched, since unifdef is run even on
headers-y nowadays.Signed-off-by: Jiri Slaby
-
Don't pass current RLIMIT_RTTIME to update_rlimit_cpu() in
selinux_bprm_committing_creds, since update_rlimit_cpu expects
RLIMIT_CPU limit.Use proper rlim[RLIMIT_CPU].rlim_cur instead to fix that.
Signed-off-by: Jiri Slaby
Acked-by: James Morris
Cc: Stephen Smalley
Cc: Eric Paris
Cc: David Howells -
Signed-off-by: Martin Schwidefsky
-
Since the files have identical content, might as well simplify.
Signed-off-by: Robert P. J. Day
Signed-off-by: Heiko Carstens
Signed-off-by: Martin Schwidefsky -
Revamp the qdio performance statistics and move them from procfs to
debugfs using the seq_file interface. Since the statistics are not
intended for the general user the removal of /proc/qdio_perf should
not surprise anyone.The per device statistics are disabled by default, writing 1 to
//qdio//statistics enables the
statistics for the given device.Signed-off-by: Jan Glauber
Signed-off-by: Martin Schwidefsky -
Commit f6151dfea21496d43dbaba32cfcd9c9f404769bc introduces build
breakage, so this patch fixes it together with some printk formatting
cleanup.Signed-off-by: Daisuke HATAYAMA
Signed-off-by: Paul Mundt -
Signed-off-by: Paul Mundt
-
This has the adverse effect of converting many 29bit configs to 32bit
mode, while this is a change that needs to be done manually for each
platform. Turn it off by default in order to cut down on spurious bug
reports.Signed-off-by: Paul Mundt
-
While the PMB is available on SH-4A parts, SH4AL-DSP parts exclude it
altogether. As such, explicitly disable PMB support for these parts. If
this changes in the future for newer subtypes, this will have to be made
more fine-grained.Signed-off-by: Paul Mundt
-
Merge branch 's3c24xx-updates2' into for-linus/samsung
-
Merge branch 'next-simtec' into for-linus/samsung
03 Jan, 2010
5 commits
-
…t/frederic/random-tracing
* 'reiserfs/kill-bkl' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing:
reiserfs: Safely acquire i_mutex from xattr_rmdir
reiserfs: Safely acquire i_mutex from reiserfs_for_each_xattr
reiserfs: Fix journal mutex <-> inode mutex lock inversion
reiserfs: Fix unwanted recursive reiserfs lock in reiserfs_unlink()
reiserfs: Relax lock before open xattr dir in reiserfs_xattr_set_handle()
reiserfs: Relax reiserfs lock while freeing the journal
reiserfs: Fix reiserfs lock <-> i_mutex dependency inversion on xattr
reiserfs: Warn on lock relax if taken recursively
reiserfs: Fix reiserfs lock <-> i_xattr_sem dependency inversion
reiserfs: Fix remaining in-reclaim-fs <-> reclaim-fs-on locking inversion
reiserfs: Fix reiserfs lock <-> inode mutex dependency inversion
reiserfs: Fix reiserfs lock and journal lock inversion dependency
reiserfs: Fix possible recursive lock -
It seems that Documentation/DMA-mapping.txt was supposed to be renamed
to Documentation/PCI/PCI-DMA-mapping.txt.Signed-off-by: Kusanagi Kouichi
Signed-off-by: Randy Dunlap
Signed-off-by: Linus Torvalds -
ioremap() returns a void __iomem * not an unsigned long. Update the
Documentation file to reflect this.Signed-off-by: H Hartley Sweeten
Signed-off-by: Randy Dunlap
Cc: David Woodhouse
Signed-off-by: Linus Torvalds -
ioremap() returns a void __iomem * not a char *. Update the documentation
file to reflect this.Signed-off-by: H Hartley Sweeten
Signed-off-by: Randy Dunlap
Signed-off-by: Linus Torvalds -
Fix the following htmldocs warning:
Warning(fs/fs-writeback.c:255): No description found for parameter 'sb'
Signed-off-by: Jaswinder Singh Rajput
Signed-off-by: Randy Dunlap
Acked-by: Wu Fengguang
Cc: Peter Zijlstra
Cc: Jan Kara
Cc: Jens Axboe
Signed-off-by: Linus Torvalds
02 Jan, 2010
10 commits
-
This replaces the list address for nilfs discussion to linux-nilfs at
vger.kernel.org from users at nilfs.org.Signed-off-by: Ryusuke Konishi
-
Relax the reiserfs lock before taking the inode mutex from
xattr_rmdir() to avoid the usual reiserfs lock inode mutex
bad dependency.Signed-off-by: Frederic Weisbecker
Tested-by: Christian Kujau
Cc: Alexander Beregalov
Cc: Chris Mason
Cc: Ingo Molnar -
Relax the reiserfs lock before taking the inode mutex from
reiserfs_for_each_xattr() to avoid the usual bad dependencies:=======================================================
[ INFO: possible circular locking dependency detected ]
2.6.32-atom #179
-------------------------------------------------------
rm/3242 is trying to acquire lock:
(&sb->s_type->i_mutex_key#4/3){+.+.+.}, at: [] reiserfs_for_each_xattr+0x23f/0x290but task is already holding lock:
(&REISERFS_SB(s)->lock){+.+.+.}, at: [] reiserfs_write_lock+0x29/0x40which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&REISERFS_SB(s)->lock){+.+.+.}:
[] __lock_acquire+0x11ff/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] reiserfs_write_lock_once+0x29/0x50
[] reiserfs_lookup+0x62/0x140
[] __lookup_hash+0xef/0x110
[] lookup_one_len+0x8d/0xc0
[] open_xa_dir+0xea/0x1b0
[] reiserfs_for_each_xattr+0x70/0x290
[] reiserfs_delete_xattrs+0x1a/0x60
[] reiserfs_delete_inode+0x9f/0x150
[] generic_delete_inode+0xa2/0x170
[] generic_drop_inode+0x4f/0x70
[] iput+0x47/0x50
[] do_unlinkat+0xd5/0x160
[] sys_unlinkat+0x23/0x40
[] sysenter_do_call+0x12/0x32-> #0 (&sb->s_type->i_mutex_key#4/3){+.+.+.}:
[] __lock_acquire+0x18f6/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] reiserfs_for_each_xattr+0x23f/0x290
[] reiserfs_delete_xattrs+0x1a/0x60
[] reiserfs_delete_inode+0x9f/0x150
[] generic_delete_inode+0xa2/0x170
[] generic_drop_inode+0x4f/0x70
[] iput+0x47/0x50
[] do_unlinkat+0xd5/0x160
[] sys_unlinkat+0x23/0x40
[] sysenter_do_call+0x12/0x32other info that might help us debug this:
1 lock held by rm/3242:
#0: (&REISERFS_SB(s)->lock){+.+.+.}, at: [] reiserfs_write_lock+0x29/0x40stack backtrace:
Pid: 3242, comm: rm Not tainted 2.6.32-atom #179
Call Trace:
[] ? printk+0x18/0x1a
[] print_circular_bug+0xca/0xd0
[] __lock_acquire+0x18f6/0x19e0
[] ? mark_held_locks+0x62/0x80
[] ? trace_hardirqs_on+0xb/0x10
[] ? mutex_unlock+0x8/0x10
[] lock_acquire+0x68/0x90
[] ? reiserfs_for_each_xattr+0x23f/0x290
[] ? reiserfs_for_each_xattr+0x23f/0x290
[] mutex_lock_nested+0x5b/0x340
[] ? reiserfs_for_each_xattr+0x23f/0x290
[] reiserfs_for_each_xattr+0x23f/0x290
[] ? delete_one_xattr+0x0/0x100
[] reiserfs_delete_xattrs+0x1a/0x60
[] ? reiserfs_write_lock_once+0x29/0x50
[] reiserfs_delete_inode+0x9f/0x150
[] ? _atomic_dec_and_lock+0x4f/0x70
[] ? reiserfs_delete_inode+0x0/0x150
[] generic_delete_inode+0xa2/0x170
[] generic_drop_inode+0x4f/0x70
[] iput+0x47/0x50
[] do_unlinkat+0xd5/0x160
[] ? mutex_unlock+0x8/0x10
[] ? vfs_readdir+0x7d/0xb0
[] ? filldir64+0x0/0xf0
[] ? sysenter_exit+0xf/0x16
[] ? trace_hardirqs_on_caller+0x124/0x170
[] sys_unlinkat+0x23/0x40
[] sysenter_do_call+0x12/0x32Signed-off-by: Frederic Weisbecker
Tested-by: Christian Kujau
Cc: Alexander Beregalov
Cc: Chris Mason
Cc: Ingo Molnar -
We need to relax the reiserfs lock before locking the inode mutex
from xattr_unlink(), otherwise we'll face the usual bad dependencies:=======================================================
[ INFO: possible circular locking dependency detected ]
2.6.32-atom #178
-------------------------------------------------------
rm/3202 is trying to acquire lock:
(&journal->j_mutex){+.+...}, at: [] do_journal_begin_r+0x94/0x360but task is already holding lock:
(&sb->s_type->i_mutex_key#4/2){+.+...}, at: [] xattr_unlink+0x57/0xb0which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (&sb->s_type->i_mutex_key#4/2){+.+...}:
[] __lock_acquire+0x11ff/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] xattr_unlink+0x57/0xb0
[] delete_one_xattr+0x29/0x100
[] reiserfs_for_each_xattr+0x10b/0x290
[] reiserfs_delete_xattrs+0x1a/0x60
[] reiserfs_delete_inode+0x9f/0x150
[] generic_delete_inode+0xa2/0x170
[] generic_drop_inode+0x4f/0x70
[] iput+0x47/0x50
[] do_unlinkat+0xd5/0x160
[] sys_unlinkat+0x23/0x40
[] sysenter_do_call+0x12/0x32-> #1 (&REISERFS_SB(s)->lock){+.+.+.}:
[] __lock_acquire+0x11ff/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] reiserfs_write_lock+0x29/0x40
[] do_journal_begin_r+0x9c/0x360
[] journal_begin+0x80/0x130
[] reiserfs_remount+0x223/0x4e0
[] do_remount_sb+0xa6/0x140
[] do_mount+0x560/0x750
[] sys_mount+0x84/0xb0
[] sysenter_do_call+0x12/0x32-> #0 (&journal->j_mutex){+.+...}:
[] __lock_acquire+0x18f6/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] do_journal_begin_r+0x94/0x360
[] journal_begin+0x80/0x130
[] reiserfs_unlink+0x83/0x2e0
[] xattr_unlink+0x64/0xb0
[] delete_one_xattr+0x29/0x100
[] reiserfs_for_each_xattr+0x10b/0x290
[] reiserfs_delete_xattrs+0x1a/0x60
[] reiserfs_delete_inode+0x9f/0x150
[] generic_delete_inode+0xa2/0x170
[] generic_drop_inode+0x4f/0x70
[] iput+0x47/0x50
[] do_unlinkat+0xd5/0x160
[] sys_unlinkat+0x23/0x40
[] sysenter_do_call+0x12/0x32other info that might help us debug this:
2 locks held by rm/3202:
#0: (&sb->s_type->i_mutex_key#4/3){+.+.+.}, at: [] reiserfs_for_each_xattr+0x9b/0x290
#1: (&sb->s_type->i_mutex_key#4/2){+.+...}, at: [] xattr_unlink+0x57/0xb0stack backtrace:
Pid: 3202, comm: rm Not tainted 2.6.32-atom #178
Call Trace:
[] ? printk+0x18/0x1a
[] print_circular_bug+0xca/0xd0
[] __lock_acquire+0x18f6/0x19e0
[] ? xattr_unlink+0x57/0xb0
[] lock_acquire+0x68/0x90
[] ? do_journal_begin_r+0x94/0x360
[] ? do_journal_begin_r+0x94/0x360
[] mutex_lock_nested+0x5b/0x340
[] ? do_journal_begin_r+0x94/0x360
[] do_journal_begin_r+0x94/0x360
[] ? run_timer_softirq+0x1a6/0x220
[] ? __do_softirq+0x50/0x140
[] journal_begin+0x80/0x130
[] ? __do_softirq+0xf2/0x140
[] ? hrtimer_interrupt+0xdf/0x220
[] reiserfs_unlink+0x83/0x2e0
[] ? mark_held_locks+0x62/0x80
[] ? trace_hardirqs_on_thunk+0xc/0x10
[] ? restore_all_notrace+0x0/0x18
[] ? xattr_unlink+0x57/0xb0
[] xattr_unlink+0x64/0xb0
[] delete_one_xattr+0x29/0x100
[] reiserfs_for_each_xattr+0x10b/0x290
[] ? delete_one_xattr+0x0/0x100
[] ? mutex_lock_nested+0x299/0x340
[] reiserfs_delete_xattrs+0x1a/0x60
[] ? reiserfs_write_lock_once+0x29/0x50
[] reiserfs_delete_inode+0x9f/0x150
[] ? _atomic_dec_and_lock+0x4f/0x70
[] ? reiserfs_delete_inode+0x0/0x150
[] generic_delete_inode+0xa2/0x170
[] generic_drop_inode+0x4f/0x70
[] iput+0x47/0x50
[] do_unlinkat+0xd5/0x160
[] ? mutex_unlock+0x8/0x10
[] ? vfs_readdir+0x7d/0xb0
[] ? filldir64+0x0/0xf0
[] ? sysenter_exit+0xf/0x16
[] ? trace_hardirqs_on_caller+0x124/0x170
[] sys_unlinkat+0x23/0x40
[] sysenter_do_call+0x12/0x32Signed-off-by: Frederic Weisbecker
Tested-by: Christian Kujau
Cc: Alexander Beregalov
Cc: Chris Mason
Cc: Ingo Molnar -
reiserfs_unlink() may or may not be called under the reiserfs
lock.
But it also takes the reiserfs lock and can then acquire it
recursively which leads to do_journal_begin_r() that fails to
relax the reiserfs lock before grabbing the journal mutex,
creating an unexpected lock inversion.We need to ensure reiserfs_unlink() won't get the reiserfs lock
recursively using reiserfs_write_lock_once().This fixes the following warning that precedes a lock inversion
report (reiserfs lock journal mutex).------------[ cut here ]------------
WARNING: at fs/reiserfs/lock.c:95 reiserfs_lock_check_recursive+0x3a/0x50()
Hardware name: MS-7418
Unwanted recursive reiserfs lock!
Pid: 3208, comm: dbench Not tainted 2.6.32-atom #177
Call Trace:
[] ? reiserfs_lock_check_recursive+0x3a/0x50
[] ? reiserfs_lock_check_recursive+0x3a/0x50
[] warn_slowpath_common+0x67/0xc0
[] ? reiserfs_lock_check_recursive+0x3a/0x50
[] warn_slowpath_fmt+0x26/0x30
[] reiserfs_lock_check_recursive+0x3a/0x50
[] do_journal_begin_r+0x83/0x360
[] ? __lock_acquire+0x1296/0x19e0
[] ? xattr_unlink+0x57/0xb0
[] journal_begin+0x80/0x130
[] reiserfs_unlink+0x7d/0x2d0
[] ? xattr_unlink+0x57/0xb0
[] ? xattr_unlink+0x57/0xb0
[] ? xattr_unlink+0x57/0xb0
[] xattr_unlink+0x64/0xb0
[] delete_one_xattr+0x29/0x100
[] reiserfs_for_each_xattr+0x10b/0x290
[] ? delete_one_xattr+0x0/0x100
[] ? mutex_lock_nested+0x299/0x340
[] reiserfs_delete_xattrs+0x1a/0x60
[] ? reiserfs_write_lock_once+0x29/0x50
[] reiserfs_delete_inode+0x9f/0x150
[] ? _atomic_dec_and_lock+0x4f/0x70
[] ? reiserfs_delete_inode+0x0/0x150
[] generic_delete_inode+0xa2/0x170
[] generic_drop_inode+0x4f/0x70
[] iput+0x47/0x50
[] do_unlinkat+0xd5/0x160
[] ? up_read+0x16/0x30
[] ? do_page_fault+0x187/0x330
[] ? restore_all_notrace+0x0/0x18
[] ? do_page_fault+0x0/0x330
[] ? trace_hardirqs_on_caller+0x124/0x170
[] sys_unlink+0x10/0x20
[] sysenter_do_call+0x12/0x32
---[ end trace 2e35d71a6cc69d0c ]---Signed-off-by: Frederic Weisbecker
Tested-by: Christian Kujau
Cc: Alexander Beregalov
Cc: Chris Mason
Cc: Ingo Molnar -
We call xattr_lookup() from reiserfs_xattr_get(). We then hold
the reiserfs lock when we grab the i_mutex. But later, we may
relax the reiserfs lock, creating dependency inversion between
both locks.The lookups and creation jobs ar already protected by the
inode mutex, so we can safely relax the reiserfs lock, dropping
the unwanted reiserfs lock -> i_mutex dependency, as shown
in the following lockdep report:=======================================================
[ INFO: possible circular locking dependency detected ]
2.6.32-atom #173
-------------------------------------------------------
cp/3204 is trying to acquire lock:
(&REISERFS_SB(s)->lock){+.+.+.}, at: [] reiserfs_write_lock_once+0x29/0x50but task is already holding lock:
(&sb->s_type->i_mutex_key#4/3){+.+.+.}, at: [] open_xa_dir+0xd8/0x1b0which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&sb->s_type->i_mutex_key#4/3){+.+.+.}:
[] __lock_acquire+0x11ff/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] open_xa_dir+0x43/0x1b0
[] reiserfs_for_each_xattr+0x62/0x260
[] reiserfs_delete_xattrs+0x1a/0x60
[] reiserfs_delete_inode+0x9f/0x150
[] generic_delete_inode+0xa2/0x170
[] generic_drop_inode+0x4f/0x70
[] iput+0x47/0x50
[] do_unlinkat+0xd5/0x160
[] sys_unlink+0x10/0x20
[] sysenter_do_call+0x12/0x32-> #0 (&REISERFS_SB(s)->lock){+.+.+.}:
[] __lock_acquire+0x18f6/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] reiserfs_write_lock_once+0x29/0x50
[] reiserfs_lookup+0x62/0x140
[] __lookup_hash+0xef/0x110
[] lookup_one_len+0x8d/0xc0
[] open_xa_dir+0xea/0x1b0
[] xattr_lookup+0x15/0x160
[] reiserfs_xattr_get+0x56/0x2a0
[] reiserfs_get_acl+0xa2/0x360
[] reiserfs_cache_default_acl+0x3a/0x160
[] reiserfs_mkdir+0x6c/0x2c0
[] vfs_mkdir+0xd6/0x180
[] sys_mkdirat+0xc0/0xd0
[] sys_mkdir+0x20/0x30
[] sysenter_do_call+0x12/0x32other info that might help us debug this:
2 locks held by cp/3204:
#0: (&sb->s_type->i_mutex_key#4/1){+.+.+.}, at: [] lookup_create+0x26/0xa0
#1: (&sb->s_type->i_mutex_key#4/3){+.+.+.}, at: [] open_xa_dir+0xd8/0x1b0stack backtrace:
Pid: 3204, comm: cp Not tainted 2.6.32-atom #173
Call Trace:
[] ? printk+0x18/0x1a
[] print_circular_bug+0xca/0xd0
[] __lock_acquire+0x18f6/0x19e0
[] ? check_usage+0x6a/0x460
[] lock_acquire+0x68/0x90
[] ? reiserfs_write_lock_once+0x29/0x50
[] ? reiserfs_write_lock_once+0x29/0x50
[] mutex_lock_nested+0x5b/0x340
[] ? reiserfs_write_lock_once+0x29/0x50
[] reiserfs_write_lock_once+0x29/0x50
[] reiserfs_lookup+0x62/0x140
[] ? debug_check_no_locks_freed+0x8a/0x140
[] ? trace_hardirqs_on_caller+0x124/0x170
[] __lookup_hash+0xef/0x110
[] lookup_one_len+0x8d/0xc0
[] open_xa_dir+0xea/0x1b0
[] xattr_lookup+0x15/0x160
[] reiserfs_xattr_get+0x56/0x2a0
[] reiserfs_get_acl+0xa2/0x360
[] ? new_inode+0x27/0xa0
[] reiserfs_cache_default_acl+0x3a/0x160
[] ? _spin_unlock+0x27/0x40
[] reiserfs_mkdir+0x6c/0x2c0
[] ? __d_lookup+0x108/0x190
[] ? mark_held_locks+0x62/0x80
[] ? mutex_lock_nested+0x2bd/0x340
[] ? generic_permission+0x1a/0xa0
[] ? security_inode_permission+0x1e/0x20
[] vfs_mkdir+0xd6/0x180
[] sys_mkdirat+0xc0/0xd0
[] ? up_read+0x16/0x30
[] ? restore_all_notrace+0x0/0x18
[] sys_mkdir+0x20/0x30
[] sysenter_do_call+0x12/0x32Signed-off-by: Frederic Weisbecker
Tested-by: Christian Kujau
Cc: Alexander Beregalov
Cc: Chris Mason
Cc: Ingo Molnar -
Keeping the reiserfs lock while freeing the journal on
umount path triggers a lock inversion between bdev->bd_mutex
and the reiserfs lock.We don't need the reiserfs lock at this stage. The filesystem
is not usable anymore, and there are no more pending commits,
everything got flushed (even this operation was done in parallel
and didn't required the reiserfs lock from the current process).This fixes the following lockdep report:
=======================================================
[ INFO: possible circular locking dependency detected ]
2.6.32-atom #172
-------------------------------------------------------
umount/3904 is trying to acquire lock:
(&bdev->bd_mutex){+.+.+.}, at: [] __blkdev_put+0x22/0x160but task is already holding lock:
(&REISERFS_SB(s)->lock){+.+.+.}, at: [] reiserfs_write_lock+0x29/0x40which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #3 (&REISERFS_SB(s)->lock){+.+.+.}:
[] __lock_acquire+0x11ff/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] reiserfs_write_lock_once+0x29/0x50
[] reiserfs_get_block+0x85/0x1620
[] do_mpage_readpage+0x1f0/0x6d0
[] mpage_readpages+0xc0/0x100
[] reiserfs_readpages+0x19/0x20
[] __do_page_cache_readahead+0x1bc/0x260
[] ra_submit+0x28/0x40
[] filemap_fault+0x40e/0x420
[] __do_fault+0x3d/0x430
[] handle_mm_fault+0x12e/0x790
[] do_page_fault+0x135/0x330
[] error_code+0x6b/0x70
[] load_elf_binary+0x82a/0x1a10
[] search_binary_handler+0x90/0x1d0
[] do_execve+0x1df/0x250
[] sys_execve+0x46/0x70
[] syscall_call+0x7/0xb-> #2 (&mm->mmap_sem){++++++}:
[] __lock_acquire+0x11ff/0x19e0
[] lock_acquire+0x68/0x90
[] might_fault+0x8b/0xb0
[] copy_to_user+0x32/0x70
[] filldir64+0xa4/0xf0
[] sysfs_readdir+0x116/0x210
[] vfs_readdir+0x8d/0xb0
[] sys_getdents64+0x69/0xb0
[] sysenter_do_call+0x12/0x32-> #1 (sysfs_mutex){+.+.+.}:
[] __lock_acquire+0x11ff/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] sysfs_addrm_start+0x2c/0xb0
[] create_dir+0x40/0x90
[] sysfs_create_dir+0x2b/0x50
[] kobject_add_internal+0xc2/0x1b0
[] kobject_add_varg+0x31/0x50
[] kobject_add+0x2c/0x60
[] device_add+0x94/0x560
[] add_partition+0x18a/0x2a0
[] rescan_partitions+0x33a/0x450
[] __blkdev_get+0x12f/0x2d0
[] blkdev_get+0xa/0x10
[] register_disk+0x108/0x130
[] add_disk+0xd9/0x130
[] sd_probe_async+0x105/0x1d0
[] async_thread+0xcf/0x230
[] kthread+0x74/0x80
[] kernel_thread_helper+0x7/0x3c-> #0 (&bdev->bd_mutex){+.+.+.}:
[] __lock_acquire+0x18f6/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] __blkdev_put+0x22/0x160
[] blkdev_put+0xa/0x10
[] free_journal_ram+0xd2/0x130
[] do_journal_release+0x98/0x190
[] journal_release+0xa/0x10
[] reiserfs_put_super+0x36/0x130
[] generic_shutdown_super+0x4f/0xe0
[] kill_block_super+0x25/0x40
[] reiserfs_kill_sb+0x7f/0x90
[] deactivate_super+0x7a/0x90
[] mntput_no_expire+0x98/0xd0
[] sys_umount+0x4c/0x310
[] sys_oldumount+0x19/0x20
[] sysenter_do_call+0x12/0x32other info that might help us debug this:
2 locks held by umount/3904:
#0: (&type->s_umount_key#30){+++++.}, at: [] deactivate_super+0x75/0x90
#1: (&REISERFS_SB(s)->lock){+.+.+.}, at: [] reiserfs_write_lock+0x29/0x40stack backtrace:
Pid: 3904, comm: umount Not tainted 2.6.32-atom #172
Call Trace:
[] ? printk+0x18/0x1a
[] print_circular_bug+0xca/0xd0
[] __lock_acquire+0x18f6/0x19e0
[] ? free_pcppages_bulk+0x1f/0x250
[] lock_acquire+0x68/0x90
[] ? __blkdev_put+0x22/0x160
[] ? __blkdev_put+0x22/0x160
[] mutex_lock_nested+0x5b/0x340
[] ? __blkdev_put+0x22/0x160
[] ? mark_held_locks+0x62/0x80
[] ? kfree+0x92/0xd0
[] __blkdev_put+0x22/0x160
[] ? trace_hardirqs_on+0xb/0x10
[] blkdev_put+0xa/0x10
[] free_journal_ram+0xd2/0x130
[] do_journal_release+0x98/0x190
[] journal_release+0xa/0x10
[] reiserfs_put_super+0x36/0x130
[] ? up_write+0x16/0x30
[] generic_shutdown_super+0x4f/0xe0
[] kill_block_super+0x25/0x40
[] ? vfs_quota_off+0x0/0x20
[] reiserfs_kill_sb+0x7f/0x90
[] deactivate_super+0x7a/0x90
[] mntput_no_expire+0x98/0xd0
[] sys_umount+0x4c/0x310
[] sys_oldumount+0x19/0x20
[] sysenter_do_call+0x12/0x32Signed-off-by: Frederic Weisbecker
Cc: Alexander Beregalov
Cc: Chris Mason
Cc: Ingo Molnar -
While deleting the xattrs of an inode, we hold the reiserfs lock
and grab the inode->i_mutex of the targeted inode and the root
private xattr directory.Later on, we may relax the reiserfs lock for various reasons, this
creates inverted dependencies.We can remove the reiserfs lock -> i_mutex dependency by relaxing
the former before calling open_xa_dir(). This is fine because the
lookup and creation of xattr private directories done in
open_xa_dir() are covered by the targeted inode mutexes. And deeper
operations in the tree are still done under the write lock.This fixes the following lockdep report:
=======================================================
[ INFO: possible circular locking dependency detected ]
2.6.32-atom #173
-------------------------------------------------------
cp/3204 is trying to acquire lock:
(&REISERFS_SB(s)->lock){+.+.+.}, at: [] reiserfs_write_lock_once+0x29/0x50but task is already holding lock:
(&sb->s_type->i_mutex_key#4/3){+.+.+.}, at: [] open_xa_dir+0xd8/0x1b0which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&sb->s_type->i_mutex_key#4/3){+.+.+.}:
[] __lock_acquire+0x11ff/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] open_xa_dir+0x43/0x1b0
[] reiserfs_for_each_xattr+0x62/0x260
[] reiserfs_delete_xattrs+0x1a/0x60
[] reiserfs_delete_inode+0x9f/0x150
[] generic_delete_inode+0xa2/0x170
[] generic_drop_inode+0x4f/0x70
[] iput+0x47/0x50
[] do_unlinkat+0xd5/0x160
[] sys_unlink+0x10/0x20
[] sysenter_do_call+0x12/0x32-> #0 (&REISERFS_SB(s)->lock){+.+.+.}:
[] __lock_acquire+0x18f6/0x19e0
[] lock_acquire+0x68/0x90
[] mutex_lock_nested+0x5b/0x340
[] reiserfs_write_lock_once+0x29/0x50
[] reiserfs_lookup+0x62/0x140
[] __lookup_hash+0xef/0x110
[] lookup_one_len+0x8d/0xc0
[] open_xa_dir+0xea/0x1b0
[] xattr_lookup+0x15/0x160
[] reiserfs_xattr_get+0x56/0x2a0
[] reiserfs_get_acl+0xa2/0x360
[] reiserfs_cache_default_acl+0x3a/0x160
[] reiserfs_mkdir+0x6c/0x2c0
[] vfs_mkdir+0xd6/0x180
[] sys_mkdirat+0xc0/0xd0
[] sys_mkdir+0x20/0x30
[] sysenter_do_call+0x12/0x32other info that might help us debug this:
2 locks held by cp/3204:
#0: (&sb->s_type->i_mutex_key#4/1){+.+.+.}, at: [] lookup_create+0x26/0xa0
#1: (&sb->s_type->i_mutex_key#4/3){+.+.+.}, at: [] open_xa_dir+0xd8/0x1b0stack backtrace:
Pid: 3204, comm: cp Not tainted 2.6.32-atom #173
Call Trace:
[] ? printk+0x18/0x1a
[] print_circular_bug+0xca/0xd0
[] __lock_acquire+0x18f6/0x19e0
[] ? check_usage+0x6a/0x460
[] lock_acquire+0x68/0x90
[] ? reiserfs_write_lock_once+0x29/0x50
[] ? reiserfs_write_lock_once+0x29/0x50
[] mutex_lock_nested+0x5b/0x340
[] ? reiserfs_write_lock_once+0x29/0x50
[] reiserfs_write_lock_once+0x29/0x50
[] reiserfs_lookup+0x62/0x140
[] ? debug_check_no_locks_freed+0x8a/0x140
[] ? trace_hardirqs_on_caller+0x124/0x170
[] __lookup_hash+0xef/0x110
[] lookup_one_len+0x8d/0xc0
[] open_xa_dir+0xea/0x1b0
[] xattr_lookup+0x15/0x160
[] reiserfs_xattr_get+0x56/0x2a0
[] reiserfs_get_acl+0xa2/0x360
[] ? new_inode+0x27/0xa0
[] reiserfs_cache_default_acl+0x3a/0x160
[] ? _spin_unlock+0x27/0x40
[] reiserfs_mkdir+0x6c/0x2c0
[] ? __d_lookup+0x108/0x190
[] ? mark_held_locks+0x62/0x80
[] ? mutex_lock_nested+0x2bd/0x340
[] ? generic_permission+0x1a/0xa0
[] ? security_inode_permission+0x1e/0x20
[] vfs_mkdir+0xd6/0x180
[] sys_mkdirat+0xc0/0xd0
[] ? up_read+0x16/0x30
[] ? restore_all_notrace+0x0/0x18
[] sys_mkdir+0x20/0x30
[] sysenter_do_call+0x12/0x32v2: Don't drop reiserfs_mutex_lock_nested_safe() as we'll still
need it laterSigned-off-by: Frederic Weisbecker
Tested-by: Christian Kujau
Cc: Alexander Beregalov
Cc: Chris Mason
Cc: Ingo Molnar -
When we relax the reiserfs lock to avoid creating unwanted
dependencies against others locks while grabbing these,
we want to ensure it has not been taken recursively, otherwise
the lock won't be really relaxed. Only its depth will be decreased.
The unwanted dependency would then actually happen.To prevent from that, add a reiserfs_lock_check_recursive() call
in the places that need it.Signed-off-by: Frederic Weisbecker
Cc: Alexander Beregalov
Cc: Chris Mason
Cc: Ingo Molnar -
i_xattr_sem depends on the reiserfs lock. But after we grab
i_xattr_sem, we may relax/relock the reiserfs lock while waiting
on a freezed filesystem, creating a dependency inversion between
the two locks.In order to avoid the i_xattr_sem -> reiserfs lock dependency, let's
create a reiserfs_down_read_safe() that acts like
reiserfs_mutex_lock_safe(): relax the reiserfs lock while grabbing
another lock to avoid undesired dependencies induced by the
heivyweight reiserfs lock.This fixes the following warning:
[ 990.005931] =======================================================
[ 990.012373] [ INFO: possible circular locking dependency detected ]
[ 990.013233] 2.6.33-rc1 #1
[ 990.013233] -------------------------------------------------------
[ 990.013233] dbench/1891 is trying to acquire lock:
[ 990.013233] (&REISERFS_SB(s)->lock){+.+.+.}, at: [] reiserfs_write_lock+0x35/0x50
[ 990.013233]
[ 990.013233] but task is already holding lock:
[ 990.013233] (&REISERFS_I(inode)->i_xattr_sem){+.+.+.}, at: [] reiserfs_xattr_set_handle+0x8a/0x470
[ 990.013233]
[ 990.013233] which lock already depends on the new lock.
[ 990.013233]
[ 990.013233]
[ 990.013233] the existing dependency chain (in reverse order) is:
[ 990.013233]
[ 990.013233] -> #1 (&REISERFS_I(inode)->i_xattr_sem){+.+.+.}:
[ 990.013233] [] __lock_acquire+0xf9c/0x1560
[ 990.013233] [] lock_acquire+0x8f/0xb0
[ 990.013233] [] down_write+0x44/0x80
[ 990.013233] [] reiserfs_xattr_set_handle+0x8a/0x470
[ 990.013233] [] reiserfs_xattr_set+0xb0/0x150
[ 990.013233] [] user_set+0x8a/0x90
[ 990.013233] [] reiserfs_setxattr+0xaa/0xb0
[ 990.013233] [] __vfs_setxattr_noperm+0x36/0xa0
[ 990.013233] [] vfs_setxattr+0xbc/0xc0
[ 990.013233] [] setxattr+0xc0/0x150
[ 990.013233] [] sys_fsetxattr+0x8d/0xa0
[ 990.013233] [] system_call_fastpath+0x16/0x1b
[ 990.013233]
[ 990.013233] -> #0 (&REISERFS_SB(s)->lock){+.+.+.}:
[ 990.013233] [] __lock_acquire+0x12d0/0x1560
[ 990.013233] [] lock_acquire+0x8f/0xb0
[ 990.013233] [] __mutex_lock_common+0x47/0x3b0
[ 990.013233] [] mutex_lock_nested+0x3e/0x50
[ 990.013233] [] reiserfs_write_lock+0x35/0x50
[ 990.013233] [] reiserfs_prepare_write+0x45/0x180
[ 990.013233] [] reiserfs_xattr_set_handle+0x2a6/0x470
[ 990.013233] [] reiserfs_xattr_set+0xb0/0x150
[ 990.013233] [] user_set+0x8a/0x90
[ 990.013233] [] reiserfs_setxattr+0xaa/0xb0
[ 990.013233] [] __vfs_setxattr_noperm+0x36/0xa0
[ 990.013233] [] vfs_setxattr+0xbc/0xc0
[ 990.013233] [] setxattr+0xc0/0x150
[ 990.013233] [] sys_fsetxattr+0x8d/0xa0
[ 990.013233] [] system_call_fastpath+0x16/0x1b
[ 990.013233]
[ 990.013233] other info that might help us debug this:
[ 990.013233]
[ 990.013233] 2 locks held by dbench/1891:
[ 990.013233] #0: (&sb->s_type->i_mutex_key#12){+.+.+.}, at: [] vfs_setxattr+0x78/0xc0
[ 990.013233] #1: (&REISERFS_I(inode)->i_xattr_sem){+.+.+.}, at: [] reiserfs_xattr_set_handle+0x8a/0x470
[ 990.013233]
[ 990.013233] stack backtrace:
[ 990.013233] Pid: 1891, comm: dbench Not tainted 2.6.33-rc1 #1
[ 990.013233] Call Trace:
[ 990.013233] [] print_circular_bug+0xe9/0xf0
[ 990.013233] [] __lock_acquire+0x12d0/0x1560
[ 990.013233] [] ? reiserfs_xattr_set_handle+0x8a/0x470
[ 990.013233] [] lock_acquire+0x8f/0xb0
[ 990.013233] [] ? reiserfs_write_lock+0x35/0x50
[ 990.013233] [] ? reiserfs_xattr_set_handle+0x8a/0x470
[ 990.013233] [] __mutex_lock_common+0x47/0x3b0
[ 990.013233] [] ? reiserfs_write_lock+0x35/0x50
[ 990.013233] [] ? reiserfs_write_lock+0x35/0x50
[ 990.013233] [] ? mark_held_locks+0x72/0xa0
[ 990.013233] [] ? __mutex_unlock_slowpath+0xbd/0x140
[ 990.013233] [] ? trace_hardirqs_on_caller+0x14d/0x1a0
[ 990.013233] [] mutex_lock_nested+0x3e/0x50
[ 990.013233] [] reiserfs_write_lock+0x35/0x50
[ 990.013233] [] reiserfs_prepare_write+0x45/0x180
[ 990.013233] [] reiserfs_xattr_set_handle+0x2a6/0x470
[ 990.013233] [] reiserfs_xattr_set+0xb0/0x150
[ 990.013233] [] ? __mutex_lock_common+0x284/0x3b0
[ 990.013233] [] user_set+0x8a/0x90
[ 990.013233] [] reiserfs_setxattr+0xaa/0xb0
[ 990.013233] [] __vfs_setxattr_noperm+0x36/0xa0
[ 990.013233] [] vfs_setxattr+0xbc/0xc0
[ 990.013233] [] setxattr+0xc0/0x150
[ 990.013233] [] ? sched_clock_cpu+0xb8/0x100
[ 990.013233] [] ? trace_hardirqs_off+0xd/0x10
[ 990.013233] [] ? cpu_clock+0x43/0x50
[ 990.013233] [] ? fget+0xb0/0x110
[ 990.013233] [] ? fget+0x0/0x110
[ 990.013233] [] ? sysret_check+0x27/0x62
[ 990.013233] [] sys_fsetxattr+0x8d/0xa0
[ 990.013233] [] system_call_fastpath+0x16/0x1bReported-and-tested-by: Christian Kujau
Signed-off-by: Frederic Weisbecker
Cc: Alexander Beregalov
Cc: Chris Mason
Cc: Ingo Molnar