1/*
2 * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "CreateChildJob.h"
8
9#include <syscalls.h>
10
11#include "DiskDeviceUtils.h"
12#include "PartitionReference.h"
13
14
15// constructor
16CreateChildJob::CreateChildJob(PartitionReference* partition,
17		PartitionReference* child)
18	:
19	DiskDeviceJob(partition, child),
20	fOffset(0),
21	fSize(0),
22	fType(NULL),
23	fName(NULL),
24	fParameters(NULL)
25{
26}
27
28
29// destructor
30CreateChildJob::~CreateChildJob()
31{
32	free(fType);
33	free(fName);
34	free(fParameters);
35}
36
37
38// Init
39status_t
40CreateChildJob::Init(off_t offset, off_t size, const char* type,
41	const char* name, const char* parameters)
42{
43	fOffset = offset;
44	fSize = size;
45
46	SET_STRING_RETURN_ON_ERROR(fType, type);
47	SET_STRING_RETURN_ON_ERROR(fName, name);
48	SET_STRING_RETURN_ON_ERROR(fParameters, parameters);
49
50	return B_OK;
51}
52
53
54// Do
55status_t
56CreateChildJob::Do()
57{
58	int32 changeCounter = fPartition->ChangeCounter();
59	partition_id childID;
60	int32 childChangeCounter;
61	status_t error = _kern_create_child_partition(fPartition->PartitionID(),
62		&changeCounter, fOffset, fSize, fType, fName, fParameters, &childID,
63		&childChangeCounter);
64	if (error != B_OK)
65		return error;
66
67	fPartition->SetChangeCounter(changeCounter);
68	fChild->SetTo(childID, childChangeCounter);
69
70	return B_OK;
71}
72
73