diff -urpN --exclude-from=/home/davej/.exclude bk-linus/fs/ext2/balloc.c linux-2.5/fs/ext2/balloc.c
--- bk-linus/fs/ext2/balloc.c	2002-11-21 02:19:57.000000000 +0000
+++ linux-2.5/fs/ext2/balloc.c	2002-11-21 18:02:05.000000000 +0000
@@ -178,8 +178,9 @@ void ext2_free_blocks (struct inode * in
 
 	lock_super (sb);
 	es = EXT2_SB(sb)->s_es;
-	if (block < le32_to_cpu(es->s_first_data_block) || 
-	    (block + count) > le32_to_cpu(es->s_blocks_count)) {
+	if (block < le32_to_cpu(es->s_first_data_block) ||
+	    block + count < block ||
+	    block + count > le32_to_cpu(es->s_blocks_count)) {
 		ext2_error (sb, "ext2_free_blocks",
 			    "Freeing blocks not in datazone - "
 			    "block = %lu, count = %lu", block, count);
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/fs/ext3/balloc.c linux-2.5/fs/ext3/balloc.c
--- bk-linus/fs/ext3/balloc.c	2002-11-21 02:19:59.000000000 +0000
+++ linux-2.5/fs/ext3/balloc.c	2002-11-21 18:02:06.000000000 +0000
@@ -120,8 +120,9 @@ void ext3_free_blocks (handle_t *handle,
 	}
 	lock_super (sb);
 	es = EXT3_SB(sb)->s_es;
-	if (block < le32_to_cpu(es->s_first_data_block) || 
-	    (block + count) > le32_to_cpu(es->s_blocks_count)) {
+	if (block < le32_to_cpu(es->s_first_data_block) ||
+	    block + count < block ||
+	    block + count >= le32_to_cpu(es->s_blocks_count)) {
 		ext3_error (sb, "ext3_free_blocks",
 			    "Freeing blocks not in datazone - "
 			    "block = %lu, count = %lu", block, count);