3 # Create, update or delete a logical volume
5 require './lvm-lib.pl';
8 ($vg) = grep { $_->{'name'} eq $in{'vg'} } &list_volume_groups();
9 $vg || &error($text{'vg_egone'});
11 ($lv) = grep { $_->{'name'} eq $in{'lv'} }
12 &list_logical_volumes($in{'vg'});
13 $lv || &error($text{'lv_egone'});
18 # Delete the logical volume
19 &error_setup($text{'lv_err2'});
20 $err = &delete_logical_volume($lv);
21 &error("<pre>$err</pre>") if ($err);
22 &webmin_log("delete", "lv", $in{'lv'}, $lv);
23 &redirect("index.cgi?mode=lvs");
25 elsif ($in{'delete'}) {
26 # Ask the user if he is sure
27 &ui_print_header(undef, $text{'lv_delete'}, "");
29 print &ui_form_start("save_lv.cgi");
30 print &ui_hidden("vg", $in{'vg'});
31 print &ui_hidden("lv", $in{'lv'});
32 print "<b>",&text($lv->{'is_snap'} ? 'lv_rusnap' : 'lv_rusure',
33 "<tt>$lv->{'device'}</tt>"),"</b><p>\n";
34 print &ui_form_end([ [ 'confirm', $text{'lv_deleteok'} ] ]);
36 &ui_print_footer("index.cgi?mode=lvs", $text{'index_return'});
40 &error_setup($text{'lv_err'});
41 $in{'name'} =~ /^[A-Za-z0-9\.\-\_]+$/ || &error($text{'lv_ename'});
42 ($same) = grep { $_->{'name'} eq $in{'name'} }
43 &list_logical_volumes($in{'vg'});
44 $same && (!$in{'lv'} || $in{'lv'} ne $in{'name'}) &&
45 &error($text{'lv_esame'});
46 if ($in{'size_mode'} == 0) {
48 $in{'size'} =~ /^\d+$/ || &error($text{'lv_esize'});
50 if (defined($in{'size_units'})) {
51 # Convert selected units to kB
52 $size *= $in{'size_units'}/1024;
56 elsif ($in{'size_mode'} == 1) {
58 $in{'vgsize'} =~ /^\d+$/ &&
60 $in{'vgsize'} <= 100 || &error($text{'lv_evgsize'});
61 $size = $in{'vgsize'};
64 elsif ($in{'size_mode'} == 2) {
66 $in{'freesize'} =~ /^\d+$/ &&
67 $in{'freesize'} > 0 &&
68 $in{'freesize'} <= 100 || &error($text{'lv_efreesize'});
69 $size = $in{'freesize'};
72 elsif ($in{'size_mode'} == 3) {
74 $in{'pvsize'} =~ /^\d+$/ &&
76 $in{'pvsize'} <= 100 || &error($text{'lv_epvsize'});
77 $size = $in{'pvsize'};
78 $sizeof = $in{'pvof'};
80 elsif ($in{'size_mode'} == 4) {
82 $in{'sizekb'} =~ /^\d+$/ || &error($text{'lv_esize'});
83 $size = $in{'sizekb'};
87 &error("Invalid size mode ".$in{'size_mode'});
89 $in{'snap'} || $in{'lv'} || $in{'stripe_def'} ||
90 $in{'stripe'} =~ /^[1-9]\d*$/ || &error($text{'lv_estripe'});
93 # Just create the logical volume
94 $lv->{'vg'} = $in{'vg'};
95 $lv->{'name'} = $in{'name'};
96 $lv->{'size'} = $size;
97 $lv->{'size_of'} = $sizeof;
100 $lv->{'snapof'} = $in{'snapof'};
103 $lv->{'perm'} = $in{'perm'};
104 $lv->{'alloc'} = $in{'alloc'};
105 $lv->{'stripe'} = $in{'stripe'} if (!$in{'stripe_def'});
106 $lv->{'stripesize'} = $in{'stripesize'};
107 $lv->{'readahead'} = $in{'readahead'};
109 $err = &create_logical_volume($lv);
110 &error("<pre>$err</pre>") if ($err);
111 &webmin_log("create", "lv", $in{'name'}, $lv);
113 elsif ($lv->{'is_snap'}) {
114 # Modifying a snapshot
115 if ($lv->{'size'} != $size) {
116 $err = &resize_logical_volume($lv, $size);
117 &error("<pre>$err</pre>") if ($err);
118 $lv->{'size'} = $size;
120 if ($lv->{'name'} ne $in{'name'}) {
122 $err = &rename_logical_volume($lv, $in{'name'});
123 &error("<pre>$err</pre>") if ($err);
124 $lv->{'name'} = $in{'name'};
128 # Modifying the logical volume
129 @stat = &device_status($lv->{'device'});
130 if ($lv->{'size'} != $size) {
131 # Is the new size too big?
132 local $nblocks = &round_up(
133 $size * 1.0 / $vg->{'pe_size'});
134 local $oblocks = &round_up(
135 $lv->{'size'} * 1.0 / $vg->{'pe_size'});
136 if ($vg->{'pe_alloc'} - $oblocks + $nblocks > $vg->{'pe_total'}) {
137 #&error(&text('lv_toobig', $nblocks, "$vg->{'pe_size'} kB", $vg->{'pe_total'} - $vg->{'pe_alloc'}));
140 local $realsize = $nblocks * $vg->{'pe_size'};
141 if ($in{'sizeconfirm'}) {
142 # Just resize the logical volume
143 $err = &resize_logical_volume($lv, $realsize);
144 &error("<pre>$err</pre>") if ($err);
147 local $can = &can_resize_lv_stat(@stat);
149 $can == 1 && $realsize > $lv->{'size'}) &&
151 # Attempt to resize FS properly
152 $err = &resize_filesystem($lv, $stat[1],
155 $err = &text('resize_fs',
157 "</center><pre>$err".
162 # Cannot resize while mounted
164 $text{'resize_emounted2'} :
165 $text{'resize_emounted'});
168 # Cannot resize .. ask for confirmation
169 $err = @stat && $stat[1] ne '*' &&
171 &text('resize_mesg', $stat[1]) :
172 $text{'resize_mesg2'};
175 &ui_print_header(undef, $text{'resize_title'}, "");
176 print "<center><form action=save_lv.cgi>\n";
177 foreach $i (keys %in) {
178 print "<input type=hidden name=$i value='$in{$i}'>\n";
180 print "<b>$err</b> <p>\n";
181 print "<input type=submit name=sizeconfirm value='$text{'resize_ok'}'>\n";
182 print "</form></center>\n";
183 &ui_print_footer("", $text{'index_return'});
187 $lv->{'size'} = $realsize;
189 if ($lv->{'perm'} ne $in{'perm'} ||
190 $lv->{'alloc'} ne $in{'alloc'} ||
191 $lv->{'readahead'} ne $in{'readahead'}) {
192 # Need to change options
193 $lv->{'perm'} = $in{'perm'};
194 $lv->{'alloc'} = $in{'alloc'};
195 $lv->{'readahead'} = $in{'readahead'};
196 $err = &change_logical_volume($lv, $oldlv);
197 &error("<pre>$err</pre>") if ($err);
199 if ($lv->{'name'} ne $in{'name'}) {
201 $err = &rename_logical_volume($lv, $in{'name'});
202 &error("<pre>$err</pre>") if ($err);
203 $lv->{'name'} = $in{'name'};
205 &webmin_log("modify", "lv", $in{'lv'}, $lv);
207 &redirect("index.cgi?mode=lvs");