diff -ur vmmon-only/linux/driver.c vmmon-only.b/linux/driver.c
--- vmmon-only/linux/driver.c	2007-05-02 13:08:21.000000000 +0900
+++ vmmon-only.b/linux/driver.c	2007-07-21 10:31:24.000000000 +0900
@@ -1712,9 +1712,9 @@
           current->egid == current->gid &&
 	  current->fsgid == current->gid) {
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 7)
-	 current->mm->dumpable = 1;
+	 set_dumpable(current->mm, 1);
 #else
-	 current->dumpable = 1;
+	 set_dumpable(current->mm, 1);
 #endif
          retval = 0;
       } else {
@@ -2333,6 +2333,55 @@
    return retval;
 }
 
+/*
+ * set_dumpable converts traditional three-value dumpable to two flags and
+ * stores them into mm->flags.  It modifies lower two bits of mm->flags, but
+ * these bits are not changed atomically.  So get_dumpable can observe the
+ * intermediate state.  To avoid doing unexpected behavior, get get_dumpable
+ * return either old dumpable or new one by paying attention to the order of
+ * modifying the bits.
+ *
+ * dumpable |   mm->flags (binary)
+ * old  new | initial interim  final
+ * ---------+-----------------------
+ *  0    1  |   00      01      01
+ *  0    2  |   00      10(*)   11
+ *  1    0  |   01      00      00
+ *  1    2  |   01      11      11
+ *  2    0  |   11      10(*)   00
+ *  2    1  |   11      11      01
+ *
+ * (*) get_dumpable regards interim value of 10 as 11.
+ */
+void set_dumpable(struct mm_struct *mm, int value)
+{
+	switch (value) {
+	case 0:
+		clear_bit(MMF_DUMPABLE, &mm->flags);
+		smp_wmb();
+		clear_bit(MMF_DUMP_SECURELY, &mm->flags);
+		break;
+	case 1:
+		set_bit(MMF_DUMPABLE, &mm->flags);
+		smp_wmb();
+		clear_bit(MMF_DUMP_SECURELY, &mm->flags);
+		break;
+	case 2:
+		set_bit(MMF_DUMP_SECURELY, &mm->flags);
+		smp_wmb();
+		set_bit(MMF_DUMPABLE, &mm->flags);
+		break;
+	}
+}
+/*
+int get_dumpable(struct mm_struct *mm)
+{
+	int ret;
+
+	ret = mm->flags & 0x3;
+	return (ret >= 2) ? 2 : ret;
+}
+*/
 
 /*
  *----------------------------------------------------------------------
