125ab0d1aSIngo Weinhold /* 225ab0d1aSIngo Weinhold * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de. 325ab0d1aSIngo Weinhold * Distributed under the terms of the MIT License. 425ab0d1aSIngo Weinhold */ 525ab0d1aSIngo Weinhold 625ab0d1aSIngo Weinhold #include "CreateChildJob.h" 725ab0d1aSIngo Weinhold 8*300868ceSIngo Weinhold #include <syscalls.h> 9*300868ceSIngo Weinhold 1025ab0d1aSIngo Weinhold #include "DiskDeviceUtils.h" 1125ab0d1aSIngo Weinhold #include "PartitionReference.h" 1225ab0d1aSIngo Weinhold 1325ab0d1aSIngo Weinhold 1425ab0d1aSIngo Weinhold // constructor 1525ab0d1aSIngo Weinhold CreateChildJob::CreateChildJob(PartitionReference* partition, 1625ab0d1aSIngo Weinhold PartitionReference* child) 1725ab0d1aSIngo Weinhold : DiskDeviceJob(partition, child), 1825ab0d1aSIngo Weinhold fOffset(0), 1925ab0d1aSIngo Weinhold fSize(0), 2025ab0d1aSIngo Weinhold fType(NULL), 2125ab0d1aSIngo Weinhold fName(NULL), 2225ab0d1aSIngo Weinhold fParameters(NULL) 2325ab0d1aSIngo Weinhold { 2425ab0d1aSIngo Weinhold } 2525ab0d1aSIngo Weinhold 2625ab0d1aSIngo Weinhold 2725ab0d1aSIngo Weinhold // destructor 2825ab0d1aSIngo Weinhold CreateChildJob::~CreateChildJob() 2925ab0d1aSIngo Weinhold { 3025ab0d1aSIngo Weinhold free(fType); 3125ab0d1aSIngo Weinhold free(fName); 3225ab0d1aSIngo Weinhold free(fParameters); 3325ab0d1aSIngo Weinhold } 3425ab0d1aSIngo Weinhold 3525ab0d1aSIngo Weinhold 3625ab0d1aSIngo Weinhold // Init 3725ab0d1aSIngo Weinhold status_t 3825ab0d1aSIngo Weinhold CreateChildJob::Init(off_t offset, off_t size, const char* type, 3925ab0d1aSIngo Weinhold const char* name, const char* parameters) 4025ab0d1aSIngo Weinhold { 4125ab0d1aSIngo Weinhold fOffset = offset; 4225ab0d1aSIngo Weinhold fSize = size; 4325ab0d1aSIngo Weinhold 4425ab0d1aSIngo Weinhold SET_STRING_RETURN_ON_ERROR(fType, type); 4525ab0d1aSIngo Weinhold SET_STRING_RETURN_ON_ERROR(fName, name); 4625ab0d1aSIngo Weinhold SET_STRING_RETURN_ON_ERROR(fParameters, parameters); 4725ab0d1aSIngo Weinhold 4825ab0d1aSIngo Weinhold return B_OK; 4925ab0d1aSIngo Weinhold } 5025ab0d1aSIngo Weinhold 5125ab0d1aSIngo Weinhold 5225ab0d1aSIngo Weinhold // Do 5325ab0d1aSIngo Weinhold status_t 5425ab0d1aSIngo Weinhold CreateChildJob::Do() 5525ab0d1aSIngo Weinhold { 56*300868ceSIngo Weinhold int32 changeCounter = fPartition->ChangeCounter(); 57*300868ceSIngo Weinhold partition_id childID; 58*300868ceSIngo Weinhold int32 childChangeCounter; 59*300868ceSIngo Weinhold status_t error = _kern_create_child_partition(fPartition->PartitionID(), 60*300868ceSIngo Weinhold &changeCounter, fOffset, fSize, fType, fName, fParameters, 61*300868ceSIngo Weinhold fParameters ? strlen(fParameters) : 0, &childID, &childChangeCounter); 62*300868ceSIngo Weinhold if (error != B_OK) 63*300868ceSIngo Weinhold return error; 64*300868ceSIngo Weinhold 65*300868ceSIngo Weinhold fPartition->SetChangeCounter(changeCounter); 66*300868ceSIngo Weinhold fChild->SetTo(childID, childChangeCounter); 67*300868ceSIngo Weinhold 68*300868ceSIngo Weinhold return B_OK; 6925ab0d1aSIngo Weinhold } 7025ab0d1aSIngo Weinhold 71