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
6*f75b8de3SAxel Dörfler
725ab0d1aSIngo Weinhold #include "CreateChildJob.h"
825ab0d1aSIngo Weinhold
9300868ceSIngo Weinhold #include <syscalls.h>
10300868ceSIngo Weinhold
1125ab0d1aSIngo Weinhold #include "DiskDeviceUtils.h"
1225ab0d1aSIngo Weinhold #include "PartitionReference.h"
1325ab0d1aSIngo Weinhold
1425ab0d1aSIngo Weinhold
1525ab0d1aSIngo Weinhold // constructor
CreateChildJob(PartitionReference * partition,PartitionReference * child)1625ab0d1aSIngo Weinhold CreateChildJob::CreateChildJob(PartitionReference* partition,
1725ab0d1aSIngo Weinhold PartitionReference* child)
18*f75b8de3SAxel Dörfler :
19*f75b8de3SAxel Dörfler DiskDeviceJob(partition, child),
2025ab0d1aSIngo Weinhold fOffset(0),
2125ab0d1aSIngo Weinhold fSize(0),
2225ab0d1aSIngo Weinhold fType(NULL),
2325ab0d1aSIngo Weinhold fName(NULL),
2425ab0d1aSIngo Weinhold fParameters(NULL)
2525ab0d1aSIngo Weinhold {
2625ab0d1aSIngo Weinhold }
2725ab0d1aSIngo Weinhold
2825ab0d1aSIngo Weinhold
2925ab0d1aSIngo Weinhold // destructor
~CreateChildJob()3025ab0d1aSIngo Weinhold CreateChildJob::~CreateChildJob()
3125ab0d1aSIngo Weinhold {
3225ab0d1aSIngo Weinhold free(fType);
3325ab0d1aSIngo Weinhold free(fName);
3425ab0d1aSIngo Weinhold free(fParameters);
3525ab0d1aSIngo Weinhold }
3625ab0d1aSIngo Weinhold
3725ab0d1aSIngo Weinhold
3825ab0d1aSIngo Weinhold // Init
3925ab0d1aSIngo Weinhold status_t
Init(off_t offset,off_t size,const char * type,const char * name,const char * parameters)4025ab0d1aSIngo Weinhold CreateChildJob::Init(off_t offset, off_t size, const char* type,
4125ab0d1aSIngo Weinhold const char* name, const char* parameters)
4225ab0d1aSIngo Weinhold {
4325ab0d1aSIngo Weinhold fOffset = offset;
4425ab0d1aSIngo Weinhold fSize = size;
4525ab0d1aSIngo Weinhold
4625ab0d1aSIngo Weinhold SET_STRING_RETURN_ON_ERROR(fType, type);
4725ab0d1aSIngo Weinhold SET_STRING_RETURN_ON_ERROR(fName, name);
4825ab0d1aSIngo Weinhold SET_STRING_RETURN_ON_ERROR(fParameters, parameters);
4925ab0d1aSIngo Weinhold
5025ab0d1aSIngo Weinhold return B_OK;
5125ab0d1aSIngo Weinhold }
5225ab0d1aSIngo Weinhold
5325ab0d1aSIngo Weinhold
5425ab0d1aSIngo Weinhold // Do
5525ab0d1aSIngo Weinhold status_t
Do()5625ab0d1aSIngo Weinhold CreateChildJob::Do()
5725ab0d1aSIngo Weinhold {
58300868ceSIngo Weinhold int32 changeCounter = fPartition->ChangeCounter();
59300868ceSIngo Weinhold partition_id childID;
60300868ceSIngo Weinhold int32 childChangeCounter;
61300868ceSIngo Weinhold status_t error = _kern_create_child_partition(fPartition->PartitionID(),
62*f75b8de3SAxel Dörfler &changeCounter, fOffset, fSize, fType, fName, fParameters, &childID,
63*f75b8de3SAxel Dörfler &childChangeCounter);
64300868ceSIngo Weinhold if (error != B_OK)
65300868ceSIngo Weinhold return error;
66300868ceSIngo Weinhold
67300868ceSIngo Weinhold fPartition->SetChangeCounter(changeCounter);
68300868ceSIngo Weinhold fChild->SetTo(childID, childChangeCounter);
69300868ceSIngo Weinhold
70300868ceSIngo Weinhold return B_OK;
7125ab0d1aSIngo Weinhold }
7225ab0d1aSIngo Weinhold
73