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