// -------------------------------------------------------------------- // reallocPartition() // /// \brief Reallocates a partition and all of its children. // // -------------------------------------------------------------------- void reallocPartition(Partition *p) { if (p->m_leaf) { return; } // --- INITIAL PARTITION if (PARTITION_AREA_ONLY) partitionEqualArea(p); else partitionScanlineMincut(p); resizePartition(p); // --- PARTITION IMPROVEMENT if (p->m_level < REPARTITION_LEVEL_DEPTH) { if (REPARTITION_HMETIS) repartitionHMetis(p); resizePartition(p); } reallocPartition(p->m_sub1); reallocPartition(p->m_sub2); }
bool MParted::MParted_Core::resize(const MParted::Device & device, MParted::Partition & partition_old, MParted::Partition & partition_new) { // We only support resizing if (partition_new.sector_start != partition_old.sector_start) return false; // Perfom alignment if (!snapToAlignment(device, partition_new)) return false; if (partition_new.alignment == MParted::ALIGN_CYLINDER && !calculateExactGeom(partition_old, partition_new)) return false; // If start sector has changed then undo the change if (partition_new.sector_start != partition_old.sector_start) partition_new.sector_start = partition_old.sector_start; // TODO: is this ok? -> alignment? if (partition_old.type == MParted::TYPE_EXTENDED) return resizePartition(partition_old, partition_new); // First check the filesystem if (!checkRepairFilesystem(partition_new)) return false; bool success = true; if (partition_new.getSectorLength() < partition_old.getSectorLength()) success = resizeFilesystem(partition_old, partition_new); if (success) success = resizePartition(partition_old, partition_new); // Do not maximize file system if new size <= old. It has been resized already... if (success && partition_new.getSectorLength() > partition_old.getSectorLength()) // Expand file system to fit exactly in partition success = maximizeFilesystem(partition_new); // Finally check the filesystem again if (!checkRepairFilesystem(partition_new)) return false; return success; }
// -------------------------------------------------------------------- // refinePartition() // /// \brief Splits any large leaves within a partition. // // -------------------------------------------------------------------- bool refinePartition(Partition *p) { bool degenerate = false; int nonzeroCount = 0; int i; assert(p); // is this partition completed? if (p->m_done) return true; // is this partition a non-leaf node? if (!p->m_leaf) { p->m_done = refinePartition(p->m_sub1); p->m_done &= refinePartition(p->m_sub2); return p->m_done; } // leaf... // create two new subpartitions g_place_numPartitions++; p->m_sub1 = malloc(sizeof(Partition)); p->m_sub1->m_level = p->m_level+1; p->m_sub1->m_leaf = true; p->m_sub1->m_done = false; p->m_sub1->m_area = 0; p->m_sub1->m_vertical = !p->m_vertical; p->m_sub1->m_numMembers = 0; p->m_sub1->m_members = NULL; p->m_sub2 = malloc(sizeof(Partition)); p->m_sub2->m_level = p->m_level+1; p->m_sub2->m_leaf = true; p->m_sub2->m_done = false; p->m_sub2->m_area = 0; p->m_sub2->m_vertical = !p->m_vertical; p->m_sub2->m_numMembers = 0; p->m_sub2->m_members = NULL; p->m_leaf = false; // --- INITIAL PARTITION if (PARTITION_AREA_ONLY) partitionEqualArea(p); else partitionScanlineMincut(p); resizePartition(p); // --- PARTITION IMPROVEMENT if (p->m_level < REPARTITION_LEVEL_DEPTH) { if (REPARTITION_FM) repartitionFM(p); else if (REPARTITION_HMETIS) repartitionHMetis(p); } resizePartition(p); // fix imbalances due to zero-area cells for(i=0; i<p->m_sub1->m_numMembers; i++) if (p->m_sub1->m_members[i]) if (getCellArea(p->m_sub1->m_members[i]) > 0) { nonzeroCount++; } // is this leaf now done? if (nonzeroCount <= LARGEST_FINAL_SIZE) p->m_sub1->m_done = true; if (nonzeroCount == 0) degenerate = true; nonzeroCount = 0; for(i=0; i<p->m_sub2->m_numMembers; i++) if (p->m_sub2->m_members[i]) if (getCellArea(p->m_sub2->m_members[i]) > 0) { nonzeroCount++; } // is this leaf now done? if (nonzeroCount <= LARGEST_FINAL_SIZE) p->m_sub2->m_done = true; if (nonzeroCount == 0) degenerate = true; // have we found a degenerate partitioning? if (degenerate) { printf("QPART-35 : WARNING: degenerate partition generated\n"); partitionEqualArea(p); resizePartition(p); p->m_sub1->m_done = true; p->m_sub2->m_done = true; } // is this parent now finished? if (p->m_sub1->m_done && p->m_sub2->m_done) p->m_done = true; return p->m_done; }