diff options
author | xl222276 <none@none> | 2008-06-16 21:30:50 -0700 |
---|---|---|
committer | xl222276 <none@none> | 2008-06-16 21:30:50 -0700 |
commit | 987e90dc68863b34c6e37d54acc6ae971386547d (patch) | |
tree | a9d4242896671adac03582f17bdddb1c28a368ce /usr/src/lib | |
parent | e33b3e6c8793812e1695af15ea0bf0fdf7993ce9 (diff) | |
download | illumos-joyent-987e90dc68863b34c6e37d54acc6ae971386547d.tar.gz |
6613137 write_pmbr() puts garbage in first 446 bytes on disk
Diffstat (limited to 'usr/src/lib')
-rw-r--r-- | usr/src/lib/libefi/common/rdwr_efi.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/usr/src/lib/libefi/common/rdwr_efi.c b/usr/src/lib/libefi/common/rdwr_efi.c index ddf96923c6..0f50628af0 100644 --- a/usr/src/lib/libefi/common/rdwr_efi.c +++ b/usr/src/lib/libefi/common/rdwr_efi.c @@ -540,7 +540,19 @@ write_pmbr(int fd, struct dk_gpt *vtoc) uchar_t *cp; diskaddr_t size_in_lba; - mb.signature = LE_16(MBB_MAGIC); + /* + * Preserve any boot code and disk signature if the first block is + * already an MBR. + */ + dk_ioc.dki_lba = 0; + dk_ioc.dki_length = sizeof (mb); + /* LINTED -- always longlong aligned */ + dk_ioc.dki_data = (efi_gpt_t *)&mb; + if (efi_ioctl(fd, DKIOCGETEFI, &dk_ioc) == -1 || + mb.signature != LE_16(MBB_MAGIC)) { + bzero(&mb, sizeof (mb)); + mb.signature = LE_16(MBB_MAGIC); + } bzero(&mb.parts, sizeof (mb.parts)); cp = (uchar_t *)&mb.parts[0]; /* bootable or not */ |