Пример #1
0
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;
}
Пример #2
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;
}