Sysinstall via the CD media (and probably other physical disc mediums) is 
broken currently due to the devfs filesystem not being available at all 
times in placesw here it is needed.  I've changed the behavior in my 
green_lomac branch to fix this, and would like if other people would verify 
this indeed fixes the problem for them as well (I imagine it does) and does 
what it should be expected to (which I also think it does).

Does this logic appear to be flawed in any cases?  If all seems right, I 
shall commit this to -CURRENT to unbreak CD installs.

==== //depot/user/green/lomac/usr.sbin/sysinstall/dist.c#2 (text+ko) ====

@@ -35,6 +35,8 @@
  */
 
 #include "sysinstall.h"
+#include <sys/param.h>
+#include <sys/mount.h>
 #include <sys/time.h>
 #include <signal.h>
 #include <libutil.h>
@@ -544,7 +546,7 @@
 static Boolean
 distExtract(char *parent, Distribution *me)
 {
-    int i,j, status, total, intr;
+    int i,j, status, total, intr, unmounted_dev;
     int cpid, zpid, fd2, chunk, numchunks;
     char *path, *dist, buf[300000];
     const char *tmp;
@@ -684,6 +686,12 @@
        total = 0;
        (void)gettimeofday(&start, (struct timezone *)0);
 
+       if (me[i].my_bit == DIST_BIN && RunningAsInit && !Fake) {
+               unmounted_dev = 1;
+               unmount("/dev", MNT_FORCE);
+       } else
+               unmounted_dev = 0;
+
        /* We have one or more chunks, initialize unpackers... */
        mediaExtractDistBegin(root_bias(me[i].my_dir), &fd2, &zpid, &cpid);
 
@@ -810,6 +818,10 @@
            *(me[i].my_mask) &= ~(me[i].my_bit);
        else
            continue;
+       if (unmounted_dev) {
+               (void)mount("devfs", "/dev", 0, NULL);
+               unmounted_dev = 0;
+       }
     }
     properties_free(dist_attr);
     sigaction(SIGINT, &old, NULL);     /* Restore signal handler */

==== //depot/user/green/lomac/usr.sbin/sysinstall/install.c#2 (text+ko) ====

@@ -812,6 +812,8 @@
        /* BOGON #1: Resurrect /dev after bin distribution screws it up */
        dialog_clear_norefresh();
        msgNotify("Remaking all devices.. Please wait!");
+       if (!Fake)
+           (void)unmount("/dev", MNT_FORCE);
        if (vsystem("cd /dev; sh MAKEDEV all")) {
            msgConfirm("MAKEDEV returned non-zero status");
            return DITEM_FAILURE | DITEM_RESTORE;
@@ -1070,8 +1072,6 @@
 
     command_sort();
     command_execute();
-    if (!mountfailed && !Fake)
-       unmount("/mnt/dev", MNT_FORCE);
     dialog_clear_norefresh();
     return DITEM_SUCCESS | DITEM_RESTORE;
 }


-- 
 Brian Fundakowski Feldman           \  FreeBSD: The Power to Serve!  /
 [EMAIL PROTECTED]                    `------------------------------'



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to