diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c
index dd4237e5e9ecc6b80a05b7ea5bdda134fc97d346..731fbc0f1291f84bb88ffdcdc5dcfaeab890dbd0 100644
--- a/fs/ext3/balloc.c
+++ b/fs/ext3/balloc.c
@@ -164,10 +164,11 @@ read_block_bitmap(struct super_block *sb, unsigned int block_group)
 			    block_group, le32_to_cpu(desc->bg_block_bitmap));
 		return NULL;
 	}
-	if (!ext3_valid_block_bitmap(sb, desc, block_group, bh)) {
-		brelse(bh);
-		return NULL;
-	}
+	ext3_valid_block_bitmap(sb, desc, block_group, bh);
+	/*
+	 * file system mounted not to panic on error, continue with corrupt
+	 * bitmap
+	 */
 	return bh;
 }
 /*
@@ -1641,7 +1642,11 @@ ext3_fsblk_t ext3_new_blocks(handle_t *handle, struct inode *inode,
 			    "Allocating block in system zone - "
 			    "blocks from "E3FSBLK", length %lu",
 			     ret_block, num);
-		goto out;
+		/*
+		 * claim_block() marked the blocks we allocated as in use. So we
+		 * may want to selectively mark some of the blocks as free.
+		 */
+		goto retry_alloc;
 	}
 
 	performed_allocation = 1;