summaryrefslogtreecommitdiffstats
path: root/perl-install/patch/9.1
ModeNameSize
-rw-r--r--hp.diff5915logstatsplain
-rw-r--r--patch-detectSMP-K6.pl81logstatsplain
-rw-r--r--patch-loopback.pl512logstatsplain
ef='#n75'>75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
package lvm; # $Id$

use diagnostics;
use strict;

#-######################################################################################
#- misc imports
#-######################################################################################
use common;
use modules;
use fsedit;
use devices;
use run_program;

#- for partition_table_xxx emulation
sub new {
    my ($class, $name) = @_;
    $name =~ s/\W/_/g;
    $name = substr($name, 0, 63); # max length must be < NAME_LEN / 2  where NAME_LEN is 128
    bless { disks => [], VG_name => $name }, $class;
}
sub hasExtended { 0 }
sub adjustStart {}
sub adjustEnd {}
sub write {}
sub cylinder_size { 
    my ($hd) = @_;
    $hd->{PE_size};
}

init();

sub init {
    eval { modules::load('lvm-mod') };
    run_program::run('vgscan') if !-e '/etc/lvmtab';
    run_program::run('vgchange', '-a', 'y');
}

sub run {
    if (my $r = run_program::run(@_)) {
	$r;
    } else {
	$? >> 8 == 98 or return;

	#- sometimes, it needs running vgscan again, doing so:
	run_program::run('vgscan');
	run_program::run(@_);
    }
}
sub run_or_die {
    my ($prog, @para) = @_;
    run($prog, @para) or die "$prog failed\n";
}

sub check {
    my ($in) = @_;

    my $f = '/sbin/pvcreate';
    -e $f or $in->do_pkgs->install('lvm');
    -e $f or $in->ask_warn('', "Mandatory package lvm is missing"), return;
    init();
    1;
}

sub get_vg {
    my ($part) = @_;
    my $dev = expand_symlinks(devices::make($part->{device}));
    (split(':', run_program::get_stdout('pvdisplay', '-c', $dev)))[1];
}

sub update_size {
    my ($lvm) = @_;
    my @l = split(':', run_program::get_stdout('vgdisplay', '-c', '-D', $lvm->{VG_name}));
    $lvm->{totalsectors} = ($lvm->{PE_size} = $l[12]) * $l[13];
}

sub get_lv_size {
    my ($lvm_device) = @_;
    my $info = run_program::get_stdout('lvdisplay', '-D', '-c', "/dev/$lvm_device");
    (split(':', $info))[6];
}

sub get_lvs {
    my ($lvm) = @_;
    my @l = run_program::get_stdout('vgdisplay', '-v', '-D', $lvm->{VG_name});
    $lvm->{primary}{normal} = 
      [
       map {
	   my $type = -e "/dev/$_" && fsedit::typeOfPart("/dev/$_");

	   { device => $_, 
	     type => $type || 0x83,
	     size => get_lv_size($_) }
       } map { if_(m|^LV Name\s+/dev/(\S+)|, $1) } @l
      ];
}

sub vg_add {
    my ($part) = @_;
    my $dev = expand_symlinks(devices::make($part->{device}));
    run_or_die('pvcreate', '-y', '-ff', $dev);
    my $prog = run('vgdisplay', $part->{lvm}) ? 'vgextend' : 'vgcreate';
    run_or_die($prog, $part->{lvm}, $dev);
}

sub vg_destroy {
    my ($lvm) = @_;

    is_empty_array_ref($lvm->{primary}{normal}) or die N("Remove the logical volumes first\n");
    run('vgchange', '-a', 'n', $lvm->{VG_name});
    run_or_die('vgremove', $lvm->{VG_name});
    foreach (@{$lvm->{disks}}) {
	delete $_->{lvm};
	$_->{isFormatted} = 0;
	$_->{notFormatted} = 1;	
    }
}

sub lv_delete {
    my ($lvm, $lv) = @_;

    run_or_die('lvremove', '-f', "/dev/$lv->{device}");

    my $list = $lvm->{primary}{normal};
    @$list = grep { $_ != $lv } @$list;
}

sub lv_create {
    my ($lvm, $lv) = @_;
    my $list = $lvm->{primary}{normal} ||= [];
    my $nb = 1 + max(map { basename($_->{device}) } @$list);