summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--perl-install/partition_table.pm2
-rw-r--r--perl-install/partition_table/dos.pm8
-rw-r--r--perl-install/partition_table/raw.pm6
3 files changed, 15 insertions, 1 deletions
diff --git a/perl-install/partition_table.pm b/perl-install/partition_table.pm
index 049c7bb2e..76da83b81 100644
--- a/perl-install/partition_table.pm
+++ b/perl-install/partition_table.pm
@@ -500,7 +500,7 @@ sub write {
fs::dmraid::call_dmraid('-an');
fs::dmraid::call_dmraid('-ay');
} else {
- tell_kernel($hd, $tell_kernel);
+ tell_kernel($hd, $tell_kernel) if $hd->need_to_tell_kernel();
}
}
# get major/minor again after writing the partition table so that we got them for dynamic devices
diff --git a/perl-install/partition_table/dos.pm b/perl-install/partition_table/dos.pm
index c56cdab31..69566aaa8 100644
--- a/perl-install/partition_table/dos.pm
+++ b/perl-install/partition_table/dos.pm
@@ -278,6 +278,14 @@ sub end_write {
close $F;
}
+sub need_to_tell_kernel {
+ my ($hd) = @_;
+ # If none of the partitions are mounted, the kernel will automatically rescan
+ # the partition table. If any partitions are mounted, this doesn't happen, so
+ # we need to tell the kernel what has changed.
+ return any { $_->{isMounted} } partition_table::get_normal_parts($hd);
+}
+
sub empty_raw { { raw => [ ({}) x $nb_primary ] } }
sub initialize {
diff --git a/perl-install/partition_table/raw.pm b/perl-install/partition_table/raw.pm
index e9b293b90..ebb20b179 100644
--- a/perl-install/partition_table/raw.pm
+++ b/perl-install/partition_table/raw.pm
@@ -238,6 +238,12 @@ sub zero_MBR_and_dirty {
fsedit::partition_table_clear_and_initialize([], $hd);
}
+#- by default, we assume the kernel doesn't automatically reread partition table:
+sub need_to_tell_kernel {
+ my ($_hd) = @_;
+ 1;
+}
+
sub read_primary {
my ($hd) = @_;