mm/madvise: move up the behavior parameter validation
authorAnshuman Khandual <khandual@linux.vnet.ibm.com>
Wed, 3 May 2017 21:55:28 +0000 (14:55 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 May 2017 22:52:11 +0000 (15:52 -0700)
madvise_behavior_valid() should be called before acting upon the
behavior parameter.  Hence move up the function.  This also includes
MADV_SOFT_OFFLINE and MADV_HWPOISON options as valid behavior parameter
for the system call madvise().

Link: http://lkml.kernel.org/r/20170418052844.24891-1-khandual@linux.vnet.ibm.com
Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
Acked-by: David Rientjes <rientjes@google.com>
Acked-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/madvise.c

index 31da0941293496fbb16515787a671a4ed0a84582..25b78ee4fc2c77addde06a22580e02bf05bb3b51 100644 (file)
@@ -687,6 +687,10 @@ madvise_behavior_valid(int behavior)
 #endif
        case MADV_DONTDUMP:
        case MADV_DODUMP:
+#ifdef CONFIG_MEMORY_FAILURE
+       case MADV_SOFT_OFFLINE:
+       case MADV_HWPOISON:
+#endif
                return true;
 
        default:
@@ -760,10 +764,6 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior)
        size_t len;
        struct blk_plug plug;
 
-#ifdef CONFIG_MEMORY_FAILURE
-       if (behavior == MADV_HWPOISON || behavior == MADV_SOFT_OFFLINE)
-               return madvise_inject_error(behavior, start, start + len_in);
-#endif
        if (!madvise_behavior_valid(behavior))
                return error;
 
@@ -783,6 +783,11 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior)
        if (end == start)
                return error;
 
+#ifdef CONFIG_MEMORY_FAILURE
+       if (behavior == MADV_HWPOISON || behavior == MADV_SOFT_OFFLINE)
+               return madvise_inject_error(behavior, start, start + len_in);
+#endif
+
        write = madvise_need_mmap_write(behavior);
        if (write) {
                if (down_write_killable(&current->mm->mmap_sem))