--- atomicalloc/fs/buffer.c.~1~	Thu Apr 26 02:04:33 2001
+++ atomicalloc/fs/buffer.c	Thu Apr 26 03:58:44 2001
@@ -2390,7 +2390,7 @@
 	spin_unlock(&free_list[index].lock);
 	write_unlock(&hash_table_lock);
 	spin_unlock(&lru_list_lock);
-	if (wait) {
+	if (wait && !(current->flags & PF_ATOMICALLOC)) {
 		sync_page_buffers(bh, wait);
 		/* We waited synchronously, so we can free the buffers. */
 		if (wait > 1 && !loop) {
--- atomicalloc/include/linux/sched.h.~1~	Thu Apr 26 02:04:44 2001
+++ atomicalloc/include/linux/sched.h	Thu Apr 26 04:05:28 2001
@@ -403,18 +403,15 @@
 /*
  * Per process flags
  */
-#define PF_ALIGNWARN	0x00000001	/* Print alignment warning msgs */
-					/* Not implemented yet, only for 486*/
-#define PF_STARTING	0x00000002	/* being created */
-#define PF_EXITING	0x00000004	/* getting shut down */
-#define PF_FORKNOEXEC	0x00000040	/* forked but didn't exec */
-#define PF_SUPERPRIV	0x00000100	/* used super-user privileges */
-#define PF_DUMPCORE	0x00000200	/* dumped core */
-#define PF_SIGNALED	0x00000400	/* killed by a signal */
-#define PF_MEMALLOC	0x00000800	/* Allocating memory */
-#define PF_VFORK	0x00001000	/* Wake up parent in mm_release */
-
-#define PF_USEDFPU	0x00100000	/* task used FPU this quantum (SMP) */
+#define PF_EXITING	(1UL<<0)	/* getting shut down */
+#define PF_FORKNOEXEC	(1UL<<1)	/* forked but didn't exec */
+#define PF_SUPERPRIV	(1UL<<2)	/* used super-user privileges */
+#define PF_DUMPCORE	(1UL<<3)	/* dumped core */
+#define PF_SIGNALED	(1UL<<4)	/* killed by a signal */
+#define PF_MEMALLOC	(1UL<<5)	/* Allocating memory */
+#define PF_VFORK	(1UL<<6)	/* Wake up parent in mm_release */
+#define PF_USEDFPU	(1UL<<7)	/* task used FPU this quantum (SMP) */
+#define PF_ATOMICALLOC	(1UL<<8)	/* do not block during memalloc */
 
 /*
  * Ptrace flags
--- atomicalloc/mm/slab.c.~1~	Sun Apr  1 01:17:34 2001
+++ atomicalloc/mm/slab.c	Thu Apr 26 03:59:24 2001
@@ -1690,7 +1690,7 @@
 	unsigned int best_len;
 	unsigned int scan;
 
-	if (gfp_mask & __GFP_WAIT)
+	if (gfp_mask & __GFP_WAIT && !(current->flags & PF_ATOMICALLOC))
 		down(&cache_chain_sem);
 	else
 		if (down_trylock(&cache_chain_sem))
--- atomicalloc/mm/page_alloc.c.~1~	Thu Apr 26 02:04:45 2001
+++ atomicalloc/mm/page_alloc.c	Thu Apr 26 03:59:45 2001
@@ -381,7 +381,7 @@
 	 *   able to free some memory we can't free ourselves
 	 */
 	wakeup_kswapd();
-	if (gfp_mask & __GFP_WAIT) {
+	if (gfp_mask & __GFP_WAIT && !(current->flags & PF_ATOMICALLOC)) {
 		__set_current_state(TASK_RUNNING);
 		current->policy |= SCHED_YIELD;
 		schedule();