Hello,

as libparted upstream has now confirmed that modifying
PedDisk.needs_clobber from within the calling application is
ok, I would like to apply the following patch to partman-base
unless somebody has further objections against it.

Functionally it is the same patch that I had posted earlier
already, just with some coding style cleanups.

Regards,
Karsten

>From bd3e4f79ea620fefb48c768dec22a3f7d1ad31a2 Mon Sep 17 00:00:00 2001
From: Karsten Merker <mer...@debian.org>
Date: Thu, 28 Aug 2014 20:38:12 +0200
Subject: [PATCH] Take care of the firmware area on sunxi-based systems

By default partman calls ped_disk_clobber when writing a new
partition table, but on the MMC device of sunxi-based systems this
would overwrite the firmware area, resulting in an unbootable system
(see bug #751704). Handle this as a special case in command_commit().
---
 parted_server.c | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/parted_server.c b/parted_server.c
index 55cf151..a6283f6 100644
--- a/parted_server.c
+++ b/parted_server.c
@@ -1330,6 +1330,25 @@ command_dump()
         oprintf("OK\n");
 }
 
+/* Check whether we are running on a sunxi-based system. */
+int
+is_sunxi_system()
+{
+        int cpuinfo_handle;
+        int result = 0;
+        char buf[4096];
+        int length;
+
+        if ((cpuinfo_handle = open("/proc/cpuinfo", O_RDONLY)) != -1) {
+                length = read(cpuinfo_handle, buf, sizeof(buf)-1);
+                buf[length]='\0';
+                if (strstr(buf, "Allwinner") != NULL)
+                        result = 1;
+                close(cpuinfo_handle);
+        }
+        return result;
+}
+
 void
 command_commit()
 {
@@ -1337,6 +1356,20 @@ command_commit()
         if (dev == NULL)
                 critical_error("The device %s is not opened.", device_name);
         log("command_commit()");
+
+        /* The boot device on sunxi-based systems needs special handling.
+         * By default partman calls ped_disk_clobber when writing the
+         * partition table, but on sunxi-based systems this would overwrite
+         * the firmware area, resulting in an unbootable system (see
+         * bug #751704).
+         */
+        if (is_sunxi_system() && !strcmp(disk->dev->path, "/dev/mmcblk0")) {
+                disk->needs_clobber = 0;
+                log("Sunxi platform detected. Disabling ped_disk_clobber " \
+                    "for the boot device %s to protect the firmware " \
+                    "area.", disk->dev->path);
+        }
+
         open_out();
         if (disk != NULL && named_is_changed(device_name))
                 ped_disk_commit(disk);
-- 
2.1.0


-- 
Gem. Par. 28 Abs. 4 Bundesdatenschutzgesetz widerspreche ich der Nutzung
sowie der Weitergabe meiner personenbezogenen Daten für Zwecke der
Werbung sowie der Markt- oder Meinungsforschung.


-- 
To UNSUBSCRIBE, email to debian-boot-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: https://lists.debian.org/20140828203143.ga6...@excalibur.cnev.de

Reply via email to