diff -urN z/fs/buffer.c zz/fs/buffer.c --- z/fs/buffer.c Sun Dec 9 17:08:47 2001 +++ zz/fs/buffer.c Sun Dec 9 17:09:18 2001 @@ -2539,7 +2539,7 @@ /* Uhhuh, start writeback so that we don't end up with all dirty pages */ write_unlock(&hash_table_lock); spin_unlock(&lru_list_lock); - if (gfp_mask & __GFP_IO) { + if (gfp_mask & __GFP_IO && !(current->flags & PF_ATOMICALLOC)) { if ((gfp_mask & __GFP_HIGHIO) || !PageHighMem(page)) { if (sync_page_buffers(bh)) { /* no IO or waiting next time */ diff -urN z/include/linux/sched.h zz/include/linux/sched.h --- z/include/linux/sched.h Sun Dec 9 17:08:48 2001 +++ zz/include/linux/sched.h Sun Dec 9 17:10:23 2001 @@ -427,19 +427,16 @@ /* * 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_FREE_PAGES 0x00002000 /* per process page freeing */ -#define PF_NOIO 0x00004000 /* avoid generating further I/O */ - -#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_USEDFPU (1UL<<6) /* task used FPU this quantum (SMP) */ +#define PF_ATOMICALLOC (1UL<<7) /* do not block during memalloc */ +#define PF_FREE_PAGES (1UL<<8) /* per process page freeing */ +#define PF_NOIO (1UL<<9) /* avoid generating further I/O */ /* * Ptrace flags diff -urN z/mm/slab.c zz/mm/slab.c --- z/mm/slab.c Sun Dec 9 17:08:47 2001 +++ zz/mm/slab.c Sun Dec 9 17:09:18 2001 @@ -1715,7 +1715,7 @@ unsigned int scan; int ret = 0; - 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))