Skip to content
Snippets Groups Projects
Select Git revision
  • d2404851cd23c6f3e2363b45530d6b593f17f044
  • development default protected
  • 3.2.x-stable
  • prepare
  • 6b369dc5
  • 3.1.x-stable
  • 3.0.x-stable
  • 2.4.x-stable
  • v3.2.61
  • v3.2.60
  • v3.2.59
  • v3.2.54
  • v3.2.53
  • v3.2.52
  • v3.2.51
  • v3.2.48
  • v3.2.45
  • v3.2.44.3
  • v3.2.44
  • v3.2.40
  • v3.2.13
  • v3.2.9
  • v3.2.8
  • v3.2.7
  • v3.2.6
  • v3.2.5
  • v3.2.4
  • v3.2.3
28 results

PartitionLayout.cpp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    PartitionLayout.cpp 5.82 KiB
    /* === This file is part of Calamares - <https://github.com/calamares> ===
     *
     *   Copyright 2014-2017, Teo Mrnjavac <teo@kde.org>
     *   Copyright 2017-2018, Adriaan de Groot <groot@kde.org>
     *   Copyright 2018, Collabora Ltd
     *
     *   Calamares is free software: you can redistribute it and/or modify
     *   it under the terms of the GNU General Public License as published by
     *   the Free Software Foundation, either version 3 of the License, or
     *   (at your option) any later version.
     *
     *   Calamares is distributed in the hope that it will be useful,
     *   but WITHOUT ANY WARRANTY; without even the implied warranty of
     *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     *   GNU General Public License for more details.
     *
     *   You should have received a copy of the GNU General Public License
     *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
     */
    
    #include "GlobalStorage.h"
    #include "JobQueue.h"
    
    #include "core/PartitionLayout.h"
    
    #include "core/KPMHelpers.h"
    #include "core/PartitionActions.h"
    #include "core/PartitionInfo.h"
    #include "core/PartUtils.h"
    
    #include <kpmcore/core/device.h>
    #include <kpmcore/core/partition.h>
    #include <kpmcore/fs/filesystem.h>
    
    static FileSystem::Type
    getDefaultFileSystemType()
    {
        Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
        FileSystem::Type defaultFS = FileSystem::Ext4;
    
        if ( gs->contains( "defaultFileSystemType" ) )
        {
            PartUtils::findFS( gs->value( "defaultFileSystemType" ).toString(),  &defaultFS);
            if ( defaultFS == FileSystem::Unknown )
                defaultFS = FileSystem::Ext4;
        }
    
        return defaultFS;
    }
    
    PartitionLayout::PartitionLayout()
    {
        m_defaultFsType = getDefaultFileSystemType();
    }
    
    PartitionLayout::PartitionLayout( PartitionLayout::PartitionEntry entry )
    {
        m_defaultFsType = getDefaultFileSystemType();
        m_partLayout.append( entry );
    }
    
    PartitionLayout::PartitionLayout( const PartitionLayout& layout )
        : m_defaultFsType( layout.m_defaultFsType )
        , m_partLayout( layout.m_partLayout )
    {
    }
    
    PartitionLayout::~PartitionLayout()
    {
    }
    
    void
    PartitionLayout::addEntry( PartitionLayout::PartitionEntry entry )
    {
        m_partLayout.append( entry );
    }
    
    PartitionLayout::PartitionEntry::PartitionEntry( const QString& size, const QString& min, const QString& max )
    {
        partSize = PartUtils::parseSizeString( size , &partSizeUnit );
        if ( !min.isEmpty() )
            partMinSize = PartUtils::parseSizeString( min , &partMinSizeUnit );
        if ( !max.isEmpty() )
            partMaxSize = PartUtils::parseSizeString( max , &partMaxSizeUnit );
    }
    
    void
    PartitionLayout::addEntry( const QString& mountPoint, const QString& size, const QString& min, const QString& max )
    {
        PartitionLayout::PartitionEntry entry( size, min, max );
    
        entry.partMountPoint = mountPoint;
        entry.partFileSystem = m_defaultFsType;
    
        m_partLayout.append( entry );
    }
    
    void
    PartitionLayout::addEntry( const QString& label, const QString& mountPoint, const QString& fs, const QString& size, const QString& min, const QString& max )
    {
        PartitionLayout::PartitionEntry entry( size, min, max );
    
        entry.partLabel = label;
        entry.partMountPoint = mountPoint;
        PartUtils::findFS( fs, &entry.partFileSystem );
        if ( entry.partFileSystem == FileSystem::Unknown )
            entry.partFileSystem = m_defaultFsType;
    
        m_partLayout.append( entry );
    }
    
    QList< Partition* >
    PartitionLayout::execute( Device *dev, qint64 firstSector,
                              qint64 lastSector, QString luksPassphrase,
                              PartitionNode* parent,
                              const PartitionRole& role )
    {
        QList< Partition* > partList;
        qint64 size, minSize, maxSize, end;
        qint64 totalSize = lastSector - firstSector + 1;
        qint64 availableSize = totalSize;
    
        // TODO: Refine partition sizes to make sure there is room for every partition
        // Use a default (200-500M ?) minimum size for partition without minSize
    
        foreach( const PartitionLayout::PartitionEntry& part, m_partLayout )
        {
            Partition *currentPartition = nullptr;
    
            // Calculate partition size
            size = PartUtils::sizeToSectors( part.partSize, part.partSizeUnit, totalSize, dev->logicalSize() );
            minSize = PartUtils::sizeToSectors( part.partMinSize, part.partMinSizeUnit, totalSize, dev->logicalSize() );
            maxSize = PartUtils::sizeToSectors( part.partMaxSize, part.partMaxSizeUnit, totalSize, dev->logicalSize() );
            if ( size < minSize )
                size = minSize;
            if ( size > maxSize )
                size = maxSize;
            if ( size > availableSize )
                size = availableSize;
            end = firstSector + size - 1;
    
            if ( luksPassphrase.isEmpty() )
            {
                currentPartition = KPMHelpers::createNewPartition(
                    parent,
                    *dev,
                    role,
                    part.partFileSystem,
                    firstSector,
                    end,
                    KPM_PARTITION_FLAG(None)
                );
            }
            else
            {
                currentPartition = KPMHelpers::createNewEncryptedPartition(
                    parent,
                    *dev,
                    role,
                    part.partFileSystem,
                    firstSector,
                    end,
                    luksPassphrase,
                    KPM_PARTITION_FLAG(None)
                );
            }
            PartitionInfo::setFormat( currentPartition, true );
            PartitionInfo::setMountPoint( currentPartition, part.partMountPoint );
            if ( !part.partLabel.isEmpty() )
                currentPartition->fileSystem().setLabel( part.partLabel );
            // Some buggy (legacy) BIOSes test if the bootflag of at least one partition is set.
            // Otherwise they ignore the device in boot-order, so add it here.
            partList.append( currentPartition );
            firstSector = end + 1;
            availableSize -= size;
        }
    
        return partList;
    }