summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Whitaker <mageia@martin-whitaker.me.uk>2017-01-21 19:38:55 +0000
committerMartin Whitaker <mageia@martin-whitaker.me.uk>2017-02-12 11:54:53 +0000
commit105d6bea5e69ee7011e5c468ba3cd05eb999b359 (patch)
treea8d28f5dc0bae2aadcb7c2a5397b12a35564b894
parent498f6c3feb6213ff769826d06dae3c256ee612ef (diff)
downloaddrakx-105d6bea5e69ee7011e5c468ba3cd05eb999b359.tar
drakx-105d6bea5e69ee7011e5c468ba3cd05eb999b359.tar.gz
drakx-105d6bea5e69ee7011e5c468ba3cd05eb999b359.tar.bz2
drakx-105d6bea5e69ee7011e5c468ba3cd05eb999b359.tar.xz
drakx-105d6bea5e69ee7011e5c468ba3cd05eb999b359.zip
Ensure the kernel doesn't rescan a partially written partition table (mga#20074).
When no partitions on a DOS-partitioned disk are mounted, the kernel automatically rescans the partition table when the file handle to the raw device is released. Currently the code opens and closes the raw device when writing the primary partition table and when writing each extended partition table segment. As the extended partition table segments form a linked list, this allows the kernel to get in and rescan the table when the list is not in a coherent state. This patch changes the code to open the raw device before writing the primary partition table and to close it only after writing the last extended partition table segment. The behaviour for other partition table types is unchanged. v2 (tvignaud): simplify by moving copies of noop funcs into the base class
-rw-r--r--perl-install/partition_table.pm7
-rw-r--r--perl-install/partition_table/bsd.pm2
-rw-r--r--perl-install/partition_table/dos.pm22
-rw-r--r--perl-install/partition_table/gpt.pm2
-rw-r--r--perl-install/partition_table/mac.pm2
-rw-r--r--perl-install/partition_table/raw.pm10
-rw-r--r--perl-install/partition_table/sun.pm2
7 files changed, 36 insertions, 11 deletions
diff --git a/perl-install/partition_table.pm b/perl-install/partition_table.pm
index c99cb10f8..049c7bb2e 100644
--- a/perl-install/partition_table.pm
+++ b/perl-install/partition_table.pm
@@ -482,16 +482,17 @@ sub write {
#- it will never be writed back on partition table.
verifyParts($hd);
- $hd->write(0, $hd->{primary}{raw}, $hd->{primary}{info}) or die "writing of partition table failed";
-
+ my $handle = $hd->start_write();
+ $hd->write($handle, 0, $hd->{primary}{raw}, $hd->{primary}{info}) or die "writing of partition table failed";
#- should be fixed but a extended exist with no real extended partition, that blanks mbr!
foreach (@{$hd->{extended}}) {
# in case of extended partitions, the start sector must be local to the partition
$_->{normal}{local_start} = $_->{normal}{start} - $_->{start};
$_->{extended} and $_->{extended}{local_start} = $_->{extended}{start} - $hd->{primary}{extended}{start};
- $hd->write($_->{start}, $_->{raw}) or die "writing of partition table failed";
+ $hd->write($handle, $_->{start}, $_->{raw}) or die "writing of partition table failed";
}
+ $hd->end_write($handle);
$hd->{isDirty} = 0;
if (my $tell_kernel = delete $hd->{will_tell_kernel}) {
diff --git a/perl-install/partition_table/bsd.pm b/perl-install/partition_table/bsd.pm
index b27df6d3a..ec2a2edf4 100644
--- a/perl-install/partition_table/bsd.pm
+++ b/perl-install/partition_table/bsd.pm
@@ -90,7 +90,7 @@ sub read_one {
# write the partition table (and extended ones)
# for each entry, it uses fields: start, size, pt_type, active
sub write($$$;$) {
- my ($hd, $sector, $pt, $info) = @_;
+ my ($hd, $_handle, $sector, $pt, $info) = @_;
#- handle testing for writing partition table on file only!
my $F;
diff --git a/perl-install/partition_table/dos.pm b/perl-install/partition_table/dos.pm
index 004c8a11f..c56cdab31 100644
--- a/perl-install/partition_table/dos.pm
+++ b/perl-install/partition_table/dos.pm
@@ -236,10 +236,9 @@ sub read_one {
[ @pt ];
}
-# write the partition table (and extended ones)
-# for each entry, it uses fields: start, size, pt_type, active
-sub write {
- my ($hd, $sector, $pt) = @_;
+# prepare to write the partition table (and extended ones)
+sub start_write {
+ my ($hd) = @_;
log::l("partition::dos::write $hd->{device}");
@@ -250,6 +249,16 @@ sub write {
open $F, ">$file" or die "error opening test file $file";
} else {
$F = partition_table::raw::openit($hd, 2) or die "error opening device $hd->{device} for writing";
+ }
+ $F;
+}
+
+# write the partition table (and extended ones)
+# for each entry, it uses fields: start, size, pt_type, active
+sub write {
+ my ($hd, $F, $sector, $pt) = @_;
+
+ if (!$::testing) {
c::lseek_sector(fileno($F), $sector, $offset) or return 0;
}
@@ -264,6 +273,11 @@ sub write {
1;
}
+sub end_write {
+ my ($hd, $F) = @_;
+ close $F;
+}
+
sub empty_raw { { raw => [ ({}) x $nb_primary ] } }
sub initialize {
diff --git a/perl-install/partition_table/gpt.pm b/perl-install/partition_table/gpt.pm
index 3ac6673d6..df8ead3be 100644
--- a/perl-install/partition_table/gpt.pm
+++ b/perl-install/partition_table/gpt.pm
@@ -71,7 +71,7 @@ sub read_one {
}
sub write {
- my ($hd, $_sector, $pt, $_info) = @_;
+ my ($hd, $_handle, $_sector, $pt, $_info) = @_;
my $partitions_killed;
diff --git a/perl-install/partition_table/mac.pm b/perl-install/partition_table/mac.pm
index 547704b45..78e5469cd 100644
--- a/perl-install/partition_table/mac.pm
+++ b/perl-install/partition_table/mac.pm
@@ -193,7 +193,7 @@ sub read_one {
}
sub write($$$;$) {
- my ($hd, $sector, $pt, $info) = @_;
+ my ($hd, $_handle, $sector, $pt, $info) = @_;
#- handle testing for writing partition table on file only!
my $F;
diff --git a/perl-install/partition_table/raw.pm b/perl-install/partition_table/raw.pm
index 7b4e7d5cf..e9b293b90 100644
--- a/perl-install/partition_table/raw.pm
+++ b/perl-install/partition_table/raw.pm
@@ -295,4 +295,14 @@ A test to check the integrity of data has failed.
It means writing anything on the disk will end up with random, corrupted data.");
}
+sub start_write {
+ my ($_hd) = @_;
+ 1;
+}
+
+sub end_write {
+ my ($_hd, $_handle) = @_;
+ 1;
+}
+
1;
diff --git a/perl-install/partition_table/sun.pm b/perl-install/partition_table/sun.pm
index e2fd747ac..e665d0168 100644
--- a/perl-install/partition_table/sun.pm
+++ b/perl-install/partition_table/sun.pm
@@ -119,7 +119,7 @@ sub read_one {
# write the partition table (and extended ones)
# for each entry, it uses fields: start, size, pt_type, active
sub write($$$;$) {
- my ($hd, $sector, $pt, $info) = @_;
+ my ($hd, $_handle, $sector, $pt, $info) = @_;
# my ($csize, $wdsize) = (0, 0);
#- handle testing for writing partition table on file only!