From: Marc Dionne Date: Sun, 5 Sep 2010 14:48:52 +0000 (-0400) Subject: afs_DoBulkStat: don't call afs_Analyze without holding the GLOCK X-Git-Tag: openafs-devel-1_5_77~19 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=0a7498a90b5257ca24e600a6913e8939cd81b3f7;p=packages%2Fo%2Fopenafs.git afs_DoBulkStat: don't call afs_Analyze without holding the GLOCK Limit the scope of the GUNLOCK-GLOCK blocks to cover only the RX calls. This prevents afs_Analyze from being called without the GLOCK, which causes an oops in afs_icl_Event4() where there's an ASSERT_GLOCK. Change-Id: Ifa6942d08f22479c0affba3ebd1fc9bf4063d8a5 Reviewed-on: http://gerrit.openafs.org/2668 Tested-by: Marc Dionne Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear (cherry picked from commit 526b8a7ca53977d6cdb91427932ac6b18bb7064d) Reviewed-on: http://gerrit.openafs.org/2694 --- diff --git a/src/afs/VNOPS/afs_vnop_lookup.c b/src/afs/VNOPS/afs_vnop_lookup.c index bd415f291..7bdbb2c19 100644 --- a/src/afs/VNOPS/afs_vnop_lookup.c +++ b/src/afs/VNOPS/afs_vnop_lookup.c @@ -930,19 +930,22 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp) if (tcp) { hostp = tcp->srvr->server; XSTATS_START_TIME(AFS_STATS_FS_RPCIDX_BULKSTATUS); - RX_AFS_GUNLOCK(); if (!(tcp->srvr->server->flags & SNO_INLINEBULK)) { retryonce: + RX_AFS_GUNLOCK(); code = RXAFS_InlineBulkStatus(tcp->id, &fidParm, &statParm, &cbParm, &volSync); + RX_AFS_GLOCK(); if (code == RXGEN_OPCODE) { tcp->srvr->server->flags |= SNO_INLINEBULK; inlinebulk = 0; + RX_AFS_GUNLOCK(); code = RXAFS_BulkStatus(tcp->id, &fidParm, &statParm, &cbParm, &volSync); + RX_AFS_GLOCK(); } else { inlinebulk = 1; if (!code && ((&statsp[0])->errorCode)) { @@ -960,11 +963,12 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp) } } else { inlinebulk = 0; + RX_AFS_GUNLOCK(); code = RXAFS_BulkStatus(tcp->id, &fidParm, &statParm, &cbParm, &volSync); + RX_AFS_GLOCK(); } - RX_AFS_GLOCK(); XSTATS_END_TIME; } else code = -1;