From 0a7498a90b5257ca24e600a6913e8939cd81b3f7 Mon Sep 17 00:00:00 2001 From: Marc Dionne Date: Sun, 5 Sep 2010 10:48:52 -0400 Subject: [PATCH] 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 --- src/afs/VNOPS/afs_vnop_lookup.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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; -- 2.39.5