Here's a trivial patch to the allocator for the exception_cache. I've been playing with creating a 100gigabyte logical volume, creating a snapshot, then, runing mkfs.ext2 on the origin volume. This creates approximately 1,316,000 exceptions. With the original code, My system hangs completely, as all of the NOIO memory gets consumed (this is a 16-gigabyte 8 processor system). The system is unuseable. Changing the allocator makes things better. The original allocator doesn't really make sense. The GFP_NOIO allocation should never fail. It'll just block forever. So the original code that looked for failure and then calls kmem_cache_alloc(GFP_ATOMIC) seems backwards. I think some other scheme is needed for allocationg exceptions I don't know yet what that new scheme would be. diff -ur linux-2.6.7-rc2-udm1-original/drivers/md/dm-snap.c linux-2.6.7-rc2-udm1-patched/drivers/md/dm-snap.c --- linux-2.6.7-rc2-udm1-original/drivers/md/dm-snap.c 2004-06-02 14:08:05.000000000 -0700 +++ linux-2.6.7-rc2-udm1-patched/drivers/md/dm-snap.c 2004-06-02 14:16:58.000000000 -0700 @@ -264,9 +264,9 @@ { struct exception *e; - e = kmem_cache_alloc(exception_cache, GFP_NOIO); + e = kmem_cache_alloc(exception_cache, GFP_ATOMIC); if (!e) - e = kmem_cache_alloc(exception_cache, GFP_ATOMIC); + e = kmem_cache_alloc(exception_cache, GFP_NOIO); return e; }