Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-block.git] / kernel / pid.c
index 686255e2c39e4874a13d78051afc8f54c7d4ae63..0db3e791a06d48594606bc4789bc8fbe0fd5a4f0 100644 (file)
@@ -52,9 +52,6 @@ int pid_max = PID_MAX_DEFAULT;
 int pid_max_min = RESERVED_PIDS + 1;
 int pid_max_max = PID_MAX_LIMIT;
 
-#define BITS_PER_PAGE          (PAGE_SIZE*8)
-#define BITS_PER_PAGE_MASK     (BITS_PER_PAGE-1)
-
 static inline int mk_pid(struct pid_namespace *pid_ns,
                struct pidmap *map, int off)
 {
@@ -184,15 +181,19 @@ static int alloc_pidmap(struct pid_namespace *pid_ns)
                                break;
                }
                if (likely(atomic_read(&map->nr_free))) {
-                       do {
+                       for ( ; ; ) {
                                if (!test_and_set_bit(offset, map->page)) {
                                        atomic_dec(&map->nr_free);
                                        set_last_pid(pid_ns, last, pid);
                                        return pid;
                                }
                                offset = find_next_offset(map, offset);
+                               if (offset >= BITS_PER_PAGE)
+                                       break;
                                pid = mk_pid(pid_ns, map, offset);
-                       } while (offset < BITS_PER_PAGE && pid < pid_max);
+                               if (pid >= pid_max)
+                                       break;
+                       }
                }
                if (map < &pid_ns->pidmap[(pid_max-1)/BITS_PER_PAGE]) {
                        ++map;