Mageia Bugzilla – Attachment 8906 Details for
Bug 20074
Partitions with Type: Empty corrupt the partition table
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
New Account
|
Forgot Password
[patch]
Patch to avoid race by not telling kernel about changes when it will automatically rescan the table (v2)
0001-Don-t-tell-the-kernel-about-partition-table-changes-2.patch (text/plain), 2.61 KB, created by
Thierry Vignaud
on 2017-01-30 12:28:08 CET
(
hide
)
Description:
Patch to avoid race by not telling kernel about changes when it will automatically rescan the table (v2)
Filename:
MIME Type:
Creator:
Thierry Vignaud
Created:
2017-01-30 12:28:08 CET
Size:
2.61 KB
patch
obsolete
>From 0bf566a56e7c07157bb86db25abf723b7266d964 Mon Sep 17 00:00:00 2001 >From: Martin Whitaker <mageia@martin-whitaker.me.uk> >Date: Sat, 21 Jan 2017 20:00:20 +0000 >Subject: [PATCH] Don't tell the kernel about partition table changes when it > rescans them automatically (mga#20074). > >When no partitions on a DOS-partitioned disk are mounted, the kernel >automatically rescans the partition table when it is written to disk. >We shouldn't then try to update the kernel's view of the partition >table, as the list of deltas we have recorded is relative to the >previous state of the partition table, not the newly rescanned state. > >The behaviour for other partition table types is unchanged. > >v2 (tvignaud): just make base class assumes the kernel reread, only mbr >subclass overrides need_to_tell_kernel() in order to be smarter >--- > perl-install/partition_table.pm | 2 +- > perl-install/partition_table/dos.pm | 8 ++++++++ > perl-install/partition_table/empty.pm | 6 ++++++ > 3 files changed, 15 insertions(+), 1 deletion(-) > >diff --git a/perl-install/partition_table.pm b/perl-install/partition_table.pm >index 049c7bb..76da83b 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 c56cdab..69566aa 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/empty.pm b/perl-install/partition_table/empty.pm >index fe4ad43..3f02d8f 100644 >--- a/perl-install/partition_table/empty.pm >+++ b/perl-install/partition_table/empty.pm >@@ -33,4 +33,10 @@ sub read_one { > $hd->{primary}{raw}, $hd->{primary}{info}; > } > >+#- by default, we assume the kernel automatically reread partition table: >+sub need_to_tell_kernel { >+ my ($_hd) = @_; >+ 1; >+} >+ > 1; >-- >2.10.2 >
From 0bf566a56e7c07157bb86db25abf723b7266d964 Mon Sep 17 00:00:00 2001 From: Martin Whitaker <mageia@martin-whitaker.me.uk> Date: Sat, 21 Jan 2017 20:00:20 +0000 Subject: [PATCH] Don't tell the kernel about partition table changes when it rescans them automatically (mga#20074). When no partitions on a DOS-partitioned disk are mounted, the kernel automatically rescans the partition table when it is written to disk. We shouldn't then try to update the kernel's view of the partition table, as the list of deltas we have recorded is relative to the previous state of the partition table, not the newly rescanned state. The behaviour for other partition table types is unchanged. v2 (tvignaud): just make base class assumes the kernel reread, only mbr subclass overrides need_to_tell_kernel() in order to be smarter --- perl-install/partition_table.pm | 2 +- perl-install/partition_table/dos.pm | 8 ++++++++ perl-install/partition_table/empty.pm | 6 ++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/perl-install/partition_table.pm b/perl-install/partition_table.pm index 049c7bb..76da83b 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 c56cdab..69566aa 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/empty.pm b/perl-install/partition_table/empty.pm index fe4ad43..3f02d8f 100644 --- a/perl-install/partition_table/empty.pm +++ b/perl-install/partition_table/empty.pm @@ -33,4 +33,10 @@ sub read_one { $hd->{primary}{raw}, $hd->{primary}{info}; } +#- by default, we assume the kernel automatically reread partition table: +sub need_to_tell_kernel { + my ($_hd) = @_; + 1; +} + 1; -- 2.10.2
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 20074
:
8880
|
8881
|
8882
|
8883
|
8901
|
8906
|
8907
|
8908
|
8909
|
8926
|
8927
|
8972