Ejemplo n.º 1
0
pwr_tBoolean
ivol_DeleteVolume (
  pwr_tStatus           *status,
  gdb_sVolume		*vp
)
{
  pool_sQlink		*ol;
  gdb_sObject		*op;

  pwr_dStatus(sts, status, GDH__SUCCESS);

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

  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_UnlinkObject(sts, vp, op, vol_mLink_flush);
    vol_UnlockObject(sts, op);
  }
  return YES;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
pwr_tBoolean
dvol_DeleteObject (
  pwr_tStatus		*sts,
  pwr_tObjid		oid
)
{
  static cvol_sNotify	dm;		/* Cannot be on the stack for VAXELN */

  gdb_sObject		*op;
  gdb_sObject		*p_op;
  gdb_sVolume		*vp;

  gdb_AssumeLocked;

  if (oid.oix == pwr_cNObjectIx)
    pwr_Return(FALSE, sts, GDH__VOLDELETE);

  op = vol_OidToObject(sts, oid, gdb_mLo_dynamic, vol_mTrans_none, cvol_eHint_none);
  if (op == NULL) return FALSE;

  if (op->g.flags.b.isParent && cdh_ObjidIsNotNull(op->g.soid))
    pwr_Return(FALSE, sts, GDH__CHILDREN);

  p_op	= pool_Address(NULL, gdbroot->pool, op->l.por);
  vp	= pool_Address(NULL, gdbroot->pool, op->l.vr);

  cvols_InitNotify(op, &dm, net_eMsg_deleteObject);

  unadoptObject(sts, op, p_op, &dm);

  vol_UnlinkObject(sts, vp, op, vol_mLink_delete);

  cvols_Notify(&dm);

  pwr_Return(TRUE, sts, GDH__SUCCESS);
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
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;
}
Ejemplo n.º 6
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;  
}