diff --git a/distrib/utils/sysinst/arch/mac68k/md.c b/distrib/utils/sysinst/arch/mac68k/md.c index 835e638cfbe0..0a1338d8540a 100644 --- a/distrib/utils/sysinst/arch/mac68k/md.c +++ b/distrib/utils/sysinst/arch/mac68k/md.c @@ -1,4 +1,4 @@ -/* $NetBSD: md.c,v 1.19 2001/01/14 02:38:19 mrg Exp $ */ +/* $NetBSD: md.c,v 1.20 2001/07/14 07:57:16 scottr Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -683,7 +683,29 @@ md_pre_disklabel() } /* * Well, if we get here the dirty deed has been done. + * + * Now we need to force the incore disk table to get updated. This + * should be done by disklabel -- which is normally called right after + * we return -- but may be commented out for the mac68k port. We'll + * instead update the incore table by forcing a dummy write here. This + * relies on a change in the mac68k-specific writedisklabel() routine. + * If that change doesn't exist nothing bad happens here. If disklabel + * properly updates the ondisk and incore labels everything still + * works. Only if we fail here and if disklabel fails are we in + * in a state where we've updated the disk but not the incore and + * a reboot is necessary. + * + * First, we grab a copy of the incore label as it existed before + * we did anything to it. Then we invoke the "write label" ioctl to + * rewrite it to disk. As a result, the ondisk partition map is + * re-read and the incore label is reconstructed from it. If + * disklabel() is then called to update again, either that fails + * because the mac68k port doesn't support native disklabels, or it + * succeeds and writes out a new ondisk copy. */ + ioctl(fd, DIOCGDINFO, &lp); /* Get the current disk label */ + ioctl(fd, DIOCWDINFO, &lp); /* Write it out again */ + close (fd); return 0; } diff --git a/distrib/utils/sysinst/arch/mac68k/md.h b/distrib/utils/sysinst/arch/mac68k/md.h index bfabc135b39f..23304561973c 100644 --- a/distrib/utils/sysinst/arch/mac68k/md.h +++ b/distrib/utils/sysinst/arch/mac68k/md.h @@ -1,4 +1,4 @@ -/* $NetBSD: md.h,v 1.7 2000/12/22 10:12:15 mrg Exp $ */ +/* $NetBSD: md.h,v 1.8 2001/07/14 07:57:17 scottr Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -179,16 +179,21 @@ EXTERN char *disk_names[] /* * Machine-specific command to write a new label to a disk. - * For example, i386 uses "/sbin/disklabel -w -r", just like i386 + * For example, i386 uses "/sbin/disklabel -w -r", just like i386 * miniroot scripts, though this may leave a bogus incore label. - * Sun ports should probably use DISKLABEL_CMD "/sbin/disklabel -w" - * to get incore to ondisk inode translation for the Sun proms. - * If not defined, we assume the port does not support disklabels and + * Sun ports should probably use DISKLABEL_CMD "/sbin/disklabel -w" + * to get incore to ondisk inode translation for the Sun proms. + * If not defined, we assume the port does not support disklabels and * hand-edited disklabel will NOT be written by MI code. * * The mac68k port doesn't support real disklabels so we don't define the - * command string. The Mac Disk Partition Map gets written in the - * md_pre_disklabel() routine. + * command string. The Apple Disk Partition Map gets written in the + * md_pre_disklabel() routine, which also forces the incore copy to be + * updated. If native disklabels are supported or if disklabel() is + * fixed to work for writing labels, this command should be defined + * to a value that will force the writing of the label. In that case, + * the code in md_pre_disklabel() which forces the incore update can be + * removed, though its presence won't hurt. * * #define DISKLABEL_CMD */