Esempio n. 1
0
gdb_sObject *
ivol_LoadObject (
  pwr_tStatus		*status,
  ivol_sVolume		*lv,
  dbs_sObject		*o,
  pwr_tBitMask		ilink
)
{
  gdb_sObject		*op;
  net_mGo		flags;
  pwr_tObjid		soid = pwr_cNObjid;

  pwr_dStatus(sts, status, GDH__SUCCESS);

  flags.m = 0;

  if (o->flags.m & dbs_mFlags_isClient) {
    soid = o->soid;
    flags.b.isAliasClient = o->flags.b.isAliasClient;
    flags.b.isMountClient = o->flags.b.isMountClient;
  }

  op = gdb_AddObject(sts, o->name, o->oid, o->cid, o->rbody.size, o->poid, flags.m, soid);
  if (op == NULL) return NULL;
  if (vol_LinkObject(sts, lv->vp, op, ilink) == NULL)
    return NULL;
  op->u.n.flags.b.isMountClean = o->flags.b.isMountClean;
  /*  op->u.n.rbTime = o->rbody.time; */
  op->u.n.time = o->time;
  op->u.n.lflags.m = o->flags.m;
  return op;
}
Esempio n. 2
0
pwr_tBoolean
ivol_BuildVolume (
  pwr_tStatus		*status,
  gdb_sVolume		*vp
)
{
  pool_sQlink		*ol;
  gdb_sObject		*op;

  pwr_dStatus(sts, status, GDH__SUCCESS);

  /* First link the volume block.  */


  /* Now link all objects.  */

  for (
    ol = pool_Qsucc(sts, gdbroot->pool, &vp->l.obj_lh);
    ol != &vp->l.obj_lh;
    ol = pool_Qsucc(sts, gdbroot->pool, ol)
  ) {
    op = pool_Qitem(ol, gdb_sObject, l.obj_ll);

    vol_LinkObject(sts, vp, op, vol_mLink_build);
    pwr_Assert(ODD(*sts));

  }
  return YES;
}
Esempio n. 3
0
static gdb_sObject *
loadObject (
  pwr_tStatus		*sts,
  gdb_sVolume		*vp,
  char			*name,
  pwr_tObjid		oid,
  pwr_tClassId		cid,
  int			size,
  pwr_tObjid		poid,
  pwr_tBitMask		flags,
  pwr_tObjid		soid
)
{
  gdb_sObject		*op;

  pwr_Assert(hash_Search(NULL, gdbroot->oid_ht, &oid) == NULL);

  op = gdb_AddObject(sts, name, oid, cid, size, poid, flags, soid);
  if (op == NULL) return NULL;
  op->u.n.flags.b.systemCreated = 1;
  return vol_LinkObject(sts, vp, op, vol_mLink_load);
} 
Esempio n. 4
0
void
cvolcm_RenameObject (
  qcom_sGet		*get
)
{
  gdb_sObject		*op;
  pwr_tStatus		sts = GDH__SUCCESS;
  gdb_sVolume		*vp;
  net_sRenameObject	*rop = (net_sRenameObject *) get->data;

  gdb_AssumeUnlocked;

  gdb_ScopeLock {
    op = hash_Search(&sts, gdbroot->oid_ht, &rop->notify.oid);
    if (op == NULL) break;

    vp = pool_Address(NULL, gdbroot->pool, op->l.vr);
    vol_UnlinkObject(&sts, vp, op, vol_mLink_rename);

    op->g.f = rop->f;

    vol_LinkObject(&sts, vp, op, vol_mLink_rename);
  } gdb_ScopeUnlock;
}
Esempio n. 5
0
pwr_tBoolean
ivol_RebuildVolume (
  pwr_tStatus		*status,
  ivol_sVolume		*lv,
  const co_mFormat	*format
)
{
  gdb_sVolume		*vp = lv->vp;
  ivol_sObject		*iop;
  lst_sEntry		*iol;
  pool_sQlink		*ol;
  gdb_sObject		*op;

  pwr_dStatus(sts, status, GDH__SUCCESS);

  gdb_AssumeExcled;
  gdb_AssumeLocked;

#if 0
  // if (!vp->modified) continue;
#endif

  for (
    ol = pool_Qsucc(sts, gdbroot->pool, &vp->l.obj_lh);
    ol != &vp->l.obj_lh;
  ) {
    op = pool_Qitem(ol, gdb_sObject, l.obj_ll);
    ol = pool_Qsucc(sts, gdbroot->pool, ol);

    if (op->u.n.flags.b.swapDelete && !op->u.n.flags.b.systemCreated) {
      vol_SetAlarmLevel(sts, op, 0);/* !!! TODO Remeber to take care of move also in dvol delete and move */
      vol_SetBlockLevel(sts, op, 0);/* !!! TODO Remeber to take care of move also in dvol delete and move */
    }
  }

  /* Unlink all modified objects.  */
  for (iop = lst_Succ(NULL, &lv->upd_lh, &iol); iop != NULL; iop = lst_Succ(NULL, iol, &iol)) {
    if (!(iop->flags.m & gdb_mChange_head)) continue;
    vol_UnlinkObject(sts, vp, iop->op, iop->unlink.m);
    updateObject(lv, iop);
  }
  for (iop = lst_Succ(NULL, &lv->upd_io_lh, &iol); iop != NULL; iop = lst_Succ(NULL, iol, &iol)) {
    if (!(iop->flags.m & gdb_mChange_head)) continue;
    vol_UnlinkObject(sts, vp, iop->op, iop->unlink.m);
    updateObject(lv, iop);
  }

  for (iop = lst_Succ(NULL, &lv->cre_lh, &iol); iop != NULL; iop = lst_Succ(NULL, iol, &iol)) {
    vol_LinkObject(sts, vp, iop->op, vol_mLink_loOidTab);
  }

  for (
    ol = pool_Qsucc(sts, gdbroot->pool, &vp->l.obj_lh);
    ol != &vp->l.obj_lh;
  ) {
    op = pool_Qitem(ol, gdb_sObject, l.obj_ll);
    ol = pool_Qsucc(sts, gdbroot->pool, ol);

    if (op->u.n.flags.b.swapDelete && !op->u.n.flags.b.systemCreated) {
      vol_UnlinkObject(sts, vp, op, vol_mLink_swapDelete);
    }
  }

  /* Relink all new and modified objects.  */

  for (iop = lst_Succ(NULL, &lv->upd_lh, &iol); iop != NULL; iop = lst_Succ(NULL, iol, &iol)) {
    if (!(iop->flags.m & gdb_mChange_head)) continue;
    vol_LinkObject(sts, vp, iop->op, iop->link.m);
  }
  for (iop = lst_Succ(NULL, &lv->upd_io_lh, &iol); iop != NULL; iop = lst_Succ(NULL, iol, &iol)) {
    if (!(iop->flags.m & gdb_mChange_head)) continue;
    vol_LinkObject(sts, vp, iop->op, iop->link.m);
  }

  convFctn = dvms_GetFctns(format);

  for (iop = lst_Succ(NULL, &lv->cre_lh, &iol); iop != NULL; iop = lst_Succ(NULL, iol, &iol)) {
    vol_LinkObject(sts, vp, iop->op, vol_mLink_swapBuild);
    if (convFctn != NULL)
      decodeObject(NULL, iop->op, iop->cp, format->b.bo);
  }

  convFctn = NULL;
  

#if 0
  san_DeleteVolumeServers(sts, vp);
#endif

  return YES;
}
Esempio n. 6
0
void
cvolcm_MoveObject (
  qcom_sGet		*get
)
{
  pwr_tStatus		sts;
  gdb_sObject		*op;
  gdb_sObject		*pop;
  gdb_sObject		*sop;
  pwr_tObjid		soid;
  gdb_sVolume		*vp;
  net_sMoveObject	*mop = (net_sMoveObject *) get->data;

  gdb_AssumeUnlocked;

  gdb_ScopeLock {
    op = hash_Search(&sts, gdbroot->oid_ht, &mop->notify.oid);
    if (op != NULL) {
      pop = hash_Search(&sts, gdbroot->oid_ht, &mop->npar.oid);
      vp = pool_Address(NULL, gdbroot->pool, op->l.vr);
      if (pop == NULL) {
	/* New father is not in the cache => delete object from cache.  */
	cvol_FreeObject(NULL, vp, op, vol_mLink_cacheDelete);
	op = NULL;
      } else {
	cvol_UnlinkObject(&sts, vp, op, vol_mLink_cacheMove);
	vol_UnlinkObject(&sts, vp, op, vol_mLink_cacheMove);
      }
    }

    pop = hash_Search(&sts, gdbroot->oid_ht, &mop->opar.oid);
    if (pop != NULL) {
      pop->g.soid = mop->opar.soid;

      soid = mop->opar.oid;

      soid.oix = mop->osib.blink;
      sop = hash_Search(&sts, gdbroot->oid_ht, &soid);
      if (sop != NULL)
	sop->g.sib.flink = mop->osib.newflink;

      soid.oix = mop->osib.flink;
      sop = hash_Search(&sts, gdbroot->oid_ht, &soid);
      if (sop != NULL)
	sop->g.sib.blink = mop->osib.newblink;
    }

    pop = hash_Search(&sts, gdbroot->oid_ht, &mop->npar.oid);
    if (pop != NULL) {
      pop->g.soid = mop->npar.soid;

      soid = mop->npar.oid;
      soid.oix = mop->nsib.blink;
      sop = hash_Search(&sts, gdbroot->oid_ht, &soid);
      if (sop != NULL)
	sop->g.sib.flink = mop->nsib.newflink;

      soid.oix = mop->nsib.flink;
      sop = hash_Search(&sts, gdbroot->oid_ht, &soid);
      if (sop != NULL)
	sop->g.sib.blink = mop->nsib.newblink;
    }

    if (op != NULL) {
      vol_LinkObject(&sts, vp, op, vol_mLink_cacheMove);
      cvol_LinkObject(&sts, vp, op, vol_mLink_cacheMove);
    }
  } gdb_ScopeUnlock;
}
Esempio n. 7
0
gdb_sObject *
dvol_CreateObject (
  pwr_tStatus		*sts,
  cdh_sParseName	*pn,
  pwr_tClassId		cid,
  pwr_tUInt32		size,
  pwr_tObjid		oid		/* Requested objid, */
)
{
  static cvol_sNotify	cm;		/* Cannot be on the stack for VAXELN */
  pwr_tObjid		poid;		/* Objid of parent (or pwr_cNObjid) */
  pwr_tInt32		size2;		/* Size of the new object */
  gdb_sClass		*cp;
  gdb_sObject		*tmp_op;
  gdb_sObject		*op;
  gdb_sObject		*pop;
  gdb_sVolume		*vp;
  pwr_sClassDef         *cdef;
  
  gdb_AssumeLocked;

  if (pn->flags.b.idString) pwr_Return(NULL, sts, GDH__NOSUCHOBJ);

  /* Verify class.  */

  cp = hash_Search(sts, gdbroot->cid_ht, &cid);
  if (cp == NULL) return NULL;

  size2 = MAX(size, cp->size);

  /* Check parent.  */

  pop = vol_NameToParentObject(sts, pn, gdb_mLo_dynamic, vol_mTrans_all);
  if (pop == NULL) {
    if (pn->nObject > 1)
      pwr_Return(NULL, sts , GDH__BADPARENT);

    poid = pwr_cNObjid;

    if (cdh_ObjidIsNull(oid))
      poid.vid = gdbroot->db->vid;
    else
      poid.vid = oid.vid;

    pop = vol_OidToObject(sts, poid, gdb_mLo_dynamic, vol_mTrans_all, cvol_eHint_none);
    if (pop == NULL) return NULL;
  } else {
    poid = pop->g.oid;
    if (cdh_ObjidIsNotNull(oid) && oid.vid != pop->g.oid.vid)
      pwr_Return(NULL, sts, GDH__BADPARENT);
  }

  vp = pool_Address(sts, gdbroot->pool, pop->l.vr);
  if (vp == NULL)
    pwr_Return(NULL, sts, GDH__BADPARENT);

  if (!vp->l.flags.b.dynamic)
    pwr_Return(NULL, sts, GDH__STATICVOL);

  /* Make sure that the name is unique.  */

  pn->object[pn->nObject-1].poid = poid;
  if (hash_Search(sts, gdbroot->family_ht, &pn->object[pn->nObject-1]) != NULL)
    pwr_Return(NULL, sts, GDH__DUPLNAME);

  if (cdh_ObjidIsNull(oid))
    oid = vol_Oid(sts, vp, cid);

  if (hash_Search(sts, gdbroot->oid_ht, &oid) != NULL)
    return NULL;

  tmp_op = op = gdb_AddObject(sts, pn->object[pn->nObject-1].name.orig, oid, cid, size2, poid, net_mGo__, pwr_cNObjid);
  if (op == NULL) return NULL;

  do {
    /* We have alloced an object header.
       Free it if something happens.  */

    op = vol_LinkObject(sts, vp, op, vol_mLink_create);
    if (op == NULL) break;

    cvols_InitNotify(op, &cm, net_eMsg_createObject);

    op = adoptObject(sts, op, pop, &cm);
    if (op == NULL) break;

    cdef  = pool_Address(NULL, gdbroot->rtdb, cp->cbr);

    if ( cdef->Flags.b.RtReadOnly)
      op->u.n.lflags.b.readOnly = 1;

    cvols_Notify(&cm);

    return op;
  } while (0);

  vol_UnlinkObject(sts, vp, op, vol_mLink_delete);
  return NULL;  
}