home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / include / partitioning / auto_part_prepare.ycp < prev    next >
Text File  |  2006-11-29  |  5KB  |  175 lines

  1. /**
  2.  * Module:         auto_part_prepare.ycp
  3.  *
  4.  * Authors:         Andreas Schwab (schwab@suse.de)
  5.  *            Klaus KΣmpf (kkaempf@suse.de)
  6.  *
  7.  * Purpose:         This module preparse the raw targetMap to
  8.  *            cover the whole disk, including unpartitioned
  9.  *            areas as 'dummy' partitions.
  10.  *
  11.  * $Id: auto_part_prepare.ycp 27076 2006-01-16 18:04:08Z fehr $
  12.  *
  13.  */
  14. {
  15. textdomain "storage";
  16. import "Storage";
  17. import "Partitions";
  18. import "Mode";
  19.  
  20. define list<map> prepare_partitions( map target, list<map> partitions )
  21.     ``{
  22.     // --------------------------------------------------------------
  23.     // The size of a unit (eg. one cylinder)
  24.     integer  bytes_per_unit = target["cyl_size"]:1;
  25.     // The size of the disk in units
  26.     integer disk_size = target["cyl_count"]:1;
  27.     y2milestone( "prepare_partitions bytes_per_unit: %1 disk_size:%2", 
  28.                  bytes_per_unit, disk_size );
  29.  
  30.     size_of_boot = Partitions::MinimalNeededBootsize();
  31.  
  32.     // The minimum size needed to install a default system
  33.     integer required_size = 1500 * 1024 * 1024 + size_of_boot + size_of_swap;
  34.  
  35.     // filter out all "create" paritions, they will be re-created at exit
  36.     //   (this ensures a 'clean' partition list if this dialogue is re-entered
  37.  
  38.     partitions = filter (map pentry, partitions, ``(!pentry["create"]:false));
  39.  
  40.     // reset all "delete" paritions, they will be re-created at exit
  41.     //   (this ensures a 'clean' partition list if this dialogue is re-entered
  42.  
  43.     partitions = maplist (map pentry, partitions, ``(add (pentry, "delete", false)));
  44.  
  45.     // The region that describes the full disk
  46.     list<integer> full_region = [ 0, disk_size ];
  47.  
  48.     //-------------------------------------------------------------------------
  49.     // The action
  50.     //-------------------------------------------------------------------------
  51.  
  52.     // First sort the partitions on the starting cylinder
  53.     partitions = sort( map p1, map p2, partitions,
  54.                ``(start_of_region (p1["region"]:[])
  55.               < start_of_region(p2["region"]:[])));
  56.  
  57.     // now check if automatic partitioning if feasible
  58.  
  59.     // unpartitioned disk -> yes
  60.  
  61.     can_do_auto = false;
  62.  
  63.     if( size(partitions)==0 ) 
  64.     {
  65.     // No partitions -> use the entire disk
  66.     can_do_auto = true;
  67.     unused_region = full_region;
  68.     }
  69.  
  70.     // extended region with enough free space -> yes
  71.  
  72.     if( (!can_do_auto) && contains_extended(partitions) ) 
  73.     {
  74.     // Extended partition already exists -> look for free space at
  75.     // the end of it
  76.     unused_region = unused_extended_region (partitions);
  77.  
  78.     // check if this is enough
  79.     if( (size_of_region(unused_region,bytes_per_unit) > required_size) && 
  80.         can_create_logical (partitions))
  81.         can_do_auto = true;
  82.     }
  83.  
  84.     // no extended region, but primaries left
  85.     //   if there is enough space after the last defined primary -> yes
  86.  
  87.     if( !can_do_auto && !contains_extended (partitions) && 
  88.     num_primary(partitions) != max_primary ) 
  89.     {
  90.     map last_partition = partitions[size(partitions)-1]:$[];
  91.     if( ignored_partition( target, last_partition ))
  92.         last_partition = partitions[size(partitions)-2]:$[];
  93.     list<integer> last_region = last_partition["region"]:[];
  94.     integer last_used = end_of_region(last_region);
  95.  
  96.     if (last_used < disk_size) 
  97.         {
  98.         unused_region = [ last_used, disk_size-last_used ];
  99.         if (size_of_region (unused_region,bytes_per_unit) > required_size)
  100.         can_do_auto = true;
  101.         }
  102.     }
  103.  
  104.  
  105.     //-------------------------------------------------------------------------
  106.     // Augment the partition list with a description for holes
  107.  
  108.     integer last_end = 0;
  109.     integer free_nr = 0;
  110.  
  111.     // first the mid-disk holes
  112.  
  113.     partitions = flatten( maplist( map pentry, partitions, 
  114.     ``{
  115.     list<map> ret = [];
  116.     list<integer> region = pentry["region"]:[];
  117.  
  118.     if( !ignored_partition( target, pentry ) &&
  119.         start_of_region (region) > last_end) 
  120.         {
  121.         free_nr = free_nr + 1;
  122.         ret = add (ret, $["type":`free,
  123.                  "region": [ last_end,
  124.                        start_of_region (region) - last_end ]]);
  125.         // if free space is directly located before extended partition
  126.         last_end = start_of_region (region);
  127.         }
  128.  
  129.     // if this partition is not the extended partition or a ignored
  130.     //    use its end_of_region as last_end
  131.     // on BSD-like partitions, partition # 3 is handled similary
  132.  
  133.     if( (pentry["type"]:`unknown != `extended) &&
  134.         !ignored_partition( target, pentry ) )
  135.         last_end = end_of_region (pentry["region"]:[]);
  136.     return add (ret, pentry);
  137.     }));
  138.  
  139.     // then the end-disk hole
  140.  
  141.     if (last_end < disk_size) 
  142.     {
  143.     free_nr = free_nr + 1;
  144.     partitions = add (partitions,
  145.               $[ "type":`free,
  146.                  "region": [ last_end, disk_size - last_end ]]);
  147.     }
  148.  
  149.     // now the partitions list spans the whole disk
  150.  
  151.     //-------------------------------------------------------------------------
  152.     // Create a checkbox for every real (primary or logical) partition
  153.     // and any free space
  154.  
  155.     // give each partition a unique id
  156.  
  157.     integer ui_id = 0;
  158.     partitions = maplist (map p, partitions, 
  159.     ``{
  160.     ui_id = ui_id + 1;
  161.     p["ui_id"] = ui_id;
  162.     if( p["type"]:`unknown == `free )
  163.         p["size_k"] = size_of_region( p["region"]:[0,0], bytes_per_unit )/1024;
  164.     if( haskey(p,"mount"))
  165.         p = remove( p, "mount" );
  166.     return( p );
  167.     });
  168.  
  169.     // now the partitions list spans the whole disk
  170.     y2milestone("prepare_partitions partitions: %1", partitions);
  171.  
  172.     return partitions;
  173.     };
  174. }
  175.