fs: don't use igrab() while holding i_lock
Subsystems (3)
PATCH 1/1 fs: don't use igrab() while holding i_lock
From: Dave Chinner <[email protected]>
Fix the incorrect use of igrab() inside the i_lock in NFS and Ceph‥ If we are already holding the i_lock, we have a reference to the inode so we can safely use ihold() to gain an extra reference. This avoids hangs due to lock recursion on the i_lock now that the inode_lock is gone and igrab() uses the i_lock itself.
Signed-off-by Dave Chinner <[email protected]>
--- fs/ceph/addr.c | 2 +- fs/ceph/snap.c | 4 ++-- fs/nfs/nfs4state.c | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-)
fs/ceph/addr.c +1 -1
@@ -92,7 +92,7 @@ static int ceph_set_page_dirty(struct page *page) ci->i_head_snapc =ceph_get_snap_context (snapc); ++ci->i_wrbuffer_ref_head;if (ci->i_wrbuffer_ref ==0 ) -igrab (inode); +ihold (inode); ++ci->i_wrbuffer_ref; dout("%p set_page_dirty %p idx %lu head %d/%d -> %d/%d " "snapc %p seq %lld (%d snaps)\n",
fs/ceph/snap.c +2 -2
@@ -463,8 +463,8 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci)dout ("queue_cap_snap %p cap_snap %p queuing under %p\n" , inode, capsnap, snapc); -igrab (inode); - +ihold (inode); +atomic_set (&capsnap->nref,1 ); capsnap->ci = ci;INIT_LIST_HEAD (&capsnap->ci_item);
fs/nfs/nfs4state.c +2 -1
@@ -590,7 +590,8 @@ nfs4_get_open_state(struct inode *inode, struct nfs4_state_owner *owner) state->owner = owner;atomic_inc (&owner->so_count);list_add (&state->inode_states, &nfsi->open_states); - state->inode =igrab (inode); +ihold (inode); + state->inode = inode;spin_unlock (&inode->i_lock);/* Note: The reclaim code dictates that we add stateless * and read-only stateids to the end of the list */
Signature · 1 line
1.7.2.3