[Fai-commit] r6171 - branches/experimental/patches
Michael Tautschnig
mt at alioth.debian.org
Fri Oct 29 11:55:50 UTC 2010
Author: mt
Date: 2010-10-29 11:55:49 +0000 (Fri, 29 Oct 2010)
New Revision: 6171
Added:
branches/experimental/patches/setup-storage_pvcreate-old-lvm
Removed:
branches/experimental/patches/setup-storage_raw-disk
Modified:
branches/experimental/patches/grub-pc
branches/experimental/patches/series
branches/experimental/patches/setup-storage_extended-is-not-last
branches/experimental/patches/setup-storage_gpt-bios-fix
branches/experimental/patches/setup-storage_no-cylinder-boundaries
branches/experimental/patches/setup-storage_preserve-format-all
branches/experimental/patches/setup-storage_user-100-percent
Log:
Updated experimental to match current trunk, added attempt to fix pvcreate error
in case of flushed MBR
Modified: branches/experimental/patches/grub-pc
===================================================================
--- branches/experimental/patches/grub-pc 2010-10-29 09:18:07 UTC (rev 6170)
+++ branches/experimental/patches/grub-pc 2010-10-29 11:55:49 UTC (rev 6171)
@@ -153,10 +153,10 @@
# walk through all configured parts
# the order of entries is most likely wrong, it is fixed at the end
foreach my $c (keys %$config) {
-@@ -172,15 +223,11 @@
+@@ -173,15 +224,11 @@
+ my $device_name = 0 == $p_ref->{number} ? $device :
+ &FAI::make_device_name($device, $p_ref->{number});
- my $device_name = &FAI::make_device_name($device, $p_ref->{number});
-
- # if the mount point is / or /boot, the variables should be set, unless
- # they are already
- if ($p_ref->{mountpoint} eq "/boot" || ($p_ref->{mountpoint} eq "/" &&
@@ -173,7 +173,7 @@
}
push @fstab, &FAI::create_fstab_line($p_ref,
-@@ -203,15 +250,13 @@
+@@ -204,15 +251,13 @@
my $device_name = "/dev/$device/$l";
@@ -196,7 +196,7 @@
}
push @fstab, &FAI::create_fstab_line($l_ref,
-@@ -230,15 +275,13 @@
+@@ -231,15 +276,13 @@
my $device_name = "/dev/md$r";
@@ -219,7 +219,7 @@
}
push @fstab, &FAI::create_fstab_line($r_ref,
-@@ -252,8 +295,7 @@
+@@ -253,8 +296,7 @@
my $device_name = &FAI::enc_name($c_ref->{device});
@@ -229,7 +229,7 @@
die "Boot partition cannot be encrypted\n";
push @fstab, &FAI::create_fstab_line($c_ref, $device_name, $device_name);
-@@ -291,7 +333,10 @@
+@@ -292,7 +334,10 @@
$FAI::disk_var{SWAPLIST} =~ s/\s*$/"/;
# cleanup the list of boot devices (remove leading space and add quotes)
Modified: branches/experimental/patches/series
===================================================================
--- branches/experimental/patches/series 2010-10-29 09:18:07 UTC (rev 6170)
+++ branches/experimental/patches/series 2010-10-29 11:55:49 UTC (rev 6171)
@@ -14,10 +14,10 @@
setup-storage_user-100-percent
bugfix-498412
ftar_rm-fix
-setup-storage_raw-disk
fcopy_symlinks
setup-storage_cryptsetup-passphrase
setup-storage_no-empty-config
setup-storage_entire-disk-in-volume
setup-storage_disklist-LOGDIR-defaults
grub-in-target
+setup-storage_pvcreate-old-lvm
Modified: branches/experimental/patches/setup-storage_extended-is-not-last
===================================================================
--- branches/experimental/patches/setup-storage_extended-is-not-last 2010-10-29 09:18:07 UTC (rev 6170)
+++ branches/experimental/patches/setup-storage_extended-is-not-last 2010-10-29 11:55:49 UTC (rev 6171)
@@ -25,7 +25,7 @@
}
# on gpt, ensure that the partition ends at a sector boundary
-@@ -697,37 +691,45 @@
+@@ -699,37 +693,45 @@
# reference to the current partition
my $part = (\%FAI::configs)->{$config}->{partitions}->{$part_id};
Modified: branches/experimental/patches/setup-storage_gpt-bios-fix
===================================================================
--- branches/experimental/patches/setup-storage_gpt-bios-fix 2010-10-29 09:18:07 UTC (rev 6170)
+++ branches/experimental/patches/setup-storage_gpt-bios-fix 2010-10-29 11:55:49 UTC (rev 6171)
@@ -6,7 +6,7 @@
===================================================================
--- trunk.orig/lib/setup-storage/Parser.pm
+++ trunk/lib/setup-storage/Parser.pm
-@@ -605,6 +605,20 @@
+@@ -615,6 +615,20 @@
# supported by parted could be allowed, but others are not implemented
# yet
$FAI::configs{$FAI::device}{disklabel} = $1;
@@ -31,7 +31,7 @@
===================================================================
--- trunk.orig/lib/setup-storage/Sizes.pm
+++ trunk/lib/setup-storage/Sizes.pm
-@@ -665,19 +665,6 @@
+@@ -667,19 +667,6 @@
# the space required by the GPTs
$min_req_total_space += 33 * $current_disk->{sector_size};
Modified: branches/experimental/patches/setup-storage_no-cylinder-boundaries
===================================================================
--- branches/experimental/patches/setup-storage_no-cylinder-boundaries 2010-10-29 09:18:07 UTC (rev 6170)
+++ branches/experimental/patches/setup-storage_no-cylinder-boundaries 2010-10-29 11:55:49 UTC (rev 6171)
@@ -70,7 +70,7 @@
# set $start and $end to the effective values
$start = $end_byte - $next_start + 1;
-@@ -623,6 +612,13 @@
+@@ -625,6 +614,13 @@
# reference to the current disk config
my $current_disk = $FAI::current_config{$disk};
@@ -84,7 +84,7 @@
# at various points the following code highly depends on the desired disk label!
# initialise variables
# the id of the extended partition to be created, if required
-@@ -651,10 +647,6 @@
+@@ -653,10 +649,6 @@
$next_start = $current_disk->{bios_sectors_per_track} *
$current_disk->{sector_size};
@@ -95,7 +95,7 @@
} elsif ($FAI::configs{$config}{disklabel} eq "gpt") {
# on GPT-EFI disk labels the first 34 and last 33 sectors must be left alone
$next_start = 34 * $current_disk->{sector_size};
-@@ -666,13 +658,12 @@
+@@ -668,13 +660,12 @@
$min_req_total_space += (34 + 33) * $current_disk->{sector_size};
} elsif ($FAI::configs{$config}{disklabel} eq "gpt-bios") {
@@ -114,7 +114,7 @@
# apparently parted insists in having some space left at the end too
# modify the disk to claim the space for the second partition table
-@@ -739,7 +730,7 @@
+@@ -741,7 +732,7 @@
shift @worklist;
} else {
($next_start, $min_req_total_space) = &FAI::do_partition_real($part_id,
@@ -127,7 +127,7 @@
===================================================================
--- trunk.orig/lib/setup-storage/Parser.pm
+++ trunk/lib/setup-storage/Parser.pm
-@@ -581,6 +581,10 @@
+@@ -591,6 +591,10 @@
{
$FAI::configs{$FAI::device}{partitions}{$_}{size}{always_format} = 1 foreach (split(",", $1));
}
Modified: branches/experimental/patches/setup-storage_preserve-format-all
===================================================================
--- branches/experimental/patches/setup-storage_preserve-format-all 2010-10-29 09:18:07 UTC (rev 6170)
+++ branches/experimental/patches/setup-storage_preserve-format-all 2010-10-29 11:55:49 UTC (rev 6171)
@@ -20,7 +20,7 @@
};
}
-@@ -167,6 +168,15 @@
+@@ -168,6 +169,15 @@
# the index of the new partition
my $part_number = 0;
@@ -35,8 +35,8 @@
+
# create a primary partition
if ($type eq "primary") {
-
-@@ -265,8 +275,9 @@
+ (defined($FAI::configs{$FAI::device}{partitions}{0})) and
+@@ -275,8 +285,9 @@
defined ($part_size->{always_format})
or $part_size->{always_format} = 0;
@@ -48,7 +48,7 @@
}
}
-@@ -290,15 +301,15 @@
+@@ -300,15 +311,15 @@
# add the preserve = 0 flag, if it doesn't exist already
defined ($FAI::partition_pointer->{size}->{preserve})
@@ -67,7 +67,7 @@
}
################################################################################
-@@ -375,6 +386,7 @@
+@@ -385,6 +396,7 @@
&FAI::in_path("mdadm") or die "mdadm not found in PATH\n";
$FAI::device = "RAID";
$FAI::configs{$FAI::device}{fstabkey} = "device";
@@ -75,7 +75,7 @@
}
raid_option(s?)
| 'cryptsetup'
-@@ -395,6 +407,7 @@
+@@ -405,6 +417,7 @@
# being configured
$FAI::device = "VG_";
$FAI::configs{"VG_--ANY--"}{fstabkey} = "device";
@@ -83,7 +83,7 @@
}
lvm_option(s?)
| 'end'
-@@ -426,30 +439,46 @@
+@@ -436,30 +449,46 @@
option(s?)
| <error>
@@ -139,7 +139,7 @@
}
cryptsetup_option: /^randinit/
-@@ -457,41 +486,57 @@
+@@ -467,41 +496,57 @@
$FAI::configs{$FAI::device}{randinit} = 1;
}
@@ -219,7 +219,7 @@
}
}
| /^fstabkey:(device|label|uuid)/
-@@ -499,39 +544,59 @@
+@@ -509,39 +554,59 @@
# the information preferred for fstab device identifieres
$FAI::configs{"VG_--ANY--"}{fstabkey} = $1;
}
@@ -294,7 +294,7 @@
$FAI::configs{$FAI::device}{preserveparts} = 1;
}
| /^disklabel:(msdos|gpt-bios|gpt)/
-@@ -577,9 +642,13 @@
+@@ -587,9 +652,13 @@
$FAI::configs{$FAI::device} = dclone($FAI::configs{"PHY_" . $ref_dev});
}
@@ -310,7 +310,7 @@
}
| /^align-at:(\d+[kMGTPiB]*)/
{
-@@ -604,12 +673,14 @@
+@@ -614,12 +683,14 @@
$FAI::configs{RAID}{volumes}{$vol_id}{mode} = $1;
# initialise the hash of devices
$FAI::configs{RAID}{volumes}{$vol_id}{devices} = {};
@@ -329,7 +329,7 @@
# set the reference to the current volume
# the reference is used by all further processing of this config line
$FAI::partition_pointer = (\%FAI::configs)->{RAID}->{volumes}->{$vol_id};
-@@ -681,13 +752,17 @@
+@@ -697,13 +768,17 @@
# initialise the new hash
defined($FAI::configs{$FAI::device}{volumes}{$2}) or
$FAI::configs{$FAI::device}{volumes}{$2} = {};
@@ -447,20 +447,20 @@
===================================================================
--- trunk.orig/lib/setup-storage/Commands.pm
+++ trunk/lib/setup-storage/Commands.pm
-@@ -1102,6 +1102,16 @@
- # no partition table operations
- $FAI::partition_table_deps{$disk} = "";
- }
-+ } elsif (defined($FAI::configs{$config}{opts_all}{preserve})) {
-+ foreach my $part_id (&numsort(keys %{ $FAI::configs{$config}{partitions} })) {
-+ # all partitions exist
-+ &FAI::push_command( "true", "",
-+ "exist_" . &FAI::make_device_name($disk, $part_id) );
-+ # no partition table operations
-+ $FAI::partition_table_deps{$disk} = "";
-+ }
-+ # no changes on this disk
-+ $FAI::partition_table_deps{$disk} = "";
+@@ -1103,6 +1103,16 @@
+ } elsif (defined($FAI::configs{$config}{partitions}{0})) {
+ # no partition table operations
+ $FAI::partition_table_deps{$disk} = "";
++ } elsif (defined($FAI::configs{$config}{opts_all}{preserve})) {
++ foreach my $part_id (&numsort(keys %{ $FAI::configs{$config}{partitions} })) {
++ # all partitions exist
++ &FAI::push_command( "true", "",
++ "exist_" . &FAI::make_device_name($disk, $part_id) );
++ # no partition table operations
++ $FAI::partition_table_deps{$disk} = "";
++ }
++ # no changes on this disk
++ $FAI::partition_table_deps{$disk} = "";
} else {
# create partitions on non-virtual configs
&FAI::setup_partitions($config);
Added: branches/experimental/patches/setup-storage_pvcreate-old-lvm
===================================================================
--- branches/experimental/patches/setup-storage_pvcreate-old-lvm (rev 0)
+++ branches/experimental/patches/setup-storage_pvcreate-old-lvm 2010-10-29 11:55:49 UTC (rev 6171)
@@ -0,0 +1,42 @@
+2010-10-29 Michael Tautschnig <mt at debian.org>
+
+ * setup-storage/Commands.pm: Always run vgchange -a -n, even if no prior LVM
+ was detected; run pvcreate with -ff -y.
+Index: trunk/lib/setup-storage/Commands.pm
+===================================================================
+--- trunk.orig/lib/setup-storage/Commands.pm
++++ trunk/lib/setup-storage/Commands.pm
+@@ -416,7 +416,7 @@
+ my $type_pre = "";
+ $type_pre .= ",type_lvm_$dev" if (&FAI::set_partition_type_on_phys_dev($dev, "lvm"));
+
+- &FAI::push_command( "pvcreate $pv_create_options $dev",
++ &FAI::push_command( "pvcreate -ff -y $pv_create_options $dev",
+ "all_pv_sigs_removed,exist_$dev$type_pre", "pv_done_$dev");
+ $devs .= " $dev";
+ $pre_dev .= ",pv_done_$dev";
+@@ -460,7 +460,7 @@
+ my $type_pre = "";
+ $type_pre .= ",type_lvm_$dev" if (&FAI::set_partition_type_on_phys_dev($dev, "lvm"));
+
+- &FAI::push_command( "pvcreate $pv_create_options $dev",
++ &FAI::push_command( "pvcreate -ff -y $pv_create_options $dev",
+ "all_pv_sigs_removed,exist_$dev$type_pre", "pv_done_$dev");
+ $pre_dev .= ",pv_done_$dev";
+ }
+@@ -667,13 +667,12 @@
+ sub build_lvm_commands {
+
+ # disable volumes if there are pre-existing ones
+- my $all_vg_pre = "";
++ &FAI::push_command("vgchange -a n", "", "vgchange_a_n");
++ my $all_vg_pre = "vgchange_a_n";
+ if (scalar(keys %FAI::current_lvm_config)) {
+- &FAI::push_command("vgchange -a n", "", "vgchange_a_n");
+ foreach my $vg (keys %FAI::current_lvm_config) {
+ $all_vg_pre .= ",pv_sigs_removed_$vg" if (&FAI::cleanup_vg($vg));
+ }
+- $all_vg_pre =~ s/^,//;
+ }
+ &FAI::push_command("true", "$all_vg_pre", "all_pv_sigs_removed");
+
Deleted: branches/experimental/patches/setup-storage_raw-disk
===================================================================
--- branches/experimental/patches/setup-storage_raw-disk 2010-10-29 09:18:07 UTC (rev 6170)
+++ branches/experimental/patches/setup-storage_raw-disk 2010-10-29 11:55:49 UTC (rev 6171)
@@ -1,174 +0,0 @@
-2010-09-18 Michael Tautschnig <mt at debian.org>
-
- * setup-storage/{Parser,Command,Sizes,Volumes,Fstab}.pm: Added support for
- using raw disk devices, without partitioning (closes: #589649).
- * setup-storage.8: Document new raw-disk pseudo partition type.
-Index: trunk/lib/setup-storage/Commands.pm
-===================================================================
---- trunk.orig/lib/setup-storage/Commands.pm
-+++ trunk/lib/setup-storage/Commands.pm
-@@ -1094,14 +1094,15 @@
-
- if ($FAI::configs{$config}{virtual}) {
- foreach my $part_id (&numsort(keys %{ $FAI::configs{$config}{partitions} })) {
-- # reference to the current partition
-- my $part = (\%FAI::configs)->{$config}->{partitions}->{$part_id};
- # virtual disks always exist
- &FAI::push_command( "true", "",
- "exist_" . &FAI::make_device_name($disk, $part_id) );
- # no partition table operations
- $FAI::partition_table_deps{$disk} = "";
- }
-+ } elsif (defined($FAI::configs{$config}{partitions}{0})) {
-+ # no partition table operations
-+ $FAI::partition_table_deps{$disk} = "";
- } elsif (defined($FAI::configs{$config}{opts_all}{preserve})) {
- foreach my $part_id (&numsort(keys %{ $FAI::configs{$config}{partitions} })) {
- # all partitions exist
-@@ -1128,7 +1129,7 @@
- || $part->{size}->{extended} == 1);
-
- # create the filesystem on the device
-- &FAI::build_mkfs_commands( &FAI::make_device_name($disk, $part_id), $part );
-+ &FAI::build_mkfs_commands( 0 == $part_id ? $disk : &FAI::make_device_name($disk, $part_id), $part );
- }
- }
- }
-Index: trunk/lib/setup-storage/Fstab.pm
-===================================================================
---- trunk.orig/lib/setup-storage/Fstab.pm
-+++ trunk/lib/setup-storage/Fstab.pm
-@@ -221,7 +221,8 @@
- # skip extended partitions and entries without a mountpoint
- next if ($p_ref->{size}->{extended} || $p_ref->{mountpoint} eq "-");
-
-- my $device_name = &FAI::make_device_name($device, $p_ref->{number});
-+ my $device_name = 0 == $p_ref->{number} ? $device :
-+ &FAI::make_device_name($device, $p_ref->{number});
-
- # if the mount point the /boot mount point, variables must be set
- if ($p_ref->{mountpoint} eq $boot_mnt_point) {
-Index: trunk/lib/setup-storage/Parser.pm
-===================================================================
---- trunk.orig/lib/setup-storage/Parser.pm
-+++ trunk/lib/setup-storage/Parser.pm
-@@ -146,7 +146,8 @@
- #
- # @brief Initialise the entry of a partition in @ref $FAI::configs
- #
--# @param $type The type of the partition. It must be either primary or logical.
-+# @param $type The type of the partition. It must be either primary or logical
-+# or raw.
- #
- ################################################################################
- sub init_part_config {
-@@ -154,9 +155,9 @@
- # the type of the partition to be created
- my ($type) = @_;
-
-- # type must either be primary or logical, nothing else may be accepted by the
-- # parser
-- ($type eq "primary" || $type eq "logical") or
-+ # type must either be primary or logical or raw, nothing else may be accepted
-+ # by the parser
-+ ($type eq "primary" || $type eq "logical" || $type eq "raw") or
- &FAI::internal_error("invalid type $type");
-
- # check that a physical device is being configured; logical partitions are
-@@ -179,6 +180,8 @@
-
- # create a primary partition
- if ($type eq "primary") {
-+ (defined($FAI::configs{$FAI::device}{partitions}{0})) and
-+ die "You cannot use raw-disk together with primary/logical partitions\n";
-
- # find all previously defined primary partitions
- foreach my $part_id (&numsort(keys %{ $FAI::configs{$FAI::device}{partitions} })) {
-@@ -201,7 +204,14 @@
- ($part_number < 5 || $FAI::configs{$FAI::device}{virtual} ||
- $FAI::configs{$FAI::device}{disklabel} ne "msdos")
- or die "$part_number are too many primary partitions\n";
-+ } elsif ($type eq "raw") {
-+ (0 == scalar(keys %{ $FAI::configs{$FAI::device}{partitions} })) or
-+ die "You cannot use raw-disk together with primary/logical partitions\n";
-+ # special-case hack: part number 0 is invalid otherwise
-+ $part_number = 0;
- } else {
-+ (defined($FAI::configs{$FAI::device}{partitions}{0})) and
-+ die "You cannot use raw-disk together with primary/logical partitions\n";
-
- # no further checks for the disk label being msdos have to be performed in
- # this branch, it has been ensured above
-@@ -753,6 +763,12 @@
- # initialise a logical partition
- &FAI::init_part_config($item[ 1 ]);
- }
-+ | 'raw-disk'
-+ {
-+ # initialise a pseudo-partition: this disk will be used without
-+ # partitioning it
-+ &FAI::init_part_config("raw");
-+ }
- | m{^([^/,\s\-]+)-([^/,\s\-]+)\s+}
- {
- # set $FAI::device to VG_$1
-Index: trunk/lib/setup-storage/Sizes.pm
-===================================================================
---- trunk.orig/lib/setup-storage/Sizes.pm
-+++ trunk/lib/setup-storage/Sizes.pm
-@@ -598,8 +598,10 @@
- # for RAID, encrypted, tmpfs or LVM, there is nothing to be done here
- next if ($config eq "RAID" || $config eq "CRYPT" || $config eq "TMPFS" || $config =~ /^VG_./);
- ($config =~ /^PHY_(.+)$/) or &FAI::internal_error("invalid config entry $config");
-- # nothing to be done, if this is a configuration for a virtual disk
-- next if $FAI::configs{$config}{virtual};
-+ # nothing to be done, if this is a configuration for a virtual disk or a
-+ # disk without partitions
-+ next if ($FAI::configs{$config}{virtual} ||
-+ defined($FAI::configs{$config}{partitions}{0}));
- my $disk = $1; # the device name of the disk
- # test, whether $disk is a block special device
- (-b $disk) or die "$disk is not a valid device name\n";
-Index: trunk/lib/setup-storage/Volumes.pm
-===================================================================
---- trunk.orig/lib/setup-storage/Volumes.pm
-+++ trunk/lib/setup-storage/Volumes.pm
-@@ -530,12 +530,17 @@
- next unless ($part->{size}->{preserve} || $part->{size}->{resize});
- ($part->{size}->{extended}) and die
- "Preserving extended partitions is not supported; mark all logical partitions instead\n";
-- defined ($FAI::current_config{$1}{partitions}{$part_id}) or die
-- "Can't preserve ". &FAI::make_device_name($1, $part->{number})
-- . " because it does not exist\n";
-- defined ($part->{size}->{range}) or die
-- "Can't preserve ". &FAI::make_device_name($1, $part->{number})
-- . " because it is not defined in the current config\n";
-+ if (0 == $part_id) {
-+ defined ($FAI::current_config{$1}) or die
-+ "Can't preserve $1 because it does not exist\n";
-+ } else {
-+ defined ($FAI::current_config{$1}{partitions}{$part_id}) or die
-+ "Can't preserve ". &FAI::make_device_name($1, $part->{number})
-+ . " because it does not exist\n";
-+ defined ($part->{size}->{range}) or die
-+ "Can't preserve ". &FAI::make_device_name($1, $part->{number})
-+ . " because it is not defined in the current config\n";
-+ }
- }
- } elsif ($config =~ /^VG_(.+)$/) {
- next if ($1 eq "--ANY--");
-Index: trunk/man/setup-storage.8
-===================================================================
---- trunk.orig/man/setup-storage.8
-+++ trunk/man/setup-storage.8
-@@ -318,6 +318,10 @@
- .br
- /* for physical disks only */
- .br
-+ | raw-disk
-+.br
-+ /* for physical disks only: do not partition this disk, use it as-is */
-+.br
- | raid[0156]
- .br
- /* raid level */
Modified: branches/experimental/patches/setup-storage_user-100-percent
===================================================================
--- branches/experimental/patches/setup-storage_user-100-percent 2010-10-29 09:18:07 UTC (rev 6170)
+++ branches/experimental/patches/setup-storage_user-100-percent 2010-10-29 11:55:49 UTC (rev 6171)
@@ -70,7 +70,7 @@
# logical partitions require the space for the EPBR to be left
# out
-@@ -640,6 +640,7 @@
+@@ -642,6 +642,7 @@
# on msdos disk labels, the first partitions starts at head #1
$next_start = $current_disk->{bios_sectors_per_track} *
$current_disk->{sector_size};
@@ -78,7 +78,7 @@
} elsif ($FAI::configs{$config}{disklabel} eq "gpt") {
# on GPT-EFI disk labels the first 34 and last 33 sectors must be left alone
-@@ -667,6 +668,11 @@
+@@ -669,6 +670,11 @@
$min_req_total_space += 33 * $current_disk->{sector_size};
}
@@ -90,7 +90,7 @@
# the list of partitions that we need to find start and end bytes for
my @worklist = (&numsort(keys %{ $FAI::configs{$config}{partitions} }));
-@@ -713,13 +719,14 @@
+@@ -715,13 +721,14 @@
# the partition $part_id must be preserved
} elsif ($part->{size}->{preserve}) {
($next_start, $min_req_total_space) = &FAI::do_partition_preserve($part_id,
More information about the Fai-commit
mailing list