bool AllocationManager_impl::deallocateLocal(const std::string& allocationID) { ossie::AllocationTable::iterator alloc = this->_allocations.find(allocationID); if (alloc == this->_allocations.end()) { return false; } const ossie::AllocationType& localAlloc = alloc->second; std::vector<CF::Properties> allocations; partitionProperties(localAlloc.allocationProperties, allocations); LOG_TRACE(AllocationManager_impl, "Deallocating " << localAlloc.allocationProperties.length() << " properties (" << allocations.size() << " calls) for local allocation " << allocationID); if (!ossie::corba::objectExists(localAlloc.allocatedDevice)) { LOG_WARN(AllocationManager_impl, "Not deallocating capacity a device because it no longer exists"); } else { bool warned = false; for (size_t index = 0; index < allocations.size(); ++index) { try { localAlloc.allocatedDevice->deallocateCapacity(allocations[index]); } catch (...) { if (!warned) { // If a symmetric deallocateCapacity failes, the device is // probably in a bad state; only warn about it once LOG_WARN(AllocationManager_impl, "Deallocation raised an exception"); warned = true; } } } } this->_allocations.erase(alloc); return true; }
void Task::runVolumeTask() { /* Root user can create encrypted volumes in all partitions including system partitions. Show all partitions, not only non system. */ if( m_partitionType == QString( " -N" ) && getuid() == 0 ){ m_partitionType = QString( " -A" ) ; } QString exe = QString( ZULUCRYPTzuluCrypt ) + m_partitionType + QString( " -Z" ) ; QStringList l = utility::Task( exe ).splitOutput( '\n' ) ; QStringList list ; QString entry ; for( const auto& it : l ){ list = utility::split( it,'\t' ) ; if( list.size() >= 4 ){ entry = list.at( 3 ) ; /* * MDRAID partitions have "linux_raid_member" as their file system * LVM partitions have "LVM2_member" as their file system * * we are not showing these partitions since we dont support them */ if( !entry.contains( "member" ) ){ emit partitionProperties( list ) ; } } } }
bool AllocationManager_impl::allocateDevice(const CF::Properties& requestedProperties, ossie::DeviceNode& node, CF::Properties& allocatedProperties, const std::vector<std::string>& processorDeps, const std::vector<ossie::SPD::NameVersionPair>& osDeps) { if (!ossie::corba::objectExists(node.device)) { LOG_WARN(AllocationManager_impl, "Not using device for uses_device allocation " << node.identifier << " because it no longer exists"); return false; } try { if (node.device->usageState() == CF::Device::BUSY) { return false; } } catch ( ... ) { // bad device reference or device in an unusable state LOG_WARN(AllocationManager_impl, "Unable to verify state of device " << node.identifier); return false; } LOG_TRACE(AllocationManager_impl, "Allocating against device " << node.identifier); // Determine whether or not the device in question has the required matching properties CF::Properties allocProps; if (!checkDeviceMatching(node.prf, allocProps, requestedProperties, processorDeps, osDeps)) { LOG_TRACE(AllocationManager_impl, "Matching failed"); return false; } // If there are no external properties to allocate, the allocation is // already successful if (allocProps.length() == 0) { LOG_TRACE(AllocationManager_impl, "Allocation requires no capacity from device"); return true; } // If there are duplicates in the allocation sequence, break up the allocation into multiple calls std::vector<CF::Properties> allocations; partitionProperties(allocProps, allocations); LOG_TRACE(AllocationManager_impl, "Allocating " << allocProps.length() << " properties (" << allocations.size() << " calls)"); try { if (!this->completeAllocations(node.device, allocations)) { LOG_TRACE(AllocationManager_impl, "Device lacks sufficient capacity"); return false; } } catch (const CF::Device::InvalidCapacity& e) { LOG_TRACE(AllocationManager_impl, "Device reported invalid capacity"); return false; } catch (const CF::Device::InsufficientCapacity& e) { LOG_TRACE(AllocationManager_impl, "Device reported insufficient capacity"); return false; } // Transfer ownership of the allocated properties to the caller ossie::corba::move(allocatedProperties, allocProps); LOG_TRACE(AllocationManager_impl, "Allocation successful"); return true; }