Skip to content

Commit

Permalink
[nemo-systemsettings] Don't duplicate already unlocked block device t…
Browse files Browse the repository at this point in the history
…o the model. Fixes JB#43009
  • Loading branch information
rainemak committed Sep 24, 2018
1 parent 8df1034 commit 526b35b
Showing 1 changed file with 22 additions and 10 deletions.
32 changes: 22 additions & 10 deletions src/udisks2monitor.cpp
Expand Up @@ -603,28 +603,40 @@ void UDisks2::Monitor::createBlockDevice(const QString &dbusObjectPath, const UD

// Upon creation.
connect(block, &UDisks2::Block::completed, this, [this]() {
UDisks2::Block *block = qobject_cast<UDisks2::Block *>(sender());
if (block->isExternal() && (block->isMountable() || block->isEncrypted())) {
const QString cryptoBackingDeviceObjectPath = block->cryptoBackingDeviceObjectPath();
if (block->hasCryptoBackingDevice() && m_blockDevices.contains(cryptoBackingDeviceObjectPath)) {
UDisks2::Block *completedBlock = qobject_cast<UDisks2::Block *>(sender());
bool unlocked = false;

// Check if device is already unlocked.
if (completedBlock->isEncrypted()) {
for (const Block *b : m_blockDevices.values()) {
if (b->cryptoBackingDeviceObjectPath() == completedBlock->path()) {
unlocked = true;
break;
}
}
}

if (!unlocked && completedBlock->isExternal() && (completedBlock->isMountable() || completedBlock->isEncrypted())) {
const QString cryptoBackingDeviceObjectPath = completedBlock->cryptoBackingDeviceObjectPath();
if (completedBlock->hasCryptoBackingDevice() && m_blockDevices.contains(cryptoBackingDeviceObjectPath)) {
// Update crypto backing device to file system device.
UDisks2::Block *cryptoBackingDev = m_blockDevices.value(cryptoBackingDeviceObjectPath);
*cryptoBackingDev = *block;
*cryptoBackingDev = *completedBlock;

m_blockDevices.remove(cryptoBackingDeviceObjectPath);
m_blockDevices.insert(cryptoBackingDev->path(), cryptoBackingDev);

updatePartitionProperties(cryptoBackingDev);

block->deleteLater();
} else if (!m_blockDevices.contains(block->path())) {
m_blockDevices.insert(block->path(), block);
createPartition(block);
completedBlock->deleteLater();
} else if (!m_blockDevices.contains(completedBlock->path())) {
m_blockDevices.insert(completedBlock->path(), completedBlock);
createPartition(completedBlock);
}
} else {
// This is garbage block device that should not be exposed
// from the partition model.
block->deleteLater();
completedBlock->deleteLater();
}
});

Expand Down

0 comments on commit 526b35b

Please sign in to comment.