diff --git a/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.cpp b/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.cpp index 79ba397eed..0e97251ca7 100644 --- a/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.cpp +++ b/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.cpp @@ -45,6 +45,7 @@ KDiskDeviceJobGenerator::~KDiskDeviceJobGenerator() { delete[] fMoveInfos; delete[] fPartitionIDs; + delete fJobQueue; } // JobFactory @@ -68,6 +69,15 @@ KDiskDeviceJobGenerator::JobQueue() const return fJobQueue; } +// DetachJobQueue +KDiskDeviceJobQueue * +KDiskDeviceJobGenerator::DetachJobQueue() +{ + KDiskDeviceJobQueue *jobQueue = fJobQueue; + fJobQueue = NULL; + return jobQueue; +} + // GenerateJobs status_t KDiskDeviceJobGenerator::GenerateJobs() diff --git a/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.h b/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.h index 9202f05f2a..3338a646f8 100644 --- a/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.h +++ b/src/kernel/core/disk_device_manager/KDiskDeviceJobGenerator.h @@ -27,6 +27,8 @@ public: KDiskDevice *Device() const; KDiskDeviceJobQueue *JobQueue() const; + KDiskDeviceJobQueue *DetachJobQueue(); + status_t GenerateJobs(); private: diff --git a/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp b/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp index ea52580b74..5f954e227e 100644 --- a/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp +++ b/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp @@ -1230,7 +1230,9 @@ _kern_commit_disk_device_modifications(partition_id deviceID, port_id port, // add the jobs to the manager if (ManagerLocker locker2 = manager) { error = manager->AddJobQueue(generator.JobQueue()); - if (error != B_OK) + if (error == B_OK) + generator.DetachJobQueue(); + else return error; } else return B_ERROR;