On Sat, Apr 09, 2011 at 10:55:02PM -0400, Will Simoneau wrote: > Hi, > > I just got this soft-lockup 3 times in a row and was able to reproduce > it with lockdep enabled. The kernel is Linus git 94c8a984 plus patches > to support my hardware. System is a full custom 2-way SMP mipsel/R4K > clone on an FPGA, I am hoping this is not my fault or the hardware's > fault though. Root is on NFS (tcp). > > This seems to happen consistently when running "apt-get update". Ideas? > Known bug? The bug is in nfs_commit_inode(), where it calls nfs_scan_commit() with the inode->i_lock held and that calls __mark_inode_dirty() which takes the inode->i_lock.... The patch below should fix this problem. Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx nfs: don't call __mark_inode_dirty while holding i_lock From: Dave Chinner <dchinner@xxxxxxxxxx> nfs_scan_commit() is called with the inode->i_lock held, but it then calls __mark_inode_dirty() while still holding the lock. This causes a deadlock. Move the __mark_inode_dirty() call outside nfs_scan_commit() and the inode->i_lock to avoid the deadlock. Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> --- fs/nfs/write.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/nfs/write.c b/fs/nfs/write.c index af0c627..e4cbc11 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -542,11 +542,15 @@ nfs_scan_commit(struct inode *inode, struct list_head *dst, pgoff_t idx_start, u if (!nfs_need_commit(nfsi)) return 0; + spin_lock(&inode->i_lock); ret = nfs_scan_list(nfsi, dst, idx_start, npages, NFS_PAGE_TAG_COMMIT); if (ret > 0) nfsi->ncommit -= ret; + spin_unlock(&inode->i_lock); + if (nfs_need_commit(NFS_I(inode))) __mark_inode_dirty(inode, I_DIRTY_DATASYNC); + return ret; } #else @@ -1483,9 +1487,7 @@ int nfs_commit_inode(struct inode *inode, int how) res = nfs_commit_set_lock(NFS_I(inode), may_wait); if (res <= 0) goto out_mark_dirty; - spin_lock(&inode->i_lock); res = nfs_scan_commit(inode, &head, 0, 0); - spin_unlock(&inode->i_lock); if (res) { int error; -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html