summaryrefslogtreecommitdiffstats
path: root/common/partitions
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2018-01-17 07:49:41 -0800
committerSascha Hauer <s.hauer@pengutronix.de>2018-01-22 08:25:47 +0100
commitc9c58efe41b4cdd0633c86064e7059225fbdd7fd (patch)
tree4db7307e167d5fe7c2def0610c0622b728c74468 /common/partitions
parentbc0851db17676c3b79e7be1da14b28c679b87565 (diff)
downloadbarebox-c9c58efe41b4cdd0633c86064e7059225fbdd7fd.tar.gz
barebox-c9c58efe41b4cdd0633c86064e7059225fbdd7fd.tar.xz
partitions: dos: Treat all extended partition types equally
Creating logical DOS partitions with fdisk (Fedora 27, fdisk from util-linux 2.30.2) results in extended partition of type 0x05 being created on the device. Partitioned like this, device is succesfully recognized by Linux, but, due to algorithm in dos_partition(), not Barebox. Looking closer at the actual contents of MBR shows that while marked as "Extended partition with CHS addressing" that partition still have all of the LBA adressed fields filled correctly. Given the above and the fact that similar code in Linux kernel (block/partitions/msdos.c) does not make a distinction between types 0x0f and 0x05, port Linux's is_extended_partition() and convert the code to treat types 0x05, 0x0f and 0x85 the same way. Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common/partitions')
-rw-r--r--common/partitions/dos.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/common/partitions/dos.c b/common/partitions/dos.c
index 91b5399079..488c2936f7 100644
--- a/common/partitions/dos.c
+++ b/common/partitions/dos.c
@@ -21,6 +21,22 @@
#include "parser.h"
+
+enum {
+/* These three have identical behaviour; use the second one if DOS FDISK gets
+ confused about extended/logical partitions starting past cylinder 1023. */
+ DOS_EXTENDED_PARTITION = 5,
+ LINUX_EXTENDED_PARTITION = 0x85,
+ WIN98_EXTENDED_PARTITION = 0x0f,
+};
+
+static inline int is_extended_partition(struct partition *p)
+{
+ return (p->dos_partition_type == DOS_EXTENDED_PARTITION ||
+ p->dos_partition_type == WIN98_EXTENDED_PARTITION ||
+ p->dos_partition_type == LINUX_EXTENDED_PARTITION);
+}
+
/**
* Guess the size of the disk, based on the partition table entries
* @param dev device to create partitions for
@@ -212,13 +228,8 @@ static void dos_partition(void *buf, struct block_device *blk,
sprintf(pd->parts[n].partuuid, "%08x-%02d",
signature, i + 1);
pd->used_entries++;
- /*
- * Partitions of type 0x05 and 0x0f (and some more)
- * contain extended partitions. Only check for type 0x0f
- * here as this is the easiest to parse and common
- * enough.
- */
- if (pentry.dos_partition_type == 0x0f) {
+
+ if (is_extended_partition(&pentry)) {
if (!extended_partition)
extended_partition = &pd->parts[n];
else