Behavior when booting two UMLs with the same umid was broken.  The
second one would steal the umid.  This fixes that, making the second
UML take a random umid instead.

Signed-off-by: Jeff Dike <[EMAIL PROTECTED]>

Index: linux-2.6.15/arch/um/os-Linux/umid.c
===================================================================
--- linux-2.6.15.orig/arch/um/os-Linux/umid.c   2006-02-09 18:49:55.000000000 
-0500
+++ linux-2.6.15/arch/um/os-Linux/umid.c        2006-02-10 14:11:28.000000000 
-0500
@@ -143,8 +143,10 @@ static int not_dead_yet(char *dir)
                goto out_close;
        }
 
-       if((kill(p, 0) == 0) || (errno != ESRCH))
+       if((kill(p, 0) == 0) || (errno != ESRCH)){
+               printk("umid \"%s\" is already in use by pid %d\n", umid, p);
                return 1;
+       }
 
        err = actually_do_remove(dir);
        if(err)
@@ -234,33 +236,44 @@ int __init make_umid(void)
        err = mkdir(tmp, 0777);
        if(err < 0){
                err = -errno;
-               if(errno != EEXIST)
+               if(err != -EEXIST)
                        goto err;
 
-               if(not_dead_yet(tmp) < 0)
+               /* 1   -> this umid is already in use
+                * < 0 -> we couldn't remove the umid directory
+                * In either case, we can't use this umid, so return -EEXIST.
+                */
+               if(not_dead_yet(tmp) != 0)
                        goto err;
 
                err = mkdir(tmp, 0777);
        }
-       if(err < 0){
-               printk("Failed to create '%s' - err = %d\n", umid, err);
-               goto err_rmdir;
+       if(err){
+               err = -errno;
+               printk("Failed to create '%s' - err = %d\n", umid, -errno);
+               goto err;
        }
 
        umid_setup = 1;
 
        create_pid_file();
 
-       return 0;
-
- err_rmdir:
-       rmdir(tmp);
+       err = 0;
  err:
        return err;
 }
 
 static int __init make_umid_init(void)
 {
+       if(!make_umid())
+               return 0;
+
+       /* If initializing with the given umid failed, then try again with
+        * a random one.
+        */
+       printk("Failed to initialize umid \"%s\", trying with a random umid\n",
+              umid);
+       *umid = '\0';
        make_umid();
 
        return 0;



-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
User-mode-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel

Reply via email to