--- linux-2.4.21/drivers/md/dm-ioctl.c	Wed Aug 20 14:41:38 2003
+++ linux/drivers/md/dm-ioctl.c	Wed Aug 20 14:42:58 2003
@@ -1178,19 +1178,11 @@
 	}
 
 	/*
-	 * FIXME: I don't like this, we're trying to avoid low
-	 * memory issues when a device is suspended.
-	 */
-	current->flags |= PF_MEMALLOC;
-
-	/*
 	 * Copy the parameters into kernel space.
 	 */
 	r = copy_params(user, &param);
-	if (r) {
-		current->flags &= ~PF_MEMALLOC;
+	if (r)
 		return r;
-	}
 
 	r = validate_params(cmd, param);
 	if (r)
@@ -1208,7 +1200,6 @@
 
  out:
 	free_params(param);
-	current->flags &= ~PF_MEMALLOC;
 	return r;
 }
 
--- linux-2.4.21/include/asm-alpha/mman.h	Fri Jan 10 16:35:33 2003
+++ linux/include/asm-alpha/mman.h	Wed Aug 20 14:42:58 2003
@@ -30,6 +30,7 @@
 
 #define MCL_CURRENT	 8192		/* lock all currently mapped pages */
 #define MCL_FUTURE	16384		/* lock all additions to address space */
+#define MCL_MEMALLOC	32768		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0		/* no further special treatment */
 #define MADV_RANDOM	1		/* expect random page references */
--- linux-2.4.21/include/asm-arm/mman.h	Fri Jan 10 16:35:33 2003
+++ linux/include/asm-arm/mman.h	Wed Aug 20 14:42:58 2003
@@ -24,6 +24,7 @@
 
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0x0		/* default page-in behavior */
 #define MADV_RANDOM	0x1		/* page-in minimum required */
--- linux-2.4.21/include/asm-cris/mman.h	Fri Jan 10 16:35:36 2003
+++ linux/include/asm-cris/mman.h	Wed Aug 20 14:42:58 2003
@@ -26,6 +26,7 @@
 
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0x0		/* default page-in behavior */
 #define MADV_RANDOM	0x1		/* page-in minimum required */
--- linux-2.4.21/include/asm-i386/mman.h	Fri Jan 10 16:35:37 2003
+++ linux/include/asm-i386/mman.h	Wed Aug 20 14:42:58 2003
@@ -24,6 +24,7 @@
 
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0x0		/* default page-in behavior */
 #define MADV_RANDOM	0x1		/* page-in minimum required */
--- linux-2.4.21/include/asm-ia64/mman.h	Fri Jan 10 16:35:38 2003
+++ linux/include/asm-ia64/mman.h	Wed Aug 20 14:42:58 2003
@@ -32,6 +32,7 @@
 
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0x0		/* default page-in behavior */
 #define MADV_RANDOM	0x1		/* page-in minimum required */
--- linux-2.4.21/include/asm-m68k/mman.h	Fri Jan 10 16:35:43 2003
+++ linux/include/asm-m68k/mman.h	Wed Aug 20 14:42:58 2003
@@ -24,6 +24,7 @@
 
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0x0		/* default page-in behavior */
 #define MADV_RANDOM	0x1		/* page-in minimum required */
--- linux-2.4.21/include/asm-mips/mman.h	Fri Jan 10 16:35:44 2003
+++ linux/include/asm-mips/mman.h	Wed Aug 20 14:42:58 2003
@@ -55,6 +55,7 @@
  */
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0x0		/* default page-in behavior */
 #define MADV_RANDOM	0x1		/* page-in minimum required */
--- linux-2.4.21/include/asm-mips64/mman.h	Fri Jan 10 16:35:45 2003
+++ linux/include/asm-mips64/mman.h	Wed Aug 20 14:42:58 2003
@@ -53,6 +53,7 @@
  */
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0x0		/* default page-in behavior */
 #define MADV_RANDOM	0x1		/* page-in minimum required */
--- linux-2.4.21/include/asm-parisc/mman.h	Fri Jan 10 16:35:47 2003
+++ linux/include/asm-parisc/mman.h	Wed Aug 20 14:42:58 2003
@@ -24,6 +24,7 @@
 
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL     0               /* no further special treatment */
 #define MADV_RANDOM     1               /* expect random page references */
--- linux-2.4.21/include/asm-ppc/mman.h	Fri Jun 13 16:32:50 2003
+++ linux/include/asm-ppc/mman.h	Wed Aug 20 14:42:58 2003
@@ -25,6 +25,7 @@
 
 #define MCL_CURRENT     0x2000          /* lock all currently mapped pages */
 #define MCL_FUTURE      0x4000          /* lock all additions to address space */
+#define MCL_MEMALLOC	0x8000		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0x0		/* default page-in behavior */
 #define MADV_RANDOM	0x1		/* page-in minimum required */
--- linux-2.4.21/include/asm-ppc64/mman.h	Fri Jan 10 16:35:49 2003
+++ linux/include/asm-ppc64/mman.h	Wed Aug 20 14:42:58 2003
@@ -31,6 +31,7 @@
 
 #define MCL_CURRENT     0x2000          /* lock all currently mapped pages */
 #define MCL_FUTURE      0x4000          /* lock all additions to address space */
+#define MCL_MEMALLOC	0x8000		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0x0		/* default page-in behavior */
 #define MADV_RANDOM	0x1		/* page-in minimum required */
--- linux-2.4.21/include/asm-s390/mman.h	Fri Jan 10 16:35:49 2003
+++ linux/include/asm-s390/mman.h	Wed Aug 20 14:42:58 2003
@@ -32,6 +32,7 @@
 
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL    0x0              /* default page-in behavior */
 #define MADV_RANDOM    0x1              /* page-in minimum required */
--- linux-2.4.21/include/asm-s390x/mman.h	Fri Jan 10 16:35:50 2003
+++ linux/include/asm-s390x/mman.h	Wed Aug 20 14:42:58 2003
@@ -32,6 +32,7 @@
 
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL    0x0              /* default page-in behavior */
 #define MADV_RANDOM    0x1              /* page-in minimum required */
--- linux-2.4.21/include/asm-sh/mman.h	Fri Jan 10 16:35:52 2003
+++ linux/include/asm-sh/mman.h	Wed Aug 20 14:42:58 2003
@@ -24,6 +24,7 @@
 
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0x0		/* default page-in behavior */
 #define MADV_RANDOM	0x1		/* page-in minimum required */
--- linux-2.4.21/include/asm-sparc/mman.h	Fri Jun 13 16:32:51 2003
+++ linux/include/asm-sparc/mman.h	Wed Aug 20 14:42:58 2003
@@ -30,6 +30,7 @@
 
 #define MCL_CURRENT     0x2000          /* lock all currently mapped pages */
 #define MCL_FUTURE      0x4000          /* lock all additions to address space */
+#define MCL_MEMALLOC	0x8000		/* allow allocation of reserved memory */
 
 /* XXX Need to add flags to SunOS's mctl, mlockall, and madvise system
  * XXX calls.
--- linux-2.4.21/include/asm-sparc64/mman.h	Fri Jun 13 16:32:51 2003
+++ linux/include/asm-sparc64/mman.h	Wed Aug 20 14:42:58 2003
@@ -30,6 +30,7 @@
 
 #define MCL_CURRENT     0x2000          /* lock all currently mapped pages */
 #define MCL_FUTURE      0x4000          /* lock all additions to address space */
+#define MCL_MEMALLOC	0x8000		/* allow allocation of reserved memory */
 
 /* XXX Need to add flags to SunOS's mctl, mlockall, and madvise system
  * XXX calls.
--- linux-2.4.21/include/asm-x86_64/mman.h	Fri Jan 10 16:35:53 2003
+++ linux/include/asm-x86_64/mman.h	Wed Aug 20 14:42:58 2003
@@ -25,6 +25,7 @@
 
 #define MCL_CURRENT	1		/* lock all current mappings */
 #define MCL_FUTURE	2		/* lock all future mappings */
+#define MCL_MEMALLOC	4		/* allow allocation of reserved memory */
 
 #define MADV_NORMAL	0x0		/* default page-in behavior */
 #define MADV_RANDOM	0x1		/* page-in minimum required */
--- linux-2.4.21/mm/mlock.c	Fri Jan 10 16:36:03 2003
+++ linux/mm/mlock.c	Wed Aug 20 14:42:58 2003
@@ -244,6 +244,11 @@
 	if (!capable(CAP_IPC_LOCK))
 		return -EPERM;
 
+	if (flags & MCL_MEMALLOC)
+		current->flags |= PF_MEMALLOC;
+	else
+		current->flags &= ~PF_MEMALLOC;
+
 	def_flags = 0;
 	if (flags & MCL_FUTURE)
 		def_flags = VM_LOCKED;
@@ -269,7 +274,7 @@
 	int ret = -EINVAL;
 
 	down_write(&current->mm->mmap_sem);
-	if (!flags || (flags & ~(MCL_CURRENT | MCL_FUTURE)))
+	if (!flags || (flags & ~(MCL_CURRENT | MCL_FUTURE | MCL_MEMALLOC)))
 		goto out;
 
 	lock_limit = current->rlim[RLIMIT_MEMLOCK].rlim_cur;
--- linux-2.4.21/mm/oom_kill.c	Fri Jan 10 16:36:03 2003
+++ linux/mm/oom_kill.c	Wed Aug 20 14:42:58 2003
@@ -61,6 +61,13 @@
 
 	if (!p->mm)
 		return 0;
+
+	/*
+	 * The system's likely doomed if we have to kill a PF_MEMALLOC process.
+	 */
+	if (p->flags & PF_MEMALLOC)
+		return 1;
+
 	/*
 	 * The memory size of the process is the basis for the badness.
 	 */
--- linux-2.4.21/mm/page_alloc.c	Fri Jan 10 16:36:03 2003
+++ linux/mm/page_alloc.c	Wed Aug 20 14:42:58 2003
@@ -254,6 +254,7 @@
 {
 	struct page * page = NULL;
 	int __freed = 0;
+	unsigned long pf_memalloc;
 
 	if (!(gfp_mask & __GFP_WAIT))
 		goto out;
@@ -261,11 +262,12 @@
 		BUG();
 
 	current->allocation_order = order;
+	pf_memalloc = current->flags & PF_MEMALLOC;
 	current->flags |= PF_MEMALLOC | PF_FREE_PAGES;
 
 	__freed = try_to_free_pages_zone(classzone, gfp_mask);
 
-	current->flags &= ~(PF_MEMALLOC | PF_FREE_PAGES);
+	current->flags &= ~(PF_MEMALLOC | PF_FREE_PAGES) | pf_memalloc;
 
 	if (current->nr_local_pages) {
 		struct list_head * entry, * local_pages;
