Better options for LV creation size
authorJamie Cameron <jcameron@webmin.com>
Wed, 1 Apr 2009 00:25:13 +0000 (00:25 +0000)
committerJamie Cameron <jcameron@webmin.com>
Wed, 1 Apr 2009 00:25:13 +0000 (00:25 +0000)
lvm/CHANGELOG
lvm/edit_lv.cgi
lvm/lang/en
lvm/lvm-lib.pl
lvm/save_lv.cgi

index 28551ad..c387e45 100644 (file)
@@ -15,3 +15,5 @@ The percentage of a snapshot's blocks used is now shown on the Edit Snapshot pag
 ---- Changes since 1.440 ----
 Filesystem space used is show on the logical volume list, and the field for a new volume's size is more user-friendly.
 When using newer versions of the resize2fs command, EXT filesystems can be shrunk as well as enlarged.
+---- Changes since 1.480 ----
+When creating a logical volume, size can now be specified as a fraction of the volume group size, free space, or free space on some physical volume.
index 81d9ba2..7b50858 100755 (executable)
@@ -41,9 +41,22 @@ else {
                &ui_textbox("name", $lv->{'name'}, 20));
 
        if (!$in{'lv'}) {
-               # Can show nice size chooser
+               # Can show nice size chooser for absolute or relative size
+               @pvopts = map { $_->{'name'} }
+                             &list_physical_volumes($in{'vg'});
                print &ui_table_row($text{'lv_size'},
-                       &ui_bytesbox("size", $lv->{'size'}*1024, 8));
+                       &ui_radio_table("size_mode", 0,
+                         [ [ 0, $text{'lv_size0'},
+                             &ui_bytesbox("size", $lv->{'size'}*1024, 8) ],
+                           [ 1, $text{'lv_size1'},
+                             &ui_textbox("vgsize", undef, 4)."%" ],
+                           [ 2, $text{'lv_size2'},
+                             &ui_textbox("freesize", undef, 4)."%" ],
+                           [ 3, $text{'lv_size3'},
+                             &text('lv_size3a',
+                               &ui_textbox("pvsize", undef, 4)."%",
+                               &ui_select("pvof", undef, \@pvopts)) ],
+                         ]), 3);
                }
        else {
                # Show in exactly kB
index 574c246..4ea08b5 100644 (file)
@@ -47,6 +47,11 @@ lv_vg=In volume group $1
 lv_header=Logical volume details
 lv_name=Volume name
 lv_size=Volume size
+lv_size0=Absolute size
+lv_size1=Percentage of VG size
+lv_size2=Percentage of VG free space
+lv_size3=Percentage of PV free space
+lv_size3a=$1 of $2
 lv_device=Device file
 lv_status=Current status
 lv_mount=Mounted on $1 as $2
@@ -70,6 +75,9 @@ lv_err=Failed to save logical volume
 lv_ename=Missing or invalid volume name
 lv_esame=A logical volume with the same name already exists
 lv_esize=Missing or invalid volume size
+lv_evgsize=Missing or invalid volume group size percentage
+lv_efreesize=Missing or invalid free volume group size percentage
+lv_epvsize=Missing or invalid free physical volume size percentage
 lv_estripe=Missing or invalid number of stripes
 lv_delete=Delete Logical Volume
 lv_rusure=Are you sure you want to delete the logical volume $1 ? Any data in a filesystem on this logical volume will be deleted forever!
index 1162652..a8cb2e4 100644 (file)
@@ -277,6 +277,7 @@ else {
        # Use the lvdisplay command
        local $lv;
        local $_;
+       local ($vg) = grep { $_->{'name'} eq $_[0] } &list_volume_groups();
        open(DISPLAY, "lvdisplay |");
        while(<DISPLAY>) {
                s/\r|\n//g;
@@ -292,6 +293,9 @@ else {
                elsif (/LV\s+Size\s+(\S+)\s+(\S+)/i) {
                        $lv->{'size'} = &mult_units($1, $2);
                        }
+               elsif (/Current\s+LE\s+(\d+)/ && $vg) {
+                       $lv->{'size'} = $1 * $vg->{'pe_size'};
+                       }
                elsif (/LV\s+Write\s+Access\s+(\S+)/i) {
                        $lv->{'perm'} = $1 eq 'read/write' ? 'rw' : 'r';
                        }
@@ -361,7 +365,18 @@ return @rv;
 # create_logical_volume(&lv)
 sub create_logical_volume
 {
-local $cmd = "lvcreate -n$_[0]->{'name'} -L$_[0]->{'size'}k";
+local $cmd = "lvcreate -n$_[0]->{'name'} ";
+local $suffix;
+if ($_[0]->{'size_of'} eq 'VG' || $_[0]->{'size_of'} eq 'FREE') {
+       $cmd .= "-l $_[0]->{'size'}%$_[0]->{'size_of'}";
+       }
+elsif ($_[0]->{'size_of'}) {
+       $cmd .= "-l $_[0]->{'size'}%PVS";
+       $suffix = " /dev/".$_[0]->{'size_of'};
+       }
+else {
+       $cmd .= "-L$_[0]->{'size'}k";
+       }
 if ($_[0]->{'is_snap'}) {
        $cmd .= " -s '/dev/$_[0]->{'vg'}/$_[0]->{'snapof'}'";
        }
@@ -371,6 +386,7 @@ else {
        $cmd .= " -i $_[0]->{'stripe'}" if ($_[0]->{'stripe'});
        $cmd .= " $_[0]->{'vg'}";
        }
+$cmd .= $suffix;
 local $out = &backquote_logged("$cmd 2>&1 </dev/null");
 return $? ? $out : undef;
 }
index 473a6fa..2242334 100755 (executable)
@@ -38,11 +38,40 @@ else {
                       &list_logical_volumes($in{'vg'});
        $same && (!$in{'lv'} || $in{'lv'} ne $in{'name'}) &&
                &error($text{'lv_esame'});
-       $in{'size'} =~ /^\d+$/ || &error($text{'lv_esize'});
-       if (defined($in{'size_units'})) {
-               # Convert selected units to kB
-               $in{'size'} = $in{'size'}*$in{'size_units'}/1024;
-               delete($in{'size_units'});
+       if ($in{'size_mode'} == 0) {
+               # Absolute size
+               $in{'size'} =~ /^\d+$/ || &error($text{'lv_esize'});
+               $size = $in{'size'};
+               if (defined($in{'size_units'})) {
+                       # Convert selected units to kB
+                       $size *= $in{'size_units'}/1024;
+                       delete($in{'size_units'});
+                       }
+               $sizeof = undef;
+               }
+       elsif ($in{'size_mode'} == 1) {
+               # Size of VG
+               $in{'vgsize'} =~ /^\d+$/ &&
+                       $in{'vgsize'} > 0 &&
+                       $in{'vgsize'} <= 100 || &error($text{'lv_evgsize'});
+               $size = $in{'vgsize'};
+               $sizeof = 'VG';
+               }
+       elsif ($in{'size_mode'} == 2) {
+               # Size of free space
+               $in{'freesize'} =~ /^\d+$/ &&
+                       $in{'freesize'} > 0 &&
+                       $in{'freesize'} <= 100 || &error($text{'lv_efreesize'});
+               $size = $in{'freesize'};
+               $sizeof = 'FREE';
+               }
+       else {
+               # Size of some PV
+               $in{'pvsize'} =~ /^\d+$/ &&
+                       $in{'pvsize'} > 0 &&
+                       $in{'pvsize'} <= 100 || &error($text{'lv_epvsize'});
+               $size = $in{'pvsize'};
+               $sizeof = $in{'pvof'};
                }
        $in{'snap'} || $in{'lv'} || $in{'stripe_def'} ||
                $in{'stripe'} =~ /^[1-9]\d*$/ || &error($text{'lv_estripe'});
@@ -51,7 +80,8 @@ else {
                # Just create the logical volume
                $lv->{'vg'} = $in{'vg'};
                $lv->{'name'} = $in{'name'};
-               $lv->{'size'} = $in{'size'};
+               $lv->{'size'} = $size;
+               $lv->{'size_of'} = $sizeof;
                if ($in{'snap'}) {
                        $lv->{'is_snap'} = 1;
                        $lv->{'snapof'} = $in{'snapof'};