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; }
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; }
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); }
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; }
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; }
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; }