static NTSTATUS STDCALL AoeBusDevCtlDetach_(IN PIRP irp) { PIO_STACK_LOCATION io_stack_loc = IoGetCurrentIrpStackLocation(irp); UINT32 unit_num; WVL_SP_BUS_NODE walker; AOE_SP_DISK aoe_disk = NULL; unit_num = *((PUINT32) irp->AssociatedIrp.SystemBuffer); DBG("Request to detach unit: %d\n", unit_num); walker = NULL; /* For each node on the bus... */ WvlBusLock(&AoeBusMain); while (walker = WvlBusGetNextNode(&AoeBusMain, walker)) { aoe_disk = CONTAINING_RECORD(walker, AOE_S_DISK, BusNode[0]); /* If the unit number matches... */ if (WvlBusGetNodeNum(walker) == unit_num) { /* If it's not a boot-time device... */ if (aoe_disk->Boot) { DBG("Cannot detach a boot-time device.\n"); /* Signal error. */ aoe_disk = NULL; break; } } } WvlBusUnlock(&AoeBusMain); if (!aoe_disk) { DBG("Unit %d not found.\n", unit_num); return WvlIrpComplete(irp, 0, STATUS_INVALID_PARAMETER); } /* Detach the node. */ WvlBusRemoveNode(aoe_disk->BusNode); DBG("Removed unit %d.\n", unit_num); return WvlIrpComplete(irp, 0, STATUS_SUCCESS); }
/* Filedisk disk-unit query-response routine. */ static UCHAR STDCALL WvFilediskUnitNum_(IN WVL_SP_DISK_T disk) { WV_SP_FILEDISK_T filedisk = CONTAINING_RECORD( disk, WV_S_FILEDISK_T, disk[0] ); /* Possible precision loss. */ return (UCHAR) WvlBusGetNodeNum(&filedisk->Dev->BusNode); }