diff --git a/headers/private/storage/DiskDevice.h b/headers/private/storage/DiskDevice.h index e11f06caf6..5879c30928 100644 --- a/headers/private/storage/DiskDevice.h +++ b/headers/private/storage/DiskDevice.h @@ -52,6 +52,8 @@ private: status_t _Update(bool shadow, bool *updated); status_t _Update(user_disk_device_data *data, bool *updated); + static void _ClearUserData(user_partition_data* data); + virtual bool _AcceptVisitor(BDiskDeviceVisitor *visitor, int32 level); user_disk_device_data *fDeviceData; diff --git a/src/kits/storage/DiskDevice.cpp b/src/kits/storage/DiskDevice.cpp index c084db4218..f8cab70688 100644 --- a/src/kits/storage/DiskDevice.cpp +++ b/src/kits/storage/DiskDevice.cpp @@ -377,11 +377,16 @@ BDiskDevice::_Update(user_disk_device_data *data, bool *updated) if (!updated) updated = &_updated; *updated = false; + + // clear the user_data fields first + _ClearUserData(&data->device_partition_data); + // remove obsolete partitions status_t error = _RemoveObsoleteDescendants(&data->device_partition_data, - updated); + updated); if (error != B_OK) return error; + // update existing partitions and add new ones error = BPartition::_Update(&data->device_partition_data, updated); if (error == B_OK) { @@ -404,3 +409,14 @@ BDiskDevice::_AcceptVisitor(BDiskDeviceVisitor *visitor, int32 level) return visitor->Visit(this); } + +// _ClearUserData +void +BDiskDevice::_ClearUserData(user_partition_data* data) +{ + data->user_data = NULL; + + // recurse + for (int i = 0; i < data->child_count; i++) + _ClearUserData(data->children[i]); +}