diff -up linux-2.6.9/drivers/block/genhd.c.orig linux-2.6.9/drivers/block/genhd.c
--- linux-2.6.9/drivers/block/genhd.c.orig	2009-04-15 13:47:43.000000000 +0800
+++ linux-2.6.9/drivers/block/genhd.c	2009-04-15 13:52:29.000000000 +0800
@@ -271,6 +271,7 @@ static int show_partition(struct seq_fil
 	struct gendisk *sgp = v;
 	int n;
 	char buf[BDEVNAME_SIZE];
+	struct hd_struct *hd_part;
 
 	if (&sgp->kobj.entry == block_subsys.kset.list.next)
 		seq_puts(part, "major minor  #blocks  name\n\n");
@@ -288,14 +289,19 @@ static int show_partition(struct seq_fil
 		(unsigned long long)get_capacity(sgp) >> 1,
 		disk_name(sgp, 0, buf));
 	for (n = 0; n < sgp->minors - 1; n++) {
-		if (!sgp->part[n])
-			continue;
-		if (sgp->part[n]->nr_sects == 0)
+		rcu_read_lock();
+		hd_part = rcu_dereference(sgp->part[n]);
+
+		if ((!hd_part) || (hd_part->nr_sects == 0)) {
+			rcu_read_unlock();
 			continue;
+		}
 		seq_printf(part, "%4d  %4d %10llu %s\n",
 			sgp->major, n + 1 + sgp->first_minor,
-			(unsigned long long)sgp->part[n]->nr_sects >> 1 ,
+			(unsigned long long)hd_part->nr_sects >> 1,
 			disk_name(sgp, n + 1, buf));
+
+		rcu_read_unlock();
 	}
 
 	return 0;
diff -up linux-2.6.9/fs/partitions/check.c.orig linux-2.6.9/fs/partitions/check.c
--- linux-2.6.9/fs/partitions/check.c.orig	2009-04-15 13:53:11.000000000 +0800
+++ linux-2.6.9/fs/partitions/check.c	2009-04-15 13:56:21.000000000 +0800
@@ -305,7 +305,9 @@ void delete_partition(struct gendisk *di
 		return;
 	if (!p->nr_sects)
 		return;
-	disk->part[part-1] = NULL;
+	rcu_assign_pointer(disk->part[part-1], NULL);
+	synchronize_kernel();
+
 	p->start_sect = 0;
 	p->nr_sects = 0;
 	p->reads = p->writes = p->read_sectors = p->write_sectors = 0;
