diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2006-10-02 05:18:03 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-02 10:57:20 -0400 |
commit | 12fd352038c037ba3a7071a2ca8597c55114abc3 (patch) | |
tree | a3d8c7ba34bd340167c160474bab8104d1d78baa | |
parent | eed2965af1bae30f746e936d80ad4fabb9e208c8 (diff) |
[PATCH] nfsd: lockdep annotation
while doing a kernel make modules_install install over an NFS mount.
=============================================
[ INFO: possible recursive locking detected ]
---------------------------------------------
nfsd/9550 is trying to acquire lock:
(&inode->i_mutex){--..}, at: [<c034c845>] mutex_lock+0x1c/0x1f
but task is already holding lock:
(&inode->i_mutex){--..}, at: [<c034c845>] mutex_lock+0x1c/0x1f
other info that might help us debug this:
2 locks held by nfsd/9550:
#0: (hash_sem){..--}, at: [<cc895223>] exp_readlock+0xd/0xf [nfsd]
#1: (&inode->i_mutex){--..}, at: [<c034c845>] mutex_lock+0x1c/0x1f
stack backtrace:
[<c0103508>] show_trace_log_lvl+0x58/0x152
[<c0103b8b>] show_trace+0xd/0x10
[<c0103c2f>] dump_stack+0x19/0x1b
[<c012aa57>] __lock_acquire+0x77a/0x9a3
[<c012af4a>] lock_acquire+0x60/0x80
[<c034c6c2>] __mutex_lock_slowpath+0xa7/0x20e
[<c034c845>] mutex_lock+0x1c/0x1f
[<c0162edc>] vfs_unlink+0x34/0x8a
[<cc891d98>] nfsd_unlink+0x18f/0x1e2 [nfsd]
[<cc89884f>] nfsd3_proc_remove+0x95/0xa2 [nfsd]
[<cc88f0d4>] nfsd_dispatch+0xc0/0x178 [nfsd]
[<c033e84d>] svc_process+0x3a5/0x5ed
[<cc88f5ba>] nfsd+0x1a7/0x305 [nfsd]
[<c0101005>] kernel_thread_helper+0x5/0xb
DWARF2 unwinder stuck at kernel_thread_helper+0x5/0xb
Leftover inexact backtrace:
[<c0103b8b>] show_trace+0xd/0x10
[<c0103c2f>] dump_stack+0x19/0x1b
[<c012aa57>] __lock_acquire+0x77a/0x9a3
[<c012af4a>] lock_acquire+0x60/0x80
[<c034c6c2>] __mutex_lock_slowpath+0xa7/0x20e
[<c034c845>] mutex_lock+0x1c/0x1f
[<c0162edc>] vfs_unlink+0x34/0x8a
[<cc891d98>] nfsd_unlink+0x18f/0x1e2 [nfsd]
[<cc89884f>] nfsd3_proc_remove+0x95/0xa2 [nfsd]
[<cc88f0d4>] nfsd_dispatch+0xc0/0x178 [nfsd]
[<c033e84d>] svc_process+0x3a5/0x5ed
[<cc88f5ba>] nfsd+0x1a7/0x305 [nfsd]
[<c0101005>] kernel_thread_helper+0x5/0xb
=============================================
[ INFO: possible recursive locking detected ]
---------------------------------------------
nfsd/9580 is trying to acquire lock:
(&inode->i_mutex){--..}, at: [<c034cc1d>] mutex_lock+0x1c/0x1f
but task is already holding lock:
(&inode->i_mutex){--..}, at: [<c034cc1d>] mutex_lock+0x1c/0x1f
other info that might help us debug this:
2 locks held by nfsd/9580:
#0: (hash_sem){..--}, at: [<cc89522b>] exp_readlock+0xd/0xf [nfsd]
#1: (&inode->i_mutex){--..}, at: [<c034cc1d>] mutex_lock+0x1c/0x1f
stack backtrace:
[<c0103508>] show_trace_log_lvl+0x58/0x152
[<c0103b8b>] show_trace+0xd/0x10
[<c0103c2f>] dump_stack+0x19/0x1b
[<c012aa63>] __lock_acquire+0x77a/0x9a3
[<c012af56>] lock_acquire+0x60/0x80
[<c034ca9a>] __mutex_lock_slowpath+0xa7/0x20e
[<c034cc1d>] mutex_lock+0x1c/0x1f
[<cc892ad1>] nfsd_setattr+0x2c8/0x499 [nfsd]
[<cc893ede>] nfsd_create_v3+0x31b/0x4ac [nfsd]
[<cc8984a1>] nfsd3_proc_create+0x128/0x138 [nfsd]
[<cc88f0d4>] nfsd_dispatch+0xc0/0x178 [nfsd]
[<c033ec1d>] svc_process+0x3a5/0x5ed
[<cc88f5ba>] nfsd+0x1a7/0x305 [nfsd]
[<c0101005>] kernel_thread_helper+0x5/0xb
DWARF2 unwinder stuck at kernel_thread_helper+0x5/0xb
Leftover inexact backtrace:
[<c0103b8b>] show_trace+0xd/0x10
[<c0103c2f>] dump_stack+0x19/0x1b
[<c012aa63>] __lock_acquire+0x77a/0x9a3
[<c012af56>] lock_acquire+0x60/0x80
[<c034ca9a>] __mutex_lock_slowpath+0xa7/0x20e
[<c034cc1d>] mutex_lock+0x1c/0x1f
[<cc892ad1>] nfsd_setattr+0x2c8/0x499 [nfsd]
[<cc893ede>] nfsd_create_v3+0x31b/0x4ac [nfsd]
[<cc8984a1>] nfsd3_proc_create+0x128/0x138 [nfsd]
[<cc88f0d4>] nfsd_dispatch+0xc0/0x178 [nfsd]
[<c033ec1d>] svc_process+0x3a5/0x5ed
[<cc88f5ba>] nfsd+0x1a7/0x305 [nfsd]
[<c0101005>] kernel_thread_helper+0x5/0xb
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Neil Brown <neilb@suse.de>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Arjan van de Ven <arjan@infradead.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | fs/nfsd/vfs.c | 8 | ||||
-rw-r--r-- | include/linux/nfsd/nfsfh.h | 11 |
2 files changed, 13 insertions, 6 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index c9e3b5a8fe07..443ebc52e382 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -1114,7 +1114,7 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1114 | */ | 1114 | */ |
1115 | if (!resfhp->fh_dentry) { | 1115 | if (!resfhp->fh_dentry) { |
1116 | /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ | 1116 | /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ |
1117 | fh_lock(fhp); | 1117 | fh_lock_nested(fhp, I_MUTEX_PARENT); |
1118 | dchild = lookup_one_len(fname, dentry, flen); | 1118 | dchild = lookup_one_len(fname, dentry, flen); |
1119 | err = PTR_ERR(dchild); | 1119 | err = PTR_ERR(dchild); |
1120 | if (IS_ERR(dchild)) | 1120 | if (IS_ERR(dchild)) |
@@ -1240,7 +1240,7 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1240 | err = nfserr_notdir; | 1240 | err = nfserr_notdir; |
1241 | if(!dirp->i_op || !dirp->i_op->lookup) | 1241 | if(!dirp->i_op || !dirp->i_op->lookup) |
1242 | goto out; | 1242 | goto out; |
1243 | fh_lock(fhp); | 1243 | fh_lock_nested(fhp, I_MUTEX_PARENT); |
1244 | 1244 | ||
1245 | /* | 1245 | /* |
1246 | * Compose the response file handle. | 1246 | * Compose the response file handle. |
@@ -1494,7 +1494,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, | |||
1494 | if (isdotent(name, len)) | 1494 | if (isdotent(name, len)) |
1495 | goto out; | 1495 | goto out; |
1496 | 1496 | ||
1497 | fh_lock(ffhp); | 1497 | fh_lock_nested(ffhp, I_MUTEX_PARENT); |
1498 | ddir = ffhp->fh_dentry; | 1498 | ddir = ffhp->fh_dentry; |
1499 | dirp = ddir->d_inode; | 1499 | dirp = ddir->d_inode; |
1500 | 1500 | ||
@@ -1644,7 +1644,7 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, | |||
1644 | if (err) | 1644 | if (err) |
1645 | goto out; | 1645 | goto out; |
1646 | 1646 | ||
1647 | fh_lock(fhp); | 1647 | fh_lock_nested(fhp, I_MUTEX_PARENT); |
1648 | dentry = fhp->fh_dentry; | 1648 | dentry = fhp->fh_dentry; |
1649 | dirp = dentry->d_inode; | 1649 | dirp = dentry->d_inode; |
1650 | 1650 | ||
diff --git a/include/linux/nfsd/nfsfh.h b/include/linux/nfsd/nfsfh.h index 31a3cb617ce0..069257ea99a0 100644 --- a/include/linux/nfsd/nfsfh.h +++ b/include/linux/nfsd/nfsfh.h | |||
@@ -290,8 +290,9 @@ fill_post_wcc(struct svc_fh *fhp) | |||
290 | * vfs.c:nfsd_rename as it needs to grab 2 i_mutex's at once | 290 | * vfs.c:nfsd_rename as it needs to grab 2 i_mutex's at once |
291 | * so, any changes here should be reflected there. | 291 | * so, any changes here should be reflected there. |
292 | */ | 292 | */ |
293 | |||
293 | static inline void | 294 | static inline void |
294 | fh_lock(struct svc_fh *fhp) | 295 | fh_lock_nested(struct svc_fh *fhp, unsigned int subclass) |
295 | { | 296 | { |
296 | struct dentry *dentry = fhp->fh_dentry; | 297 | struct dentry *dentry = fhp->fh_dentry; |
297 | struct inode *inode; | 298 | struct inode *inode; |
@@ -310,11 +311,17 @@ fh_lock(struct svc_fh *fhp) | |||
310 | } | 311 | } |
311 | 312 | ||
312 | inode = dentry->d_inode; | 313 | inode = dentry->d_inode; |
313 | mutex_lock(&inode->i_mutex); | 314 | mutex_lock_nested(&inode->i_mutex, subclass); |
314 | fill_pre_wcc(fhp); | 315 | fill_pre_wcc(fhp); |
315 | fhp->fh_locked = 1; | 316 | fhp->fh_locked = 1; |
316 | } | 317 | } |
317 | 318 | ||
319 | static inline void | ||
320 | fh_lock(struct svc_fh *fhp) | ||
321 | { | ||
322 | fh_lock_nested(fhp, I_MUTEX_NORMAL); | ||
323 | } | ||
324 | |||
318 | /* | 325 | /* |
319 | * Unlock a file handle/inode | 326 | * Unlock a file handle/inode |
320 | */ | 327 | */ |