void cvolcm_FlushVolume ( pwr_tStatus *sts, gdb_sVolume *vp ) { pool_sQlink *ol; gdb_sObject *op; gdb_sMountServer *msp; gdb_AssumeLocked; for ( ol = pool_Qsucc(NULL, gdbroot->pool, &vp->l.obj_lh); ol != &vp->l.obj_lh; ol = pool_Qsucc(NULL, gdbroot->pool, &vp->l.obj_lh) ) { op = pool_Qitem(ol, gdb_sObject, l.obj_ll); if (op->l.flags.b.isMountServer) { msp = hash_Search(sts, gdbroot->ms_ht, &op->g.oid); if (msp == NULL) errh_Bugcheck(*sts, "mount server inconsitency"); msp->msor = pool_cNRef; pool_Qremove(NULL, gdbroot->pool, &msp->nodms_ll); /* Todo !!! Clear alarm and blocklevel in all mount clients. */ } cvol_FlushObject(op); } pwr_Assert(vp->l.flags.b.inOwnList); pool_Qremove(NULL, gdbroot->pool, &vp->l.own_ll); vp->l.flags.b.inOwnList = 0; vp->g.nid = pwr_cNNodeId; pwr_Assert(pool_QisEmpty(NULL, gdbroot->pool, &vp->u.c.cacheLock.lh)); pwr_Assert(vp->u.c.cacheLock.lc == 0); pwr_Assert(pool_QisEmpty(NULL, gdbroot->pool, &vp->u.c.cacheVol.lh)); pwr_Assert(vp->u.c.cacheVol.lc == 0); vp->l.flags.b.isConnected = 0; vp->l.flags.b.isCached = 0; vp->l.flags.b.netCached = 0; vp->l.flags.b.remote = 0; }
pwr_tUInt32 sansm_Update(gdb_sNode* np) { static net_sSanUpdate* up = NULL; static san_sServer** spl = NULL; int i; pwr_tStatus sts; pwr_tUInt32 gen; pool_sQlink* sl; san_sServer* sp; qcom_sQid tgt; gdb_AssumeLocked; if (pool_QisEmpty(NULL, gdbroot->pool, &np->sansUpd_lh)) return 0; if (up == NULL) { up = malloc(sizeof(*up) + (net_cSanMaxUpdate - 1) * sizeof(up->data[0])); spl = malloc(sizeof(san_sServer*) * net_cSanMaxUpdate); } for (i = 0, sl = pool_Qsucc(NULL, gdbroot->pool, &np->sansUpd_lh); sl != &np->sansUpd_lh && i < net_cSanMaxUpdate; i++) { sp = pool_Qitem(sl, san_sServer, sansUpd_ll); sl = pool_Qsucc(NULL, gdbroot->pool, sl); pwr_Assert(sp->flags.b.sansUpd); up->data[i].al = sp->al; up->data[i].sane = sp->sane; spl[i] = sp; } up->count = i; tgt.nid = np->nid; tgt.qix = net_cProcHandler; gen = np->sans_gen; gdb_Unlock; net_Put(&sts, &tgt, up, net_eMsg_sanUpdate, 0, pwr_Offset(up, data[i]), 0); gdb_Lock; if (EVEN(sts)) return 0; if (gen == np->sans_gen) { for (i = 0; i < up->count; i++) { sp = spl[i]; pwr_Assert(sp->flags.b.sansUpd); pool_Qremove(NULL, gdbroot->pool, &sp->sansUpd_ll); sp->flags.b.sansUpd = 0; } } else { for (i = 0; i < up->count; i++) { sp = hash_Search(NULL, gdbroot->sans_ht, &up->data[i].sane.sid); if (sp != NULL) { pwr_Assert(sp->flags.b.sansUpd); pool_Qremove(NULL, gdbroot->pool, &sp->sansUpd_ll); sp->flags.b.sansUpd = 0; } } } return up->count; }