--- calamares-1.1.2.orig/src/modules/partition/gui/EraseDiskPage.cpp 2015-08-10 16:20:20.000000000 +0200 +++ calamares-1.1.2/src/modules/partition/gui/EraseDiskPage.cpp 2015-08-13 10:32:06.442017396 +0200 @@ -181,24 +181,35 @@ m_core->createPartitionTable( dev, PartitionTable::msdos ); } + qint64 suggestedRootSizeB = + ( Calamares::JobQueue::instance()-> + globalStorage()-> + value( "requiredStorageGB" ).toDouble() + 0.1 + 20.0 ) GiB; + bool shouldCreateSwap = false; qint64 availableSpaceB = ( dev->totalSectors() - firstFreeSector ) * dev->logicalSectorSize(); qint64 suggestedSwapSizeB = swapSuggestion( availableSpaceB ); - qint64 requiredSpaceB = - ( Calamares::JobQueue::instance()-> - globalStorage()-> - value( "requiredStorageGB" ).toDouble() + 0.1 + 2.0 ) GiB + - suggestedSwapSizeB; + qint64 requiredSpaceB = suggestedRootSizeB + suggestedSwapSizeB; // If there is enough room for ESP + root + swap, create swap, otherwise don't. shouldCreateSwap = availableSpaceB > requiredSpaceB; - qint64 lastSectorForRoot = dev->totalSectors() - 1; //last sector of the device - if ( shouldCreateSwap ) - { - lastSectorForRoot -= suggestedSwapSizeB / dev->logicalSectorSize() + 1; + bool shouldCreateHome = false; + if ( shouldCreateSwap ) { + availableSpaceB -= requiredSpaceB; + qint64 suggestedHomeSizeB = 30 GiB; + requiredSpaceB += suggestedHomeSizeB; + + // If there is enough room for ESP + root + swap, create swap, otherwise don't. + shouldCreateHome = availableSpaceB > requiredSpaceB; + if ( !shouldCreateHome ) { + suggestedRootSizeB = availableSpaceB - suggestedSwapSizeB; + } + } else { + suggestedRootSizeB = availableSpaceB; } + qint64 lastSectorForRoot = firstFreeSector + suggestedRootSizeB / dev->logicalSectorSize() - 1; Partition* rootPartition = PMUtils::createNewPartition( dev->partitionTable(), *dev, @@ -210,21 +221,40 @@ PartitionInfo::setFormat( rootPartition, true ); PartitionInfo::setMountPoint( rootPartition, "/" ); m_core->createPartition( dev, rootPartition ); + firstFreeSector = firstFreeSector + suggestedRootSizeB / dev->logicalSectorSize(); if ( shouldCreateSwap ) { + qint64 lastSectorForSwap = firstFreeSector + suggestedSwapSizeB / dev->logicalSectorSize() - 1; Partition* swapPartition = PMUtils::createNewPartition( dev->partitionTable(), *dev, PartitionRole( PartitionRole::Primary ), FileSystem::LinuxSwap, - lastSectorForRoot + 1, - dev->totalSectors() - 1 + firstFreeSector, + lastSectorForSwap ); PartitionInfo::setFormat( swapPartition, true ); m_core->createPartition( dev, swapPartition ); + firstFreeSector = firstFreeSector + suggestedSwapSizeB / dev->logicalSectorSize(); } + if ( shouldCreateHome ) + { + Partition* homePartition = PMUtils::createNewPartition( + dev->partitionTable(), + *dev, + PartitionRole( PartitionRole::Primary ), + FileSystem::Ext4, + firstFreeSector, + dev->totalSectors() - 1 + ); + PartitionInfo::setFormat( homePartition, true ); + m_core->createPartition( dev, homePartition ); + } + + m_core->setBootLoaderInstallPath( dev->deviceNode() ); + updatePreviews(); m_core->dumpQueue();