#define        MADV_SPACEAVAIL 5               /* ensure resources are available */
 #define MADV_DONTNEED  6               /* don't need these pages */
 #define MADV_REMOVE    7               /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_4M_PAGES   22              /* Use 4 Megabyte pages */
 #define MADV_16M_PAGES  24              /* Use 16 Megabyte pages */
 #define MADV_64M_PAGES  26              /* Use 64 Megabyte pages */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3              /* pre-fault pages */
 #define MADV_DONTNEED  0x4              /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_FREE      0x5             /* (Solaris) contents can be freed */
 #define MADV_REMOVE    0x6             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_FREE      0x5             /* (Solaris) contents can be freed */
 #define MADV_REMOVE    0x6             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
 #define MADV_WILLNEED  0x3             /* pre-fault pages */
 #define MADV_DONTNEED  0x4             /* discard these pages */
 #define MADV_REMOVE    0x5             /* remove these pages & resources */
+#define MADV_DONTFORK  0x30            /* dont inherit across fork */
+#define MADV_DOFORK    0x31            /* do inherit across fork */
 
 /* compatibility flags */
 #define MAP_ANON       MAP_ANONYMOUS
 
        struct mm_struct * mm = vma->vm_mm;
        int error = 0;
        pgoff_t pgoff;
-       int new_flags = vma->vm_flags & ~VM_READHINTMASK;
+       int new_flags = vma->vm_flags;
 
        switch (behavior) {
+       case MADV_NORMAL:
+               new_flags = new_flags & ~VM_RAND_READ & ~VM_SEQ_READ;
+               break;
        case MADV_SEQUENTIAL:
-               new_flags |= VM_SEQ_READ;
+               new_flags = (new_flags & ~VM_RAND_READ) | VM_SEQ_READ;
                break;
        case MADV_RANDOM:
-               new_flags |= VM_RAND_READ;
+               new_flags = (new_flags & ~VM_SEQ_READ) | VM_RAND_READ;
                break;
-       default:
+       case MADV_DONTFORK:
+               new_flags |= VM_DONTCOPY;
+               break;
+       case MADV_DOFORK:
+               new_flags &= ~VM_DONTCOPY;
                break;
        }
 
        long error;
 
        switch (behavior) {
+       case MADV_DOFORK:
+               if (vma->vm_flags & VM_IO) {
+                       error = -EINVAL;
+                       break;
+               }
+       case MADV_DONTFORK:
        case MADV_NORMAL:
        case MADV_SEQUENTIAL:
        case MADV_RANDOM: