diff -Nru linux-2.4.19/mm/vmalloc.c linux/mm/vmalloc.c
--- linux-2.4.19/mm/vmalloc.c	Wed Jun 12 12:04:44 2002
+++ linux/mm/vmalloc.c	Thu Jun 13 13:13:44 2002
@@ -321,3 +321,22 @@
 	read_unlock(&vmlist_lock);
 	return buf - buf_start;
 }
+
+void *vcalloc(unsigned long nmemb, unsigned long elem_size)
+{
+	unsigned long size;
+	void *addr;
+
+	/*
+	 * Check that we're not going to overflow.
+	 */
+	if (nmemb > (ULONG_MAX / elem_size))
+		return NULL;
+
+	size = nmemb * elem_size;
+	addr = vmalloc(size);
+	if (addr)
+		memset(addr, 0, size);
+
+	return addr;
+}
diff -Nru linux-2.4.19/include/linux/vmalloc.h linux/include/linux/vmalloc.h
--- linux-2.4.19/include/linux/vmalloc.h	Wed Jun 12 12:35:58 2002
+++ linux/include/linux/vmalloc.h	Thu Jun 13 13:13:39 2002
@@ -25,6 +25,7 @@
 extern void vmfree_area_pages(unsigned long address, unsigned long size);
 extern int vmalloc_area_pages(unsigned long address, unsigned long size,
                               int gfp_mask, pgprot_t prot);
+extern void *vcalloc(unsigned long nmemb, unsigned long elem_size);
 
 /*
  *	Allocate any pages
diff -Nru linux-2.4.19/kernel/ksyms.c linux/kernel/ksyms.c
--- linux-2.4.19/kernel/ksyms.c	Wed Jun 26 18:42:28 2002
+++ linux/kernel/ksyms.c	Wed Jun 26 18:37:01 2002
@@ -109,6 +109,7 @@
 EXPORT_SYMBOL(vfree);
 EXPORT_SYMBOL(__vmalloc);
 EXPORT_SYMBOL(vmalloc_to_page);
+EXPORT_SYMBOL(vcalloc);
 EXPORT_SYMBOL(mem_map);
 EXPORT_SYMBOL(remap_page_range);
 EXPORT_SYMBOL(max_mapnr);
