Print this page
6785 nfs4_attr_cache deadlock
*** 2573,2586 ****
* decrement.
*/
ASSERT(osp->os_ref_count >= 2);
osp->os_ref_count--;
! if (!ep->error)
nfs4_attr_cache(vp,
&res.array[1].nfs_resop4_u.opgetattr.ga_res,
t, cred_otw, TRUE, NULL);
NFS4_DEBUG(nfs4_client_state_debug, (CE_NOTE, "nfs4close_otw:"
" returning %d", ep->error));
(void) xdr_free(xdr_COMPOUND4res_clnt, (caddr_t)&res);
--- 2573,2596 ----
* decrement.
*/
ASSERT(osp->os_ref_count >= 2);
osp->os_ref_count--;
! if (ep->error == 0) {
! /*
! * Avoid a deadlock with the r_serial thread waiting for
! * os_sync_lock in nfs4_get_otw_cred_by_osp() which might be
! * held by us. We will wait in nfs4_attr_cache() for the
! * completion of the r_serial thread.
! */
! mutex_exit(&osp->os_sync_lock);
! *have_sync_lockp = 0;
!
nfs4_attr_cache(vp,
&res.array[1].nfs_resop4_u.opgetattr.ga_res,
t, cred_otw, TRUE, NULL);
+ }
NFS4_DEBUG(nfs4_client_state_debug, (CE_NOTE, "nfs4close_otw:"
" returning %d", ep->error));
(void) xdr_free(xdr_COMPOUND4res_clnt, (caddr_t)&res);