xref: /haiku/src/kits/storage/disk_device/jobs/CreateChildJob.cpp (revision 300868ce276e35845db32cb8344e662de0872af9)
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