MBR magic exists at the beginning of 'a' partition, BPB is cleared.

Avoid to detect msdosfs incorrectly at boot time.
This commit is contained in:
nonaka 2011-06-11 11:43:23 +00:00
parent 064389cedb
commit 665e83d2f3
2 changed files with 66 additions and 2 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: md.c,v 1.10 2011/04/04 08:30:29 mbalmer Exp $ */
/* $NetBSD: md.c,v 1.11 2011/06/11 11:43:23 nonaka Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -148,6 +148,38 @@ md_post_disklabel(void)
int
md_post_newfs(void)
{
struct mbr_sector pbr;
char adevname[STRSIZE];
ssize_t sz;
int fd = -1;
snprintf(adevname, sizeof(adevname), "/dev/r%sa", diskdev);
fd = open(adevname, O_RDWR);
if (fd < 0)
goto out;
/* Read partition boot record */
sz = pread(fd, &pbr, sizeof(pbr), 0);
if (sz != sizeof(pbr))
goto out;
/* Check magic number */
if (pbr.mbr_magic != le16toh(MBR_MAGIC))
goto out;
#define OSNAME "NetBSD60"
/* Update oemname */
memcpy(&pbr.mbr_oemname, OSNAME, sizeof(OSNAME) - 1);
/* Clear BPB */
memset(&pbr.mbr_bpb, 0, sizeof(pbr.mbr_bpb));
/* write-backed new patition boot record */
(void)pwrite(fd, &pbr, sizeof(pbr), 0);
out:
if (fd >= 0)
close(fd);
return 0;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: md.c,v 1.7 2011/04/04 08:30:46 mbalmer Exp $ */
/* $NetBSD: md.c,v 1.8 2011/06/11 11:43:23 nonaka Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -111,6 +111,38 @@ md_post_disklabel(void)
int
md_post_newfs(void)
{
struct mbr_sector pbr;
char adevname[STRSIZE];
ssize_t sz;
int fd = -1;
snprintf(adevname, sizeof(adevname), "/dev/r%sa", diskdev);
fd = open(adevname, O_RDWR);
if (fd < 0)
goto out;
/* Read partition boot record */
sz = pread(fd, &pbr, sizeof(pbr), 0);
if (sz != sizeof(pbr))
goto out;
/* Check magic number */
if (pbr.mbr_magic != le16toh(MBR_MAGIC))
goto out;
#define OSNAME "NetBSD60"
/* Update oemname */
memcpy(&pbr.mbr_oemname, OSNAME, sizeof(OSNAME) - 1);
/* Clear BPB */
memset(&pbr.mbr_bpb, 0, sizeof(pbr.mbr_bpb));
/* write-backed new patition boot record */
(void)pwrite(fd, &pbr, sizeof(pbr), 0);
out:
if (fd >= 0)
close(fd);
return 0;
}