Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / arch / um / os-Linux / umid.c
index 48092b9..362db05 100644 (file)
@@ -67,53 +67,32 @@ err:
        return err;
 }
 
-/*
- * Unlinks the files contained in @dir and then removes @dir.
- * Doesn't handle directory trees, so it's not like rm -rf, but almost such. We
- * ignore ENOENT errors for anything (they happen, strangely enough - possibly due
- * to races between multiple dying UML threads).
- */
-static int remove_files_and_dir(char *dir)
+static int actually_do_remove(char *dir)
 {
        DIR *directory;
        struct dirent *ent;
        int len;
        char file[256];
-       int ret;
 
        directory = opendir(dir);
-       if (directory == NULL) {
-               if (errno != ENOENT)
-                       return -errno;
-               else
-                       return 0;
-       }
+       if(directory == NULL)
+               return -errno;
 
-       while ((ent = readdir(directory)) != NULL) {
-               if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
+       while((ent = readdir(directory)) != NULL){
+               if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
                        continue;
                len = strlen(dir) + sizeof("/") + strlen(ent->d_name) + 1;
-               if (len > sizeof(file)) {
-                       ret = -E2BIG;
-                       goto out;
-               }
+               if(len > sizeof(file))
+                       return -E2BIG;
 
                sprintf(file, "%s/%s", dir, ent->d_name);
-               if (unlink(file) < 0 && errno != ENOENT) {
-                       ret = -errno;
-                       goto out;
-               }
-       }
-
-       if (rmdir(dir) < 0 && errno != ENOENT) {
-               ret = -errno;
-               goto out;
+               if(unlink(file) < 0)
+                       return -errno;
        }
+       if(rmdir(dir) < 0)
+               return -errno;
 
-       ret = 0;
-out:
-       closedir(directory);
-       return ret;
+       return 0;
 }
 
 /* This says that there isn't already a user of the specified directory even if
@@ -124,10 +103,9 @@ out:
  *     something other than UML sticking stuff in the directory
  *     this boot racing with a shutdown of the other UML
  * In any of these cases, the directory isn't useful for anything else.
- *
- * Boolean return: 1 if in use, 0 otherwise.
  */
-static inline int is_umdir_used(char *dir)
+
+static int not_dead_yet(char *dir)
 {
        char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")];
        char pid[sizeof("nnnnn\0")], *end;
@@ -135,7 +113,7 @@ static inline int is_umdir_used(char *dir)
 
        n = snprintf(file, sizeof(file), "%s/pid", dir);
        if(n >= sizeof(file)){
-               printk("is_umdir_used - pid filename too long\n");
+               printk("not_dead_yet - pid filename too long\n");
                err = -E2BIG;
                goto out;
        }
@@ -145,7 +123,7 @@ static inline int is_umdir_used(char *dir)
        if(fd < 0) {
                fd = -errno;
                if(fd != -ENOENT){
-                       printk("is_umdir_used : couldn't open pid file '%s', "
+                       printk("not_dead_yet : couldn't open pid file '%s', "
                               "err = %d\n", file, -fd);
                }
                goto out;
@@ -154,18 +132,18 @@ static inline int is_umdir_used(char *dir)
        err = 0;
        n = read(fd, pid, sizeof(pid));
        if(n < 0){
-               printk("is_umdir_used : couldn't read pid file '%s', "
+               printk("not_dead_yet : couldn't read pid file '%s', "
                       "err = %d\n", file, errno);
                goto out_close;
        } else if(n == 0){
-               printk("is_umdir_used : couldn't read pid file '%s', "
+               printk("not_dead_yet : couldn't read pid file '%s', "
                       "0-byte read\n", file);
                goto out_close;
        }
 
        p = strtoul(pid, &end, 0);
        if(end == pid){
-               printk("is_umdir_used : couldn't parse pid file '%s', "
+               printk("not_dead_yet : couldn't parse pid file '%s', "
                       "errno = %d\n", file, errno);
                goto out_close;
        }
@@ -175,32 +153,19 @@ static inline int is_umdir_used(char *dir)
                return 1;
        }
 
+       err = actually_do_remove(dir);
+       if(err)
+               printk("not_dead_yet - actually_do_remove failed with "
+                      "err = %d\n", err);
+
+       return err;
+
 out_close:
        close(fd);
 out:
        return 0;
 }
 
-/*
- * Try to remove the directory @dir unless it's in use.
- * Precondition: @dir exists.
- * Returns 0 for success, < 0 for failure in removal or if the directory is in
- * use.
- */
-static int umdir_take_if_dead(char *dir)
-{
-       int ret;
-       if (is_umdir_used(dir))
-               return -EEXIST;
-
-       ret = remove_files_and_dir(dir);
-       if (ret) {
-               printk("is_umdir_used - remove_files_and_dir failed with "
-                      "err = %d\n", ret);
-       }
-       return ret;
-}
-
 static void __init create_pid_file(void)
 {
        char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")];
@@ -279,7 +244,11 @@ int __init make_umid(void)
                if(err != -EEXIST)
                        goto err;
 
-               if (umdir_take_if_dead(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);
@@ -375,9 +344,9 @@ static void remove_umid_dir(void)
        char dir[strlen(uml_dir) + UMID_LEN + 1], err;
 
        sprintf(dir, "%s%s", uml_dir, umid);
-       err = remove_files_and_dir(dir);
+       err = actually_do_remove(dir);
        if(err)
-               printf("remove_umid_dir - remove_files_and_dir failed with "
+               printf("remove_umid_dir - actually_do_remove failed with "
                       "err = %d\n", err);
 }