浏览代码

Merge branch 'for-linus' of git://neil.brown.name/md

* 'for-linus' of git://neil.brown.name/md: (34 commits)
  md: Fix some bugs in recovery_disabled handling.
  md/raid5: fix bug that could result in reads from a failed device.
  lib/raid6: Fix filename emitted in generated code
  md.c: trivial comment fix
  MD: Allow restarting an interrupted incremental recovery.
  md: clear In_sync bit on devices added to an active array.
  md: add proper write-congestion reporting to RAID1 and RAID10.
  md: rename "mdk_personality" to "md_personality"
  md/bitmap remove fault injection options.
  md/raid5: typedef removal: raid5_conf_t -> struct r5conf
  md/raid1: typedef removal: conf_t -> struct r1conf
  md/raid10: typedef removal: conf_t -> struct r10conf
  md/raid0: typedef removal: raid0_conf_t -> struct r0conf
  md/multipath: typedef removal: multipath_conf_t -> struct mpconf
  md/linear: typedef removal: linear_conf_t -> struct linear_conf
  md/faulty: remove typedef: conf_t -> struct faulty_conf
  md/linear: remove typedefs: dev_info_t -> struct dev_info
  md: remove typedefs: mirror_info_t -> struct mirror_info
  md: remove typedefs: r10bio_t -> struct r10bio and r1bio_t -> struct r1bio
  md: remove typedefs: mdk_thread_t -> struct md_thread
  ...
Linus Torvalds 14 年之前
父节点
当前提交
c3ae1f3356
共有 19 个文件被更改,包括 1217 次插入1273 次删除
  1. 77 111
      drivers/md/bitmap.c
  2. 6 6
      drivers/md/bitmap.h
  3. 14 14
      drivers/md/dm-raid.c
  4. 19 19
      drivers/md/faulty.c
  5. 23 23
      drivers/md/linear.c
  6. 3 9
      drivers/md/linear.h
  7. 320 311
      drivers/md/md.c
  8. 75 78
      drivers/md/md.h
  9. 32 32
      drivers/md/multipath.c
  10. 4 6
      drivers/md/multipath.h
  11. 83 108
      drivers/md/raid0.c
  12. 3 7
      drivers/md/raid0.h
  13. 179 156
      drivers/md/raid1.c
  14. 52 33
      drivers/md/raid1.h
  15. 151 129
      drivers/md/raid10.c
  16. 8 14
      drivers/md/raid10.h
  17. 158 205
      drivers/md/raid5.c
  18. 9 11
      drivers/md/raid5.h
  19. 1 1
      lib/raid6/int.uc

+ 77 - 111
drivers/md/bitmap.c

@@ -29,35 +29,6 @@
 #include "md.h"
 #include "md.h"
 #include "bitmap.h"
 #include "bitmap.h"
 
 
-/* debug macros */
-
-#define DEBUG 0
-
-#if DEBUG
-/* these are for debugging purposes only! */
-
-/* define one and only one of these */
-#define INJECT_FAULTS_1 0 /* cause bitmap_alloc_page to fail always */
-#define INJECT_FAULTS_2 0 /* cause bitmap file to be kicked when first bit set*/
-#define INJECT_FAULTS_3 0 /* treat bitmap file as kicked at init time */
-#define INJECT_FAULTS_4 0 /* undef */
-#define INJECT_FAULTS_5 0 /* undef */
-#define INJECT_FAULTS_6 0
-
-/* if these are defined, the driver will fail! debug only */
-#define INJECT_FATAL_FAULT_1 0 /* fail kmalloc, causing bitmap_create to fail */
-#define INJECT_FATAL_FAULT_2 0 /* undef */
-#define INJECT_FATAL_FAULT_3 0 /* undef */
-#endif
-
-#ifndef PRINTK
-#  if DEBUG > 0
-#    define PRINTK(x...) printk(KERN_DEBUG x)
-#  else
-#    define PRINTK(x...)
-#  endif
-#endif
-
 static inline char *bmname(struct bitmap *bitmap)
 static inline char *bmname(struct bitmap *bitmap)
 {
 {
 	return bitmap->mddev ? mdname(bitmap->mddev) : "mdX";
 	return bitmap->mddev ? mdname(bitmap->mddev) : "mdX";
@@ -70,16 +41,12 @@ static unsigned char *bitmap_alloc_page(struct bitmap *bitmap)
 {
 {
 	unsigned char *page;
 	unsigned char *page;
 
 
-#ifdef INJECT_FAULTS_1
-	page = NULL;
-#else
 	page = kzalloc(PAGE_SIZE, GFP_NOIO);
 	page = kzalloc(PAGE_SIZE, GFP_NOIO);
-#endif
 	if (!page)
 	if (!page)
 		printk("%s: bitmap_alloc_page FAILED\n", bmname(bitmap));
 		printk("%s: bitmap_alloc_page FAILED\n", bmname(bitmap));
 	else
 	else
-		PRINTK("%s: bitmap_alloc_page: allocated page at %p\n",
-			bmname(bitmap), page);
+		pr_debug("%s: bitmap_alloc_page: allocated page at %p\n",
+			 bmname(bitmap), page);
 	return page;
 	return page;
 }
 }
 
 
@@ -88,7 +55,7 @@ static unsigned char *bitmap_alloc_page(struct bitmap *bitmap)
  */
  */
 static void bitmap_free_page(struct bitmap *bitmap, unsigned char *page)
 static void bitmap_free_page(struct bitmap *bitmap, unsigned char *page)
 {
 {
-	PRINTK("%s: bitmap_free_page: free page %p\n", bmname(bitmap), page);
+	pr_debug("%s: bitmap_free_page: free page %p\n", bmname(bitmap), page);
 	kfree(page);
 	kfree(page);
 }
 }
 
 
@@ -133,8 +100,8 @@ __acquires(bitmap->lock)
 	spin_lock_irq(&bitmap->lock);
 	spin_lock_irq(&bitmap->lock);
 
 
 	if (mappage == NULL) {
 	if (mappage == NULL) {
-		PRINTK("%s: bitmap map page allocation failed, hijacking\n",
-			bmname(bitmap));
+		pr_debug("%s: bitmap map page allocation failed, hijacking\n",
+			 bmname(bitmap));
 		/* failed - set the hijacked flag so that we can use the
 		/* failed - set the hijacked flag so that we can use the
 		 * pointer as a counter */
 		 * pointer as a counter */
 		if (!bitmap->bp[page].map)
 		if (!bitmap->bp[page].map)
@@ -187,13 +154,13 @@ static void bitmap_checkfree(struct bitmap *bitmap, unsigned long page)
  */
  */
 
 
 /* IO operations when bitmap is stored near all superblocks */
 /* IO operations when bitmap is stored near all superblocks */
-static struct page *read_sb_page(mddev_t *mddev, loff_t offset,
+static struct page *read_sb_page(struct mddev *mddev, loff_t offset,
 				 struct page *page,
 				 struct page *page,
 				 unsigned long index, int size)
 				 unsigned long index, int size)
 {
 {
 	/* choose a good rdev and read the page from there */
 	/* choose a good rdev and read the page from there */
 
 
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	sector_t target;
 	sector_t target;
 	int did_alloc = 0;
 	int did_alloc = 0;
 
 
@@ -226,7 +193,7 @@ static struct page *read_sb_page(mddev_t *mddev, loff_t offset,
 
 
 }
 }
 
 
-static mdk_rdev_t *next_active_rdev(mdk_rdev_t *rdev, mddev_t *mddev)
+static struct md_rdev *next_active_rdev(struct md_rdev *rdev, struct mddev *mddev)
 {
 {
 	/* Iterate the disks of an mddev, using rcu to protect access to the
 	/* Iterate the disks of an mddev, using rcu to protect access to the
 	 * linked list, and raising the refcount of devices we return to ensure
 	 * linked list, and raising the refcount of devices we return to ensure
@@ -247,7 +214,7 @@ static mdk_rdev_t *next_active_rdev(mdk_rdev_t *rdev, mddev_t *mddev)
 		pos = &rdev->same_set;
 		pos = &rdev->same_set;
 	}
 	}
 	list_for_each_continue_rcu(pos, &mddev->disks) {
 	list_for_each_continue_rcu(pos, &mddev->disks) {
-		rdev = list_entry(pos, mdk_rdev_t, same_set);
+		rdev = list_entry(pos, struct md_rdev, same_set);
 		if (rdev->raid_disk >= 0 &&
 		if (rdev->raid_disk >= 0 &&
 		    !test_bit(Faulty, &rdev->flags)) {
 		    !test_bit(Faulty, &rdev->flags)) {
 			/* this is a usable devices */
 			/* this is a usable devices */
@@ -262,9 +229,9 @@ static mdk_rdev_t *next_active_rdev(mdk_rdev_t *rdev, mddev_t *mddev)
 
 
 static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
 static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
 {
 {
-	mdk_rdev_t *rdev = NULL;
+	struct md_rdev *rdev = NULL;
 	struct block_device *bdev;
 	struct block_device *bdev;
-	mddev_t *mddev = bitmap->mddev;
+	struct mddev *mddev = bitmap->mddev;
 
 
 	while ((rdev = next_active_rdev(rdev, mddev)) != NULL) {
 	while ((rdev = next_active_rdev(rdev, mddev)) != NULL) {
 		int size = PAGE_SIZE;
 		int size = PAGE_SIZE;
@@ -409,8 +376,8 @@ static struct page *read_page(struct file *file, unsigned long index,
 	struct buffer_head *bh;
 	struct buffer_head *bh;
 	sector_t block;
 	sector_t block;
 
 
-	PRINTK("read bitmap file (%dB @ %llu)\n", (int)PAGE_SIZE,
-			(unsigned long long)index << PAGE_SHIFT);
+	pr_debug("read bitmap file (%dB @ %llu)\n", (int)PAGE_SIZE,
+		 (unsigned long long)index << PAGE_SHIFT);
 
 
 	page = alloc_page(GFP_KERNEL);
 	page = alloc_page(GFP_KERNEL);
 	if (!page)
 	if (!page)
@@ -868,7 +835,8 @@ static void bitmap_file_kick(struct bitmap *bitmap)
 
 
 enum bitmap_page_attr {
 enum bitmap_page_attr {
 	BITMAP_PAGE_DIRTY = 0,     /* there are set bits that need to be synced */
 	BITMAP_PAGE_DIRTY = 0,     /* there are set bits that need to be synced */
-	BITMAP_PAGE_CLEAN = 1,     /* there are bits that might need to be cleared */
+	BITMAP_PAGE_PENDING = 1,   /* there are bits that are being cleaned.
+				    * i.e. counter is 1 or 2. */
 	BITMAP_PAGE_NEEDWRITE = 2, /* there are cleared bits that need to be synced */
 	BITMAP_PAGE_NEEDWRITE = 2, /* there are cleared bits that need to be synced */
 };
 };
 
 
@@ -919,7 +887,7 @@ static void bitmap_file_set_bit(struct bitmap *bitmap, sector_t block)
 	else
 	else
 		__set_bit_le(bit, kaddr);
 		__set_bit_le(bit, kaddr);
 	kunmap_atomic(kaddr, KM_USER0);
 	kunmap_atomic(kaddr, KM_USER0);
-	PRINTK("set file bit %lu page %lu\n", bit, page->index);
+	pr_debug("set file bit %lu page %lu\n", bit, page->index);
 	/* record page number so it gets flushed to disk when unplug occurs */
 	/* record page number so it gets flushed to disk when unplug occurs */
 	set_page_attr(bitmap, page, BITMAP_PAGE_DIRTY);
 	set_page_attr(bitmap, page, BITMAP_PAGE_DIRTY);
 }
 }
@@ -997,11 +965,7 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
 
 
 	BUG_ON(!file && !bitmap->mddev->bitmap_info.offset);
 	BUG_ON(!file && !bitmap->mddev->bitmap_info.offset);
 
 
-#ifdef INJECT_FAULTS_3
-	outofdate = 1;
-#else
 	outofdate = bitmap->flags & BITMAP_STALE;
 	outofdate = bitmap->flags & BITMAP_STALE;
-#endif
 	if (outofdate)
 	if (outofdate)
 		printk(KERN_INFO "%s: bitmap file is out of date, doing full "
 		printk(KERN_INFO "%s: bitmap file is out of date, doing full "
 			"recovery\n", bmname(bitmap));
 			"recovery\n", bmname(bitmap));
@@ -1111,7 +1075,6 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
 					       (sector_t)i << CHUNK_BLOCK_SHIFT(bitmap),
 					       (sector_t)i << CHUNK_BLOCK_SHIFT(bitmap),
 					       needed);
 					       needed);
 			bit_cnt++;
 			bit_cnt++;
-			set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
 		}
 		}
 	}
 	}
 
 
@@ -1146,6 +1109,7 @@ void bitmap_write_all(struct bitmap *bitmap)
 	for (i = 0; i < bitmap->file_pages; i++)
 	for (i = 0; i < bitmap->file_pages; i++)
 		set_page_attr(bitmap, bitmap->filemap[i],
 		set_page_attr(bitmap, bitmap->filemap[i],
 			      BITMAP_PAGE_NEEDWRITE);
 			      BITMAP_PAGE_NEEDWRITE);
+	bitmap->allclean = 0;
 }
 }
 
 
 static void bitmap_count_page(struct bitmap *bitmap, sector_t offset, int inc)
 static void bitmap_count_page(struct bitmap *bitmap, sector_t offset, int inc)
@@ -1164,7 +1128,7 @@ static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap,
  *			out to disk
  *			out to disk
  */
  */
 
 
-void bitmap_daemon_work(mddev_t *mddev)
+void bitmap_daemon_work(struct mddev *mddev)
 {
 {
 	struct bitmap *bitmap;
 	struct bitmap *bitmap;
 	unsigned long j;
 	unsigned long j;
@@ -1204,17 +1168,15 @@ void bitmap_daemon_work(mddev_t *mddev)
 
 
 		if (page != lastpage) {
 		if (page != lastpage) {
 			/* skip this page unless it's marked as needing cleaning */
 			/* skip this page unless it's marked as needing cleaning */
-			if (!test_page_attr(bitmap, page, BITMAP_PAGE_CLEAN)) {
+			if (!test_page_attr(bitmap, page, BITMAP_PAGE_PENDING)) {
 				int need_write = test_page_attr(bitmap, page,
 				int need_write = test_page_attr(bitmap, page,
 								BITMAP_PAGE_NEEDWRITE);
 								BITMAP_PAGE_NEEDWRITE);
 				if (need_write)
 				if (need_write)
 					clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE);
 					clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE);
 
 
 				spin_unlock_irqrestore(&bitmap->lock, flags);
 				spin_unlock_irqrestore(&bitmap->lock, flags);
-				if (need_write) {
+				if (need_write)
 					write_page(bitmap, page, 0);
 					write_page(bitmap, page, 0);
-					bitmap->allclean = 0;
-				}
 				spin_lock_irqsave(&bitmap->lock, flags);
 				spin_lock_irqsave(&bitmap->lock, flags);
 				j |= (PAGE_BITS - 1);
 				j |= (PAGE_BITS - 1);
 				continue;
 				continue;
@@ -1222,12 +1184,16 @@ void bitmap_daemon_work(mddev_t *mddev)
 
 
 			/* grab the new page, sync and release the old */
 			/* grab the new page, sync and release the old */
 			if (lastpage != NULL) {
 			if (lastpage != NULL) {
-				if (test_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE)) {
-					clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
+				if (test_page_attr(bitmap, lastpage,
+						   BITMAP_PAGE_NEEDWRITE)) {
+					clear_page_attr(bitmap, lastpage,
+							BITMAP_PAGE_NEEDWRITE);
 					spin_unlock_irqrestore(&bitmap->lock, flags);
 					spin_unlock_irqrestore(&bitmap->lock, flags);
 					write_page(bitmap, lastpage, 0);
 					write_page(bitmap, lastpage, 0);
 				} else {
 				} else {
-					set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
+					set_page_attr(bitmap, lastpage,
+						      BITMAP_PAGE_NEEDWRITE);
+					bitmap->allclean = 0;
 					spin_unlock_irqrestore(&bitmap->lock, flags);
 					spin_unlock_irqrestore(&bitmap->lock, flags);
 				}
 				}
 			} else
 			} else
@@ -1249,19 +1215,17 @@ void bitmap_daemon_work(mddev_t *mddev)
 			}
 			}
 			spin_lock_irqsave(&bitmap->lock, flags);
 			spin_lock_irqsave(&bitmap->lock, flags);
 			if (!bitmap->need_sync)
 			if (!bitmap->need_sync)
-				clear_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
+				clear_page_attr(bitmap, page, BITMAP_PAGE_PENDING);
+			else
+				bitmap->allclean = 0;
 		}
 		}
 		bmc = bitmap_get_counter(bitmap,
 		bmc = bitmap_get_counter(bitmap,
 					 (sector_t)j << CHUNK_BLOCK_SHIFT(bitmap),
 					 (sector_t)j << CHUNK_BLOCK_SHIFT(bitmap),
 					 &blocks, 0);
 					 &blocks, 0);
-		if (bmc) {
-			if (*bmc)
-				bitmap->allclean = 0;
-
-			if (*bmc == 2) {
-				*bmc = 1; /* maybe clear the bit next time */
-				set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
-			} else if (*bmc == 1 && !bitmap->need_sync) {
+		if (!bmc)
+			j |= PAGE_COUNTER_MASK;
+		else if (*bmc) {
+			if (*bmc == 1 && !bitmap->need_sync) {
 				/* we can clear the bit */
 				/* we can clear the bit */
 				*bmc = 0;
 				*bmc = 0;
 				bitmap_count_page(bitmap,
 				bitmap_count_page(bitmap,
@@ -1275,13 +1239,16 @@ void bitmap_daemon_work(mddev_t *mddev)
 						  paddr);
 						  paddr);
 				else
 				else
 					__clear_bit_le(
 					__clear_bit_le(
-							file_page_offset(bitmap,
-									 j),
-							paddr);
+						file_page_offset(bitmap,
+								 j),
+						paddr);
 				kunmap_atomic(paddr, KM_USER0);
 				kunmap_atomic(paddr, KM_USER0);
+			} else if (*bmc <= 2) {
+				*bmc = 1; /* maybe clear the bit next time */
+				set_page_attr(bitmap, page, BITMAP_PAGE_PENDING);
+				bitmap->allclean = 0;
 			}
 			}
-		} else
-			j |= PAGE_COUNTER_MASK;
+		}
 	}
 	}
 	spin_unlock_irqrestore(&bitmap->lock, flags);
 	spin_unlock_irqrestore(&bitmap->lock, flags);
 
 
@@ -1294,6 +1261,7 @@ void bitmap_daemon_work(mddev_t *mddev)
 			write_page(bitmap, lastpage, 0);
 			write_page(bitmap, lastpage, 0);
 		} else {
 		} else {
 			set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
 			set_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE);
+			bitmap->allclean = 0;
 			spin_unlock_irqrestore(&bitmap->lock, flags);
 			spin_unlock_irqrestore(&bitmap->lock, flags);
 		}
 		}
 	}
 	}
@@ -1359,8 +1327,8 @@ int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sect
 		if (bw > bitmap->behind_writes_used)
 		if (bw > bitmap->behind_writes_used)
 			bitmap->behind_writes_used = bw;
 			bitmap->behind_writes_used = bw;
 
 
-		PRINTK(KERN_DEBUG "inc write-behind count %d/%d\n",
-		       bw, bitmap->max_write_behind);
+		pr_debug("inc write-behind count %d/%lu\n",
+			 bw, bitmap->mddev->bitmap_info.max_write_behind);
 	}
 	}
 
 
 	while (sectors) {
 	while (sectors) {
@@ -1407,7 +1375,6 @@ int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sect
 		else
 		else
 			sectors = 0;
 			sectors = 0;
 	}
 	}
-	bitmap->allclean = 0;
 	return 0;
 	return 0;
 }
 }
 EXPORT_SYMBOL(bitmap_startwrite);
 EXPORT_SYMBOL(bitmap_startwrite);
@@ -1420,8 +1387,9 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long secto
 	if (behind) {
 	if (behind) {
 		if (atomic_dec_and_test(&bitmap->behind_writes))
 		if (atomic_dec_and_test(&bitmap->behind_writes))
 			wake_up(&bitmap->behind_wait);
 			wake_up(&bitmap->behind_wait);
-		PRINTK(KERN_DEBUG "dec write-behind count %d/%d\n",
-		  atomic_read(&bitmap->behind_writes), bitmap->max_write_behind);
+		pr_debug("dec write-behind count %d/%lu\n",
+			 atomic_read(&bitmap->behind_writes),
+			 bitmap->mddev->bitmap_info.max_write_behind);
 	}
 	}
 	if (bitmap->mddev->degraded)
 	if (bitmap->mddev->degraded)
 		/* Never clear bits or update events_cleared when degraded */
 		/* Never clear bits or update events_cleared when degraded */
@@ -1453,13 +1421,14 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long secto
 			wake_up(&bitmap->overflow_wait);
 			wake_up(&bitmap->overflow_wait);
 
 
 		(*bmc)--;
 		(*bmc)--;
-		if (*bmc <= 2)
+		if (*bmc <= 2) {
 			set_page_attr(bitmap,
 			set_page_attr(bitmap,
 				      filemap_get_page(
 				      filemap_get_page(
 					      bitmap,
 					      bitmap,
 					      offset >> CHUNK_BLOCK_SHIFT(bitmap)),
 					      offset >> CHUNK_BLOCK_SHIFT(bitmap)),
-				      BITMAP_PAGE_CLEAN);
-
+				      BITMAP_PAGE_PENDING);
+			bitmap->allclean = 0;
+		}
 		spin_unlock_irqrestore(&bitmap->lock, flags);
 		spin_unlock_irqrestore(&bitmap->lock, flags);
 		offset += blocks;
 		offset += blocks;
 		if (sectors > blocks)
 		if (sectors > blocks)
@@ -1495,7 +1464,6 @@ static int __bitmap_start_sync(struct bitmap *bitmap, sector_t offset, sector_t
 		}
 		}
 	}
 	}
 	spin_unlock_irq(&bitmap->lock);
 	spin_unlock_irq(&bitmap->lock);
-	bitmap->allclean = 0;
 	return rv;
 	return rv;
 }
 }
 
 
@@ -1543,15 +1511,16 @@ void bitmap_end_sync(struct bitmap *bitmap, sector_t offset, sector_t *blocks, i
 		if (!NEEDED(*bmc) && aborted)
 		if (!NEEDED(*bmc) && aborted)
 			*bmc |= NEEDED_MASK;
 			*bmc |= NEEDED_MASK;
 		else {
 		else {
-			if (*bmc <= 2)
+			if (*bmc <= 2) {
 				set_page_attr(bitmap,
 				set_page_attr(bitmap,
 					      filemap_get_page(bitmap, offset >> CHUNK_BLOCK_SHIFT(bitmap)),
 					      filemap_get_page(bitmap, offset >> CHUNK_BLOCK_SHIFT(bitmap)),
-					      BITMAP_PAGE_CLEAN);
+					      BITMAP_PAGE_PENDING);
+				bitmap->allclean = 0;
+			}
 		}
 		}
 	}
 	}
  unlock:
  unlock:
 	spin_unlock_irqrestore(&bitmap->lock, flags);
 	spin_unlock_irqrestore(&bitmap->lock, flags);
-	bitmap->allclean = 0;
 }
 }
 EXPORT_SYMBOL(bitmap_end_sync);
 EXPORT_SYMBOL(bitmap_end_sync);
 
 
@@ -1622,10 +1591,10 @@ static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset, int n
 		*bmc = 1 | (needed ? NEEDED_MASK : 0);
 		*bmc = 1 | (needed ? NEEDED_MASK : 0);
 		bitmap_count_page(bitmap, offset, 1);
 		bitmap_count_page(bitmap, offset, 1);
 		page = filemap_get_page(bitmap, offset >> CHUNK_BLOCK_SHIFT(bitmap));
 		page = filemap_get_page(bitmap, offset >> CHUNK_BLOCK_SHIFT(bitmap));
-		set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
+		set_page_attr(bitmap, page, BITMAP_PAGE_PENDING);
+		bitmap->allclean = 0;
 	}
 	}
 	spin_unlock_irq(&bitmap->lock);
 	spin_unlock_irq(&bitmap->lock);
-	bitmap->allclean = 0;
 }
 }
 
 
 /* dirty the memory and file bits for bitmap chunks "s" to "e" */
 /* dirty the memory and file bits for bitmap chunks "s" to "e" */
@@ -1649,7 +1618,7 @@ void bitmap_dirty_bits(struct bitmap *bitmap, unsigned long s, unsigned long e)
 /*
 /*
  * flush out any pending updates
  * flush out any pending updates
  */
  */
-void bitmap_flush(mddev_t *mddev)
+void bitmap_flush(struct mddev *mddev)
 {
 {
 	struct bitmap *bitmap = mddev->bitmap;
 	struct bitmap *bitmap = mddev->bitmap;
 	long sleep;
 	long sleep;
@@ -1697,7 +1666,7 @@ static void bitmap_free(struct bitmap *bitmap)
 	kfree(bitmap);
 	kfree(bitmap);
 }
 }
 
 
-void bitmap_destroy(mddev_t *mddev)
+void bitmap_destroy(struct mddev *mddev)
 {
 {
 	struct bitmap *bitmap = mddev->bitmap;
 	struct bitmap *bitmap = mddev->bitmap;
 
 
@@ -1720,7 +1689,7 @@ void bitmap_destroy(mddev_t *mddev)
  * initialize the bitmap structure
  * initialize the bitmap structure
  * if this returns an error, bitmap_destroy must be called to do clean up
  * if this returns an error, bitmap_destroy must be called to do clean up
  */
  */
-int bitmap_create(mddev_t *mddev)
+int bitmap_create(struct mddev *mddev)
 {
 {
 	struct bitmap *bitmap;
 	struct bitmap *bitmap;
 	sector_t blocks = mddev->resync_max_sectors;
 	sector_t blocks = mddev->resync_max_sectors;
@@ -1802,11 +1771,8 @@ int bitmap_create(mddev_t *mddev)
 	bitmap->pages = pages;
 	bitmap->pages = pages;
 	bitmap->missing_pages = pages;
 	bitmap->missing_pages = pages;
 
 
-#ifdef INJECT_FATAL_FAULT_1
-	bitmap->bp = NULL;
-#else
 	bitmap->bp = kzalloc(pages * sizeof(*bitmap->bp), GFP_KERNEL);
 	bitmap->bp = kzalloc(pages * sizeof(*bitmap->bp), GFP_KERNEL);
-#endif
+
 	err = -ENOMEM;
 	err = -ENOMEM;
 	if (!bitmap->bp)
 	if (!bitmap->bp)
 		goto error;
 		goto error;
@@ -1824,7 +1790,7 @@ int bitmap_create(mddev_t *mddev)
 	return err;
 	return err;
 }
 }
 
 
-int bitmap_load(mddev_t *mddev)
+int bitmap_load(struct mddev *mddev)
 {
 {
 	int err = 0;
 	int err = 0;
 	sector_t start = 0;
 	sector_t start = 0;
@@ -1870,7 +1836,7 @@ out:
 EXPORT_SYMBOL_GPL(bitmap_load);
 EXPORT_SYMBOL_GPL(bitmap_load);
 
 
 static ssize_t
 static ssize_t
-location_show(mddev_t *mddev, char *page)
+location_show(struct mddev *mddev, char *page)
 {
 {
 	ssize_t len;
 	ssize_t len;
 	if (mddev->bitmap_info.file)
 	if (mddev->bitmap_info.file)
@@ -1884,7 +1850,7 @@ location_show(mddev_t *mddev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-location_store(mddev_t *mddev, const char *buf, size_t len)
+location_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 
 
 	if (mddev->pers) {
 	if (mddev->pers) {
@@ -1961,7 +1927,7 @@ static struct md_sysfs_entry bitmap_location =
 __ATTR(location, S_IRUGO|S_IWUSR, location_show, location_store);
 __ATTR(location, S_IRUGO|S_IWUSR, location_show, location_store);
 
 
 static ssize_t
 static ssize_t
-timeout_show(mddev_t *mddev, char *page)
+timeout_show(struct mddev *mddev, char *page)
 {
 {
 	ssize_t len;
 	ssize_t len;
 	unsigned long secs = mddev->bitmap_info.daemon_sleep / HZ;
 	unsigned long secs = mddev->bitmap_info.daemon_sleep / HZ;
@@ -1975,7 +1941,7 @@ timeout_show(mddev_t *mddev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-timeout_store(mddev_t *mddev, const char *buf, size_t len)
+timeout_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	/* timeout can be set at any time */
 	/* timeout can be set at any time */
 	unsigned long timeout;
 	unsigned long timeout;
@@ -2011,13 +1977,13 @@ static struct md_sysfs_entry bitmap_timeout =
 __ATTR(time_base, S_IRUGO|S_IWUSR, timeout_show, timeout_store);
 __ATTR(time_base, S_IRUGO|S_IWUSR, timeout_show, timeout_store);
 
 
 static ssize_t
 static ssize_t
-backlog_show(mddev_t *mddev, char *page)
+backlog_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%lu\n", mddev->bitmap_info.max_write_behind);
 	return sprintf(page, "%lu\n", mddev->bitmap_info.max_write_behind);
 }
 }
 
 
 static ssize_t
 static ssize_t
-backlog_store(mddev_t *mddev, const char *buf, size_t len)
+backlog_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	unsigned long backlog;
 	unsigned long backlog;
 	int rv = strict_strtoul(buf, 10, &backlog);
 	int rv = strict_strtoul(buf, 10, &backlog);
@@ -2033,13 +1999,13 @@ static struct md_sysfs_entry bitmap_backlog =
 __ATTR(backlog, S_IRUGO|S_IWUSR, backlog_show, backlog_store);
 __ATTR(backlog, S_IRUGO|S_IWUSR, backlog_show, backlog_store);
 
 
 static ssize_t
 static ssize_t
-chunksize_show(mddev_t *mddev, char *page)
+chunksize_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%lu\n", mddev->bitmap_info.chunksize);
 	return sprintf(page, "%lu\n", mddev->bitmap_info.chunksize);
 }
 }
 
 
 static ssize_t
 static ssize_t
-chunksize_store(mddev_t *mddev, const char *buf, size_t len)
+chunksize_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	/* Can only be changed when no bitmap is active */
 	/* Can only be changed when no bitmap is active */
 	int rv;
 	int rv;
@@ -2059,13 +2025,13 @@ chunksize_store(mddev_t *mddev, const char *buf, size_t len)
 static struct md_sysfs_entry bitmap_chunksize =
 static struct md_sysfs_entry bitmap_chunksize =
 __ATTR(chunksize, S_IRUGO|S_IWUSR, chunksize_show, chunksize_store);
 __ATTR(chunksize, S_IRUGO|S_IWUSR, chunksize_show, chunksize_store);
 
 
-static ssize_t metadata_show(mddev_t *mddev, char *page)
+static ssize_t metadata_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%s\n", (mddev->bitmap_info.external
 	return sprintf(page, "%s\n", (mddev->bitmap_info.external
 				      ? "external" : "internal"));
 				      ? "external" : "internal"));
 }
 }
 
 
-static ssize_t metadata_store(mddev_t *mddev, const char *buf, size_t len)
+static ssize_t metadata_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	if (mddev->bitmap ||
 	if (mddev->bitmap ||
 	    mddev->bitmap_info.file ||
 	    mddev->bitmap_info.file ||
@@ -2083,7 +2049,7 @@ static ssize_t metadata_store(mddev_t *mddev, const char *buf, size_t len)
 static struct md_sysfs_entry bitmap_metadata =
 static struct md_sysfs_entry bitmap_metadata =
 __ATTR(metadata, S_IRUGO|S_IWUSR, metadata_show, metadata_store);
 __ATTR(metadata, S_IRUGO|S_IWUSR, metadata_show, metadata_store);
 
 
-static ssize_t can_clear_show(mddev_t *mddev, char *page)
+static ssize_t can_clear_show(struct mddev *mddev, char *page)
 {
 {
 	int len;
 	int len;
 	if (mddev->bitmap)
 	if (mddev->bitmap)
@@ -2094,7 +2060,7 @@ static ssize_t can_clear_show(mddev_t *mddev, char *page)
 	return len;
 	return len;
 }
 }
 
 
-static ssize_t can_clear_store(mddev_t *mddev, const char *buf, size_t len)
+static ssize_t can_clear_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	if (mddev->bitmap == NULL)
 	if (mddev->bitmap == NULL)
 		return -ENOENT;
 		return -ENOENT;
@@ -2113,7 +2079,7 @@ static struct md_sysfs_entry bitmap_can_clear =
 __ATTR(can_clear, S_IRUGO|S_IWUSR, can_clear_show, can_clear_store);
 __ATTR(can_clear, S_IRUGO|S_IWUSR, can_clear_show, can_clear_store);
 
 
 static ssize_t
 static ssize_t
-behind_writes_used_show(mddev_t *mddev, char *page)
+behind_writes_used_show(struct mddev *mddev, char *page)
 {
 {
 	if (mddev->bitmap == NULL)
 	if (mddev->bitmap == NULL)
 		return sprintf(page, "0\n");
 		return sprintf(page, "0\n");
@@ -2122,7 +2088,7 @@ behind_writes_used_show(mddev_t *mddev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-behind_writes_used_reset(mddev_t *mddev, const char *buf, size_t len)
+behind_writes_used_reset(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	if (mddev->bitmap)
 	if (mddev->bitmap)
 		mddev->bitmap->behind_writes_used = 0;
 		mddev->bitmap->behind_writes_used = 0;

+ 6 - 6
drivers/md/bitmap.h

@@ -193,7 +193,7 @@ struct bitmap {
 	unsigned long pages; /* total number of pages in the bitmap */
 	unsigned long pages; /* total number of pages in the bitmap */
 	unsigned long missing_pages; /* number of pages not yet allocated */
 	unsigned long missing_pages; /* number of pages not yet allocated */
 
 
-	mddev_t *mddev; /* the md device that the bitmap is for */
+	struct mddev *mddev; /* the md device that the bitmap is for */
 
 
 	/* bitmap chunksize -- how much data does each bit represent? */
 	/* bitmap chunksize -- how much data does each bit represent? */
 	unsigned long chunkshift; /* chunksize = 2^chunkshift (for bitops) */
 	unsigned long chunkshift; /* chunksize = 2^chunkshift (for bitops) */
@@ -238,10 +238,10 @@ struct bitmap {
 /* the bitmap API */
 /* the bitmap API */
 
 
 /* these are used only by md/bitmap */
 /* these are used only by md/bitmap */
-int  bitmap_create(mddev_t *mddev);
-int bitmap_load(mddev_t *mddev);
-void bitmap_flush(mddev_t *mddev);
-void bitmap_destroy(mddev_t *mddev);
+int  bitmap_create(struct mddev *mddev);
+int bitmap_load(struct mddev *mddev);
+void bitmap_flush(struct mddev *mddev);
+void bitmap_destroy(struct mddev *mddev);
 
 
 void bitmap_print_sb(struct bitmap *bitmap);
 void bitmap_print_sb(struct bitmap *bitmap);
 void bitmap_update_sb(struct bitmap *bitmap);
 void bitmap_update_sb(struct bitmap *bitmap);
@@ -262,7 +262,7 @@ void bitmap_close_sync(struct bitmap *bitmap);
 void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector);
 void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector);
 
 
 void bitmap_unplug(struct bitmap *bitmap);
 void bitmap_unplug(struct bitmap *bitmap);
-void bitmap_daemon_work(mddev_t *mddev);
+void bitmap_daemon_work(struct mddev *mddev);
 #endif
 #endif
 
 
 #endif
 #endif

+ 14 - 14
drivers/md/dm-raid.c

@@ -37,7 +37,7 @@ struct raid_dev {
 	 */
 	 */
 	struct dm_dev *meta_dev;
 	struct dm_dev *meta_dev;
 	struct dm_dev *data_dev;
 	struct dm_dev *data_dev;
-	struct mdk_rdev_s rdev;
+	struct md_rdev rdev;
 };
 };
 
 
 /*
 /*
@@ -57,7 +57,7 @@ struct raid_set {
 
 
 	uint64_t print_flags;
 	uint64_t print_flags;
 
 
-	struct mddev_s md;
+	struct mddev md;
 	struct raid_type *raid_type;
 	struct raid_type *raid_type;
 	struct dm_target_callbacks callbacks;
 	struct dm_target_callbacks callbacks;
 
 
@@ -594,7 +594,7 @@ struct dm_raid_superblock {
 				/* Always set to 0 when writing. */
 				/* Always set to 0 when writing. */
 } __packed;
 } __packed;
 
 
-static int read_disk_sb(mdk_rdev_t *rdev, int size)
+static int read_disk_sb(struct md_rdev *rdev, int size)
 {
 {
 	BUG_ON(!rdev->sb_page);
 	BUG_ON(!rdev->sb_page);
 
 
@@ -611,9 +611,9 @@ static int read_disk_sb(mdk_rdev_t *rdev, int size)
 	return 0;
 	return 0;
 }
 }
 
 
-static void super_sync(mddev_t *mddev, mdk_rdev_t *rdev)
+static void super_sync(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
-	mdk_rdev_t *r, *t;
+	struct md_rdev *r, *t;
 	uint64_t failed_devices;
 	uint64_t failed_devices;
 	struct dm_raid_superblock *sb;
 	struct dm_raid_superblock *sb;
 
 
@@ -651,7 +651,7 @@ static void super_sync(mddev_t *mddev, mdk_rdev_t *rdev)
  *
  *
  * Return: 1 if use rdev, 0 if use refdev, -Exxx otherwise
  * Return: 1 if use rdev, 0 if use refdev, -Exxx otherwise
  */
  */
-static int super_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev)
+static int super_load(struct md_rdev *rdev, struct md_rdev *refdev)
 {
 {
 	int ret;
 	int ret;
 	struct dm_raid_superblock *sb;
 	struct dm_raid_superblock *sb;
@@ -689,7 +689,7 @@ static int super_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev)
 	return (events_sb > events_refsb) ? 1 : 0;
 	return (events_sb > events_refsb) ? 1 : 0;
 }
 }
 
 
-static int super_init_validation(mddev_t *mddev, mdk_rdev_t *rdev)
+static int super_init_validation(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	int role;
 	int role;
 	struct raid_set *rs = container_of(mddev, struct raid_set, md);
 	struct raid_set *rs = container_of(mddev, struct raid_set, md);
@@ -698,7 +698,7 @@ static int super_init_validation(mddev_t *mddev, mdk_rdev_t *rdev)
 	struct dm_raid_superblock *sb;
 	struct dm_raid_superblock *sb;
 	uint32_t new_devs = 0;
 	uint32_t new_devs = 0;
 	uint32_t rebuilds = 0;
 	uint32_t rebuilds = 0;
-	mdk_rdev_t *r, *t;
+	struct md_rdev *r, *t;
 	struct dm_raid_superblock *sb2;
 	struct dm_raid_superblock *sb2;
 
 
 	sb = page_address(rdev->sb_page);
 	sb = page_address(rdev->sb_page);
@@ -809,7 +809,7 @@ static int super_init_validation(mddev_t *mddev, mdk_rdev_t *rdev)
 	return 0;
 	return 0;
 }
 }
 
 
-static int super_validate(mddev_t *mddev, mdk_rdev_t *rdev)
+static int super_validate(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	struct dm_raid_superblock *sb = page_address(rdev->sb_page);
 	struct dm_raid_superblock *sb = page_address(rdev->sb_page);
 
 
@@ -849,8 +849,8 @@ static int super_validate(mddev_t *mddev, mdk_rdev_t *rdev)
 static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)
 static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)
 {
 {
 	int ret;
 	int ret;
-	mdk_rdev_t *rdev, *freshest, *tmp;
-	mddev_t *mddev = &rs->md;
+	struct md_rdev *rdev, *freshest, *tmp;
+	struct mddev *mddev = &rs->md;
 
 
 	freshest = NULL;
 	freshest = NULL;
 	rdev_for_each(rdev, tmp, mddev) {
 	rdev_for_each(rdev, tmp, mddev) {
@@ -1004,7 +1004,7 @@ static void raid_dtr(struct dm_target *ti)
 static int raid_map(struct dm_target *ti, struct bio *bio, union map_info *map_context)
 static int raid_map(struct dm_target *ti, struct bio *bio, union map_info *map_context)
 {
 {
 	struct raid_set *rs = ti->private;
 	struct raid_set *rs = ti->private;
-	mddev_t *mddev = &rs->md;
+	struct mddev *mddev = &rs->md;
 
 
 	mddev->pers->make_request(mddev, bio);
 	mddev->pers->make_request(mddev, bio);
 
 
@@ -1097,7 +1097,7 @@ static int raid_status(struct dm_target *ti, status_type_t type,
 			       rs->md.bitmap_info.max_write_behind);
 			       rs->md.bitmap_info.max_write_behind);
 
 
 		if (rs->print_flags & DMPF_STRIPE_CACHE) {
 		if (rs->print_flags & DMPF_STRIPE_CACHE) {
-			raid5_conf_t *conf = rs->md.private;
+			struct r5conf *conf = rs->md.private;
 
 
 			/* convert from kiB to sectors */
 			/* convert from kiB to sectors */
 			DMEMIT(" stripe_cache %d",
 			DMEMIT(" stripe_cache %d",
@@ -1146,7 +1146,7 @@ static void raid_io_hints(struct dm_target *ti, struct queue_limits *limits)
 {
 {
 	struct raid_set *rs = ti->private;
 	struct raid_set *rs = ti->private;
 	unsigned chunk_size = rs->md.chunk_sectors << 9;
 	unsigned chunk_size = rs->md.chunk_sectors << 9;
-	raid5_conf_t *conf = rs->md.private;
+	struct r5conf *conf = rs->md.private;
 
 
 	blk_limits_io_min(limits, chunk_size);
 	blk_limits_io_min(limits, chunk_size);
 	blk_limits_io_opt(limits, chunk_size * (conf->raid_disks - conf->max_degraded));
 	blk_limits_io_opt(limits, chunk_size * (conf->raid_disks - conf->max_degraded));

+ 19 - 19
drivers/md/faulty.c

@@ -81,16 +81,16 @@ static void faulty_fail(struct bio *bio, int error)
 	bio_io_error(b);
 	bio_io_error(b);
 }
 }
 
 
-typedef struct faulty_conf {
+struct faulty_conf {
 	int period[Modes];
 	int period[Modes];
 	atomic_t counters[Modes];
 	atomic_t counters[Modes];
 	sector_t faults[MaxFault];
 	sector_t faults[MaxFault];
 	int	modes[MaxFault];
 	int	modes[MaxFault];
 	int nfaults;
 	int nfaults;
-	mdk_rdev_t *rdev;
-} conf_t;
+	struct md_rdev *rdev;
+};
 
 
-static int check_mode(conf_t *conf, int mode)
+static int check_mode(struct faulty_conf *conf, int mode)
 {
 {
 	if (conf->period[mode] == 0 &&
 	if (conf->period[mode] == 0 &&
 	    atomic_read(&conf->counters[mode]) <= 0)
 	    atomic_read(&conf->counters[mode]) <= 0)
@@ -105,7 +105,7 @@ static int check_mode(conf_t *conf, int mode)
 	return 0;
 	return 0;
 }
 }
 
 
-static int check_sector(conf_t *conf, sector_t start, sector_t end, int dir)
+static int check_sector(struct faulty_conf *conf, sector_t start, sector_t end, int dir)
 {
 {
 	/* If we find a ReadFixable sector, we fix it ... */
 	/* If we find a ReadFixable sector, we fix it ... */
 	int i;
 	int i;
@@ -129,7 +129,7 @@ static int check_sector(conf_t *conf, sector_t start, sector_t end, int dir)
 	return 0;
 	return 0;
 }
 }
 
 
-static void add_sector(conf_t *conf, sector_t start, int mode)
+static void add_sector(struct faulty_conf *conf, sector_t start, int mode)
 {
 {
 	int i;
 	int i;
 	int n = conf->nfaults;
 	int n = conf->nfaults;
@@ -169,9 +169,9 @@ static void add_sector(conf_t *conf, sector_t start, int mode)
 		conf->nfaults = n+1;
 		conf->nfaults = n+1;
 }
 }
 
 
-static int make_request(mddev_t *mddev, struct bio *bio)
+static int make_request(struct mddev *mddev, struct bio *bio)
 {
 {
-	conf_t *conf = mddev->private;
+	struct faulty_conf *conf = mddev->private;
 	int failit = 0;
 	int failit = 0;
 
 
 	if (bio_data_dir(bio) == WRITE) {
 	if (bio_data_dir(bio) == WRITE) {
@@ -222,9 +222,9 @@ static int make_request(mddev_t *mddev, struct bio *bio)
 	}
 	}
 }
 }
 
 
-static void status(struct seq_file *seq, mddev_t *mddev)
+static void status(struct seq_file *seq, struct mddev *mddev)
 {
 {
-	conf_t *conf = mddev->private;
+	struct faulty_conf *conf = mddev->private;
 	int n;
 	int n;
 
 
 	if ((n=atomic_read(&conf->counters[WriteTransient])) != 0)
 	if ((n=atomic_read(&conf->counters[WriteTransient])) != 0)
@@ -255,11 +255,11 @@ static void status(struct seq_file *seq, mddev_t *mddev)
 }
 }
 
 
 
 
-static int reshape(mddev_t *mddev)
+static int reshape(struct mddev *mddev)
 {
 {
 	int mode = mddev->new_layout & ModeMask;
 	int mode = mddev->new_layout & ModeMask;
 	int count = mddev->new_layout >> ModeShift;
 	int count = mddev->new_layout >> ModeShift;
-	conf_t *conf = mddev->private;
+	struct faulty_conf *conf = mddev->private;
 
 
 	if (mddev->new_layout < 0)
 	if (mddev->new_layout < 0)
 		return 0;
 		return 0;
@@ -284,7 +284,7 @@ static int reshape(mddev_t *mddev)
 	return 0;
 	return 0;
 }
 }
 
 
-static sector_t faulty_size(mddev_t *mddev, sector_t sectors, int raid_disks)
+static sector_t faulty_size(struct mddev *mddev, sector_t sectors, int raid_disks)
 {
 {
 	WARN_ONCE(raid_disks,
 	WARN_ONCE(raid_disks,
 		  "%s does not support generic reshape\n", __func__);
 		  "%s does not support generic reshape\n", __func__);
@@ -295,11 +295,11 @@ static sector_t faulty_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 	return sectors;
 	return sectors;
 }
 }
 
 
-static int run(mddev_t *mddev)
+static int run(struct mddev *mddev)
 {
 {
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	int i;
 	int i;
-	conf_t *conf;
+	struct faulty_conf *conf;
 
 
 	if (md_check_no_bitmap(mddev))
 	if (md_check_no_bitmap(mddev))
 		return -EINVAL;
 		return -EINVAL;
@@ -325,16 +325,16 @@ static int run(mddev_t *mddev)
 	return 0;
 	return 0;
 }
 }
 
 
-static int stop(mddev_t *mddev)
+static int stop(struct mddev *mddev)
 {
 {
-	conf_t *conf = mddev->private;
+	struct faulty_conf *conf = mddev->private;
 
 
 	kfree(conf);
 	kfree(conf);
 	mddev->private = NULL;
 	mddev->private = NULL;
 	return 0;
 	return 0;
 }
 }
 
 
-static struct mdk_personality faulty_personality =
+static struct md_personality faulty_personality =
 {
 {
 	.name		= "faulty",
 	.name		= "faulty",
 	.level		= LEVEL_FAULTY,
 	.level		= LEVEL_FAULTY,

+ 23 - 23
drivers/md/linear.c

@@ -26,10 +26,10 @@
 /*
 /*
  * find which device holds a particular offset 
  * find which device holds a particular offset 
  */
  */
-static inline dev_info_t *which_dev(mddev_t *mddev, sector_t sector)
+static inline struct dev_info *which_dev(struct mddev *mddev, sector_t sector)
 {
 {
 	int lo, mid, hi;
 	int lo, mid, hi;
-	linear_conf_t *conf;
+	struct linear_conf *conf;
 
 
 	lo = 0;
 	lo = 0;
 	hi = mddev->raid_disks - 1;
 	hi = mddev->raid_disks - 1;
@@ -63,8 +63,8 @@ static int linear_mergeable_bvec(struct request_queue *q,
 				 struct bvec_merge_data *bvm,
 				 struct bvec_merge_data *bvm,
 				 struct bio_vec *biovec)
 				 struct bio_vec *biovec)
 {
 {
-	mddev_t *mddev = q->queuedata;
-	dev_info_t *dev0;
+	struct mddev *mddev = q->queuedata;
+	struct dev_info *dev0;
 	unsigned long maxsectors, bio_sectors = bvm->bi_size >> 9;
 	unsigned long maxsectors, bio_sectors = bvm->bi_size >> 9;
 	sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
 	sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
 
 
@@ -89,8 +89,8 @@ static int linear_mergeable_bvec(struct request_queue *q,
 
 
 static int linear_congested(void *data, int bits)
 static int linear_congested(void *data, int bits)
 {
 {
-	mddev_t *mddev = data;
-	linear_conf_t *conf;
+	struct mddev *mddev = data;
+	struct linear_conf *conf;
 	int i, ret = 0;
 	int i, ret = 0;
 
 
 	if (mddev_congested(mddev, bits))
 	if (mddev_congested(mddev, bits))
@@ -108,9 +108,9 @@ static int linear_congested(void *data, int bits)
 	return ret;
 	return ret;
 }
 }
 
 
-static sector_t linear_size(mddev_t *mddev, sector_t sectors, int raid_disks)
+static sector_t linear_size(struct mddev *mddev, sector_t sectors, int raid_disks)
 {
 {
-	linear_conf_t *conf;
+	struct linear_conf *conf;
 	sector_t array_sectors;
 	sector_t array_sectors;
 
 
 	rcu_read_lock();
 	rcu_read_lock();
@@ -123,13 +123,13 @@ static sector_t linear_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 	return array_sectors;
 	return array_sectors;
 }
 }
 
 
-static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
+static struct linear_conf *linear_conf(struct mddev *mddev, int raid_disks)
 {
 {
-	linear_conf_t *conf;
-	mdk_rdev_t *rdev;
+	struct linear_conf *conf;
+	struct md_rdev *rdev;
 	int i, cnt;
 	int i, cnt;
 
 
-	conf = kzalloc (sizeof (*conf) + raid_disks*sizeof(dev_info_t),
+	conf = kzalloc (sizeof (*conf) + raid_disks*sizeof(struct dev_info),
 			GFP_KERNEL);
 			GFP_KERNEL);
 	if (!conf)
 	if (!conf)
 		return NULL;
 		return NULL;
@@ -139,7 +139,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
 
 
 	list_for_each_entry(rdev, &mddev->disks, same_set) {
 	list_for_each_entry(rdev, &mddev->disks, same_set) {
 		int j = rdev->raid_disk;
 		int j = rdev->raid_disk;
-		dev_info_t *disk = conf->disks + j;
+		struct dev_info *disk = conf->disks + j;
 		sector_t sectors;
 		sector_t sectors;
 
 
 		if (j < 0 || j >= raid_disks || disk->rdev) {
 		if (j < 0 || j >= raid_disks || disk->rdev) {
@@ -194,9 +194,9 @@ out:
 	return NULL;
 	return NULL;
 }
 }
 
 
-static int linear_run (mddev_t *mddev)
+static int linear_run (struct mddev *mddev)
 {
 {
-	linear_conf_t *conf;
+	struct linear_conf *conf;
 
 
 	if (md_check_no_bitmap(mddev))
 	if (md_check_no_bitmap(mddev))
 		return -EINVAL;
 		return -EINVAL;
@@ -213,7 +213,7 @@ static int linear_run (mddev_t *mddev)
 	return md_integrity_register(mddev);
 	return md_integrity_register(mddev);
 }
 }
 
 
-static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev)
+static int linear_add(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	/* Adding a drive to a linear array allows the array to grow.
 	/* Adding a drive to a linear array allows the array to grow.
 	 * It is permitted if the new drive has a matching superblock
 	 * It is permitted if the new drive has a matching superblock
@@ -223,7 +223,7 @@ static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev)
 	 * The current one is never freed until the array is stopped.
 	 * The current one is never freed until the array is stopped.
 	 * This avoids races.
 	 * This avoids races.
 	 */
 	 */
-	linear_conf_t *newconf, *oldconf;
+	struct linear_conf *newconf, *oldconf;
 
 
 	if (rdev->saved_raid_disk != mddev->raid_disks)
 	if (rdev->saved_raid_disk != mddev->raid_disks)
 		return -EINVAL;
 		return -EINVAL;
@@ -245,9 +245,9 @@ static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev)
 	return 0;
 	return 0;
 }
 }
 
 
-static int linear_stop (mddev_t *mddev)
+static int linear_stop (struct mddev *mddev)
 {
 {
-	linear_conf_t *conf = mddev->private;
+	struct linear_conf *conf = mddev->private;
 
 
 	/*
 	/*
 	 * We do not require rcu protection here since
 	 * We do not require rcu protection here since
@@ -264,9 +264,9 @@ static int linear_stop (mddev_t *mddev)
 	return 0;
 	return 0;
 }
 }
 
 
-static int linear_make_request (mddev_t *mddev, struct bio *bio)
+static int linear_make_request (struct mddev *mddev, struct bio *bio)
 {
 {
-	dev_info_t *tmp_dev;
+	struct dev_info *tmp_dev;
 	sector_t start_sector;
 	sector_t start_sector;
 
 
 	if (unlikely(bio->bi_rw & REQ_FLUSH)) {
 	if (unlikely(bio->bi_rw & REQ_FLUSH)) {
@@ -323,14 +323,14 @@ static int linear_make_request (mddev_t *mddev, struct bio *bio)
 	return 1;
 	return 1;
 }
 }
 
 
-static void linear_status (struct seq_file *seq, mddev_t *mddev)
+static void linear_status (struct seq_file *seq, struct mddev *mddev)
 {
 {
 
 
 	seq_printf(seq, " %dk rounding", mddev->chunk_sectors / 2);
 	seq_printf(seq, " %dk rounding", mddev->chunk_sectors / 2);
 }
 }
 
 
 
 
-static struct mdk_personality linear_personality =
+static struct md_personality linear_personality =
 {
 {
 	.name		= "linear",
 	.name		= "linear",
 	.level		= LEVEL_LINEAR,
 	.level		= LEVEL_LINEAR,

+ 3 - 9
drivers/md/linear.h

@@ -2,20 +2,14 @@
 #define _LINEAR_H
 #define _LINEAR_H
 
 
 struct dev_info {
 struct dev_info {
-	mdk_rdev_t	*rdev;
+	struct md_rdev	*rdev;
 	sector_t	end_sector;
 	sector_t	end_sector;
 };
 };
 
 
-typedef struct dev_info dev_info_t;
-
-struct linear_private_data
+struct linear_conf
 {
 {
 	struct rcu_head		rcu;
 	struct rcu_head		rcu;
 	sector_t		array_sectors;
 	sector_t		array_sectors;
-	dev_info_t		disks[0];
+	struct dev_info		disks[0];
 };
 };
-
-
-typedef struct linear_private_data linear_conf_t;
-
 #endif
 #endif

+ 320 - 311
drivers/md/md.c

@@ -54,9 +54,6 @@
 #include "md.h"
 #include "md.h"
 #include "bitmap.h"
 #include "bitmap.h"
 
 
-#define DEBUG 0
-#define dprintk(x...) ((void)(DEBUG && printk(x)))
-
 #ifndef MODULE
 #ifndef MODULE
 static void autostart_arrays(int part);
 static void autostart_arrays(int part);
 #endif
 #endif
@@ -98,13 +95,13 @@ static struct workqueue_struct *md_misc_wq;
 
 
 static int sysctl_speed_limit_min = 1000;
 static int sysctl_speed_limit_min = 1000;
 static int sysctl_speed_limit_max = 200000;
 static int sysctl_speed_limit_max = 200000;
-static inline int speed_min(mddev_t *mddev)
+static inline int speed_min(struct mddev *mddev)
 {
 {
 	return mddev->sync_speed_min ?
 	return mddev->sync_speed_min ?
 		mddev->sync_speed_min : sysctl_speed_limit_min;
 		mddev->sync_speed_min : sysctl_speed_limit_min;
 }
 }
 
 
-static inline int speed_max(mddev_t *mddev)
+static inline int speed_max(struct mddev *mddev)
 {
 {
 	return mddev->sync_speed_max ?
 	return mddev->sync_speed_max ?
 		mddev->sync_speed_max : sysctl_speed_limit_max;
 		mddev->sync_speed_max : sysctl_speed_limit_max;
@@ -160,7 +157,7 @@ static int start_readonly;
 
 
 static void mddev_bio_destructor(struct bio *bio)
 static void mddev_bio_destructor(struct bio *bio)
 {
 {
-	mddev_t *mddev, **mddevp;
+	struct mddev *mddev, **mddevp;
 
 
 	mddevp = (void*)bio;
 	mddevp = (void*)bio;
 	mddev = mddevp[-1];
 	mddev = mddevp[-1];
@@ -169,10 +166,10 @@ static void mddev_bio_destructor(struct bio *bio)
 }
 }
 
 
 struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
 struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
-			    mddev_t *mddev)
+			    struct mddev *mddev)
 {
 {
 	struct bio *b;
 	struct bio *b;
-	mddev_t **mddevp;
+	struct mddev **mddevp;
 
 
 	if (!mddev || !mddev->bio_set)
 	if (!mddev || !mddev->bio_set)
 		return bio_alloc(gfp_mask, nr_iovecs);
 		return bio_alloc(gfp_mask, nr_iovecs);
@@ -189,10 +186,10 @@ struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
 EXPORT_SYMBOL_GPL(bio_alloc_mddev);
 EXPORT_SYMBOL_GPL(bio_alloc_mddev);
 
 
 struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
 struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
-			    mddev_t *mddev)
+			    struct mddev *mddev)
 {
 {
 	struct bio *b;
 	struct bio *b;
-	mddev_t **mddevp;
+	struct mddev **mddevp;
 
 
 	if (!mddev || !mddev->bio_set)
 	if (!mddev || !mddev->bio_set)
 		return bio_clone(bio, gfp_mask);
 		return bio_clone(bio, gfp_mask);
@@ -281,7 +278,7 @@ EXPORT_SYMBOL_GPL(md_trim_bio);
  */
  */
 static DECLARE_WAIT_QUEUE_HEAD(md_event_waiters);
 static DECLARE_WAIT_QUEUE_HEAD(md_event_waiters);
 static atomic_t md_event_count;
 static atomic_t md_event_count;
-void md_new_event(mddev_t *mddev)
+void md_new_event(struct mddev *mddev)
 {
 {
 	atomic_inc(&md_event_count);
 	atomic_inc(&md_event_count);
 	wake_up(&md_event_waiters);
 	wake_up(&md_event_waiters);
@@ -291,7 +288,7 @@ EXPORT_SYMBOL_GPL(md_new_event);
 /* Alternate version that can be called from interrupts
 /* Alternate version that can be called from interrupts
  * when calling sysfs_notify isn't needed.
  * when calling sysfs_notify isn't needed.
  */
  */
-static void md_new_event_inintr(mddev_t *mddev)
+static void md_new_event_inintr(struct mddev *mddev)
 {
 {
 	atomic_inc(&md_event_count);
 	atomic_inc(&md_event_count);
 	wake_up(&md_event_waiters);
 	wake_up(&md_event_waiters);
@@ -312,19 +309,19 @@ static DEFINE_SPINLOCK(all_mddevs_lock);
  * Any code which breaks out of this loop while own
  * Any code which breaks out of this loop while own
  * a reference to the current mddev and must mddev_put it.
  * a reference to the current mddev and must mddev_put it.
  */
  */
-#define for_each_mddev(mddev,tmp)					\
+#define for_each_mddev(_mddev,_tmp)					\
 									\
 									\
 	for (({ spin_lock(&all_mddevs_lock); 				\
 	for (({ spin_lock(&all_mddevs_lock); 				\
-		tmp = all_mddevs.next;					\
-		mddev = NULL;});					\
-	     ({ if (tmp != &all_mddevs)					\
-			mddev_get(list_entry(tmp, mddev_t, all_mddevs));\
+		_tmp = all_mddevs.next;					\
+		_mddev = NULL;});					\
+	     ({ if (_tmp != &all_mddevs)				\
+			mddev_get(list_entry(_tmp, struct mddev, all_mddevs));\
 		spin_unlock(&all_mddevs_lock);				\
 		spin_unlock(&all_mddevs_lock);				\
-		if (mddev) mddev_put(mddev);				\
-		mddev = list_entry(tmp, mddev_t, all_mddevs);		\
-		tmp != &all_mddevs;});					\
+		if (_mddev) mddev_put(_mddev);				\
+		_mddev = list_entry(_tmp, struct mddev, all_mddevs);	\
+		_tmp != &all_mddevs;});					\
 	     ({ spin_lock(&all_mddevs_lock);				\
 	     ({ spin_lock(&all_mddevs_lock);				\
-		tmp = tmp->next;})					\
+		_tmp = _tmp->next;})					\
 		)
 		)
 
 
 
 
@@ -338,7 +335,7 @@ static DEFINE_SPINLOCK(all_mddevs_lock);
 static int md_make_request(struct request_queue *q, struct bio *bio)
 static int md_make_request(struct request_queue *q, struct bio *bio)
 {
 {
 	const int rw = bio_data_dir(bio);
 	const int rw = bio_data_dir(bio);
-	mddev_t *mddev = q->queuedata;
+	struct mddev *mddev = q->queuedata;
 	int rv;
 	int rv;
 	int cpu;
 	int cpu;
 	unsigned int sectors;
 	unsigned int sectors;
@@ -390,7 +387,7 @@ static int md_make_request(struct request_queue *q, struct bio *bio)
  * Once ->stop is called and completes, the module will be completely
  * Once ->stop is called and completes, the module will be completely
  * unused.
  * unused.
  */
  */
-void mddev_suspend(mddev_t *mddev)
+void mddev_suspend(struct mddev *mddev)
 {
 {
 	BUG_ON(mddev->suspended);
 	BUG_ON(mddev->suspended);
 	mddev->suspended = 1;
 	mddev->suspended = 1;
@@ -400,7 +397,7 @@ void mddev_suspend(mddev_t *mddev)
 }
 }
 EXPORT_SYMBOL_GPL(mddev_suspend);
 EXPORT_SYMBOL_GPL(mddev_suspend);
 
 
-void mddev_resume(mddev_t *mddev)
+void mddev_resume(struct mddev *mddev)
 {
 {
 	mddev->suspended = 0;
 	mddev->suspended = 0;
 	wake_up(&mddev->sb_wait);
 	wake_up(&mddev->sb_wait);
@@ -411,7 +408,7 @@ void mddev_resume(mddev_t *mddev)
 }
 }
 EXPORT_SYMBOL_GPL(mddev_resume);
 EXPORT_SYMBOL_GPL(mddev_resume);
 
 
-int mddev_congested(mddev_t *mddev, int bits)
+int mddev_congested(struct mddev *mddev, int bits)
 {
 {
 	return mddev->suspended;
 	return mddev->suspended;
 }
 }
@@ -423,8 +420,8 @@ EXPORT_SYMBOL(mddev_congested);
 
 
 static void md_end_flush(struct bio *bio, int err)
 static void md_end_flush(struct bio *bio, int err)
 {
 {
-	mdk_rdev_t *rdev = bio->bi_private;
-	mddev_t *mddev = rdev->mddev;
+	struct md_rdev *rdev = bio->bi_private;
+	struct mddev *mddev = rdev->mddev;
 
 
 	rdev_dec_pending(rdev, mddev);
 	rdev_dec_pending(rdev, mddev);
 
 
@@ -439,8 +436,8 @@ static void md_submit_flush_data(struct work_struct *ws);
 
 
 static void submit_flushes(struct work_struct *ws)
 static void submit_flushes(struct work_struct *ws)
 {
 {
-	mddev_t *mddev = container_of(ws, mddev_t, flush_work);
-	mdk_rdev_t *rdev;
+	struct mddev *mddev = container_of(ws, struct mddev, flush_work);
+	struct md_rdev *rdev;
 
 
 	INIT_WORK(&mddev->flush_work, md_submit_flush_data);
 	INIT_WORK(&mddev->flush_work, md_submit_flush_data);
 	atomic_set(&mddev->flush_pending, 1);
 	atomic_set(&mddev->flush_pending, 1);
@@ -472,7 +469,7 @@ static void submit_flushes(struct work_struct *ws)
 
 
 static void md_submit_flush_data(struct work_struct *ws)
 static void md_submit_flush_data(struct work_struct *ws)
 {
 {
-	mddev_t *mddev = container_of(ws, mddev_t, flush_work);
+	struct mddev *mddev = container_of(ws, struct mddev, flush_work);
 	struct bio *bio = mddev->flush_bio;
 	struct bio *bio = mddev->flush_bio;
 
 
 	if (bio->bi_size == 0)
 	if (bio->bi_size == 0)
@@ -488,7 +485,7 @@ static void md_submit_flush_data(struct work_struct *ws)
 	wake_up(&mddev->sb_wait);
 	wake_up(&mddev->sb_wait);
 }
 }
 
 
-void md_flush_request(mddev_t *mddev, struct bio *bio)
+void md_flush_request(struct mddev *mddev, struct bio *bio)
 {
 {
 	spin_lock_irq(&mddev->write_lock);
 	spin_lock_irq(&mddev->write_lock);
 	wait_event_lock_irq(mddev->sb_wait,
 	wait_event_lock_irq(mddev->sb_wait,
@@ -512,7 +509,7 @@ EXPORT_SYMBOL(md_flush_request);
  */
  */
 struct md_plug_cb {
 struct md_plug_cb {
 	struct blk_plug_cb cb;
 	struct blk_plug_cb cb;
-	mddev_t *mddev;
+	struct mddev *mddev;
 };
 };
 
 
 static void plugger_unplug(struct blk_plug_cb *cb)
 static void plugger_unplug(struct blk_plug_cb *cb)
@@ -526,7 +523,7 @@ static void plugger_unplug(struct blk_plug_cb *cb)
 /* Check that an unplug wakeup will come shortly.
 /* Check that an unplug wakeup will come shortly.
  * If not, wakeup the md thread immediately
  * If not, wakeup the md thread immediately
  */
  */
-int mddev_check_plugged(mddev_t *mddev)
+int mddev_check_plugged(struct mddev *mddev)
 {
 {
 	struct blk_plug *plug = current->plug;
 	struct blk_plug *plug = current->plug;
 	struct md_plug_cb *mdcb;
 	struct md_plug_cb *mdcb;
@@ -558,7 +555,7 @@ int mddev_check_plugged(mddev_t *mddev)
 }
 }
 EXPORT_SYMBOL_GPL(mddev_check_plugged);
 EXPORT_SYMBOL_GPL(mddev_check_plugged);
 
 
-static inline mddev_t *mddev_get(mddev_t *mddev)
+static inline struct mddev *mddev_get(struct mddev *mddev)
 {
 {
 	atomic_inc(&mddev->active);
 	atomic_inc(&mddev->active);
 	return mddev;
 	return mddev;
@@ -566,7 +563,7 @@ static inline mddev_t *mddev_get(mddev_t *mddev)
 
 
 static void mddev_delayed_delete(struct work_struct *ws);
 static void mddev_delayed_delete(struct work_struct *ws);
 
 
-static void mddev_put(mddev_t *mddev)
+static void mddev_put(struct mddev *mddev)
 {
 {
 	struct bio_set *bs = NULL;
 	struct bio_set *bs = NULL;
 
 
@@ -595,7 +592,7 @@ static void mddev_put(mddev_t *mddev)
 		bioset_free(bs);
 		bioset_free(bs);
 }
 }
 
 
-void mddev_init(mddev_t *mddev)
+void mddev_init(struct mddev *mddev)
 {
 {
 	mutex_init(&mddev->open_mutex);
 	mutex_init(&mddev->open_mutex);
 	mutex_init(&mddev->reconfig_mutex);
 	mutex_init(&mddev->reconfig_mutex);
@@ -618,9 +615,9 @@ void mddev_init(mddev_t *mddev)
 }
 }
 EXPORT_SYMBOL_GPL(mddev_init);
 EXPORT_SYMBOL_GPL(mddev_init);
 
 
-static mddev_t * mddev_find(dev_t unit)
+static struct mddev * mddev_find(dev_t unit)
 {
 {
-	mddev_t *mddev, *new = NULL;
+	struct mddev *mddev, *new = NULL;
 
 
 	if (unit && MAJOR(unit) != MD_MAJOR)
 	if (unit && MAJOR(unit) != MD_MAJOR)
 		unit &= ~((1<<MdpMinorShift)-1);
 		unit &= ~((1<<MdpMinorShift)-1);
@@ -692,24 +689,24 @@ static mddev_t * mddev_find(dev_t unit)
 	goto retry;
 	goto retry;
 }
 }
 
 
-static inline int mddev_lock(mddev_t * mddev)
+static inline int mddev_lock(struct mddev * mddev)
 {
 {
 	return mutex_lock_interruptible(&mddev->reconfig_mutex);
 	return mutex_lock_interruptible(&mddev->reconfig_mutex);
 }
 }
 
 
-static inline int mddev_is_locked(mddev_t *mddev)
+static inline int mddev_is_locked(struct mddev *mddev)
 {
 {
 	return mutex_is_locked(&mddev->reconfig_mutex);
 	return mutex_is_locked(&mddev->reconfig_mutex);
 }
 }
 
 
-static inline int mddev_trylock(mddev_t * mddev)
+static inline int mddev_trylock(struct mddev * mddev)
 {
 {
 	return mutex_trylock(&mddev->reconfig_mutex);
 	return mutex_trylock(&mddev->reconfig_mutex);
 }
 }
 
 
 static struct attribute_group md_redundancy_group;
 static struct attribute_group md_redundancy_group;
 
 
-static void mddev_unlock(mddev_t * mddev)
+static void mddev_unlock(struct mddev * mddev)
 {
 {
 	if (mddev->to_remove) {
 	if (mddev->to_remove) {
 		/* These cannot be removed under reconfig_mutex as
 		/* These cannot be removed under reconfig_mutex as
@@ -744,17 +741,17 @@ static void mddev_unlock(mddev_t * mddev)
 	} else
 	} else
 		mutex_unlock(&mddev->reconfig_mutex);
 		mutex_unlock(&mddev->reconfig_mutex);
 
 
-	/* was we've dropped the mutex we need a spinlock to
-	 * make sur the thread doesn't disappear
+	/* As we've dropped the mutex we need a spinlock to
+	 * make sure the thread doesn't disappear
 	 */
 	 */
 	spin_lock(&pers_lock);
 	spin_lock(&pers_lock);
 	md_wakeup_thread(mddev->thread);
 	md_wakeup_thread(mddev->thread);
 	spin_unlock(&pers_lock);
 	spin_unlock(&pers_lock);
 }
 }
 
 
-static mdk_rdev_t * find_rdev_nr(mddev_t *mddev, int nr)
+static struct md_rdev * find_rdev_nr(struct mddev *mddev, int nr)
 {
 {
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	list_for_each_entry(rdev, &mddev->disks, same_set)
 	list_for_each_entry(rdev, &mddev->disks, same_set)
 		if (rdev->desc_nr == nr)
 		if (rdev->desc_nr == nr)
@@ -763,9 +760,9 @@ static mdk_rdev_t * find_rdev_nr(mddev_t *mddev, int nr)
 	return NULL;
 	return NULL;
 }
 }
 
 
-static mdk_rdev_t * find_rdev(mddev_t * mddev, dev_t dev)
+static struct md_rdev * find_rdev(struct mddev * mddev, dev_t dev)
 {
 {
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	list_for_each_entry(rdev, &mddev->disks, same_set)
 	list_for_each_entry(rdev, &mddev->disks, same_set)
 		if (rdev->bdev->bd_dev == dev)
 		if (rdev->bdev->bd_dev == dev)
@@ -774,9 +771,9 @@ static mdk_rdev_t * find_rdev(mddev_t * mddev, dev_t dev)
 	return NULL;
 	return NULL;
 }
 }
 
 
-static struct mdk_personality *find_pers(int level, char *clevel)
+static struct md_personality *find_pers(int level, char *clevel)
 {
 {
-	struct mdk_personality *pers;
+	struct md_personality *pers;
 	list_for_each_entry(pers, &pers_list, list) {
 	list_for_each_entry(pers, &pers_list, list) {
 		if (level != LEVEL_NONE && pers->level == level)
 		if (level != LEVEL_NONE && pers->level == level)
 			return pers;
 			return pers;
@@ -787,13 +784,13 @@ static struct mdk_personality *find_pers(int level, char *clevel)
 }
 }
 
 
 /* return the offset of the super block in 512byte sectors */
 /* return the offset of the super block in 512byte sectors */
-static inline sector_t calc_dev_sboffset(mdk_rdev_t *rdev)
+static inline sector_t calc_dev_sboffset(struct md_rdev *rdev)
 {
 {
 	sector_t num_sectors = i_size_read(rdev->bdev->bd_inode) / 512;
 	sector_t num_sectors = i_size_read(rdev->bdev->bd_inode) / 512;
 	return MD_NEW_SIZE_SECTORS(num_sectors);
 	return MD_NEW_SIZE_SECTORS(num_sectors);
 }
 }
 
 
-static int alloc_disk_sb(mdk_rdev_t * rdev)
+static int alloc_disk_sb(struct md_rdev * rdev)
 {
 {
 	if (rdev->sb_page)
 	if (rdev->sb_page)
 		MD_BUG();
 		MD_BUG();
@@ -807,7 +804,7 @@ static int alloc_disk_sb(mdk_rdev_t * rdev)
 	return 0;
 	return 0;
 }
 }
 
 
-static void free_disk_sb(mdk_rdev_t * rdev)
+static void free_disk_sb(struct md_rdev * rdev)
 {
 {
 	if (rdev->sb_page) {
 	if (rdev->sb_page) {
 		put_page(rdev->sb_page);
 		put_page(rdev->sb_page);
@@ -825,8 +822,8 @@ static void free_disk_sb(mdk_rdev_t * rdev)
 
 
 static void super_written(struct bio *bio, int error)
 static void super_written(struct bio *bio, int error)
 {
 {
-	mdk_rdev_t *rdev = bio->bi_private;
-	mddev_t *mddev = rdev->mddev;
+	struct md_rdev *rdev = bio->bi_private;
+	struct mddev *mddev = rdev->mddev;
 
 
 	if (error || !test_bit(BIO_UPTODATE, &bio->bi_flags)) {
 	if (error || !test_bit(BIO_UPTODATE, &bio->bi_flags)) {
 		printk("md: super_written gets error=%d, uptodate=%d\n",
 		printk("md: super_written gets error=%d, uptodate=%d\n",
@@ -840,7 +837,7 @@ static void super_written(struct bio *bio, int error)
 	bio_put(bio);
 	bio_put(bio);
 }
 }
 
 
-void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev,
+void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
 		   sector_t sector, int size, struct page *page)
 		   sector_t sector, int size, struct page *page)
 {
 {
 	/* write first size bytes of page to sector of rdev
 	/* write first size bytes of page to sector of rdev
@@ -861,7 +858,7 @@ void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev,
 	submit_bio(WRITE_FLUSH_FUA, bio);
 	submit_bio(WRITE_FLUSH_FUA, bio);
 }
 }
 
 
-void md_super_wait(mddev_t *mddev)
+void md_super_wait(struct mddev *mddev)
 {
 {
 	/* wait for all superblock writes that were scheduled to complete */
 	/* wait for all superblock writes that were scheduled to complete */
 	DEFINE_WAIT(wq);
 	DEFINE_WAIT(wq);
@@ -879,7 +876,7 @@ static void bi_complete(struct bio *bio, int error)
 	complete((struct completion*)bio->bi_private);
 	complete((struct completion*)bio->bi_private);
 }
 }
 
 
-int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size,
+int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,
 		 struct page *page, int rw, bool metadata_op)
 		 struct page *page, int rw, bool metadata_op)
 {
 {
 	struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev);
 	struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev);
@@ -907,7 +904,7 @@ int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size,
 }
 }
 EXPORT_SYMBOL_GPL(sync_page_io);
 EXPORT_SYMBOL_GPL(sync_page_io);
 
 
-static int read_disk_sb(mdk_rdev_t * rdev, int size)
+static int read_disk_sb(struct md_rdev * rdev, int size)
 {
 {
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 	if (!rdev->sb_page) {
 	if (!rdev->sb_page) {
@@ -1014,7 +1011,7 @@ static unsigned int calc_sb_csum(mdp_super_t * sb)
  * We rely on user-space to write the initial superblock, and support
  * We rely on user-space to write the initial superblock, and support
  * reading and updating of superblocks.
  * reading and updating of superblocks.
  * Interface methods are:
  * Interface methods are:
- *   int load_super(mdk_rdev_t *dev, mdk_rdev_t *refdev, int minor_version)
+ *   int load_super(struct md_rdev *dev, struct md_rdev *refdev, int minor_version)
  *      loads and validates a superblock on dev.
  *      loads and validates a superblock on dev.
  *      if refdev != NULL, compare superblocks on both devices
  *      if refdev != NULL, compare superblocks on both devices
  *    Return:
  *    Return:
@@ -1024,13 +1021,13 @@ static unsigned int calc_sb_csum(mdp_super_t * sb)
  *     -EINVAL superblock incompatible or invalid
  *     -EINVAL superblock incompatible or invalid
  *     -othererror e.g. -EIO
  *     -othererror e.g. -EIO
  *
  *
- *   int validate_super(mddev_t *mddev, mdk_rdev_t *dev)
+ *   int validate_super(struct mddev *mddev, struct md_rdev *dev)
  *      Verify that dev is acceptable into mddev.
  *      Verify that dev is acceptable into mddev.
  *       The first time, mddev->raid_disks will be 0, and data from
  *       The first time, mddev->raid_disks will be 0, and data from
  *       dev should be merged in.  Subsequent calls check that dev
  *       dev should be merged in.  Subsequent calls check that dev
  *       is new enough.  Return 0 or -EINVAL
  *       is new enough.  Return 0 or -EINVAL
  *
  *
- *   void sync_super(mddev_t *mddev, mdk_rdev_t *dev)
+ *   void sync_super(struct mddev *mddev, struct md_rdev *dev)
  *     Update the superblock for rdev with data in mddev
  *     Update the superblock for rdev with data in mddev
  *     This does not write to disc.
  *     This does not write to disc.
  *
  *
@@ -1039,11 +1036,11 @@ static unsigned int calc_sb_csum(mdp_super_t * sb)
 struct super_type  {
 struct super_type  {
 	char		    *name;
 	char		    *name;
 	struct module	    *owner;
 	struct module	    *owner;
-	int		    (*load_super)(mdk_rdev_t *rdev, mdk_rdev_t *refdev,
+	int		    (*load_super)(struct md_rdev *rdev, struct md_rdev *refdev,
 					  int minor_version);
 					  int minor_version);
-	int		    (*validate_super)(mddev_t *mddev, mdk_rdev_t *rdev);
-	void		    (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev);
-	unsigned long long  (*rdev_size_change)(mdk_rdev_t *rdev,
+	int		    (*validate_super)(struct mddev *mddev, struct md_rdev *rdev);
+	void		    (*sync_super)(struct mddev *mddev, struct md_rdev *rdev);
+	unsigned long long  (*rdev_size_change)(struct md_rdev *rdev,
 						sector_t num_sectors);
 						sector_t num_sectors);
 };
 };
 
 
@@ -1055,7 +1052,7 @@ struct super_type  {
  * has a bitmap. Otherwise, it returns 0.
  * has a bitmap. Otherwise, it returns 0.
  *
  *
  */
  */
-int md_check_no_bitmap(mddev_t *mddev)
+int md_check_no_bitmap(struct mddev *mddev)
 {
 {
 	if (!mddev->bitmap_info.file && !mddev->bitmap_info.offset)
 	if (!mddev->bitmap_info.file && !mddev->bitmap_info.offset)
 		return 0;
 		return 0;
@@ -1068,7 +1065,7 @@ EXPORT_SYMBOL(md_check_no_bitmap);
 /*
 /*
  * load_super for 0.90.0 
  * load_super for 0.90.0 
  */
  */
-static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
+static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_version)
 {
 {
 	char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
 	mdp_super_t *sb;
 	mdp_super_t *sb;
@@ -1163,7 +1160,7 @@ static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version
 /*
 /*
  * validate_super for 0.90.0
  * validate_super for 0.90.0
  */
  */
-static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
+static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	mdp_disk_t *desc;
 	mdp_disk_t *desc;
 	mdp_super_t *sb = page_address(rdev->sb_page);
 	mdp_super_t *sb = page_address(rdev->sb_page);
@@ -1275,10 +1272,10 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
 /*
 /*
  * sync_super for 0.90.0
  * sync_super for 0.90.0
  */
  */
-static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev)
+static void super_90_sync(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	mdp_super_t *sb;
 	mdp_super_t *sb;
-	mdk_rdev_t *rdev2;
+	struct md_rdev *rdev2;
 	int next_spare = mddev->raid_disks;
 	int next_spare = mddev->raid_disks;
 
 
 
 
@@ -1419,7 +1416,7 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev)
  * rdev_size_change for 0.90.0
  * rdev_size_change for 0.90.0
  */
  */
 static unsigned long long
 static unsigned long long
-super_90_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
+super_90_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors)
 {
 {
 	if (num_sectors && num_sectors < rdev->mddev->dev_sectors)
 	if (num_sectors && num_sectors < rdev->mddev->dev_sectors)
 		return 0; /* component must fit device */
 		return 0; /* component must fit device */
@@ -1469,7 +1466,7 @@ static __le32 calc_sb_1_csum(struct mdp_superblock_1 * sb)
 
 
 static int md_set_badblocks(struct badblocks *bb, sector_t s, int sectors,
 static int md_set_badblocks(struct badblocks *bb, sector_t s, int sectors,
 			    int acknowledged);
 			    int acknowledged);
-static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
+static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_version)
 {
 {
 	struct mdp_superblock_1 *sb;
 	struct mdp_superblock_1 *sb;
 	int ret;
 	int ret;
@@ -1625,7 +1622,7 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
 	return ret;
 	return ret;
 }
 }
 
 
-static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
+static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	struct mdp_superblock_1 *sb = page_address(rdev->sb_page);
 	struct mdp_superblock_1 *sb = page_address(rdev->sb_page);
 	__u64 ev1 = le64_to_cpu(sb->events);
 	__u64 ev1 = le64_to_cpu(sb->events);
@@ -1726,10 +1723,10 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
 	return 0;
 	return 0;
 }
 }
 
 
-static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
+static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	struct mdp_superblock_1 *sb;
 	struct mdp_superblock_1 *sb;
-	mdk_rdev_t *rdev2;
+	struct md_rdev *rdev2;
 	int max_dev, i;
 	int max_dev, i;
 	/* make rdev->sb match mddev and rdev data. */
 	/* make rdev->sb match mddev and rdev data. */
 
 
@@ -1851,7 +1848,7 @@ retry:
 }
 }
 
 
 static unsigned long long
 static unsigned long long
-super_1_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
+super_1_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors)
 {
 {
 	struct mdp_superblock_1 *sb;
 	struct mdp_superblock_1 *sb;
 	sector_t max_sectors;
 	sector_t max_sectors;
@@ -1905,7 +1902,7 @@ static struct super_type super_types[] = {
 	},
 	},
 };
 };
 
 
-static void sync_super(mddev_t *mddev, mdk_rdev_t *rdev)
+static void sync_super(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	if (mddev->sync_super) {
 	if (mddev->sync_super) {
 		mddev->sync_super(mddev, rdev);
 		mddev->sync_super(mddev, rdev);
@@ -1917,9 +1914,9 @@ static void sync_super(mddev_t *mddev, mdk_rdev_t *rdev)
 	super_types[mddev->major_version].sync_super(mddev, rdev);
 	super_types[mddev->major_version].sync_super(mddev, rdev);
 }
 }
 
 
-static int match_mddev_units(mddev_t *mddev1, mddev_t *mddev2)
+static int match_mddev_units(struct mddev *mddev1, struct mddev *mddev2)
 {
 {
-	mdk_rdev_t *rdev, *rdev2;
+	struct md_rdev *rdev, *rdev2;
 
 
 	rcu_read_lock();
 	rcu_read_lock();
 	rdev_for_each_rcu(rdev, mddev1)
 	rdev_for_each_rcu(rdev, mddev1)
@@ -1942,9 +1939,9 @@ static LIST_HEAD(pending_raid_disks);
  * from the array. It only succeeds if all working and active component devices
  * from the array. It only succeeds if all working and active component devices
  * are integrity capable with matching profiles.
  * are integrity capable with matching profiles.
  */
  */
-int md_integrity_register(mddev_t *mddev)
+int md_integrity_register(struct mddev *mddev)
 {
 {
-	mdk_rdev_t *rdev, *reference = NULL;
+	struct md_rdev *rdev, *reference = NULL;
 
 
 	if (list_empty(&mddev->disks))
 	if (list_empty(&mddev->disks))
 		return 0; /* nothing to do */
 		return 0; /* nothing to do */
@@ -1989,7 +1986,7 @@ int md_integrity_register(mddev_t *mddev)
 EXPORT_SYMBOL(md_integrity_register);
 EXPORT_SYMBOL(md_integrity_register);
 
 
 /* Disable data integrity if non-capable/non-matching disk is being added */
 /* Disable data integrity if non-capable/non-matching disk is being added */
-void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev)
+void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev)
 {
 {
 	struct blk_integrity *bi_rdev = bdev_get_integrity(rdev->bdev);
 	struct blk_integrity *bi_rdev = bdev_get_integrity(rdev->bdev);
 	struct blk_integrity *bi_mddev = blk_get_integrity(mddev->gendisk);
 	struct blk_integrity *bi_mddev = blk_get_integrity(mddev->gendisk);
@@ -2006,7 +2003,7 @@ void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev)
 }
 }
 EXPORT_SYMBOL(md_integrity_add_rdev);
 EXPORT_SYMBOL(md_integrity_add_rdev);
 
 
-static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
+static int bind_rdev_to_array(struct md_rdev * rdev, struct mddev * mddev)
 {
 {
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 	struct kobject *ko;
 	struct kobject *ko;
@@ -2086,12 +2083,12 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
 
 
 static void md_delayed_delete(struct work_struct *ws)
 static void md_delayed_delete(struct work_struct *ws)
 {
 {
-	mdk_rdev_t *rdev = container_of(ws, mdk_rdev_t, del_work);
+	struct md_rdev *rdev = container_of(ws, struct md_rdev, del_work);
 	kobject_del(&rdev->kobj);
 	kobject_del(&rdev->kobj);
 	kobject_put(&rdev->kobj);
 	kobject_put(&rdev->kobj);
 }
 }
 
 
-static void unbind_rdev_from_array(mdk_rdev_t * rdev)
+static void unbind_rdev_from_array(struct md_rdev * rdev)
 {
 {
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 	if (!rdev->mddev) {
 	if (!rdev->mddev) {
@@ -2123,14 +2120,14 @@ static void unbind_rdev_from_array(mdk_rdev_t * rdev)
  * otherwise reused by a RAID array (or any other kernel
  * otherwise reused by a RAID array (or any other kernel
  * subsystem), by bd_claiming the device.
  * subsystem), by bd_claiming the device.
  */
  */
-static int lock_rdev(mdk_rdev_t *rdev, dev_t dev, int shared)
+static int lock_rdev(struct md_rdev *rdev, dev_t dev, int shared)
 {
 {
 	int err = 0;
 	int err = 0;
 	struct block_device *bdev;
 	struct block_device *bdev;
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 
 
 	bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL,
 	bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL,
-				 shared ? (mdk_rdev_t *)lock_rdev : rdev);
+				 shared ? (struct md_rdev *)lock_rdev : rdev);
 	if (IS_ERR(bdev)) {
 	if (IS_ERR(bdev)) {
 		printk(KERN_ERR "md: could not open %s.\n",
 		printk(KERN_ERR "md: could not open %s.\n",
 			__bdevname(dev, b));
 			__bdevname(dev, b));
@@ -2140,7 +2137,7 @@ static int lock_rdev(mdk_rdev_t *rdev, dev_t dev, int shared)
 	return err;
 	return err;
 }
 }
 
 
-static void unlock_rdev(mdk_rdev_t *rdev)
+static void unlock_rdev(struct md_rdev *rdev)
 {
 {
 	struct block_device *bdev = rdev->bdev;
 	struct block_device *bdev = rdev->bdev;
 	rdev->bdev = NULL;
 	rdev->bdev = NULL;
@@ -2151,7 +2148,7 @@ static void unlock_rdev(mdk_rdev_t *rdev)
 
 
 void md_autodetect_dev(dev_t dev);
 void md_autodetect_dev(dev_t dev);
 
 
-static void export_rdev(mdk_rdev_t * rdev)
+static void export_rdev(struct md_rdev * rdev)
 {
 {
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 	printk(KERN_INFO "md: export_rdev(%s)\n",
 	printk(KERN_INFO "md: export_rdev(%s)\n",
@@ -2167,15 +2164,15 @@ static void export_rdev(mdk_rdev_t * rdev)
 	kobject_put(&rdev->kobj);
 	kobject_put(&rdev->kobj);
 }
 }
 
 
-static void kick_rdev_from_array(mdk_rdev_t * rdev)
+static void kick_rdev_from_array(struct md_rdev * rdev)
 {
 {
 	unbind_rdev_from_array(rdev);
 	unbind_rdev_from_array(rdev);
 	export_rdev(rdev);
 	export_rdev(rdev);
 }
 }
 
 
-static void export_array(mddev_t *mddev)
+static void export_array(struct mddev *mddev)
 {
 {
-	mdk_rdev_t *rdev, *tmp;
+	struct md_rdev *rdev, *tmp;
 
 
 	rdev_for_each(rdev, tmp, mddev) {
 	rdev_for_each(rdev, tmp, mddev) {
 		if (!rdev->mddev) {
 		if (!rdev->mddev) {
@@ -2271,7 +2268,7 @@ static void print_sb_1(struct mdp_superblock_1 *sb)
 		);
 		);
 }
 }
 
 
-static void print_rdev(mdk_rdev_t *rdev, int major_version)
+static void print_rdev(struct md_rdev *rdev, int major_version)
 {
 {
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 	printk(KERN_INFO "md: rdev %s, Sect:%08llu F:%d S:%d DN:%u\n",
 	printk(KERN_INFO "md: rdev %s, Sect:%08llu F:%d S:%d DN:%u\n",
@@ -2295,8 +2292,8 @@ static void print_rdev(mdk_rdev_t *rdev, int major_version)
 static void md_print_devices(void)
 static void md_print_devices(void)
 {
 {
 	struct list_head *tmp;
 	struct list_head *tmp;
-	mdk_rdev_t *rdev;
-	mddev_t *mddev;
+	struct md_rdev *rdev;
+	struct mddev *mddev;
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 
 
 	printk("\n");
 	printk("\n");
@@ -2321,7 +2318,7 @@ static void md_print_devices(void)
 }
 }
 
 
 
 
-static void sync_sbs(mddev_t * mddev, int nospares)
+static void sync_sbs(struct mddev * mddev, int nospares)
 {
 {
 	/* Update each superblock (in-memory image), but
 	/* Update each superblock (in-memory image), but
 	 * if we are allowed to, skip spares which already
 	 * if we are allowed to, skip spares which already
@@ -2329,7 +2326,7 @@ static void sync_sbs(mddev_t * mddev, int nospares)
 	 * (which would mean they aren't being marked as dirty
 	 * (which would mean they aren't being marked as dirty
 	 * with the rest of the array)
 	 * with the rest of the array)
 	 */
 	 */
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	list_for_each_entry(rdev, &mddev->disks, same_set) {
 	list_for_each_entry(rdev, &mddev->disks, same_set) {
 		if (rdev->sb_events == mddev->events ||
 		if (rdev->sb_events == mddev->events ||
 		    (nospares &&
 		    (nospares &&
@@ -2344,9 +2341,9 @@ static void sync_sbs(mddev_t * mddev, int nospares)
 	}
 	}
 }
 }
 
 
-static void md_update_sb(mddev_t * mddev, int force_change)
+static void md_update_sb(struct mddev * mddev, int force_change)
 {
 {
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	int sync_req;
 	int sync_req;
 	int nospares = 0;
 	int nospares = 0;
 	int any_badblocks_changed = 0;
 	int any_badblocks_changed = 0;
@@ -2442,27 +2439,24 @@ repeat:
 	sync_sbs(mddev, nospares);
 	sync_sbs(mddev, nospares);
 	spin_unlock_irq(&mddev->write_lock);
 	spin_unlock_irq(&mddev->write_lock);
 
 
-	dprintk(KERN_INFO 
-		"md: updating %s RAID superblock on device (in sync %d)\n",
-		mdname(mddev),mddev->in_sync);
+	pr_debug("md: updating %s RAID superblock on device (in sync %d)\n",
+		 mdname(mddev), mddev->in_sync);
 
 
 	bitmap_update_sb(mddev->bitmap);
 	bitmap_update_sb(mddev->bitmap);
 	list_for_each_entry(rdev, &mddev->disks, same_set) {
 	list_for_each_entry(rdev, &mddev->disks, same_set) {
 		char b[BDEVNAME_SIZE];
 		char b[BDEVNAME_SIZE];
-		dprintk(KERN_INFO "md: ");
+
 		if (rdev->sb_loaded != 1)
 		if (rdev->sb_loaded != 1)
 			continue; /* no noise on spare devices */
 			continue; /* no noise on spare devices */
-		if (test_bit(Faulty, &rdev->flags))
-			dprintk("(skipping faulty ");
 
 
-		dprintk("%s ", bdevname(rdev->bdev,b));
-		if (!test_bit(Faulty, &rdev->flags)) {
+		if (!test_bit(Faulty, &rdev->flags) &&
+		    rdev->saved_raid_disk == -1) {
 			md_super_write(mddev,rdev,
 			md_super_write(mddev,rdev,
 				       rdev->sb_start, rdev->sb_size,
 				       rdev->sb_start, rdev->sb_size,
 				       rdev->sb_page);
 				       rdev->sb_page);
-			dprintk(KERN_INFO "(write) %s's sb offset: %llu\n",
-				bdevname(rdev->bdev,b),
-				(unsigned long long)rdev->sb_start);
+			pr_debug("md: (write) %s's sb offset: %llu\n",
+				 bdevname(rdev->bdev, b),
+				 (unsigned long long)rdev->sb_start);
 			rdev->sb_events = mddev->events;
 			rdev->sb_events = mddev->events;
 			if (rdev->badblocks.size) {
 			if (rdev->badblocks.size) {
 				md_super_write(mddev, rdev,
 				md_super_write(mddev, rdev,
@@ -2472,8 +2466,12 @@ repeat:
 				rdev->badblocks.size = 0;
 				rdev->badblocks.size = 0;
 			}
 			}
 
 
-		} else
-			dprintk(")\n");
+		} else if (test_bit(Faulty, &rdev->flags))
+			pr_debug("md: %s (skipping faulty)\n",
+				 bdevname(rdev->bdev, b));
+		else
+			pr_debug("(skipping incremental s/r ");
+
 		if (mddev->level == LEVEL_MULTIPATH)
 		if (mddev->level == LEVEL_MULTIPATH)
 			/* only need to write one superblock... */
 			/* only need to write one superblock... */
 			break;
 			break;
@@ -2527,12 +2525,12 @@ static int cmd_match(const char *cmd, const char *str)
 
 
 struct rdev_sysfs_entry {
 struct rdev_sysfs_entry {
 	struct attribute attr;
 	struct attribute attr;
-	ssize_t (*show)(mdk_rdev_t *, char *);
-	ssize_t (*store)(mdk_rdev_t *, const char *, size_t);
+	ssize_t (*show)(struct md_rdev *, char *);
+	ssize_t (*store)(struct md_rdev *, const char *, size_t);
 };
 };
 
 
 static ssize_t
 static ssize_t
-state_show(mdk_rdev_t *rdev, char *page)
+state_show(struct md_rdev *rdev, char *page)
 {
 {
 	char *sep = "";
 	char *sep = "";
 	size_t len = 0;
 	size_t len = 0;
@@ -2568,7 +2566,7 @@ state_show(mdk_rdev_t *rdev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
+state_store(struct md_rdev *rdev, const char *buf, size_t len)
 {
 {
 	/* can write
 	/* can write
 	 *  faulty  - simulates an error
 	 *  faulty  - simulates an error
@@ -2592,7 +2590,7 @@ state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 		if (rdev->raid_disk >= 0)
 		if (rdev->raid_disk >= 0)
 			err = -EBUSY;
 			err = -EBUSY;
 		else {
 		else {
-			mddev_t *mddev = rdev->mddev;
+			struct mddev *mddev = rdev->mddev;
 			kick_rdev_from_array(rdev);
 			kick_rdev_from_array(rdev);
 			if (mddev->pers)
 			if (mddev->pers)
 				md_update_sb(mddev, 1);
 				md_update_sb(mddev, 1);
@@ -2641,13 +2639,13 @@ static struct rdev_sysfs_entry rdev_state =
 __ATTR(state, S_IRUGO|S_IWUSR, state_show, state_store);
 __ATTR(state, S_IRUGO|S_IWUSR, state_show, state_store);
 
 
 static ssize_t
 static ssize_t
-errors_show(mdk_rdev_t *rdev, char *page)
+errors_show(struct md_rdev *rdev, char *page)
 {
 {
 	return sprintf(page, "%d\n", atomic_read(&rdev->corrected_errors));
 	return sprintf(page, "%d\n", atomic_read(&rdev->corrected_errors));
 }
 }
 
 
 static ssize_t
 static ssize_t
-errors_store(mdk_rdev_t *rdev, const char *buf, size_t len)
+errors_store(struct md_rdev *rdev, const char *buf, size_t len)
 {
 {
 	char *e;
 	char *e;
 	unsigned long n = simple_strtoul(buf, &e, 10);
 	unsigned long n = simple_strtoul(buf, &e, 10);
@@ -2661,7 +2659,7 @@ static struct rdev_sysfs_entry rdev_errors =
 __ATTR(errors, S_IRUGO|S_IWUSR, errors_show, errors_store);
 __ATTR(errors, S_IRUGO|S_IWUSR, errors_show, errors_store);
 
 
 static ssize_t
 static ssize_t
-slot_show(mdk_rdev_t *rdev, char *page)
+slot_show(struct md_rdev *rdev, char *page)
 {
 {
 	if (rdev->raid_disk < 0)
 	if (rdev->raid_disk < 0)
 		return sprintf(page, "none\n");
 		return sprintf(page, "none\n");
@@ -2670,7 +2668,7 @@ slot_show(mdk_rdev_t *rdev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
+slot_store(struct md_rdev *rdev, const char *buf, size_t len)
 {
 {
 	char *e;
 	char *e;
 	int err;
 	int err;
@@ -2701,7 +2699,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 		set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery);
 		set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery);
 		md_wakeup_thread(rdev->mddev->thread);
 		md_wakeup_thread(rdev->mddev->thread);
 	} else if (rdev->mddev->pers) {
 	} else if (rdev->mddev->pers) {
-		mdk_rdev_t *rdev2;
+		struct md_rdev *rdev2;
 		/* Activating a spare .. or possibly reactivating
 		/* Activating a spare .. or possibly reactivating
 		 * if we ever get bitmaps working here.
 		 * if we ever get bitmaps working here.
 		 */
 		 */
@@ -2728,6 +2726,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 			rdev->saved_raid_disk = slot;
 			rdev->saved_raid_disk = slot;
 		else
 		else
 			rdev->saved_raid_disk = -1;
 			rdev->saved_raid_disk = -1;
+		clear_bit(In_sync, &rdev->flags);
 		err = rdev->mddev->pers->
 		err = rdev->mddev->pers->
 			hot_add_disk(rdev->mddev, rdev);
 			hot_add_disk(rdev->mddev, rdev);
 		if (err) {
 		if (err) {
@@ -2757,13 +2756,13 @@ static struct rdev_sysfs_entry rdev_slot =
 __ATTR(slot, S_IRUGO|S_IWUSR, slot_show, slot_store);
 __ATTR(slot, S_IRUGO|S_IWUSR, slot_show, slot_store);
 
 
 static ssize_t
 static ssize_t
-offset_show(mdk_rdev_t *rdev, char *page)
+offset_show(struct md_rdev *rdev, char *page)
 {
 {
 	return sprintf(page, "%llu\n", (unsigned long long)rdev->data_offset);
 	return sprintf(page, "%llu\n", (unsigned long long)rdev->data_offset);
 }
 }
 
 
 static ssize_t
 static ssize_t
-offset_store(mdk_rdev_t *rdev, const char *buf, size_t len)
+offset_store(struct md_rdev *rdev, const char *buf, size_t len)
 {
 {
 	char *e;
 	char *e;
 	unsigned long long offset = simple_strtoull(buf, &e, 10);
 	unsigned long long offset = simple_strtoull(buf, &e, 10);
@@ -2783,7 +2782,7 @@ static struct rdev_sysfs_entry rdev_offset =
 __ATTR(offset, S_IRUGO|S_IWUSR, offset_show, offset_store);
 __ATTR(offset, S_IRUGO|S_IWUSR, offset_show, offset_store);
 
 
 static ssize_t
 static ssize_t
-rdev_size_show(mdk_rdev_t *rdev, char *page)
+rdev_size_show(struct md_rdev *rdev, char *page)
 {
 {
 	return sprintf(page, "%llu\n", (unsigned long long)rdev->sectors / 2);
 	return sprintf(page, "%llu\n", (unsigned long long)rdev->sectors / 2);
 }
 }
@@ -2818,9 +2817,9 @@ static int strict_blocks_to_sectors(const char *buf, sector_t *sectors)
 }
 }
 
 
 static ssize_t
 static ssize_t
-rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
+rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len)
 {
 {
-	mddev_t *my_mddev = rdev->mddev;
+	struct mddev *my_mddev = rdev->mddev;
 	sector_t oldsectors = rdev->sectors;
 	sector_t oldsectors = rdev->sectors;
 	sector_t sectors;
 	sector_t sectors;
 
 
@@ -2846,13 +2845,13 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 		 * a deadlock.  We have already changed rdev->sectors, and if
 		 * a deadlock.  We have already changed rdev->sectors, and if
 		 * we have to change it back, we will have the lock again.
 		 * we have to change it back, we will have the lock again.
 		 */
 		 */
-		mddev_t *mddev;
+		struct mddev *mddev;
 		int overlap = 0;
 		int overlap = 0;
 		struct list_head *tmp;
 		struct list_head *tmp;
 
 
 		mddev_unlock(my_mddev);
 		mddev_unlock(my_mddev);
 		for_each_mddev(mddev, tmp) {
 		for_each_mddev(mddev, tmp) {
-			mdk_rdev_t *rdev2;
+			struct md_rdev *rdev2;
 
 
 			mddev_lock(mddev);
 			mddev_lock(mddev);
 			list_for_each_entry(rdev2, &mddev->disks, same_set)
 			list_for_each_entry(rdev2, &mddev->disks, same_set)
@@ -2889,7 +2888,7 @@ static struct rdev_sysfs_entry rdev_size =
 __ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store);
 __ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store);
 
 
 
 
-static ssize_t recovery_start_show(mdk_rdev_t *rdev, char *page)
+static ssize_t recovery_start_show(struct md_rdev *rdev, char *page)
 {
 {
 	unsigned long long recovery_start = rdev->recovery_offset;
 	unsigned long long recovery_start = rdev->recovery_offset;
 
 
@@ -2900,7 +2899,7 @@ static ssize_t recovery_start_show(mdk_rdev_t *rdev, char *page)
 	return sprintf(page, "%llu\n", recovery_start);
 	return sprintf(page, "%llu\n", recovery_start);
 }
 }
 
 
-static ssize_t recovery_start_store(mdk_rdev_t *rdev, const char *buf, size_t len)
+static ssize_t recovery_start_store(struct md_rdev *rdev, const char *buf, size_t len)
 {
 {
 	unsigned long long recovery_start;
 	unsigned long long recovery_start;
 
 
@@ -2930,11 +2929,11 @@ badblocks_show(struct badblocks *bb, char *page, int unack);
 static ssize_t
 static ssize_t
 badblocks_store(struct badblocks *bb, const char *page, size_t len, int unack);
 badblocks_store(struct badblocks *bb, const char *page, size_t len, int unack);
 
 
-static ssize_t bb_show(mdk_rdev_t *rdev, char *page)
+static ssize_t bb_show(struct md_rdev *rdev, char *page)
 {
 {
 	return badblocks_show(&rdev->badblocks, page, 0);
 	return badblocks_show(&rdev->badblocks, page, 0);
 }
 }
-static ssize_t bb_store(mdk_rdev_t *rdev, const char *page, size_t len)
+static ssize_t bb_store(struct md_rdev *rdev, const char *page, size_t len)
 {
 {
 	int rv = badblocks_store(&rdev->badblocks, page, len, 0);
 	int rv = badblocks_store(&rdev->badblocks, page, len, 0);
 	/* Maybe that ack was all we needed */
 	/* Maybe that ack was all we needed */
@@ -2946,11 +2945,11 @@ static struct rdev_sysfs_entry rdev_bad_blocks =
 __ATTR(bad_blocks, S_IRUGO|S_IWUSR, bb_show, bb_store);
 __ATTR(bad_blocks, S_IRUGO|S_IWUSR, bb_show, bb_store);
 
 
 
 
-static ssize_t ubb_show(mdk_rdev_t *rdev, char *page)
+static ssize_t ubb_show(struct md_rdev *rdev, char *page)
 {
 {
 	return badblocks_show(&rdev->badblocks, page, 1);
 	return badblocks_show(&rdev->badblocks, page, 1);
 }
 }
-static ssize_t ubb_store(mdk_rdev_t *rdev, const char *page, size_t len)
+static ssize_t ubb_store(struct md_rdev *rdev, const char *page, size_t len)
 {
 {
 	return badblocks_store(&rdev->badblocks, page, len, 1);
 	return badblocks_store(&rdev->badblocks, page, len, 1);
 }
 }
@@ -2972,8 +2971,8 @@ static ssize_t
 rdev_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
 rdev_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
 {
 {
 	struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr);
 	struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr);
-	mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj);
-	mddev_t *mddev = rdev->mddev;
+	struct md_rdev *rdev = container_of(kobj, struct md_rdev, kobj);
+	struct mddev *mddev = rdev->mddev;
 	ssize_t rv;
 	ssize_t rv;
 
 
 	if (!entry->show)
 	if (!entry->show)
@@ -2995,9 +2994,9 @@ rdev_attr_store(struct kobject *kobj, struct attribute *attr,
 	      const char *page, size_t length)
 	      const char *page, size_t length)
 {
 {
 	struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr);
 	struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr);
-	mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj);
+	struct md_rdev *rdev = container_of(kobj, struct md_rdev, kobj);
 	ssize_t rv;
 	ssize_t rv;
-	mddev_t *mddev = rdev->mddev;
+	struct mddev *mddev = rdev->mddev;
 
 
 	if (!entry->store)
 	if (!entry->store)
 		return -EIO;
 		return -EIO;
@@ -3016,7 +3015,7 @@ rdev_attr_store(struct kobject *kobj, struct attribute *attr,
 
 
 static void rdev_free(struct kobject *ko)
 static void rdev_free(struct kobject *ko)
 {
 {
-	mdk_rdev_t *rdev = container_of(ko, mdk_rdev_t, kobj);
+	struct md_rdev *rdev = container_of(ko, struct md_rdev, kobj);
 	kfree(rdev);
 	kfree(rdev);
 }
 }
 static const struct sysfs_ops rdev_sysfs_ops = {
 static const struct sysfs_ops rdev_sysfs_ops = {
@@ -3029,7 +3028,7 @@ static struct kobj_type rdev_ktype = {
 	.default_attrs	= rdev_default_attrs,
 	.default_attrs	= rdev_default_attrs,
 };
 };
 
 
-int md_rdev_init(mdk_rdev_t *rdev)
+int md_rdev_init(struct md_rdev *rdev)
 {
 {
 	rdev->desc_nr = -1;
 	rdev->desc_nr = -1;
 	rdev->saved_raid_disk = -1;
 	rdev->saved_raid_disk = -1;
@@ -3072,11 +3071,11 @@ EXPORT_SYMBOL_GPL(md_rdev_init);
  *
  *
  * a faulty rdev _never_ has rdev->sb set.
  * a faulty rdev _never_ has rdev->sb set.
  */
  */
-static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_minor)
+static struct md_rdev *md_import_device(dev_t newdev, int super_format, int super_minor)
 {
 {
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 	int err;
 	int err;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	sector_t size;
 	sector_t size;
 
 
 	rdev = kzalloc(sizeof(*rdev), GFP_KERNEL);
 	rdev = kzalloc(sizeof(*rdev), GFP_KERNEL);
@@ -3145,10 +3144,10 @@ abort_free:
  */
  */
 
 
 
 
-static void analyze_sbs(mddev_t * mddev)
+static void analyze_sbs(struct mddev * mddev)
 {
 {
 	int i;
 	int i;
-	mdk_rdev_t *rdev, *freshest, *tmp;
+	struct md_rdev *rdev, *freshest, *tmp;
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 
 
 	freshest = NULL;
 	freshest = NULL;
@@ -3248,13 +3247,13 @@ int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale)
 static void md_safemode_timeout(unsigned long data);
 static void md_safemode_timeout(unsigned long data);
 
 
 static ssize_t
 static ssize_t
-safe_delay_show(mddev_t *mddev, char *page)
+safe_delay_show(struct mddev *mddev, char *page)
 {
 {
 	int msec = (mddev->safemode_delay*1000)/HZ;
 	int msec = (mddev->safemode_delay*1000)/HZ;
 	return sprintf(page, "%d.%03d\n", msec/1000, msec%1000);
 	return sprintf(page, "%d.%03d\n", msec/1000, msec%1000);
 }
 }
 static ssize_t
 static ssize_t
-safe_delay_store(mddev_t *mddev, const char *cbuf, size_t len)
+safe_delay_store(struct mddev *mddev, const char *cbuf, size_t len)
 {
 {
 	unsigned long msec;
 	unsigned long msec;
 
 
@@ -3276,9 +3275,9 @@ static struct md_sysfs_entry md_safe_delay =
 __ATTR(safe_mode_delay, S_IRUGO|S_IWUSR,safe_delay_show, safe_delay_store);
 __ATTR(safe_mode_delay, S_IRUGO|S_IWUSR,safe_delay_show, safe_delay_store);
 
 
 static ssize_t
 static ssize_t
-level_show(mddev_t *mddev, char *page)
+level_show(struct mddev *mddev, char *page)
 {
 {
-	struct mdk_personality *p = mddev->pers;
+	struct md_personality *p = mddev->pers;
 	if (p)
 	if (p)
 		return sprintf(page, "%s\n", p->name);
 		return sprintf(page, "%s\n", p->name);
 	else if (mddev->clevel[0])
 	else if (mddev->clevel[0])
@@ -3290,14 +3289,14 @@ level_show(mddev_t *mddev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-level_store(mddev_t *mddev, const char *buf, size_t len)
+level_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	char clevel[16];
 	char clevel[16];
 	ssize_t rv = len;
 	ssize_t rv = len;
-	struct mdk_personality *pers;
+	struct md_personality *pers;
 	long level;
 	long level;
 	void *priv;
 	void *priv;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	if (mddev->pers == NULL) {
 	if (mddev->pers == NULL) {
 		if (len == 0)
 		if (len == 0)
@@ -3471,7 +3470,7 @@ __ATTR(level, S_IRUGO|S_IWUSR, level_show, level_store);
 
 
 
 
 static ssize_t
 static ssize_t
-layout_show(mddev_t *mddev, char *page)
+layout_show(struct mddev *mddev, char *page)
 {
 {
 	/* just a number, not meaningful for all levels */
 	/* just a number, not meaningful for all levels */
 	if (mddev->reshape_position != MaxSector &&
 	if (mddev->reshape_position != MaxSector &&
@@ -3482,7 +3481,7 @@ layout_show(mddev_t *mddev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-layout_store(mddev_t *mddev, const char *buf, size_t len)
+layout_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	char *e;
 	char *e;
 	unsigned long n = simple_strtoul(buf, &e, 10);
 	unsigned long n = simple_strtoul(buf, &e, 10);
@@ -3512,7 +3511,7 @@ __ATTR(layout, S_IRUGO|S_IWUSR, layout_show, layout_store);
 
 
 
 
 static ssize_t
 static ssize_t
-raid_disks_show(mddev_t *mddev, char *page)
+raid_disks_show(struct mddev *mddev, char *page)
 {
 {
 	if (mddev->raid_disks == 0)
 	if (mddev->raid_disks == 0)
 		return 0;
 		return 0;
@@ -3523,10 +3522,10 @@ raid_disks_show(mddev_t *mddev, char *page)
 	return sprintf(page, "%d\n", mddev->raid_disks);
 	return sprintf(page, "%d\n", mddev->raid_disks);
 }
 }
 
 
-static int update_raid_disks(mddev_t *mddev, int raid_disks);
+static int update_raid_disks(struct mddev *mddev, int raid_disks);
 
 
 static ssize_t
 static ssize_t
-raid_disks_store(mddev_t *mddev, const char *buf, size_t len)
+raid_disks_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	char *e;
 	char *e;
 	int rv = 0;
 	int rv = 0;
@@ -3549,7 +3548,7 @@ static struct md_sysfs_entry md_raid_disks =
 __ATTR(raid_disks, S_IRUGO|S_IWUSR, raid_disks_show, raid_disks_store);
 __ATTR(raid_disks, S_IRUGO|S_IWUSR, raid_disks_show, raid_disks_store);
 
 
 static ssize_t
 static ssize_t
-chunk_size_show(mddev_t *mddev, char *page)
+chunk_size_show(struct mddev *mddev, char *page)
 {
 {
 	if (mddev->reshape_position != MaxSector &&
 	if (mddev->reshape_position != MaxSector &&
 	    mddev->chunk_sectors != mddev->new_chunk_sectors)
 	    mddev->chunk_sectors != mddev->new_chunk_sectors)
@@ -3560,7 +3559,7 @@ chunk_size_show(mddev_t *mddev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-chunk_size_store(mddev_t *mddev, const char *buf, size_t len)
+chunk_size_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	char *e;
 	char *e;
 	unsigned long n = simple_strtoul(buf, &e, 10);
 	unsigned long n = simple_strtoul(buf, &e, 10);
@@ -3589,7 +3588,7 @@ static struct md_sysfs_entry md_chunk_size =
 __ATTR(chunk_size, S_IRUGO|S_IWUSR, chunk_size_show, chunk_size_store);
 __ATTR(chunk_size, S_IRUGO|S_IWUSR, chunk_size_show, chunk_size_store);
 
 
 static ssize_t
 static ssize_t
-resync_start_show(mddev_t *mddev, char *page)
+resync_start_show(struct mddev *mddev, char *page)
 {
 {
 	if (mddev->recovery_cp == MaxSector)
 	if (mddev->recovery_cp == MaxSector)
 		return sprintf(page, "none\n");
 		return sprintf(page, "none\n");
@@ -3597,7 +3596,7 @@ resync_start_show(mddev_t *mddev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-resync_start_store(mddev_t *mddev, const char *buf, size_t len)
+resync_start_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	char *e;
 	char *e;
 	unsigned long long n = simple_strtoull(buf, &e, 10);
 	unsigned long long n = simple_strtoull(buf, &e, 10);
@@ -3667,7 +3666,7 @@ static int match_word(const char *word, char **list)
 }
 }
 
 
 static ssize_t
 static ssize_t
-array_state_show(mddev_t *mddev, char *page)
+array_state_show(struct mddev *mddev, char *page)
 {
 {
 	enum array_state st = inactive;
 	enum array_state st = inactive;
 
 
@@ -3700,13 +3699,13 @@ array_state_show(mddev_t *mddev, char *page)
 	return sprintf(page, "%s\n", array_states[st]);
 	return sprintf(page, "%s\n", array_states[st]);
 }
 }
 
 
-static int do_md_stop(mddev_t * mddev, int ro, int is_open);
-static int md_set_readonly(mddev_t * mddev, int is_open);
-static int do_md_run(mddev_t * mddev);
-static int restart_array(mddev_t *mddev);
+static int do_md_stop(struct mddev * mddev, int ro, int is_open);
+static int md_set_readonly(struct mddev * mddev, int is_open);
+static int do_md_run(struct mddev * mddev);
+static int restart_array(struct mddev *mddev);
 
 
 static ssize_t
 static ssize_t
-array_state_store(mddev_t *mddev, const char *buf, size_t len)
+array_state_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	int err = -EINVAL;
 	int err = -EINVAL;
 	enum array_state st = match_word(buf, array_states);
 	enum array_state st = match_word(buf, array_states);
@@ -3800,13 +3799,13 @@ static struct md_sysfs_entry md_array_state =
 __ATTR(array_state, S_IRUGO|S_IWUSR, array_state_show, array_state_store);
 __ATTR(array_state, S_IRUGO|S_IWUSR, array_state_show, array_state_store);
 
 
 static ssize_t
 static ssize_t
-max_corrected_read_errors_show(mddev_t *mddev, char *page) {
+max_corrected_read_errors_show(struct mddev *mddev, char *page) {
 	return sprintf(page, "%d\n",
 	return sprintf(page, "%d\n",
 		       atomic_read(&mddev->max_corr_read_errors));
 		       atomic_read(&mddev->max_corr_read_errors));
 }
 }
 
 
 static ssize_t
 static ssize_t
-max_corrected_read_errors_store(mddev_t *mddev, const char *buf, size_t len)
+max_corrected_read_errors_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	char *e;
 	char *e;
 	unsigned long n = simple_strtoul(buf, &e, 10);
 	unsigned long n = simple_strtoul(buf, &e, 10);
@@ -3823,13 +3822,13 @@ __ATTR(max_read_errors, S_IRUGO|S_IWUSR, max_corrected_read_errors_show,
 	max_corrected_read_errors_store);
 	max_corrected_read_errors_store);
 
 
 static ssize_t
 static ssize_t
-null_show(mddev_t *mddev, char *page)
+null_show(struct mddev *mddev, char *page)
 {
 {
 	return -EINVAL;
 	return -EINVAL;
 }
 }
 
 
 static ssize_t
 static ssize_t
-new_dev_store(mddev_t *mddev, const char *buf, size_t len)
+new_dev_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	/* buf must be %d:%d\n? giving major and minor numbers */
 	/* buf must be %d:%d\n? giving major and minor numbers */
 	/* The new device is added to the array.
 	/* The new device is added to the array.
@@ -3842,7 +3841,7 @@ new_dev_store(mddev_t *mddev, const char *buf, size_t len)
 	int major = simple_strtoul(buf, &e, 10);
 	int major = simple_strtoul(buf, &e, 10);
 	int minor;
 	int minor;
 	dev_t dev;
 	dev_t dev;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	int err;
 	int err;
 
 
 	if (!*buf || *e != ':' || !e[1] || e[1] == '\n')
 	if (!*buf || *e != ':' || !e[1] || e[1] == '\n')
@@ -3860,8 +3859,9 @@ new_dev_store(mddev_t *mddev, const char *buf, size_t len)
 		rdev = md_import_device(dev, mddev->major_version,
 		rdev = md_import_device(dev, mddev->major_version,
 					mddev->minor_version);
 					mddev->minor_version);
 		if (!IS_ERR(rdev) && !list_empty(&mddev->disks)) {
 		if (!IS_ERR(rdev) && !list_empty(&mddev->disks)) {
-			mdk_rdev_t *rdev0 = list_entry(mddev->disks.next,
-						       mdk_rdev_t, same_set);
+			struct md_rdev *rdev0
+				= list_entry(mddev->disks.next,
+					     struct md_rdev, same_set);
 			err = super_types[mddev->major_version]
 			err = super_types[mddev->major_version]
 				.load_super(rdev, rdev0, mddev->minor_version);
 				.load_super(rdev, rdev0, mddev->minor_version);
 			if (err < 0)
 			if (err < 0)
@@ -3885,7 +3885,7 @@ static struct md_sysfs_entry md_new_device =
 __ATTR(new_dev, S_IWUSR, null_show, new_dev_store);
 __ATTR(new_dev, S_IWUSR, null_show, new_dev_store);
 
 
 static ssize_t
 static ssize_t
-bitmap_store(mddev_t *mddev, const char *buf, size_t len)
+bitmap_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	char *end;
 	char *end;
 	unsigned long chunk, end_chunk;
 	unsigned long chunk, end_chunk;
@@ -3914,16 +3914,16 @@ static struct md_sysfs_entry md_bitmap =
 __ATTR(bitmap_set_bits, S_IWUSR, null_show, bitmap_store);
 __ATTR(bitmap_set_bits, S_IWUSR, null_show, bitmap_store);
 
 
 static ssize_t
 static ssize_t
-size_show(mddev_t *mddev, char *page)
+size_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%llu\n",
 	return sprintf(page, "%llu\n",
 		(unsigned long long)mddev->dev_sectors / 2);
 		(unsigned long long)mddev->dev_sectors / 2);
 }
 }
 
 
-static int update_size(mddev_t *mddev, sector_t num_sectors);
+static int update_size(struct mddev *mddev, sector_t num_sectors);
 
 
 static ssize_t
 static ssize_t
-size_store(mddev_t *mddev, const char *buf, size_t len)
+size_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	/* If array is inactive, we can reduce the component size, but
 	/* If array is inactive, we can reduce the component size, but
 	 * not increase it (except from 0).
 	 * not increase it (except from 0).
@@ -3958,7 +3958,7 @@ __ATTR(component_size, S_IRUGO|S_IWUSR, size_show, size_store);
  * or N.M for internally known formats
  * or N.M for internally known formats
  */
  */
 static ssize_t
 static ssize_t
-metadata_show(mddev_t *mddev, char *page)
+metadata_show(struct mddev *mddev, char *page)
 {
 {
 	if (mddev->persistent)
 	if (mddev->persistent)
 		return sprintf(page, "%d.%d\n",
 		return sprintf(page, "%d.%d\n",
@@ -3970,7 +3970,7 @@ metadata_show(mddev_t *mddev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-metadata_store(mddev_t *mddev, const char *buf, size_t len)
+metadata_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	int major, minor;
 	int major, minor;
 	char *e;
 	char *e;
@@ -4024,7 +4024,7 @@ static struct md_sysfs_entry md_metadata =
 __ATTR(metadata_version, S_IRUGO|S_IWUSR, metadata_show, metadata_store);
 __ATTR(metadata_version, S_IRUGO|S_IWUSR, metadata_show, metadata_store);
 
 
 static ssize_t
 static ssize_t
-action_show(mddev_t *mddev, char *page)
+action_show(struct mddev *mddev, char *page)
 {
 {
 	char *type = "idle";
 	char *type = "idle";
 	if (test_bit(MD_RECOVERY_FROZEN, &mddev->recovery))
 	if (test_bit(MD_RECOVERY_FROZEN, &mddev->recovery))
@@ -4046,10 +4046,10 @@ action_show(mddev_t *mddev, char *page)
 	return sprintf(page, "%s\n", type);
 	return sprintf(page, "%s\n", type);
 }
 }
 
 
-static void reap_sync_thread(mddev_t *mddev);
+static void reap_sync_thread(struct mddev *mddev);
 
 
 static ssize_t
 static ssize_t
-action_store(mddev_t *mddev, const char *page, size_t len)
+action_store(struct mddev *mddev, const char *page, size_t len)
 {
 {
 	if (!mddev->pers || !mddev->pers->sync_request)
 	if (!mddev->pers || !mddev->pers->sync_request)
 		return -EINVAL;
 		return -EINVAL;
@@ -4095,7 +4095,7 @@ action_store(mddev_t *mddev, const char *page, size_t len)
 }
 }
 
 
 static ssize_t
 static ssize_t
-mismatch_cnt_show(mddev_t *mddev, char *page)
+mismatch_cnt_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%llu\n",
 	return sprintf(page, "%llu\n",
 		       (unsigned long long) mddev->resync_mismatches);
 		       (unsigned long long) mddev->resync_mismatches);
@@ -4108,14 +4108,14 @@ __ATTR(sync_action, S_IRUGO|S_IWUSR, action_show, action_store);
 static struct md_sysfs_entry md_mismatches = __ATTR_RO(mismatch_cnt);
 static struct md_sysfs_entry md_mismatches = __ATTR_RO(mismatch_cnt);
 
 
 static ssize_t
 static ssize_t
-sync_min_show(mddev_t *mddev, char *page)
+sync_min_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%d (%s)\n", speed_min(mddev),
 	return sprintf(page, "%d (%s)\n", speed_min(mddev),
 		       mddev->sync_speed_min ? "local": "system");
 		       mddev->sync_speed_min ? "local": "system");
 }
 }
 
 
 static ssize_t
 static ssize_t
-sync_min_store(mddev_t *mddev, const char *buf, size_t len)
+sync_min_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	int min;
 	int min;
 	char *e;
 	char *e;
@@ -4134,14 +4134,14 @@ static struct md_sysfs_entry md_sync_min =
 __ATTR(sync_speed_min, S_IRUGO|S_IWUSR, sync_min_show, sync_min_store);
 __ATTR(sync_speed_min, S_IRUGO|S_IWUSR, sync_min_show, sync_min_store);
 
 
 static ssize_t
 static ssize_t
-sync_max_show(mddev_t *mddev, char *page)
+sync_max_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%d (%s)\n", speed_max(mddev),
 	return sprintf(page, "%d (%s)\n", speed_max(mddev),
 		       mddev->sync_speed_max ? "local": "system");
 		       mddev->sync_speed_max ? "local": "system");
 }
 }
 
 
 static ssize_t
 static ssize_t
-sync_max_store(mddev_t *mddev, const char *buf, size_t len)
+sync_max_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	int max;
 	int max;
 	char *e;
 	char *e;
@@ -4160,20 +4160,20 @@ static struct md_sysfs_entry md_sync_max =
 __ATTR(sync_speed_max, S_IRUGO|S_IWUSR, sync_max_show, sync_max_store);
 __ATTR(sync_speed_max, S_IRUGO|S_IWUSR, sync_max_show, sync_max_store);
 
 
 static ssize_t
 static ssize_t
-degraded_show(mddev_t *mddev, char *page)
+degraded_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%d\n", mddev->degraded);
 	return sprintf(page, "%d\n", mddev->degraded);
 }
 }
 static struct md_sysfs_entry md_degraded = __ATTR_RO(degraded);
 static struct md_sysfs_entry md_degraded = __ATTR_RO(degraded);
 
 
 static ssize_t
 static ssize_t
-sync_force_parallel_show(mddev_t *mddev, char *page)
+sync_force_parallel_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%d\n", mddev->parallel_resync);
 	return sprintf(page, "%d\n", mddev->parallel_resync);
 }
 }
 
 
 static ssize_t
 static ssize_t
-sync_force_parallel_store(mddev_t *mddev, const char *buf, size_t len)
+sync_force_parallel_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	long n;
 	long n;
 
 
@@ -4197,7 +4197,7 @@ __ATTR(sync_force_parallel, S_IRUGO|S_IWUSR,
        sync_force_parallel_show, sync_force_parallel_store);
        sync_force_parallel_show, sync_force_parallel_store);
 
 
 static ssize_t
 static ssize_t
-sync_speed_show(mddev_t *mddev, char *page)
+sync_speed_show(struct mddev *mddev, char *page)
 {
 {
 	unsigned long resync, dt, db;
 	unsigned long resync, dt, db;
 	if (mddev->curr_resync == 0)
 	if (mddev->curr_resync == 0)
@@ -4212,7 +4212,7 @@ sync_speed_show(mddev_t *mddev, char *page)
 static struct md_sysfs_entry md_sync_speed = __ATTR_RO(sync_speed);
 static struct md_sysfs_entry md_sync_speed = __ATTR_RO(sync_speed);
 
 
 static ssize_t
 static ssize_t
-sync_completed_show(mddev_t *mddev, char *page)
+sync_completed_show(struct mddev *mddev, char *page)
 {
 {
 	unsigned long long max_sectors, resync;
 	unsigned long long max_sectors, resync;
 
 
@@ -4231,13 +4231,13 @@ sync_completed_show(mddev_t *mddev, char *page)
 static struct md_sysfs_entry md_sync_completed = __ATTR_RO(sync_completed);
 static struct md_sysfs_entry md_sync_completed = __ATTR_RO(sync_completed);
 
 
 static ssize_t
 static ssize_t
-min_sync_show(mddev_t *mddev, char *page)
+min_sync_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%llu\n",
 	return sprintf(page, "%llu\n",
 		       (unsigned long long)mddev->resync_min);
 		       (unsigned long long)mddev->resync_min);
 }
 }
 static ssize_t
 static ssize_t
-min_sync_store(mddev_t *mddev, const char *buf, size_t len)
+min_sync_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	unsigned long long min;
 	unsigned long long min;
 	if (strict_strtoull(buf, 10, &min))
 	if (strict_strtoull(buf, 10, &min))
@@ -4262,7 +4262,7 @@ static struct md_sysfs_entry md_min_sync =
 __ATTR(sync_min, S_IRUGO|S_IWUSR, min_sync_show, min_sync_store);
 __ATTR(sync_min, S_IRUGO|S_IWUSR, min_sync_show, min_sync_store);
 
 
 static ssize_t
 static ssize_t
-max_sync_show(mddev_t *mddev, char *page)
+max_sync_show(struct mddev *mddev, char *page)
 {
 {
 	if (mddev->resync_max == MaxSector)
 	if (mddev->resync_max == MaxSector)
 		return sprintf(page, "max\n");
 		return sprintf(page, "max\n");
@@ -4271,7 +4271,7 @@ max_sync_show(mddev_t *mddev, char *page)
 			       (unsigned long long)mddev->resync_max);
 			       (unsigned long long)mddev->resync_max);
 }
 }
 static ssize_t
 static ssize_t
-max_sync_store(mddev_t *mddev, const char *buf, size_t len)
+max_sync_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	if (strncmp(buf, "max", 3) == 0)
 	if (strncmp(buf, "max", 3) == 0)
 		mddev->resync_max = MaxSector;
 		mddev->resync_max = MaxSector;
@@ -4302,13 +4302,13 @@ static struct md_sysfs_entry md_max_sync =
 __ATTR(sync_max, S_IRUGO|S_IWUSR, max_sync_show, max_sync_store);
 __ATTR(sync_max, S_IRUGO|S_IWUSR, max_sync_show, max_sync_store);
 
 
 static ssize_t
 static ssize_t
-suspend_lo_show(mddev_t *mddev, char *page)
+suspend_lo_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo);
 	return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo);
 }
 }
 
 
 static ssize_t
 static ssize_t
-suspend_lo_store(mddev_t *mddev, const char *buf, size_t len)
+suspend_lo_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	char *e;
 	char *e;
 	unsigned long long new = simple_strtoull(buf, &e, 10);
 	unsigned long long new = simple_strtoull(buf, &e, 10);
@@ -4336,13 +4336,13 @@ __ATTR(suspend_lo, S_IRUGO|S_IWUSR, suspend_lo_show, suspend_lo_store);
 
 
 
 
 static ssize_t
 static ssize_t
-suspend_hi_show(mddev_t *mddev, char *page)
+suspend_hi_show(struct mddev *mddev, char *page)
 {
 {
 	return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi);
 	return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi);
 }
 }
 
 
 static ssize_t
 static ssize_t
-suspend_hi_store(mddev_t *mddev, const char *buf, size_t len)
+suspend_hi_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	char *e;
 	char *e;
 	unsigned long long new = simple_strtoull(buf, &e, 10);
 	unsigned long long new = simple_strtoull(buf, &e, 10);
@@ -4369,7 +4369,7 @@ static struct md_sysfs_entry md_suspend_hi =
 __ATTR(suspend_hi, S_IRUGO|S_IWUSR, suspend_hi_show, suspend_hi_store);
 __ATTR(suspend_hi, S_IRUGO|S_IWUSR, suspend_hi_show, suspend_hi_store);
 
 
 static ssize_t
 static ssize_t
-reshape_position_show(mddev_t *mddev, char *page)
+reshape_position_show(struct mddev *mddev, char *page)
 {
 {
 	if (mddev->reshape_position != MaxSector)
 	if (mddev->reshape_position != MaxSector)
 		return sprintf(page, "%llu\n",
 		return sprintf(page, "%llu\n",
@@ -4379,7 +4379,7 @@ reshape_position_show(mddev_t *mddev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-reshape_position_store(mddev_t *mddev, const char *buf, size_t len)
+reshape_position_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	char *e;
 	char *e;
 	unsigned long long new = simple_strtoull(buf, &e, 10);
 	unsigned long long new = simple_strtoull(buf, &e, 10);
@@ -4400,7 +4400,7 @@ __ATTR(reshape_position, S_IRUGO|S_IWUSR, reshape_position_show,
        reshape_position_store);
        reshape_position_store);
 
 
 static ssize_t
 static ssize_t
-array_size_show(mddev_t *mddev, char *page)
+array_size_show(struct mddev *mddev, char *page)
 {
 {
 	if (mddev->external_size)
 	if (mddev->external_size)
 		return sprintf(page, "%llu\n",
 		return sprintf(page, "%llu\n",
@@ -4410,7 +4410,7 @@ array_size_show(mddev_t *mddev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-array_size_store(mddev_t *mddev, const char *buf, size_t len)
+array_size_store(struct mddev *mddev, const char *buf, size_t len)
 {
 {
 	sector_t sectors;
 	sector_t sectors;
 
 
@@ -4485,7 +4485,7 @@ static ssize_t
 md_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
 md_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
 {
 {
 	struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr);
 	struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr);
-	mddev_t *mddev = container_of(kobj, struct mddev_s, kobj);
+	struct mddev *mddev = container_of(kobj, struct mddev, kobj);
 	ssize_t rv;
 	ssize_t rv;
 
 
 	if (!entry->show)
 	if (!entry->show)
@@ -4503,7 +4503,7 @@ md_attr_store(struct kobject *kobj, struct attribute *attr,
 	      const char *page, size_t length)
 	      const char *page, size_t length)
 {
 {
 	struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr);
 	struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr);
-	mddev_t *mddev = container_of(kobj, struct mddev_s, kobj);
+	struct mddev *mddev = container_of(kobj, struct mddev, kobj);
 	ssize_t rv;
 	ssize_t rv;
 
 
 	if (!entry->store)
 	if (!entry->store)
@@ -4522,7 +4522,7 @@ md_attr_store(struct kobject *kobj, struct attribute *attr,
 
 
 static void md_free(struct kobject *ko)
 static void md_free(struct kobject *ko)
 {
 {
-	mddev_t *mddev = container_of(ko, mddev_t, kobj);
+	struct mddev *mddev = container_of(ko, struct mddev, kobj);
 
 
 	if (mddev->sysfs_state)
 	if (mddev->sysfs_state)
 		sysfs_put(mddev->sysfs_state);
 		sysfs_put(mddev->sysfs_state);
@@ -4551,7 +4551,7 @@ int mdp_major = 0;
 
 
 static void mddev_delayed_delete(struct work_struct *ws)
 static void mddev_delayed_delete(struct work_struct *ws)
 {
 {
-	mddev_t *mddev = container_of(ws, mddev_t, del_work);
+	struct mddev *mddev = container_of(ws, struct mddev, del_work);
 
 
 	sysfs_remove_group(&mddev->kobj, &md_bitmap_group);
 	sysfs_remove_group(&mddev->kobj, &md_bitmap_group);
 	kobject_del(&mddev->kobj);
 	kobject_del(&mddev->kobj);
@@ -4561,7 +4561,7 @@ static void mddev_delayed_delete(struct work_struct *ws)
 static int md_alloc(dev_t dev, char *name)
 static int md_alloc(dev_t dev, char *name)
 {
 {
 	static DEFINE_MUTEX(disks_mutex);
 	static DEFINE_MUTEX(disks_mutex);
-	mddev_t *mddev = mddev_find(dev);
+	struct mddev *mddev = mddev_find(dev);
 	struct gendisk *disk;
 	struct gendisk *disk;
 	int partitioned;
 	int partitioned;
 	int shift;
 	int shift;
@@ -4588,7 +4588,7 @@ static int md_alloc(dev_t dev, char *name)
 	if (name) {
 	if (name) {
 		/* Need to ensure that 'name' is not a duplicate.
 		/* Need to ensure that 'name' is not a duplicate.
 		 */
 		 */
-		mddev_t *mddev2;
+		struct mddev *mddev2;
 		spin_lock(&all_mddevs_lock);
 		spin_lock(&all_mddevs_lock);
 
 
 		list_for_each_entry(mddev2, &all_mddevs, all_mddevs)
 		list_for_each_entry(mddev2, &all_mddevs, all_mddevs)
@@ -4689,7 +4689,7 @@ static int add_named_array(const char *val, struct kernel_param *kp)
 
 
 static void md_safemode_timeout(unsigned long data)
 static void md_safemode_timeout(unsigned long data)
 {
 {
-	mddev_t *mddev = (mddev_t *) data;
+	struct mddev *mddev = (struct mddev *) data;
 
 
 	if (!atomic_read(&mddev->writes_pending)) {
 	if (!atomic_read(&mddev->writes_pending)) {
 		mddev->safemode = 1;
 		mddev->safemode = 1;
@@ -4701,11 +4701,11 @@ static void md_safemode_timeout(unsigned long data)
 
 
 static int start_dirty_degraded;
 static int start_dirty_degraded;
 
 
-int md_run(mddev_t *mddev)
+int md_run(struct mddev *mddev)
 {
 {
 	int err;
 	int err;
-	mdk_rdev_t *rdev;
-	struct mdk_personality *pers;
+	struct md_rdev *rdev;
+	struct md_personality *pers;
 
 
 	if (list_empty(&mddev->disks))
 	if (list_empty(&mddev->disks))
 		/* cannot run an array with no devices.. */
 		/* cannot run an array with no devices.. */
@@ -4769,7 +4769,7 @@ int md_run(mddev_t *mddev)
 
 
 	if (mddev->bio_set == NULL)
 	if (mddev->bio_set == NULL)
 		mddev->bio_set = bioset_create(BIO_POOL_SIZE,
 		mddev->bio_set = bioset_create(BIO_POOL_SIZE,
-					       sizeof(mddev_t *));
+					       sizeof(struct mddev *));
 
 
 	spin_lock(&pers_lock);
 	spin_lock(&pers_lock);
 	pers = find_pers(mddev->level, mddev->clevel);
 	pers = find_pers(mddev->level, mddev->clevel);
@@ -4804,7 +4804,7 @@ int md_run(mddev_t *mddev)
 		 * configuration.
 		 * configuration.
 		 */
 		 */
 		char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
 		char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
-		mdk_rdev_t *rdev2;
+		struct md_rdev *rdev2;
 		int warned = 0;
 		int warned = 0;
 
 
 		list_for_each_entry(rdev, &mddev->disks, same_set)
 		list_for_each_entry(rdev, &mddev->disks, same_set)
@@ -4903,7 +4903,7 @@ int md_run(mddev_t *mddev)
 }
 }
 EXPORT_SYMBOL_GPL(md_run);
 EXPORT_SYMBOL_GPL(md_run);
 
 
-static int do_md_run(mddev_t *mddev)
+static int do_md_run(struct mddev *mddev)
 {
 {
 	int err;
 	int err;
 
 
@@ -4927,7 +4927,7 @@ out:
 	return err;
 	return err;
 }
 }
 
 
-static int restart_array(mddev_t *mddev)
+static int restart_array(struct mddev *mddev)
 {
 {
 	struct gendisk *disk = mddev->gendisk;
 	struct gendisk *disk = mddev->gendisk;
 
 
@@ -4977,7 +4977,7 @@ void restore_bitmap_write_access(struct file *file)
 	spin_unlock(&inode->i_lock);
 	spin_unlock(&inode->i_lock);
 }
 }
 
 
-static void md_clean(mddev_t *mddev)
+static void md_clean(struct mddev *mddev)
 {
 {
 	mddev->array_sectors = 0;
 	mddev->array_sectors = 0;
 	mddev->external_size = 0;
 	mddev->external_size = 0;
@@ -5020,7 +5020,7 @@ static void md_clean(mddev_t *mddev)
 	mddev->bitmap_info.max_write_behind = 0;
 	mddev->bitmap_info.max_write_behind = 0;
 }
 }
 
 
-static void __md_stop_writes(mddev_t *mddev)
+static void __md_stop_writes(struct mddev *mddev)
 {
 {
 	if (mddev->sync_thread) {
 	if (mddev->sync_thread) {
 		set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
 		set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
@@ -5040,7 +5040,7 @@ static void __md_stop_writes(mddev_t *mddev)
 	}
 	}
 }
 }
 
 
-void md_stop_writes(mddev_t *mddev)
+void md_stop_writes(struct mddev *mddev)
 {
 {
 	mddev_lock(mddev);
 	mddev_lock(mddev);
 	__md_stop_writes(mddev);
 	__md_stop_writes(mddev);
@@ -5048,7 +5048,7 @@ void md_stop_writes(mddev_t *mddev)
 }
 }
 EXPORT_SYMBOL_GPL(md_stop_writes);
 EXPORT_SYMBOL_GPL(md_stop_writes);
 
 
-void md_stop(mddev_t *mddev)
+void md_stop(struct mddev *mddev)
 {
 {
 	mddev->ready = 0;
 	mddev->ready = 0;
 	mddev->pers->stop(mddev);
 	mddev->pers->stop(mddev);
@@ -5060,7 +5060,7 @@ void md_stop(mddev_t *mddev)
 }
 }
 EXPORT_SYMBOL_GPL(md_stop);
 EXPORT_SYMBOL_GPL(md_stop);
 
 
-static int md_set_readonly(mddev_t *mddev, int is_open)
+static int md_set_readonly(struct mddev *mddev, int is_open)
 {
 {
 	int err = 0;
 	int err = 0;
 	mutex_lock(&mddev->open_mutex);
 	mutex_lock(&mddev->open_mutex);
@@ -5090,10 +5090,10 @@ out:
  *   0 - completely stop and dis-assemble array
  *   0 - completely stop and dis-assemble array
  *   2 - stop but do not disassemble array
  *   2 - stop but do not disassemble array
  */
  */
-static int do_md_stop(mddev_t * mddev, int mode, int is_open)
+static int do_md_stop(struct mddev * mddev, int mode, int is_open)
 {
 {
 	struct gendisk *disk = mddev->gendisk;
 	struct gendisk *disk = mddev->gendisk;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	mutex_lock(&mddev->open_mutex);
 	mutex_lock(&mddev->open_mutex);
 	if (atomic_read(&mddev->openers) > is_open ||
 	if (atomic_read(&mddev->openers) > is_open ||
@@ -5156,9 +5156,9 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
 }
 }
 
 
 #ifndef MODULE
 #ifndef MODULE
-static void autorun_array(mddev_t *mddev)
+static void autorun_array(struct mddev *mddev)
 {
 {
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	int err;
 	int err;
 
 
 	if (list_empty(&mddev->disks))
 	if (list_empty(&mddev->disks))
@@ -5193,8 +5193,8 @@ static void autorun_array(mddev_t *mddev)
  */
  */
 static void autorun_devices(int part)
 static void autorun_devices(int part)
 {
 {
-	mdk_rdev_t *rdev0, *rdev, *tmp;
-	mddev_t *mddev;
+	struct md_rdev *rdev0, *rdev, *tmp;
+	struct mddev *mddev;
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 
 
 	printk(KERN_INFO "md: autorun ...\n");
 	printk(KERN_INFO "md: autorun ...\n");
@@ -5203,7 +5203,7 @@ static void autorun_devices(int part)
 		dev_t dev;
 		dev_t dev;
 		LIST_HEAD(candidates);
 		LIST_HEAD(candidates);
 		rdev0 = list_entry(pending_raid_disks.next,
 		rdev0 = list_entry(pending_raid_disks.next,
-					 mdk_rdev_t, same_set);
+					 struct md_rdev, same_set);
 
 
 		printk(KERN_INFO "md: considering %s ...\n",
 		printk(KERN_INFO "md: considering %s ...\n",
 			bdevname(rdev0->bdev,b));
 			bdevname(rdev0->bdev,b));
@@ -5289,11 +5289,11 @@ static int get_version(void __user * arg)
 	return 0;
 	return 0;
 }
 }
 
 
-static int get_array_info(mddev_t * mddev, void __user * arg)
+static int get_array_info(struct mddev * mddev, void __user * arg)
 {
 {
 	mdu_array_info_t info;
 	mdu_array_info_t info;
 	int nr,working,insync,failed,spare;
 	int nr,working,insync,failed,spare;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	nr=working=insync=failed=spare=0;
 	nr=working=insync=failed=spare=0;
 	list_for_each_entry(rdev, &mddev->disks, same_set) {
 	list_for_each_entry(rdev, &mddev->disks, same_set) {
@@ -5342,7 +5342,7 @@ static int get_array_info(mddev_t * mddev, void __user * arg)
 	return 0;
 	return 0;
 }
 }
 
 
-static int get_bitmap_file(mddev_t * mddev, void __user * arg)
+static int get_bitmap_file(struct mddev * mddev, void __user * arg)
 {
 {
 	mdu_bitmap_file_t *file = NULL; /* too big for stack allocation */
 	mdu_bitmap_file_t *file = NULL; /* too big for stack allocation */
 	char *ptr, *buf = NULL;
 	char *ptr, *buf = NULL;
@@ -5382,10 +5382,10 @@ out:
 	return err;
 	return err;
 }
 }
 
 
-static int get_disk_info(mddev_t * mddev, void __user * arg)
+static int get_disk_info(struct mddev * mddev, void __user * arg)
 {
 {
 	mdu_disk_info_t info;
 	mdu_disk_info_t info;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	if (copy_from_user(&info, arg, sizeof(info)))
 	if (copy_from_user(&info, arg, sizeof(info)))
 		return -EFAULT;
 		return -EFAULT;
@@ -5416,10 +5416,10 @@ static int get_disk_info(mddev_t * mddev, void __user * arg)
 	return 0;
 	return 0;
 }
 }
 
 
-static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
+static int add_new_disk(struct mddev * mddev, mdu_disk_info_t *info)
 {
 {
 	char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	dev_t dev = MKDEV(info->major,info->minor);
 	dev_t dev = MKDEV(info->major,info->minor);
 
 
 	if (info->major != MAJOR(dev) || info->minor != MINOR(dev))
 	if (info->major != MAJOR(dev) || info->minor != MINOR(dev))
@@ -5436,8 +5436,9 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
 			return PTR_ERR(rdev);
 			return PTR_ERR(rdev);
 		}
 		}
 		if (!list_empty(&mddev->disks)) {
 		if (!list_empty(&mddev->disks)) {
-			mdk_rdev_t *rdev0 = list_entry(mddev->disks.next,
-							mdk_rdev_t, same_set);
+			struct md_rdev *rdev0
+				= list_entry(mddev->disks.next,
+					     struct md_rdev, same_set);
 			err = super_types[mddev->major_version]
 			err = super_types[mddev->major_version]
 				.load_super(rdev, rdev0, mddev->minor_version);
 				.load_super(rdev, rdev0, mddev->minor_version);
 			if (err < 0) {
 			if (err < 0) {
@@ -5587,10 +5588,10 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
 	return 0;
 	return 0;
 }
 }
 
 
-static int hot_remove_disk(mddev_t * mddev, dev_t dev)
+static int hot_remove_disk(struct mddev * mddev, dev_t dev)
 {
 {
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	rdev = find_rdev(mddev, dev);
 	rdev = find_rdev(mddev, dev);
 	if (!rdev)
 	if (!rdev)
@@ -5610,11 +5611,11 @@ busy:
 	return -EBUSY;
 	return -EBUSY;
 }
 }
 
 
-static int hot_add_disk(mddev_t * mddev, dev_t dev)
+static int hot_add_disk(struct mddev * mddev, dev_t dev)
 {
 {
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 	int err;
 	int err;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	if (!mddev->pers)
 	if (!mddev->pers)
 		return -ENODEV;
 		return -ENODEV;
@@ -5684,7 +5685,7 @@ abort_export:
 	return err;
 	return err;
 }
 }
 
 
-static int set_bitmap_file(mddev_t *mddev, int fd)
+static int set_bitmap_file(struct mddev *mddev, int fd)
 {
 {
 	int err;
 	int err;
 
 
@@ -5757,7 +5758,7 @@ static int set_bitmap_file(mddev_t *mddev, int fd)
  *  The minor and patch _version numbers are also kept incase the
  *  The minor and patch _version numbers are also kept incase the
  *  super_block handler wishes to interpret them.
  *  super_block handler wishes to interpret them.
  */
  */
-static int set_array_info(mddev_t * mddev, mdu_array_info_t *info)
+static int set_array_info(struct mddev * mddev, mdu_array_info_t *info)
 {
 {
 
 
 	if (info->raid_disks == 0) {
 	if (info->raid_disks == 0) {
@@ -5827,7 +5828,7 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info)
 	return 0;
 	return 0;
 }
 }
 
 
-void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors)
+void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors)
 {
 {
 	WARN(!mddev_is_locked(mddev), "%s: unlocked mddev!\n", __func__);
 	WARN(!mddev_is_locked(mddev), "%s: unlocked mddev!\n", __func__);
 
 
@@ -5838,9 +5839,9 @@ void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors)
 }
 }
 EXPORT_SYMBOL(md_set_array_sectors);
 EXPORT_SYMBOL(md_set_array_sectors);
 
 
-static int update_size(mddev_t *mddev, sector_t num_sectors)
+static int update_size(struct mddev *mddev, sector_t num_sectors)
 {
 {
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	int rv;
 	int rv;
 	int fit = (num_sectors == 0);
 	int fit = (num_sectors == 0);
 
 
@@ -5876,7 +5877,7 @@ static int update_size(mddev_t *mddev, sector_t num_sectors)
 	return rv;
 	return rv;
 }
 }
 
 
-static int update_raid_disks(mddev_t *mddev, int raid_disks)
+static int update_raid_disks(struct mddev *mddev, int raid_disks)
 {
 {
 	int rv;
 	int rv;
 	/* change the number of raid disks */
 	/* change the number of raid disks */
@@ -5904,7 +5905,7 @@ static int update_raid_disks(mddev_t *mddev, int raid_disks)
  * Any differences that cannot be handled will cause an error.
  * Any differences that cannot be handled will cause an error.
  * Normally, only one change can be managed at a time.
  * Normally, only one change can be managed at a time.
  */
  */
-static int update_array_info(mddev_t *mddev, mdu_array_info_t *info)
+static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
 {
 {
 	int rv = 0;
 	int rv = 0;
 	int cnt = 0;
 	int cnt = 0;
@@ -5997,9 +5998,9 @@ static int update_array_info(mddev_t *mddev, mdu_array_info_t *info)
 	return rv;
 	return rv;
 }
 }
 
 
-static int set_disk_faulty(mddev_t *mddev, dev_t dev)
+static int set_disk_faulty(struct mddev *mddev, dev_t dev)
 {
 {
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	if (mddev->pers == NULL)
 	if (mddev->pers == NULL)
 		return -ENODEV;
 		return -ENODEV;
@@ -6022,7 +6023,7 @@ static int set_disk_faulty(mddev_t *mddev, dev_t dev)
  */
  */
 static int md_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 static int md_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 {
 {
-	mddev_t *mddev = bdev->bd_disk->private_data;
+	struct mddev *mddev = bdev->bd_disk->private_data;
 
 
 	geo->heads = 2;
 	geo->heads = 2;
 	geo->sectors = 4;
 	geo->sectors = 4;
@@ -6035,7 +6036,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
 {
 {
 	int err = 0;
 	int err = 0;
 	void __user *argp = (void __user *)arg;
 	void __user *argp = (void __user *)arg;
-	mddev_t *mddev = NULL;
+	struct mddev *mddev = NULL;
 	int ro;
 	int ro;
 
 
 	if (!capable(CAP_SYS_ADMIN))
 	if (!capable(CAP_SYS_ADMIN))
@@ -6298,7 +6299,7 @@ static int md_open(struct block_device *bdev, fmode_t mode)
 	 * Succeed if we can lock the mddev, which confirms that
 	 * Succeed if we can lock the mddev, which confirms that
 	 * it isn't being stopped right now.
 	 * it isn't being stopped right now.
 	 */
 	 */
-	mddev_t *mddev = mddev_find(bdev->bd_dev);
+	struct mddev *mddev = mddev_find(bdev->bd_dev);
 	int err;
 	int err;
 
 
 	if (mddev->gendisk != bdev->bd_disk) {
 	if (mddev->gendisk != bdev->bd_disk) {
@@ -6327,7 +6328,7 @@ static int md_open(struct block_device *bdev, fmode_t mode)
 
 
 static int md_release(struct gendisk *disk, fmode_t mode)
 static int md_release(struct gendisk *disk, fmode_t mode)
 {
 {
- 	mddev_t *mddev = disk->private_data;
+ 	struct mddev *mddev = disk->private_data;
 
 
 	BUG_ON(!mddev);
 	BUG_ON(!mddev);
 	atomic_dec(&mddev->openers);
 	atomic_dec(&mddev->openers);
@@ -6338,14 +6339,14 @@ static int md_release(struct gendisk *disk, fmode_t mode)
 
 
 static int md_media_changed(struct gendisk *disk)
 static int md_media_changed(struct gendisk *disk)
 {
 {
-	mddev_t *mddev = disk->private_data;
+	struct mddev *mddev = disk->private_data;
 
 
 	return mddev->changed;
 	return mddev->changed;
 }
 }
 
 
 static int md_revalidate(struct gendisk *disk)
 static int md_revalidate(struct gendisk *disk)
 {
 {
-	mddev_t *mddev = disk->private_data;
+	struct mddev *mddev = disk->private_data;
 
 
 	mddev->changed = 0;
 	mddev->changed = 0;
 	return 0;
 	return 0;
@@ -6366,7 +6367,7 @@ static const struct block_device_operations md_fops =
 
 
 static int md_thread(void * arg)
 static int md_thread(void * arg)
 {
 {
-	mdk_thread_t *thread = arg;
+	struct md_thread *thread = arg;
 
 
 	/*
 	/*
 	 * md_thread is a 'system-thread', it's priority should be very
 	 * md_thread is a 'system-thread', it's priority should be very
@@ -6405,21 +6406,21 @@ static int md_thread(void * arg)
 	return 0;
 	return 0;
 }
 }
 
 
-void md_wakeup_thread(mdk_thread_t *thread)
+void md_wakeup_thread(struct md_thread *thread)
 {
 {
 	if (thread) {
 	if (thread) {
-		dprintk("md: waking up MD thread %s.\n", thread->tsk->comm);
+		pr_debug("md: waking up MD thread %s.\n", thread->tsk->comm);
 		set_bit(THREAD_WAKEUP, &thread->flags);
 		set_bit(THREAD_WAKEUP, &thread->flags);
 		wake_up(&thread->wqueue);
 		wake_up(&thread->wqueue);
 	}
 	}
 }
 }
 
 
-mdk_thread_t *md_register_thread(void (*run) (mddev_t *), mddev_t *mddev,
+struct md_thread *md_register_thread(void (*run) (struct mddev *), struct mddev *mddev,
 				 const char *name)
 				 const char *name)
 {
 {
-	mdk_thread_t *thread;
+	struct md_thread *thread;
 
 
-	thread = kzalloc(sizeof(mdk_thread_t), GFP_KERNEL);
+	thread = kzalloc(sizeof(struct md_thread), GFP_KERNEL);
 	if (!thread)
 	if (!thread)
 		return NULL;
 		return NULL;
 
 
@@ -6439,12 +6440,12 @@ mdk_thread_t *md_register_thread(void (*run) (mddev_t *), mddev_t *mddev,
 	return thread;
 	return thread;
 }
 }
 
 
-void md_unregister_thread(mdk_thread_t **threadp)
+void md_unregister_thread(struct md_thread **threadp)
 {
 {
-	mdk_thread_t *thread = *threadp;
+	struct md_thread *thread = *threadp;
 	if (!thread)
 	if (!thread)
 		return;
 		return;
-	dprintk("interrupting MD-thread pid %d\n", task_pid_nr(thread->tsk));
+	pr_debug("interrupting MD-thread pid %d\n", task_pid_nr(thread->tsk));
 	/* Locking ensures that mddev_unlock does not wake_up a
 	/* Locking ensures that mddev_unlock does not wake_up a
 	 * non-existent thread
 	 * non-existent thread
 	 */
 	 */
@@ -6456,7 +6457,7 @@ void md_unregister_thread(mdk_thread_t **threadp)
 	kfree(thread);
 	kfree(thread);
 }
 }
 
 
-void md_error(mddev_t *mddev, mdk_rdev_t *rdev)
+void md_error(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	if (!mddev) {
 	if (!mddev) {
 		MD_BUG();
 		MD_BUG();
@@ -6485,7 +6486,7 @@ void md_error(mddev_t *mddev, mdk_rdev_t *rdev)
 static void status_unused(struct seq_file *seq)
 static void status_unused(struct seq_file *seq)
 {
 {
 	int i = 0;
 	int i = 0;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	seq_printf(seq, "unused devices: ");
 	seq_printf(seq, "unused devices: ");
 
 
@@ -6502,7 +6503,7 @@ static void status_unused(struct seq_file *seq)
 }
 }
 
 
 
 
-static void status_resync(struct seq_file *seq, mddev_t * mddev)
+static void status_resync(struct seq_file *seq, struct mddev * mddev)
 {
 {
 	sector_t max_sectors, resync, res;
 	sector_t max_sectors, resync, res;
 	unsigned long dt, db;
 	unsigned long dt, db;
@@ -6593,7 +6594,7 @@ static void *md_seq_start(struct seq_file *seq, loff_t *pos)
 {
 {
 	struct list_head *tmp;
 	struct list_head *tmp;
 	loff_t l = *pos;
 	loff_t l = *pos;
-	mddev_t *mddev;
+	struct mddev *mddev;
 
 
 	if (l >= 0x10000)
 	if (l >= 0x10000)
 		return NULL;
 		return NULL;
@@ -6604,7 +6605,7 @@ static void *md_seq_start(struct seq_file *seq, loff_t *pos)
 	spin_lock(&all_mddevs_lock);
 	spin_lock(&all_mddevs_lock);
 	list_for_each(tmp,&all_mddevs)
 	list_for_each(tmp,&all_mddevs)
 		if (!l--) {
 		if (!l--) {
-			mddev = list_entry(tmp, mddev_t, all_mddevs);
+			mddev = list_entry(tmp, struct mddev, all_mddevs);
 			mddev_get(mddev);
 			mddev_get(mddev);
 			spin_unlock(&all_mddevs_lock);
 			spin_unlock(&all_mddevs_lock);
 			return mddev;
 			return mddev;
@@ -6618,7 +6619,7 @@ static void *md_seq_start(struct seq_file *seq, loff_t *pos)
 static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
 {
 	struct list_head *tmp;
 	struct list_head *tmp;
-	mddev_t *next_mddev, *mddev = v;
+	struct mddev *next_mddev, *mddev = v;
 	
 	
 	++*pos;
 	++*pos;
 	if (v == (void*)2)
 	if (v == (void*)2)
@@ -6630,7 +6631,7 @@ static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 	else
 	else
 		tmp = mddev->all_mddevs.next;
 		tmp = mddev->all_mddevs.next;
 	if (tmp != &all_mddevs)
 	if (tmp != &all_mddevs)
-		next_mddev = mddev_get(list_entry(tmp,mddev_t,all_mddevs));
+		next_mddev = mddev_get(list_entry(tmp,struct mddev,all_mddevs));
 	else {
 	else {
 		next_mddev = (void*)2;
 		next_mddev = (void*)2;
 		*pos = 0x10000;
 		*pos = 0x10000;
@@ -6645,7 +6646,7 @@ static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 
 
 static void md_seq_stop(struct seq_file *seq, void *v)
 static void md_seq_stop(struct seq_file *seq, void *v)
 {
 {
-	mddev_t *mddev = v;
+	struct mddev *mddev = v;
 
 
 	if (mddev && v != (void*)1 && v != (void*)2)
 	if (mddev && v != (void*)1 && v != (void*)2)
 		mddev_put(mddev);
 		mddev_put(mddev);
@@ -6653,13 +6654,13 @@ static void md_seq_stop(struct seq_file *seq, void *v)
 
 
 static int md_seq_show(struct seq_file *seq, void *v)
 static int md_seq_show(struct seq_file *seq, void *v)
 {
 {
-	mddev_t *mddev = v;
+	struct mddev *mddev = v;
 	sector_t sectors;
 	sector_t sectors;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	struct bitmap *bitmap;
 	struct bitmap *bitmap;
 
 
 	if (v == (void*)1) {
 	if (v == (void*)1) {
-		struct mdk_personality *pers;
+		struct md_personality *pers;
 		seq_printf(seq, "Personalities : ");
 		seq_printf(seq, "Personalities : ");
 		spin_lock(&pers_lock);
 		spin_lock(&pers_lock);
 		list_for_each_entry(pers, &pers_list, list)
 		list_for_each_entry(pers, &pers_list, list)
@@ -6815,7 +6816,7 @@ static const struct file_operations md_seq_fops = {
 	.poll		= mdstat_poll,
 	.poll		= mdstat_poll,
 };
 };
 
 
-int register_md_personality(struct mdk_personality *p)
+int register_md_personality(struct md_personality *p)
 {
 {
 	spin_lock(&pers_lock);
 	spin_lock(&pers_lock);
 	list_add_tail(&p->list, &pers_list);
 	list_add_tail(&p->list, &pers_list);
@@ -6824,7 +6825,7 @@ int register_md_personality(struct mdk_personality *p)
 	return 0;
 	return 0;
 }
 }
 
 
-int unregister_md_personality(struct mdk_personality *p)
+int unregister_md_personality(struct md_personality *p)
 {
 {
 	printk(KERN_INFO "md: %s personality unregistered\n", p->name);
 	printk(KERN_INFO "md: %s personality unregistered\n", p->name);
 	spin_lock(&pers_lock);
 	spin_lock(&pers_lock);
@@ -6833,9 +6834,9 @@ int unregister_md_personality(struct mdk_personality *p)
 	return 0;
 	return 0;
 }
 }
 
 
-static int is_mddev_idle(mddev_t *mddev, int init)
+static int is_mddev_idle(struct mddev *mddev, int init)
 {
 {
-	mdk_rdev_t * rdev;
+	struct md_rdev * rdev;
 	int idle;
 	int idle;
 	int curr_events;
 	int curr_events;
 
 
@@ -6877,7 +6878,7 @@ static int is_mddev_idle(mddev_t *mddev, int init)
 	return idle;
 	return idle;
 }
 }
 
 
-void md_done_sync(mddev_t *mddev, int blocks, int ok)
+void md_done_sync(struct mddev *mddev, int blocks, int ok)
 {
 {
 	/* another "blocks" (512byte) blocks have been synced */
 	/* another "blocks" (512byte) blocks have been synced */
 	atomic_sub(blocks, &mddev->recovery_active);
 	atomic_sub(blocks, &mddev->recovery_active);
@@ -6895,7 +6896,7 @@ void md_done_sync(mddev_t *mddev, int blocks, int ok)
  * in superblock) before writing, schedule a superblock update
  * in superblock) before writing, schedule a superblock update
  * and wait for it to complete.
  * and wait for it to complete.
  */
  */
-void md_write_start(mddev_t *mddev, struct bio *bi)
+void md_write_start(struct mddev *mddev, struct bio *bi)
 {
 {
 	int did_change = 0;
 	int did_change = 0;
 	if (bio_data_dir(bi) != WRITE)
 	if (bio_data_dir(bi) != WRITE)
@@ -6930,7 +6931,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi)
 		   !test_bit(MD_CHANGE_PENDING, &mddev->flags));
 		   !test_bit(MD_CHANGE_PENDING, &mddev->flags));
 }
 }
 
 
-void md_write_end(mddev_t *mddev)
+void md_write_end(struct mddev *mddev)
 {
 {
 	if (atomic_dec_and_test(&mddev->writes_pending)) {
 	if (atomic_dec_and_test(&mddev->writes_pending)) {
 		if (mddev->safemode == 2)
 		if (mddev->safemode == 2)
@@ -6949,7 +6950,7 @@ void md_write_end(mddev_t *mddev)
  * In the ->external case MD_CHANGE_CLEAN can not be cleared until mddev->lock
  * In the ->external case MD_CHANGE_CLEAN can not be cleared until mddev->lock
  * is dropped, so return -EAGAIN after notifying userspace.
  * is dropped, so return -EAGAIN after notifying userspace.
  */
  */
-int md_allow_write(mddev_t *mddev)
+int md_allow_write(struct mddev *mddev)
 {
 {
 	if (!mddev->pers)
 	if (!mddev->pers)
 		return 0;
 		return 0;
@@ -6981,9 +6982,9 @@ EXPORT_SYMBOL_GPL(md_allow_write);
 
 
 #define SYNC_MARKS	10
 #define SYNC_MARKS	10
 #define	SYNC_MARK_STEP	(3*HZ)
 #define	SYNC_MARK_STEP	(3*HZ)
-void md_do_sync(mddev_t *mddev)
+void md_do_sync(struct mddev *mddev)
 {
 {
-	mddev_t *mddev2;
+	struct mddev *mddev2;
 	unsigned int currspeed = 0,
 	unsigned int currspeed = 0,
 		 window;
 		 window;
 	sector_t max_sectors,j, io_sectors;
 	sector_t max_sectors,j, io_sectors;
@@ -6993,7 +6994,7 @@ void md_do_sync(mddev_t *mddev)
 	struct list_head *tmp;
 	struct list_head *tmp;
 	sector_t last_check;
 	sector_t last_check;
 	int skipped = 0;
 	int skipped = 0;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	char *desc;
 	char *desc;
 
 
 	/* just incase thread restarts... */
 	/* just incase thread restarts... */
@@ -7308,9 +7309,9 @@ void md_do_sync(mddev_t *mddev)
 }
 }
 EXPORT_SYMBOL_GPL(md_do_sync);
 EXPORT_SYMBOL_GPL(md_do_sync);
 
 
-static int remove_and_add_spares(mddev_t *mddev)
+static int remove_and_add_spares(struct mddev *mddev)
 {
 {
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	int spares = 0;
 	int spares = 0;
 
 
 	mddev->curr_resync_completed = 0;
 	mddev->curr_resync_completed = 0;
@@ -7352,9 +7353,9 @@ static int remove_and_add_spares(mddev_t *mddev)
 	return spares;
 	return spares;
 }
 }
 
 
-static void reap_sync_thread(mddev_t *mddev)
+static void reap_sync_thread(struct mddev *mddev)
 {
 {
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	/* resync has finished, collect result */
 	/* resync has finished, collect result */
 	md_unregister_thread(&mddev->sync_thread);
 	md_unregister_thread(&mddev->sync_thread);
@@ -7369,15 +7370,19 @@ static void reap_sync_thread(mddev_t *mddev)
 	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
 	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
 	    mddev->pers->finish_reshape)
 	    mddev->pers->finish_reshape)
 		mddev->pers->finish_reshape(mddev);
 		mddev->pers->finish_reshape(mddev);
-	md_update_sb(mddev, 1);
 
 
-	/* if array is no-longer degraded, then any saved_raid_disk
-	 * information must be scrapped
+	/* If array is no-longer degraded, then any saved_raid_disk
+	 * information must be scrapped.  Also if any device is now
+	 * In_sync we must scrape the saved_raid_disk for that device
+	 * do the superblock for an incrementally recovered device
+	 * written out.
 	 */
 	 */
-	if (!mddev->degraded)
-		list_for_each_entry(rdev, &mddev->disks, same_set)
+	list_for_each_entry(rdev, &mddev->disks, same_set)
+		if (!mddev->degraded ||
+		    test_bit(In_sync, &rdev->flags))
 			rdev->saved_raid_disk = -1;
 			rdev->saved_raid_disk = -1;
 
 
+	md_update_sb(mddev, 1);
 	clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
 	clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
 	clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
 	clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
 	clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
 	clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
@@ -7413,7 +7418,7 @@ static void reap_sync_thread(mddev_t *mddev)
  *  5/ If array is degraded, try to add spares devices
  *  5/ If array is degraded, try to add spares devices
  *  6/ If array has spares or is not in-sync, start a resync thread.
  *  6/ If array has spares or is not in-sync, start a resync thread.
  */
  */
-void md_check_recovery(mddev_t *mddev)
+void md_check_recovery(struct mddev *mddev)
 {
 {
 	if (mddev->suspended)
 	if (mddev->suspended)
 		return;
 		return;
@@ -7449,7 +7454,7 @@ void md_check_recovery(mddev_t *mddev)
 			/* Only thing we do on a ro array is remove
 			/* Only thing we do on a ro array is remove
 			 * failed devices.
 			 * failed devices.
 			 */
 			 */
-			mdk_rdev_t *rdev;
+			struct md_rdev *rdev;
 			list_for_each_entry(rdev, &mddev->disks, same_set)
 			list_for_each_entry(rdev, &mddev->disks, same_set)
 				if (rdev->raid_disk >= 0 &&
 				if (rdev->raid_disk >= 0 &&
 				    !test_bit(Blocked, &rdev->flags) &&
 				    !test_bit(Blocked, &rdev->flags) &&
@@ -7573,7 +7578,7 @@ void md_check_recovery(mddev_t *mddev)
 	}
 	}
 }
 }
 
 
-void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev)
+void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev)
 {
 {
 	sysfs_notify_dirent_safe(rdev->sysfs_state);
 	sysfs_notify_dirent_safe(rdev->sysfs_state);
 	wait_event_timeout(rdev->blocked_wait,
 	wait_event_timeout(rdev->blocked_wait,
@@ -7831,7 +7836,7 @@ static int md_set_badblocks(struct badblocks *bb, sector_t s, int sectors,
 	return rv;
 	return rv;
 }
 }
 
 
-int rdev_set_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors,
+int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
 		       int acknowledged)
 		       int acknowledged)
 {
 {
 	int rv = md_set_badblocks(&rdev->badblocks,
 	int rv = md_set_badblocks(&rdev->badblocks,
@@ -7940,7 +7945,7 @@ out:
 	return rv;
 	return rv;
 }
 }
 
 
-int rdev_clear_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors)
+int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors)
 {
 {
 	return md_clear_badblocks(&rdev->badblocks,
 	return md_clear_badblocks(&rdev->badblocks,
 				  s + rdev->data_offset,
 				  s + rdev->data_offset,
@@ -8074,13 +8079,14 @@ static int md_notify_reboot(struct notifier_block *this,
 			    unsigned long code, void *x)
 			    unsigned long code, void *x)
 {
 {
 	struct list_head *tmp;
 	struct list_head *tmp;
-	mddev_t *mddev;
+	struct mddev *mddev;
+	int need_delay = 0;
 
 
 	if ((code == SYS_DOWN) || (code == SYS_HALT) || (code == SYS_POWER_OFF)) {
 	if ((code == SYS_DOWN) || (code == SYS_HALT) || (code == SYS_POWER_OFF)) {
 
 
 		printk(KERN_INFO "md: stopping all md devices.\n");
 		printk(KERN_INFO "md: stopping all md devices.\n");
 
 
-		for_each_mddev(mddev, tmp)
+		for_each_mddev(mddev, tmp) {
 			if (mddev_trylock(mddev)) {
 			if (mddev_trylock(mddev)) {
 				/* Force a switch to readonly even array
 				/* Force a switch to readonly even array
 				 * appears to still be in use.  Hence
 				 * appears to still be in use.  Hence
@@ -8089,13 +8095,16 @@ static int md_notify_reboot(struct notifier_block *this,
 				md_set_readonly(mddev, 100);
 				md_set_readonly(mddev, 100);
 				mddev_unlock(mddev);
 				mddev_unlock(mddev);
 			}
 			}
+			need_delay = 1;
+		}
 		/*
 		/*
 		 * certain more exotic SCSI devices are known to be
 		 * certain more exotic SCSI devices are known to be
 		 * volatile wrt too early system reboots. While the
 		 * volatile wrt too early system reboots. While the
 		 * right place to handle this issue is the given
 		 * right place to handle this issue is the given
 		 * driver, we do want to have a safe RAID driver ...
 		 * driver, we do want to have a safe RAID driver ...
 		 */
 		 */
-		mdelay(1000*1);
+		if (need_delay)
+			mdelay(1000*1);
 	}
 	}
 	return NOTIFY_DONE;
 	return NOTIFY_DONE;
 }
 }
@@ -8108,7 +8117,7 @@ static struct notifier_block md_notifier = {
 
 
 static void md_geninit(void)
 static void md_geninit(void)
 {
 {
-	dprintk("md: sizeof(mdp_super_t) = %d\n", (int)sizeof(mdp_super_t));
+	pr_debug("md: sizeof(mdp_super_t) = %d\n", (int)sizeof(mdp_super_t));
 
 
 	proc_create("mdstat", S_IRUGO, NULL, &md_seq_fops);
 	proc_create("mdstat", S_IRUGO, NULL, &md_seq_fops);
 }
 }
@@ -8183,7 +8192,7 @@ void md_autodetect_dev(dev_t dev)
 
 
 static void autostart_arrays(int part)
 static void autostart_arrays(int part)
 {
 {
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	struct detected_devices_node *node_detected_dev;
 	struct detected_devices_node *node_detected_dev;
 	dev_t dev;
 	dev_t dev;
 	int i_scanned, i_passed;
 	int i_scanned, i_passed;
@@ -8223,7 +8232,7 @@ static void autostart_arrays(int part)
 
 
 static __exit void md_exit(void)
 static __exit void md_exit(void)
 {
 {
-	mddev_t *mddev;
+	struct mddev *mddev;
 	struct list_head *tmp;
 	struct list_head *tmp;
 
 
 	blk_unregister_region(MKDEV(MD_MAJOR,0), 1U << MINORBITS);
 	blk_unregister_region(MKDEV(MD_MAJOR,0), 1U << MINORBITS);

+ 75 - 78
drivers/md/md.h

@@ -1,5 +1,5 @@
 /*
 /*
-   md_k.h : kernel internal structure of the Linux MD driver
+   md.h : kernel internal structure of the Linux MD driver
           Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman
           Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman
 	  
 	  
    This program is free software; you can redistribute it and/or modify
    This program is free software; you can redistribute it and/or modify
@@ -26,9 +26,6 @@
 
 
 #define MaxSector (~(sector_t)0)
 #define MaxSector (~(sector_t)0)
 
 
-typedef struct mddev_s mddev_t;
-typedef struct mdk_rdev_s mdk_rdev_t;
-
 /* Bad block numbers are stored sorted in a single page.
 /* Bad block numbers are stored sorted in a single page.
  * 64bits is used for each block or extent.
  * 64bits is used for each block or extent.
  * 54 bits are sector number, 9 bits are extent size,
  * 54 bits are sector number, 9 bits are extent size,
@@ -39,12 +36,11 @@ typedef struct mdk_rdev_s mdk_rdev_t;
 /*
 /*
  * MD's 'extended' device
  * MD's 'extended' device
  */
  */
-struct mdk_rdev_s
-{
+struct md_rdev {
 	struct list_head same_set;	/* RAID devices within the same set */
 	struct list_head same_set;	/* RAID devices within the same set */
 
 
 	sector_t sectors;		/* Device size (in 512bytes sectors) */
 	sector_t sectors;		/* Device size (in 512bytes sectors) */
-	mddev_t *mddev;			/* RAID array if running */
+	struct mddev *mddev;		/* RAID array if running */
 	int last_events;		/* IO event timestamp */
 	int last_events;		/* IO event timestamp */
 
 
 	/*
 	/*
@@ -168,7 +164,7 @@ struct mdk_rdev_s
 
 
 extern int md_is_badblock(struct badblocks *bb, sector_t s, int sectors,
 extern int md_is_badblock(struct badblocks *bb, sector_t s, int sectors,
 			  sector_t *first_bad, int *bad_sectors);
 			  sector_t *first_bad, int *bad_sectors);
-static inline int is_badblock(mdk_rdev_t *rdev, sector_t s, int sectors,
+static inline int is_badblock(struct md_rdev *rdev, sector_t s, int sectors,
 			      sector_t *first_bad, int *bad_sectors)
 			      sector_t *first_bad, int *bad_sectors)
 {
 {
 	if (unlikely(rdev->badblocks.count)) {
 	if (unlikely(rdev->badblocks.count)) {
@@ -181,15 +177,14 @@ static inline int is_badblock(mdk_rdev_t *rdev, sector_t s, int sectors,
 	}
 	}
 	return 0;
 	return 0;
 }
 }
-extern int rdev_set_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors,
+extern int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
 			      int acknowledged);
 			      int acknowledged);
-extern int rdev_clear_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors);
+extern int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors);
 extern void md_ack_all_badblocks(struct badblocks *bb);
 extern void md_ack_all_badblocks(struct badblocks *bb);
 
 
-struct mddev_s
-{
+struct mddev {
 	void				*private;
 	void				*private;
-	struct mdk_personality		*pers;
+	struct md_personality		*pers;
 	dev_t				unit;
 	dev_t				unit;
 	int				md_minor;
 	int				md_minor;
 	struct list_head 		disks;
 	struct list_head 		disks;
@@ -256,8 +251,8 @@ struct mddev_s
 	atomic_t			plug_cnt;	/* If device is expecting
 	atomic_t			plug_cnt;	/* If device is expecting
 							 * more bios soon.
 							 * more bios soon.
 							 */
 							 */
-	struct mdk_thread_s		*thread;	/* management thread */
-	struct mdk_thread_s		*sync_thread;	/* doing resync or reconstruct */
+	struct md_thread		*thread;	/* management thread */
+	struct md_thread		*sync_thread;	/* doing resync or reconstruct */
 	sector_t			curr_resync;	/* last block scheduled */
 	sector_t			curr_resync;	/* last block scheduled */
 	/* As resync requests can complete out of order, we cannot easily track
 	/* As resync requests can complete out of order, we cannot easily track
 	 * how much resync has been completed.  So we occasionally pause until
 	 * how much resync has been completed.  So we occasionally pause until
@@ -402,11 +397,11 @@ struct mddev_s
 	atomic_t flush_pending;
 	atomic_t flush_pending;
 	struct work_struct flush_work;
 	struct work_struct flush_work;
 	struct work_struct event_work;	/* used by dm to report failure event */
 	struct work_struct event_work;	/* used by dm to report failure event */
-	void (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev);
+	void (*sync_super)(struct mddev *mddev, struct md_rdev *rdev);
 };
 };
 
 
 
 
-static inline void rdev_dec_pending(mdk_rdev_t *rdev, mddev_t *mddev)
+static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev)
 {
 {
 	int faulty = test_bit(Faulty, &rdev->flags);
 	int faulty = test_bit(Faulty, &rdev->flags);
 	if (atomic_dec_and_test(&rdev->nr_pending) && faulty)
 	if (atomic_dec_and_test(&rdev->nr_pending) && faulty)
@@ -418,35 +413,35 @@ static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sect
         atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io);
         atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io);
 }
 }
 
 
-struct mdk_personality
+struct md_personality
 {
 {
 	char *name;
 	char *name;
 	int level;
 	int level;
 	struct list_head list;
 	struct list_head list;
 	struct module *owner;
 	struct module *owner;
-	int (*make_request)(mddev_t *mddev, struct bio *bio);
-	int (*run)(mddev_t *mddev);
-	int (*stop)(mddev_t *mddev);
-	void (*status)(struct seq_file *seq, mddev_t *mddev);
+	int (*make_request)(struct mddev *mddev, struct bio *bio);
+	int (*run)(struct mddev *mddev);
+	int (*stop)(struct mddev *mddev);
+	void (*status)(struct seq_file *seq, struct mddev *mddev);
 	/* error_handler must set ->faulty and clear ->in_sync
 	/* error_handler must set ->faulty and clear ->in_sync
 	 * if appropriate, and should abort recovery if needed 
 	 * if appropriate, and should abort recovery if needed 
 	 */
 	 */
-	void (*error_handler)(mddev_t *mddev, mdk_rdev_t *rdev);
-	int (*hot_add_disk) (mddev_t *mddev, mdk_rdev_t *rdev);
-	int (*hot_remove_disk) (mddev_t *mddev, int number);
-	int (*spare_active) (mddev_t *mddev);
-	sector_t (*sync_request)(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster);
-	int (*resize) (mddev_t *mddev, sector_t sectors);
-	sector_t (*size) (mddev_t *mddev, sector_t sectors, int raid_disks);
-	int (*check_reshape) (mddev_t *mddev);
-	int (*start_reshape) (mddev_t *mddev);
-	void (*finish_reshape) (mddev_t *mddev);
+	void (*error_handler)(struct mddev *mddev, struct md_rdev *rdev);
+	int (*hot_add_disk) (struct mddev *mddev, struct md_rdev *rdev);
+	int (*hot_remove_disk) (struct mddev *mddev, int number);
+	int (*spare_active) (struct mddev *mddev);
+	sector_t (*sync_request)(struct mddev *mddev, sector_t sector_nr, int *skipped, int go_faster);
+	int (*resize) (struct mddev *mddev, sector_t sectors);
+	sector_t (*size) (struct mddev *mddev, sector_t sectors, int raid_disks);
+	int (*check_reshape) (struct mddev *mddev);
+	int (*start_reshape) (struct mddev *mddev);
+	void (*finish_reshape) (struct mddev *mddev);
 	/* quiesce moves between quiescence states
 	/* quiesce moves between quiescence states
 	 * 0 - fully active
 	 * 0 - fully active
 	 * 1 - no new requests allowed
 	 * 1 - no new requests allowed
 	 * others - reserved
 	 * others - reserved
 	 */
 	 */
-	void (*quiesce) (mddev_t *mddev, int state);
+	void (*quiesce) (struct mddev *mddev, int state);
 	/* takeover is used to transition an array from one
 	/* takeover is used to transition an array from one
 	 * personality to another.  The new personality must be able
 	 * personality to another.  The new personality must be able
 	 * to handle the data in the current layout.
 	 * to handle the data in the current layout.
@@ -456,14 +451,14 @@ struct mdk_personality
 	 * This needs to be installed and then ->run used to activate the
 	 * This needs to be installed and then ->run used to activate the
 	 * array.
 	 * array.
 	 */
 	 */
-	void *(*takeover) (mddev_t *mddev);
+	void *(*takeover) (struct mddev *mddev);
 };
 };
 
 
 
 
 struct md_sysfs_entry {
 struct md_sysfs_entry {
 	struct attribute attr;
 	struct attribute attr;
-	ssize_t (*show)(mddev_t *, char *);
-	ssize_t (*store)(mddev_t *, const char *, size_t);
+	ssize_t (*show)(struct mddev *, char *);
+	ssize_t (*store)(struct mddev *, const char *, size_t);
 };
 };
 extern struct attribute_group md_bitmap_group;
 extern struct attribute_group md_bitmap_group;
 
 
@@ -479,19 +474,19 @@ static inline void sysfs_notify_dirent_safe(struct sysfs_dirent *sd)
 		sysfs_notify_dirent(sd);
 		sysfs_notify_dirent(sd);
 }
 }
 
 
-static inline char * mdname (mddev_t * mddev)
+static inline char * mdname (struct mddev * mddev)
 {
 {
 	return mddev->gendisk ? mddev->gendisk->disk_name : "mdX";
 	return mddev->gendisk ? mddev->gendisk->disk_name : "mdX";
 }
 }
 
 
-static inline int sysfs_link_rdev(mddev_t *mddev, mdk_rdev_t *rdev)
+static inline int sysfs_link_rdev(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	char nm[20];
 	char nm[20];
 	sprintf(nm, "rd%d", rdev->raid_disk);
 	sprintf(nm, "rd%d", rdev->raid_disk);
 	return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm);
 	return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm);
 }
 }
 
 
-static inline void sysfs_unlink_rdev(mddev_t *mddev, mdk_rdev_t *rdev)
+static inline void sysfs_unlink_rdev(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	char nm[20];
 	char nm[20];
 	sprintf(nm, "rd%d", rdev->raid_disk);
 	sprintf(nm, "rd%d", rdev->raid_disk);
@@ -514,14 +509,14 @@ static inline void sysfs_unlink_rdev(mddev_t *mddev, mdk_rdev_t *rdev)
 #define rdev_for_each_rcu(rdev, mddev)				\
 #define rdev_for_each_rcu(rdev, mddev)				\
 	list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set)
 	list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set)
 
 
-typedef struct mdk_thread_s {
-	void			(*run) (mddev_t *mddev);
-	mddev_t			*mddev;
+struct md_thread {
+	void			(*run) (struct mddev *mddev);
+	struct mddev		*mddev;
 	wait_queue_head_t	wqueue;
 	wait_queue_head_t	wqueue;
 	unsigned long           flags;
 	unsigned long           flags;
 	struct task_struct	*tsk;
 	struct task_struct	*tsk;
 	unsigned long		timeout;
 	unsigned long		timeout;
-} mdk_thread_t;
+};
 
 
 #define THREAD_WAKEUP  0
 #define THREAD_WAKEUP  0
 
 
@@ -556,48 +551,50 @@ static inline void safe_put_page(struct page *p)
 	if (p) put_page(p);
 	if (p) put_page(p);
 }
 }
 
 
-extern int register_md_personality(struct mdk_personality *p);
-extern int unregister_md_personality(struct mdk_personality *p);
-extern mdk_thread_t * md_register_thread(void (*run) (mddev_t *mddev),
-				mddev_t *mddev, const char *name);
-extern void md_unregister_thread(mdk_thread_t **threadp);
-extern void md_wakeup_thread(mdk_thread_t *thread);
-extern void md_check_recovery(mddev_t *mddev);
-extern void md_write_start(mddev_t *mddev, struct bio *bi);
-extern void md_write_end(mddev_t *mddev);
-extern void md_done_sync(mddev_t *mddev, int blocks, int ok);
-extern void md_error(mddev_t *mddev, mdk_rdev_t *rdev);
-
-extern int mddev_congested(mddev_t *mddev, int bits);
-extern void md_flush_request(mddev_t *mddev, struct bio *bio);
-extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev,
+extern int register_md_personality(struct md_personality *p);
+extern int unregister_md_personality(struct md_personality *p);
+extern struct md_thread *md_register_thread(
+	void (*run)(struct mddev *mddev),
+	struct mddev *mddev,
+	const char *name);
+extern void md_unregister_thread(struct md_thread **threadp);
+extern void md_wakeup_thread(struct md_thread *thread);
+extern void md_check_recovery(struct mddev *mddev);
+extern void md_write_start(struct mddev *mddev, struct bio *bi);
+extern void md_write_end(struct mddev *mddev);
+extern void md_done_sync(struct mddev *mddev, int blocks, int ok);
+extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
+
+extern int mddev_congested(struct mddev *mddev, int bits);
+extern void md_flush_request(struct mddev *mddev, struct bio *bio);
+extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
 			   sector_t sector, int size, struct page *page);
 			   sector_t sector, int size, struct page *page);
-extern void md_super_wait(mddev_t *mddev);
-extern int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size, 
+extern void md_super_wait(struct mddev *mddev);
+extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, 
 			struct page *page, int rw, bool metadata_op);
 			struct page *page, int rw, bool metadata_op);
-extern void md_do_sync(mddev_t *mddev);
-extern void md_new_event(mddev_t *mddev);
-extern int md_allow_write(mddev_t *mddev);
-extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev);
-extern void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors);
-extern int md_check_no_bitmap(mddev_t *mddev);
-extern int md_integrity_register(mddev_t *mddev);
-extern void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev);
+extern void md_do_sync(struct mddev *mddev);
+extern void md_new_event(struct mddev *mddev);
+extern int md_allow_write(struct mddev *mddev);
+extern void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev);
+extern void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors);
+extern int md_check_no_bitmap(struct mddev *mddev);
+extern int md_integrity_register(struct mddev *mddev);
+extern void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev);
 extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale);
 extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale);
 extern void restore_bitmap_write_access(struct file *file);
 extern void restore_bitmap_write_access(struct file *file);
 
 
-extern void mddev_init(mddev_t *mddev);
-extern int md_run(mddev_t *mddev);
-extern void md_stop(mddev_t *mddev);
-extern void md_stop_writes(mddev_t *mddev);
-extern int md_rdev_init(mdk_rdev_t *rdev);
+extern void mddev_init(struct mddev *mddev);
+extern int md_run(struct mddev *mddev);
+extern void md_stop(struct mddev *mddev);
+extern void md_stop_writes(struct mddev *mddev);
+extern int md_rdev_init(struct md_rdev *rdev);
 
 
-extern void mddev_suspend(mddev_t *mddev);
-extern void mddev_resume(mddev_t *mddev);
+extern void mddev_suspend(struct mddev *mddev);
+extern void mddev_resume(struct mddev *mddev);
 extern struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
 extern struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
-				   mddev_t *mddev);
+				   struct mddev *mddev);
 extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
 extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
-				   mddev_t *mddev);
-extern int mddev_check_plugged(mddev_t *mddev);
+				   struct mddev *mddev);
+extern int mddev_check_plugged(struct mddev *mddev);
 extern void md_trim_bio(struct bio *bio, int offset, int size);
 extern void md_trim_bio(struct bio *bio, int offset, int size);
 #endif /* _MD_MD_H */
 #endif /* _MD_MD_H */

+ 32 - 32
drivers/md/multipath.c

@@ -31,7 +31,7 @@
 #define	NR_RESERVED_BUFS	32
 #define	NR_RESERVED_BUFS	32
 
 
 
 
-static int multipath_map (multipath_conf_t *conf)
+static int multipath_map (struct mpconf *conf)
 {
 {
 	int i, disks = conf->raid_disks;
 	int i, disks = conf->raid_disks;
 
 
@@ -42,7 +42,7 @@ static int multipath_map (multipath_conf_t *conf)
 
 
 	rcu_read_lock();
 	rcu_read_lock();
 	for (i = 0; i < disks; i++) {
 	for (i = 0; i < disks; i++) {
-		mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev);
+		struct md_rdev *rdev = rcu_dereference(conf->multipaths[i].rdev);
 		if (rdev && test_bit(In_sync, &rdev->flags)) {
 		if (rdev && test_bit(In_sync, &rdev->flags)) {
 			atomic_inc(&rdev->nr_pending);
 			atomic_inc(&rdev->nr_pending);
 			rcu_read_unlock();
 			rcu_read_unlock();
@@ -58,8 +58,8 @@ static int multipath_map (multipath_conf_t *conf)
 static void multipath_reschedule_retry (struct multipath_bh *mp_bh)
 static void multipath_reschedule_retry (struct multipath_bh *mp_bh)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
-	mddev_t *mddev = mp_bh->mddev;
-	multipath_conf_t *conf = mddev->private;
+	struct mddev *mddev = mp_bh->mddev;
+	struct mpconf *conf = mddev->private;
 
 
 	spin_lock_irqsave(&conf->device_lock, flags);
 	spin_lock_irqsave(&conf->device_lock, flags);
 	list_add(&mp_bh->retry_list, &conf->retry_list);
 	list_add(&mp_bh->retry_list, &conf->retry_list);
@@ -76,7 +76,7 @@ static void multipath_reschedule_retry (struct multipath_bh *mp_bh)
 static void multipath_end_bh_io (struct multipath_bh *mp_bh, int err)
 static void multipath_end_bh_io (struct multipath_bh *mp_bh, int err)
 {
 {
 	struct bio *bio = mp_bh->master_bio;
 	struct bio *bio = mp_bh->master_bio;
-	multipath_conf_t *conf = mp_bh->mddev->private;
+	struct mpconf *conf = mp_bh->mddev->private;
 
 
 	bio_endio(bio, err);
 	bio_endio(bio, err);
 	mempool_free(mp_bh, conf->pool);
 	mempool_free(mp_bh, conf->pool);
@@ -86,8 +86,8 @@ static void multipath_end_request(struct bio *bio, int error)
 {
 {
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 	struct multipath_bh *mp_bh = bio->bi_private;
 	struct multipath_bh *mp_bh = bio->bi_private;
-	multipath_conf_t *conf = mp_bh->mddev->private;
-	mdk_rdev_t *rdev = conf->multipaths[mp_bh->path].rdev;
+	struct mpconf *conf = mp_bh->mddev->private;
+	struct md_rdev *rdev = conf->multipaths[mp_bh->path].rdev;
 
 
 	if (uptodate)
 	if (uptodate)
 		multipath_end_bh_io(mp_bh, 0);
 		multipath_end_bh_io(mp_bh, 0);
@@ -106,9 +106,9 @@ static void multipath_end_request(struct bio *bio, int error)
 	rdev_dec_pending(rdev, conf->mddev);
 	rdev_dec_pending(rdev, conf->mddev);
 }
 }
 
 
-static int multipath_make_request(mddev_t *mddev, struct bio * bio)
+static int multipath_make_request(struct mddev *mddev, struct bio * bio)
 {
 {
-	multipath_conf_t *conf = mddev->private;
+	struct mpconf *conf = mddev->private;
 	struct multipath_bh * mp_bh;
 	struct multipath_bh * mp_bh;
 	struct multipath_info *multipath;
 	struct multipath_info *multipath;
 
 
@@ -140,9 +140,9 @@ static int multipath_make_request(mddev_t *mddev, struct bio * bio)
 	return 0;
 	return 0;
 }
 }
 
 
-static void multipath_status (struct seq_file *seq, mddev_t *mddev)
+static void multipath_status (struct seq_file *seq, struct mddev *mddev)
 {
 {
-	multipath_conf_t *conf = mddev->private;
+	struct mpconf *conf = mddev->private;
 	int i;
 	int i;
 	
 	
 	seq_printf (seq, " [%d/%d] [", conf->raid_disks,
 	seq_printf (seq, " [%d/%d] [", conf->raid_disks,
@@ -156,8 +156,8 @@ static void multipath_status (struct seq_file *seq, mddev_t *mddev)
 
 
 static int multipath_congested(void *data, int bits)
 static int multipath_congested(void *data, int bits)
 {
 {
-	mddev_t *mddev = data;
-	multipath_conf_t *conf = mddev->private;
+	struct mddev *mddev = data;
+	struct mpconf *conf = mddev->private;
 	int i, ret = 0;
 	int i, ret = 0;
 
 
 	if (mddev_congested(mddev, bits))
 	if (mddev_congested(mddev, bits))
@@ -165,7 +165,7 @@ static int multipath_congested(void *data, int bits)
 
 
 	rcu_read_lock();
 	rcu_read_lock();
 	for (i = 0; i < mddev->raid_disks ; i++) {
 	for (i = 0; i < mddev->raid_disks ; i++) {
-		mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev);
+		struct md_rdev *rdev = rcu_dereference(conf->multipaths[i].rdev);
 		if (rdev && !test_bit(Faulty, &rdev->flags)) {
 		if (rdev && !test_bit(Faulty, &rdev->flags)) {
 			struct request_queue *q = bdev_get_queue(rdev->bdev);
 			struct request_queue *q = bdev_get_queue(rdev->bdev);
 
 
@@ -183,9 +183,9 @@ static int multipath_congested(void *data, int bits)
 /*
 /*
  * Careful, this can execute in IRQ contexts as well!
  * Careful, this can execute in IRQ contexts as well!
  */
  */
-static void multipath_error (mddev_t *mddev, mdk_rdev_t *rdev)
+static void multipath_error (struct mddev *mddev, struct md_rdev *rdev)
 {
 {
-	multipath_conf_t *conf = mddev->private;
+	struct mpconf *conf = mddev->private;
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 
 
 	if (conf->raid_disks - mddev->degraded <= 1) {
 	if (conf->raid_disks - mddev->degraded <= 1) {
@@ -218,7 +218,7 @@ static void multipath_error (mddev_t *mddev, mdk_rdev_t *rdev)
 	       conf->raid_disks - mddev->degraded);
 	       conf->raid_disks - mddev->degraded);
 }
 }
 
 
-static void print_multipath_conf (multipath_conf_t *conf)
+static void print_multipath_conf (struct mpconf *conf)
 {
 {
 	int i;
 	int i;
 	struct multipath_info *tmp;
 	struct multipath_info *tmp;
@@ -242,9 +242,9 @@ static void print_multipath_conf (multipath_conf_t *conf)
 }
 }
 
 
 
 
-static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
+static int multipath_add_disk(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
-	multipath_conf_t *conf = mddev->private;
+	struct mpconf *conf = mddev->private;
 	struct request_queue *q;
 	struct request_queue *q;
 	int err = -EEXIST;
 	int err = -EEXIST;
 	int path;
 	int path;
@@ -291,11 +291,11 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 	return err;
 	return err;
 }
 }
 
 
-static int multipath_remove_disk(mddev_t *mddev, int number)
+static int multipath_remove_disk(struct mddev *mddev, int number)
 {
 {
-	multipath_conf_t *conf = mddev->private;
+	struct mpconf *conf = mddev->private;
 	int err = 0;
 	int err = 0;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	struct multipath_info *p = conf->multipaths + number;
 	struct multipath_info *p = conf->multipaths + number;
 
 
 	print_multipath_conf(conf);
 	print_multipath_conf(conf);
@@ -335,12 +335,12 @@ abort:
  *	3.	Performs writes following reads for array syncronising.
  *	3.	Performs writes following reads for array syncronising.
  */
  */
 
 
-static void multipathd (mddev_t *mddev)
+static void multipathd (struct mddev *mddev)
 {
 {
 	struct multipath_bh *mp_bh;
 	struct multipath_bh *mp_bh;
 	struct bio *bio;
 	struct bio *bio;
 	unsigned long flags;
 	unsigned long flags;
-	multipath_conf_t *conf = mddev->private;
+	struct mpconf *conf = mddev->private;
 	struct list_head *head = &conf->retry_list;
 	struct list_head *head = &conf->retry_list;
 
 
 	md_check_recovery(mddev);
 	md_check_recovery(mddev);
@@ -379,7 +379,7 @@ static void multipathd (mddev_t *mddev)
 	spin_unlock_irqrestore(&conf->device_lock, flags);
 	spin_unlock_irqrestore(&conf->device_lock, flags);
 }
 }
 
 
-static sector_t multipath_size(mddev_t *mddev, sector_t sectors, int raid_disks)
+static sector_t multipath_size(struct mddev *mddev, sector_t sectors, int raid_disks)
 {
 {
 	WARN_ONCE(sectors || raid_disks,
 	WARN_ONCE(sectors || raid_disks,
 		  "%s does not support generic reshape\n", __func__);
 		  "%s does not support generic reshape\n", __func__);
@@ -387,12 +387,12 @@ static sector_t multipath_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 	return mddev->dev_sectors;
 	return mddev->dev_sectors;
 }
 }
 
 
-static int multipath_run (mddev_t *mddev)
+static int multipath_run (struct mddev *mddev)
 {
 {
-	multipath_conf_t *conf;
+	struct mpconf *conf;
 	int disk_idx;
 	int disk_idx;
 	struct multipath_info *disk;
 	struct multipath_info *disk;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	int working_disks;
 	int working_disks;
 
 
 	if (md_check_no_bitmap(mddev))
 	if (md_check_no_bitmap(mddev))
@@ -409,7 +409,7 @@ static int multipath_run (mddev_t *mddev)
 	 * should be freed in multipath_stop()]
 	 * should be freed in multipath_stop()]
 	 */
 	 */
 
 
-	conf = kzalloc(sizeof(multipath_conf_t), GFP_KERNEL);
+	conf = kzalloc(sizeof(struct mpconf), GFP_KERNEL);
 	mddev->private = conf;
 	mddev->private = conf;
 	if (!conf) {
 	if (!conf) {
 		printk(KERN_ERR 
 		printk(KERN_ERR 
@@ -510,9 +510,9 @@ out:
 }
 }
 
 
 
 
-static int multipath_stop (mddev_t *mddev)
+static int multipath_stop (struct mddev *mddev)
 {
 {
-	multipath_conf_t *conf = mddev->private;
+	struct mpconf *conf = mddev->private;
 
 
 	md_unregister_thread(&mddev->thread);
 	md_unregister_thread(&mddev->thread);
 	blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
 	blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
@@ -523,7 +523,7 @@ static int multipath_stop (mddev_t *mddev)
 	return 0;
 	return 0;
 }
 }
 
 
-static struct mdk_personality multipath_personality =
+static struct md_personality multipath_personality =
 {
 {
 	.name		= "multipath",
 	.name		= "multipath",
 	.level		= LEVEL_MULTIPATH,
 	.level		= LEVEL_MULTIPATH,

+ 4 - 6
drivers/md/multipath.h

@@ -2,11 +2,11 @@
 #define _MULTIPATH_H
 #define _MULTIPATH_H
 
 
 struct multipath_info {
 struct multipath_info {
-	mdk_rdev_t	*rdev;
+	struct md_rdev	*rdev;
 };
 };
 
 
-struct multipath_private_data {
-	mddev_t			*mddev;
+struct mpconf {
+	struct mddev			*mddev;
 	struct multipath_info	*multipaths;
 	struct multipath_info	*multipaths;
 	int			raid_disks;
 	int			raid_disks;
 	spinlock_t		device_lock;
 	spinlock_t		device_lock;
@@ -15,8 +15,6 @@ struct multipath_private_data {
 	mempool_t		*pool;
 	mempool_t		*pool;
 };
 };
 
 
-typedef struct multipath_private_data multipath_conf_t;
-
 /*
 /*
  * this is our 'private' 'collective' MULTIPATH buffer head.
  * this is our 'private' 'collective' MULTIPATH buffer head.
  * it contains information about what kind of IO operations were started
  * it contains information about what kind of IO operations were started
@@ -24,7 +22,7 @@ typedef struct multipath_private_data multipath_conf_t;
  */
  */
 
 
 struct multipath_bh {
 struct multipath_bh {
-	mddev_t			*mddev;
+	struct mddev			*mddev;
 	struct bio		*master_bio;
 	struct bio		*master_bio;
 	struct bio		bio;
 	struct bio		bio;
 	int			path;
 	int			path;

+ 83 - 108
drivers/md/raid0.c

@@ -27,9 +27,9 @@
 
 
 static int raid0_congested(void *data, int bits)
 static int raid0_congested(void *data, int bits)
 {
 {
-	mddev_t *mddev = data;
-	raid0_conf_t *conf = mddev->private;
-	mdk_rdev_t **devlist = conf->devlist;
+	struct mddev *mddev = data;
+	struct r0conf *conf = mddev->private;
+	struct md_rdev **devlist = conf->devlist;
 	int raid_disks = conf->strip_zone[0].nb_dev;
 	int raid_disks = conf->strip_zone[0].nb_dev;
 	int i, ret = 0;
 	int i, ret = 0;
 
 
@@ -47,52 +47,53 @@ static int raid0_congested(void *data, int bits)
 /*
 /*
  * inform the user of the raid configuration
  * inform the user of the raid configuration
 */
 */
-static void dump_zones(mddev_t *mddev)
+static void dump_zones(struct mddev *mddev)
 {
 {
-	int j, k, h;
+	int j, k;
 	sector_t zone_size = 0;
 	sector_t zone_size = 0;
 	sector_t zone_start = 0;
 	sector_t zone_start = 0;
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
-	raid0_conf_t *conf = mddev->private;
+	struct r0conf *conf = mddev->private;
 	int raid_disks = conf->strip_zone[0].nb_dev;
 	int raid_disks = conf->strip_zone[0].nb_dev;
-	printk(KERN_INFO "******* %s configuration *********\n",
-		mdname(mddev));
-	h = 0;
+	printk(KERN_INFO "md: RAID0 configuration for %s - %d zone%s\n",
+	       mdname(mddev),
+	       conf->nr_strip_zones, conf->nr_strip_zones==1?"":"s");
 	for (j = 0; j < conf->nr_strip_zones; j++) {
 	for (j = 0; j < conf->nr_strip_zones; j++) {
-		printk(KERN_INFO "zone%d=[", j);
+		printk(KERN_INFO "md: zone%d=[", j);
 		for (k = 0; k < conf->strip_zone[j].nb_dev; k++)
 		for (k = 0; k < conf->strip_zone[j].nb_dev; k++)
-			printk(KERN_CONT "%s/",
+			printk(KERN_CONT "%s%s", k?"/":"",
 			bdevname(conf->devlist[j*raid_disks
 			bdevname(conf->devlist[j*raid_disks
 						+ k]->bdev, b));
 						+ k]->bdev, b));
 		printk(KERN_CONT "]\n");
 		printk(KERN_CONT "]\n");
 
 
 		zone_size  = conf->strip_zone[j].zone_end - zone_start;
 		zone_size  = conf->strip_zone[j].zone_end - zone_start;
-		printk(KERN_INFO "        zone offset=%llukb "
-				"device offset=%llukb size=%llukb\n",
+		printk(KERN_INFO "      zone-offset=%10lluKB, "
+				"device-offset=%10lluKB, size=%10lluKB\n",
 			(unsigned long long)zone_start>>1,
 			(unsigned long long)zone_start>>1,
 			(unsigned long long)conf->strip_zone[j].dev_start>>1,
 			(unsigned long long)conf->strip_zone[j].dev_start>>1,
 			(unsigned long long)zone_size>>1);
 			(unsigned long long)zone_size>>1);
 		zone_start = conf->strip_zone[j].zone_end;
 		zone_start = conf->strip_zone[j].zone_end;
 	}
 	}
-	printk(KERN_INFO "**********************************\n\n");
+	printk(KERN_INFO "\n");
 }
 }
 
 
-static int create_strip_zones(mddev_t *mddev, raid0_conf_t **private_conf)
+static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
 {
 {
 	int i, c, err;
 	int i, c, err;
 	sector_t curr_zone_end, sectors;
 	sector_t curr_zone_end, sectors;
-	mdk_rdev_t *smallest, *rdev1, *rdev2, *rdev, **dev;
+	struct md_rdev *smallest, *rdev1, *rdev2, *rdev, **dev;
 	struct strip_zone *zone;
 	struct strip_zone *zone;
 	int cnt;
 	int cnt;
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
-	raid0_conf_t *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
+	char b2[BDEVNAME_SIZE];
+	struct r0conf *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
 
 
 	if (!conf)
 	if (!conf)
 		return -ENOMEM;
 		return -ENOMEM;
 	list_for_each_entry(rdev1, &mddev->disks, same_set) {
 	list_for_each_entry(rdev1, &mddev->disks, same_set) {
-		printk(KERN_INFO "md/raid0:%s: looking at %s\n",
-		       mdname(mddev),
-		       bdevname(rdev1->bdev, b));
+		pr_debug("md/raid0:%s: looking at %s\n",
+			 mdname(mddev),
+			 bdevname(rdev1->bdev, b));
 		c = 0;
 		c = 0;
 
 
 		/* round size to chunk_size */
 		/* round size to chunk_size */
@@ -101,16 +102,16 @@ static int create_strip_zones(mddev_t *mddev, raid0_conf_t **private_conf)
 		rdev1->sectors = sectors * mddev->chunk_sectors;
 		rdev1->sectors = sectors * mddev->chunk_sectors;
 
 
 		list_for_each_entry(rdev2, &mddev->disks, same_set) {
 		list_for_each_entry(rdev2, &mddev->disks, same_set) {
-			printk(KERN_INFO "md/raid0:%s:   comparing %s(%llu)",
-			       mdname(mddev),
-			       bdevname(rdev1->bdev,b),
-			       (unsigned long long)rdev1->sectors);
-			printk(KERN_CONT " with %s(%llu)\n",
-			       bdevname(rdev2->bdev,b),
-			       (unsigned long long)rdev2->sectors);
+			pr_debug("md/raid0:%s:   comparing %s(%llu)"
+				 " with %s(%llu)\n",
+				 mdname(mddev),
+				 bdevname(rdev1->bdev,b),
+				 (unsigned long long)rdev1->sectors,
+				 bdevname(rdev2->bdev,b2),
+				 (unsigned long long)rdev2->sectors);
 			if (rdev2 == rdev1) {
 			if (rdev2 == rdev1) {
-				printk(KERN_INFO "md/raid0:%s:   END\n",
-				       mdname(mddev));
+				pr_debug("md/raid0:%s:   END\n",
+					 mdname(mddev));
 				break;
 				break;
 			}
 			}
 			if (rdev2->sectors == rdev1->sectors) {
 			if (rdev2->sectors == rdev1->sectors) {
@@ -118,30 +119,30 @@ static int create_strip_zones(mddev_t *mddev, raid0_conf_t **private_conf)
 				 * Not unique, don't count it as a new
 				 * Not unique, don't count it as a new
 				 * group
 				 * group
 				 */
 				 */
-				printk(KERN_INFO "md/raid0:%s:   EQUAL\n",
-				       mdname(mddev));
+				pr_debug("md/raid0:%s:   EQUAL\n",
+					 mdname(mddev));
 				c = 1;
 				c = 1;
 				break;
 				break;
 			}
 			}
-			printk(KERN_INFO "md/raid0:%s:   NOT EQUAL\n",
-			       mdname(mddev));
+			pr_debug("md/raid0:%s:   NOT EQUAL\n",
+				 mdname(mddev));
 		}
 		}
 		if (!c) {
 		if (!c) {
-			printk(KERN_INFO "md/raid0:%s:   ==> UNIQUE\n",
-			       mdname(mddev));
+			pr_debug("md/raid0:%s:   ==> UNIQUE\n",
+				 mdname(mddev));
 			conf->nr_strip_zones++;
 			conf->nr_strip_zones++;
-			printk(KERN_INFO "md/raid0:%s: %d zones\n",
-			       mdname(mddev), conf->nr_strip_zones);
+			pr_debug("md/raid0:%s: %d zones\n",
+				 mdname(mddev), conf->nr_strip_zones);
 		}
 		}
 	}
 	}
-	printk(KERN_INFO "md/raid0:%s: FINAL %d zones\n",
-	       mdname(mddev), conf->nr_strip_zones);
+	pr_debug("md/raid0:%s: FINAL %d zones\n",
+		 mdname(mddev), conf->nr_strip_zones);
 	err = -ENOMEM;
 	err = -ENOMEM;
 	conf->strip_zone = kzalloc(sizeof(struct strip_zone)*
 	conf->strip_zone = kzalloc(sizeof(struct strip_zone)*
 				conf->nr_strip_zones, GFP_KERNEL);
 				conf->nr_strip_zones, GFP_KERNEL);
 	if (!conf->strip_zone)
 	if (!conf->strip_zone)
 		goto abort;
 		goto abort;
-	conf->devlist = kzalloc(sizeof(mdk_rdev_t*)*
+	conf->devlist = kzalloc(sizeof(struct md_rdev*)*
 				conf->nr_strip_zones*mddev->raid_disks,
 				conf->nr_strip_zones*mddev->raid_disks,
 				GFP_KERNEL);
 				GFP_KERNEL);
 	if (!conf->devlist)
 	if (!conf->devlist)
@@ -218,44 +219,45 @@ static int create_strip_zones(mddev_t *mddev, raid0_conf_t **private_conf)
 		zone = conf->strip_zone + i;
 		zone = conf->strip_zone + i;
 		dev = conf->devlist + i * mddev->raid_disks;
 		dev = conf->devlist + i * mddev->raid_disks;
 
 
-		printk(KERN_INFO "md/raid0:%s: zone %d\n",
-		       mdname(mddev), i);
+		pr_debug("md/raid0:%s: zone %d\n", mdname(mddev), i);
 		zone->dev_start = smallest->sectors;
 		zone->dev_start = smallest->sectors;
 		smallest = NULL;
 		smallest = NULL;
 		c = 0;
 		c = 0;
 
 
 		for (j=0; j<cnt; j++) {
 		for (j=0; j<cnt; j++) {
 			rdev = conf->devlist[j];
 			rdev = conf->devlist[j];
-			printk(KERN_INFO "md/raid0:%s: checking %s ...",
-			       mdname(mddev),
-			       bdevname(rdev->bdev, b));
 			if (rdev->sectors <= zone->dev_start) {
 			if (rdev->sectors <= zone->dev_start) {
-				printk(KERN_CONT " nope.\n");
+				pr_debug("md/raid0:%s: checking %s ... nope\n",
+					 mdname(mddev),
+					 bdevname(rdev->bdev, b));
 				continue;
 				continue;
 			}
 			}
-			printk(KERN_CONT " contained as device %d\n", c);
+			pr_debug("md/raid0:%s: checking %s ..."
+				 " contained as device %d\n",
+				 mdname(mddev),
+				 bdevname(rdev->bdev, b), c);
 			dev[c] = rdev;
 			dev[c] = rdev;
 			c++;
 			c++;
 			if (!smallest || rdev->sectors < smallest->sectors) {
 			if (!smallest || rdev->sectors < smallest->sectors) {
 				smallest = rdev;
 				smallest = rdev;
-				printk(KERN_INFO "md/raid0:%s:  (%llu) is smallest!.\n",
-				       mdname(mddev),
-				       (unsigned long long)rdev->sectors);
+				pr_debug("md/raid0:%s:  (%llu) is smallest!.\n",
+					 mdname(mddev),
+					 (unsigned long long)rdev->sectors);
 			}
 			}
 		}
 		}
 
 
 		zone->nb_dev = c;
 		zone->nb_dev = c;
 		sectors = (smallest->sectors - zone->dev_start) * c;
 		sectors = (smallest->sectors - zone->dev_start) * c;
-		printk(KERN_INFO "md/raid0:%s: zone->nb_dev: %d, sectors: %llu\n",
-		       mdname(mddev),
-		       zone->nb_dev, (unsigned long long)sectors);
+		pr_debug("md/raid0:%s: zone->nb_dev: %d, sectors: %llu\n",
+			 mdname(mddev),
+			 zone->nb_dev, (unsigned long long)sectors);
 
 
 		curr_zone_end += sectors;
 		curr_zone_end += sectors;
 		zone->zone_end = curr_zone_end;
 		zone->zone_end = curr_zone_end;
 
 
-		printk(KERN_INFO "md/raid0:%s: current zone start: %llu\n",
-		       mdname(mddev),
-		       (unsigned long long)smallest->sectors);
+		pr_debug("md/raid0:%s: current zone start: %llu\n",
+			 mdname(mddev),
+			 (unsigned long long)smallest->sectors);
 	}
 	}
 	mddev->queue->backing_dev_info.congested_fn = raid0_congested;
 	mddev->queue->backing_dev_info.congested_fn = raid0_congested;
 	mddev->queue->backing_dev_info.congested_data = mddev;
 	mddev->queue->backing_dev_info.congested_data = mddev;
@@ -275,7 +277,7 @@ static int create_strip_zones(mddev_t *mddev, raid0_conf_t **private_conf)
 	blk_queue_io_opt(mddev->queue,
 	blk_queue_io_opt(mddev->queue,
 			 (mddev->chunk_sectors << 9) * mddev->raid_disks);
 			 (mddev->chunk_sectors << 9) * mddev->raid_disks);
 
 
-	printk(KERN_INFO "md/raid0:%s: done.\n", mdname(mddev));
+	pr_debug("md/raid0:%s: done.\n", mdname(mddev));
 	*private_conf = conf;
 	*private_conf = conf;
 
 
 	return 0;
 	return 0;
@@ -299,7 +301,7 @@ static int raid0_mergeable_bvec(struct request_queue *q,
 				struct bvec_merge_data *bvm,
 				struct bvec_merge_data *bvm,
 				struct bio_vec *biovec)
 				struct bio_vec *biovec)
 {
 {
-	mddev_t *mddev = q->queuedata;
+	struct mddev *mddev = q->queuedata;
 	sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
 	sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
 	int max;
 	int max;
 	unsigned int chunk_sectors = mddev->chunk_sectors;
 	unsigned int chunk_sectors = mddev->chunk_sectors;
@@ -318,10 +320,10 @@ static int raid0_mergeable_bvec(struct request_queue *q,
 		return max;
 		return max;
 }
 }
 
 
-static sector_t raid0_size(mddev_t *mddev, sector_t sectors, int raid_disks)
+static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks)
 {
 {
 	sector_t array_sectors = 0;
 	sector_t array_sectors = 0;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	WARN_ONCE(sectors || raid_disks,
 	WARN_ONCE(sectors || raid_disks,
 		  "%s does not support generic reshape\n", __func__);
 		  "%s does not support generic reshape\n", __func__);
@@ -332,9 +334,9 @@ static sector_t raid0_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 	return array_sectors;
 	return array_sectors;
 }
 }
 
 
-static int raid0_run(mddev_t *mddev)
+static int raid0_run(struct mddev *mddev)
 {
 {
-	raid0_conf_t *conf;
+	struct r0conf *conf;
 	int ret;
 	int ret;
 
 
 	if (mddev->chunk_sectors == 0) {
 	if (mddev->chunk_sectors == 0) {
@@ -382,9 +384,9 @@ static int raid0_run(mddev_t *mddev)
 	return md_integrity_register(mddev);
 	return md_integrity_register(mddev);
 }
 }
 
 
-static int raid0_stop(mddev_t *mddev)
+static int raid0_stop(struct mddev *mddev)
 {
 {
-	raid0_conf_t *conf = mddev->private;
+	struct r0conf *conf = mddev->private;
 
 
 	blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
 	blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
 	kfree(conf->strip_zone);
 	kfree(conf->strip_zone);
@@ -397,7 +399,7 @@ static int raid0_stop(mddev_t *mddev)
 /* Find the zone which holds a particular offset
 /* Find the zone which holds a particular offset
  * Update *sectorp to be an offset in that zone
  * Update *sectorp to be an offset in that zone
  */
  */
-static struct strip_zone *find_zone(struct raid0_private_data *conf,
+static struct strip_zone *find_zone(struct r0conf *conf,
 				    sector_t *sectorp)
 				    sector_t *sectorp)
 {
 {
 	int i;
 	int i;
@@ -417,12 +419,12 @@ static struct strip_zone *find_zone(struct raid0_private_data *conf,
  * remaps the bio to the target device. we separate two flows.
  * remaps the bio to the target device. we separate two flows.
  * power 2 flow and a general flow for the sake of perfromance
  * power 2 flow and a general flow for the sake of perfromance
 */
 */
-static mdk_rdev_t *map_sector(mddev_t *mddev, struct strip_zone *zone,
+static struct md_rdev *map_sector(struct mddev *mddev, struct strip_zone *zone,
 				sector_t sector, sector_t *sector_offset)
 				sector_t sector, sector_t *sector_offset)
 {
 {
 	unsigned int sect_in_chunk;
 	unsigned int sect_in_chunk;
 	sector_t chunk;
 	sector_t chunk;
-	raid0_conf_t *conf = mddev->private;
+	struct r0conf *conf = mddev->private;
 	int raid_disks = conf->strip_zone[0].nb_dev;
 	int raid_disks = conf->strip_zone[0].nb_dev;
 	unsigned int chunk_sects = mddev->chunk_sectors;
 	unsigned int chunk_sects = mddev->chunk_sectors;
 
 
@@ -453,7 +455,7 @@ static mdk_rdev_t *map_sector(mddev_t *mddev, struct strip_zone *zone,
 /*
 /*
  * Is io distribute over 1 or more chunks ?
  * Is io distribute over 1 or more chunks ?
 */
 */
-static inline int is_io_in_chunk_boundary(mddev_t *mddev,
+static inline int is_io_in_chunk_boundary(struct mddev *mddev,
 			unsigned int chunk_sects, struct bio *bio)
 			unsigned int chunk_sects, struct bio *bio)
 {
 {
 	if (likely(is_power_of_2(chunk_sects))) {
 	if (likely(is_power_of_2(chunk_sects))) {
@@ -466,12 +468,12 @@ static inline int is_io_in_chunk_boundary(mddev_t *mddev,
 	}
 	}
 }
 }
 
 
-static int raid0_make_request(mddev_t *mddev, struct bio *bio)
+static int raid0_make_request(struct mddev *mddev, struct bio *bio)
 {
 {
 	unsigned int chunk_sects;
 	unsigned int chunk_sects;
 	sector_t sector_offset;
 	sector_t sector_offset;
 	struct strip_zone *zone;
 	struct strip_zone *zone;
-	mdk_rdev_t *tmp_dev;
+	struct md_rdev *tmp_dev;
 
 
 	if (unlikely(bio->bi_rw & REQ_FLUSH)) {
 	if (unlikely(bio->bi_rw & REQ_FLUSH)) {
 		md_flush_request(mddev, bio);
 		md_flush_request(mddev, bio);
@@ -526,43 +528,16 @@ bad_map:
 	return 0;
 	return 0;
 }
 }
 
 
-static void raid0_status(struct seq_file *seq, mddev_t *mddev)
+static void raid0_status(struct seq_file *seq, struct mddev *mddev)
 {
 {
-#undef MD_DEBUG
-#ifdef MD_DEBUG
-	int j, k, h;
-	char b[BDEVNAME_SIZE];
-	raid0_conf_t *conf = mddev->private;
-	int raid_disks = conf->strip_zone[0].nb_dev;
-
-	sector_t zone_size;
-	sector_t zone_start = 0;
-	h = 0;
-
-	for (j = 0; j < conf->nr_strip_zones; j++) {
-		seq_printf(seq, "      z%d", j);
-		seq_printf(seq, "=[");
-		for (k = 0; k < conf->strip_zone[j].nb_dev; k++)
-			seq_printf(seq, "%s/", bdevname(
-				conf->devlist[j*raid_disks + k]
-						->bdev, b));
-
-		zone_size  = conf->strip_zone[j].zone_end - zone_start;
-		seq_printf(seq, "] ze=%lld ds=%lld s=%lld\n",
-			(unsigned long long)zone_start>>1,
-			(unsigned long long)conf->strip_zone[j].dev_start>>1,
-			(unsigned long long)zone_size>>1);
-		zone_start = conf->strip_zone[j].zone_end;
-	}
-#endif
 	seq_printf(seq, " %dk chunks", mddev->chunk_sectors / 2);
 	seq_printf(seq, " %dk chunks", mddev->chunk_sectors / 2);
 	return;
 	return;
 }
 }
 
 
-static void *raid0_takeover_raid45(mddev_t *mddev)
+static void *raid0_takeover_raid45(struct mddev *mddev)
 {
 {
-	mdk_rdev_t *rdev;
-	raid0_conf_t *priv_conf;
+	struct md_rdev *rdev;
+	struct r0conf *priv_conf;
 
 
 	if (mddev->degraded != 1) {
 	if (mddev->degraded != 1) {
 		printk(KERN_ERR "md/raid0:%s: raid5 must be degraded! Degraded disks: %d\n",
 		printk(KERN_ERR "md/raid0:%s: raid5 must be degraded! Degraded disks: %d\n",
@@ -593,9 +568,9 @@ static void *raid0_takeover_raid45(mddev_t *mddev)
 	return priv_conf;
 	return priv_conf;
 }
 }
 
 
-static void *raid0_takeover_raid10(mddev_t *mddev)
+static void *raid0_takeover_raid10(struct mddev *mddev)
 {
 {
-	raid0_conf_t *priv_conf;
+	struct r0conf *priv_conf;
 
 
 	/* Check layout:
 	/* Check layout:
 	 *  - far_copies must be 1
 	 *  - far_copies must be 1
@@ -634,9 +609,9 @@ static void *raid0_takeover_raid10(mddev_t *mddev)
 	return priv_conf;
 	return priv_conf;
 }
 }
 
 
-static void *raid0_takeover_raid1(mddev_t *mddev)
+static void *raid0_takeover_raid1(struct mddev *mddev)
 {
 {
-	raid0_conf_t *priv_conf;
+	struct r0conf *priv_conf;
 
 
 	/* Check layout:
 	/* Check layout:
 	 *  - (N - 1) mirror drives must be already faulty
 	 *  - (N - 1) mirror drives must be already faulty
@@ -660,7 +635,7 @@ static void *raid0_takeover_raid1(mddev_t *mddev)
 	return priv_conf;
 	return priv_conf;
 }
 }
 
 
-static void *raid0_takeover(mddev_t *mddev)
+static void *raid0_takeover(struct mddev *mddev)
 {
 {
 	/* raid0 can take over:
 	/* raid0 can take over:
 	 *  raid4 - if all data disks are active.
 	 *  raid4 - if all data disks are active.
@@ -691,11 +666,11 @@ static void *raid0_takeover(mddev_t *mddev)
 	return ERR_PTR(-EINVAL);
 	return ERR_PTR(-EINVAL);
 }
 }
 
 
-static void raid0_quiesce(mddev_t *mddev, int state)
+static void raid0_quiesce(struct mddev *mddev, int state)
 {
 {
 }
 }
 
 
-static struct mdk_personality raid0_personality=
+static struct md_personality raid0_personality=
 {
 {
 	.name		= "raid0",
 	.name		= "raid0",
 	.level		= 0,
 	.level		= 0,

+ 3 - 7
drivers/md/raid0.h

@@ -1,20 +1,16 @@
 #ifndef _RAID0_H
 #ifndef _RAID0_H
 #define _RAID0_H
 #define _RAID0_H
 
 
-struct strip_zone
-{
+struct strip_zone {
 	sector_t zone_end;	/* Start of the next zone (in sectors) */
 	sector_t zone_end;	/* Start of the next zone (in sectors) */
 	sector_t dev_start;	/* Zone offset in real dev (in sectors) */
 	sector_t dev_start;	/* Zone offset in real dev (in sectors) */
 	int nb_dev;		/* # of devices attached to the zone */
 	int nb_dev;		/* # of devices attached to the zone */
 };
 };
 
 
-struct raid0_private_data
-{
+struct r0conf {
 	struct strip_zone *strip_zone;
 	struct strip_zone *strip_zone;
-	mdk_rdev_t **devlist; /* lists of rdevs, pointed to by strip_zone->dev */
+	struct md_rdev **devlist; /* lists of rdevs, pointed to by strip_zone->dev */
 	int nr_strip_zones;
 	int nr_strip_zones;
 };
 };
 
 
-typedef struct raid0_private_data raid0_conf_t;
-
 #endif
 #endif

+ 179 - 156
drivers/md/raid1.c

@@ -40,22 +40,24 @@
 #include "raid1.h"
 #include "raid1.h"
 #include "bitmap.h"
 #include "bitmap.h"
 
 
-#define DEBUG 0
-#define PRINTK(x...) do { if (DEBUG) printk(x); } while (0)
-
 /*
 /*
  * Number of guaranteed r1bios in case of extreme VM load:
  * Number of guaranteed r1bios in case of extreme VM load:
  */
  */
 #define	NR_RAID1_BIOS 256
 #define	NR_RAID1_BIOS 256
 
 
+/* When there are this many requests queue to be written by
+ * the raid1 thread, we become 'congested' to provide back-pressure
+ * for writeback.
+ */
+static int max_queued_requests = 1024;
 
 
-static void allow_barrier(conf_t *conf);
-static void lower_barrier(conf_t *conf);
+static void allow_barrier(struct r1conf *conf);
+static void lower_barrier(struct r1conf *conf);
 
 
 static void * r1bio_pool_alloc(gfp_t gfp_flags, void *data)
 static void * r1bio_pool_alloc(gfp_t gfp_flags, void *data)
 {
 {
 	struct pool_info *pi = data;
 	struct pool_info *pi = data;
-	int size = offsetof(r1bio_t, bios[pi->raid_disks]);
+	int size = offsetof(struct r1bio, bios[pi->raid_disks]);
 
 
 	/* allocate a r1bio with room for raid_disks entries in the bios array */
 	/* allocate a r1bio with room for raid_disks entries in the bios array */
 	return kzalloc(size, gfp_flags);
 	return kzalloc(size, gfp_flags);
@@ -76,7 +78,7 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data)
 {
 {
 	struct pool_info *pi = data;
 	struct pool_info *pi = data;
 	struct page *page;
 	struct page *page;
-	r1bio_t *r1_bio;
+	struct r1bio *r1_bio;
 	struct bio *bio;
 	struct bio *bio;
 	int i, j;
 	int i, j;
 
 
@@ -142,7 +144,7 @@ static void r1buf_pool_free(void *__r1_bio, void *data)
 {
 {
 	struct pool_info *pi = data;
 	struct pool_info *pi = data;
 	int i,j;
 	int i,j;
-	r1bio_t *r1bio = __r1_bio;
+	struct r1bio *r1bio = __r1_bio;
 
 
 	for (i = 0; i < RESYNC_PAGES; i++)
 	for (i = 0; i < RESYNC_PAGES; i++)
 		for (j = pi->raid_disks; j-- ;) {
 		for (j = pi->raid_disks; j-- ;) {
@@ -157,7 +159,7 @@ static void r1buf_pool_free(void *__r1_bio, void *data)
 	r1bio_pool_free(r1bio, data);
 	r1bio_pool_free(r1bio, data);
 }
 }
 
 
-static void put_all_bios(conf_t *conf, r1bio_t *r1_bio)
+static void put_all_bios(struct r1conf *conf, struct r1bio *r1_bio)
 {
 {
 	int i;
 	int i;
 
 
@@ -169,17 +171,17 @@ static void put_all_bios(conf_t *conf, r1bio_t *r1_bio)
 	}
 	}
 }
 }
 
 
-static void free_r1bio(r1bio_t *r1_bio)
+static void free_r1bio(struct r1bio *r1_bio)
 {
 {
-	conf_t *conf = r1_bio->mddev->private;
+	struct r1conf *conf = r1_bio->mddev->private;
 
 
 	put_all_bios(conf, r1_bio);
 	put_all_bios(conf, r1_bio);
 	mempool_free(r1_bio, conf->r1bio_pool);
 	mempool_free(r1_bio, conf->r1bio_pool);
 }
 }
 
 
-static void put_buf(r1bio_t *r1_bio)
+static void put_buf(struct r1bio *r1_bio)
 {
 {
-	conf_t *conf = r1_bio->mddev->private;
+	struct r1conf *conf = r1_bio->mddev->private;
 	int i;
 	int i;
 
 
 	for (i=0; i<conf->raid_disks; i++) {
 	for (i=0; i<conf->raid_disks; i++) {
@@ -193,11 +195,11 @@ static void put_buf(r1bio_t *r1_bio)
 	lower_barrier(conf);
 	lower_barrier(conf);
 }
 }
 
 
-static void reschedule_retry(r1bio_t *r1_bio)
+static void reschedule_retry(struct r1bio *r1_bio)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
-	mddev_t *mddev = r1_bio->mddev;
-	conf_t *conf = mddev->private;
+	struct mddev *mddev = r1_bio->mddev;
+	struct r1conf *conf = mddev->private;
 
 
 	spin_lock_irqsave(&conf->device_lock, flags);
 	spin_lock_irqsave(&conf->device_lock, flags);
 	list_add(&r1_bio->retry_list, &conf->retry_list);
 	list_add(&r1_bio->retry_list, &conf->retry_list);
@@ -213,11 +215,11 @@ static void reschedule_retry(r1bio_t *r1_bio)
  * operation and are ready to return a success/failure code to the buffer
  * operation and are ready to return a success/failure code to the buffer
  * cache layer.
  * cache layer.
  */
  */
-static void call_bio_endio(r1bio_t *r1_bio)
+static void call_bio_endio(struct r1bio *r1_bio)
 {
 {
 	struct bio *bio = r1_bio->master_bio;
 	struct bio *bio = r1_bio->master_bio;
 	int done;
 	int done;
-	conf_t *conf = r1_bio->mddev->private;
+	struct r1conf *conf = r1_bio->mddev->private;
 
 
 	if (bio->bi_phys_segments) {
 	if (bio->bi_phys_segments) {
 		unsigned long flags;
 		unsigned long flags;
@@ -240,17 +242,17 @@ static void call_bio_endio(r1bio_t *r1_bio)
 	}
 	}
 }
 }
 
 
-static void raid_end_bio_io(r1bio_t *r1_bio)
+static void raid_end_bio_io(struct r1bio *r1_bio)
 {
 {
 	struct bio *bio = r1_bio->master_bio;
 	struct bio *bio = r1_bio->master_bio;
 
 
 	/* if nobody has done the final endio yet, do it now */
 	/* if nobody has done the final endio yet, do it now */
 	if (!test_and_set_bit(R1BIO_Returned, &r1_bio->state)) {
 	if (!test_and_set_bit(R1BIO_Returned, &r1_bio->state)) {
-		PRINTK(KERN_DEBUG "raid1: sync end %s on sectors %llu-%llu\n",
-			(bio_data_dir(bio) == WRITE) ? "write" : "read",
-			(unsigned long long) bio->bi_sector,
-			(unsigned long long) bio->bi_sector +
-				(bio->bi_size >> 9) - 1);
+		pr_debug("raid1: sync end %s on sectors %llu-%llu\n",
+			 (bio_data_dir(bio) == WRITE) ? "write" : "read",
+			 (unsigned long long) bio->bi_sector,
+			 (unsigned long long) bio->bi_sector +
+			 (bio->bi_size >> 9) - 1);
 
 
 		call_bio_endio(r1_bio);
 		call_bio_endio(r1_bio);
 	}
 	}
@@ -260,20 +262,38 @@ static void raid_end_bio_io(r1bio_t *r1_bio)
 /*
 /*
  * Update disk head position estimator based on IRQ completion info.
  * Update disk head position estimator based on IRQ completion info.
  */
  */
-static inline void update_head_pos(int disk, r1bio_t *r1_bio)
+static inline void update_head_pos(int disk, struct r1bio *r1_bio)
 {
 {
-	conf_t *conf = r1_bio->mddev->private;
+	struct r1conf *conf = r1_bio->mddev->private;
 
 
 	conf->mirrors[disk].head_position =
 	conf->mirrors[disk].head_position =
 		r1_bio->sector + (r1_bio->sectors);
 		r1_bio->sector + (r1_bio->sectors);
 }
 }
 
 
+/*
+ * Find the disk number which triggered given bio
+ */
+static int find_bio_disk(struct r1bio *r1_bio, struct bio *bio)
+{
+	int mirror;
+	int raid_disks = r1_bio->mddev->raid_disks;
+
+	for (mirror = 0; mirror < raid_disks; mirror++)
+		if (r1_bio->bios[mirror] == bio)
+			break;
+
+	BUG_ON(mirror == raid_disks);
+	update_head_pos(mirror, r1_bio);
+
+	return mirror;
+}
+
 static void raid1_end_read_request(struct bio *bio, int error)
 static void raid1_end_read_request(struct bio *bio, int error)
 {
 {
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
-	r1bio_t *r1_bio = bio->bi_private;
+	struct r1bio *r1_bio = bio->bi_private;
 	int mirror;
 	int mirror;
-	conf_t *conf = r1_bio->mddev->private;
+	struct r1conf *conf = r1_bio->mddev->private;
 
 
 	mirror = r1_bio->read_disk;
 	mirror = r1_bio->read_disk;
 	/*
 	/*
@@ -318,7 +338,7 @@ static void raid1_end_read_request(struct bio *bio, int error)
 	rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev);
 	rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev);
 }
 }
 
 
-static void close_write(r1bio_t *r1_bio)
+static void close_write(struct r1bio *r1_bio)
 {
 {
 	/* it really is the end of this request */
 	/* it really is the end of this request */
 	if (test_bit(R1BIO_BehindIO, &r1_bio->state)) {
 	if (test_bit(R1BIO_BehindIO, &r1_bio->state)) {
@@ -337,7 +357,7 @@ static void close_write(r1bio_t *r1_bio)
 	md_write_end(r1_bio->mddev);
 	md_write_end(r1_bio->mddev);
 }
 }
 
 
-static void r1_bio_write_done(r1bio_t *r1_bio)
+static void r1_bio_write_done(struct r1bio *r1_bio)
 {
 {
 	if (!atomic_dec_and_test(&r1_bio->remaining))
 	if (!atomic_dec_and_test(&r1_bio->remaining))
 		return;
 		return;
@@ -356,15 +376,12 @@ static void r1_bio_write_done(r1bio_t *r1_bio)
 static void raid1_end_write_request(struct bio *bio, int error)
 static void raid1_end_write_request(struct bio *bio, int error)
 {
 {
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
-	r1bio_t *r1_bio = bio->bi_private;
+	struct r1bio *r1_bio = bio->bi_private;
 	int mirror, behind = test_bit(R1BIO_BehindIO, &r1_bio->state);
 	int mirror, behind = test_bit(R1BIO_BehindIO, &r1_bio->state);
-	conf_t *conf = r1_bio->mddev->private;
+	struct r1conf *conf = r1_bio->mddev->private;
 	struct bio *to_put = NULL;
 	struct bio *to_put = NULL;
 
 
-
-	for (mirror = 0; mirror < conf->raid_disks; mirror++)
-		if (r1_bio->bios[mirror] == bio)
-			break;
+	mirror = find_bio_disk(r1_bio, bio);
 
 
 	/*
 	/*
 	 * 'one mirror IO has finished' event handler:
 	 * 'one mirror IO has finished' event handler:
@@ -400,8 +417,6 @@ static void raid1_end_write_request(struct bio *bio, int error)
 		}
 		}
 	}
 	}
 
 
-	update_head_pos(mirror, r1_bio);
-
 	if (behind) {
 	if (behind) {
 		if (test_bit(WriteMostly, &conf->mirrors[mirror].rdev->flags))
 		if (test_bit(WriteMostly, &conf->mirrors[mirror].rdev->flags))
 			atomic_dec(&r1_bio->behind_remaining);
 			atomic_dec(&r1_bio->behind_remaining);
@@ -418,10 +433,11 @@ static void raid1_end_write_request(struct bio *bio, int error)
 			/* Maybe we can return now */
 			/* Maybe we can return now */
 			if (!test_and_set_bit(R1BIO_Returned, &r1_bio->state)) {
 			if (!test_and_set_bit(R1BIO_Returned, &r1_bio->state)) {
 				struct bio *mbio = r1_bio->master_bio;
 				struct bio *mbio = r1_bio->master_bio;
-				PRINTK(KERN_DEBUG "raid1: behind end write sectors %llu-%llu\n",
-				       (unsigned long long) mbio->bi_sector,
-				       (unsigned long long) mbio->bi_sector +
-				       (mbio->bi_size >> 9) - 1);
+				pr_debug("raid1: behind end write sectors"
+					 " %llu-%llu\n",
+					 (unsigned long long) mbio->bi_sector,
+					 (unsigned long long) mbio->bi_sector +
+					 (mbio->bi_size >> 9) - 1);
 				call_bio_endio(r1_bio);
 				call_bio_endio(r1_bio);
 			}
 			}
 		}
 		}
@@ -455,7 +471,7 @@ static void raid1_end_write_request(struct bio *bio, int error)
  *
  *
  * The rdev for the device selected will have nr_pending incremented.
  * The rdev for the device selected will have nr_pending incremented.
  */
  */
-static int read_balance(conf_t *conf, r1bio_t *r1_bio, int *max_sectors)
+static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sectors)
 {
 {
 	const sector_t this_sector = r1_bio->sector;
 	const sector_t this_sector = r1_bio->sector;
 	int sectors;
 	int sectors;
@@ -464,7 +480,7 @@ static int read_balance(conf_t *conf, r1bio_t *r1_bio, int *max_sectors)
 	int best_disk;
 	int best_disk;
 	int i;
 	int i;
 	sector_t best_dist;
 	sector_t best_dist;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	int choose_first;
 	int choose_first;
 
 
 	rcu_read_lock();
 	rcu_read_lock();
@@ -582,14 +598,18 @@ static int read_balance(conf_t *conf, r1bio_t *r1_bio, int *max_sectors)
 	return best_disk;
 	return best_disk;
 }
 }
 
 
-int md_raid1_congested(mddev_t *mddev, int bits)
+int md_raid1_congested(struct mddev *mddev, int bits)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r1conf *conf = mddev->private;
 	int i, ret = 0;
 	int i, ret = 0;
 
 
+	if ((bits & (1 << BDI_async_congested)) &&
+	    conf->pending_count >= max_queued_requests)
+		return 1;
+
 	rcu_read_lock();
 	rcu_read_lock();
 	for (i = 0; i < mddev->raid_disks; i++) {
 	for (i = 0; i < mddev->raid_disks; i++) {
-		mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev);
+		struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
 		if (rdev && !test_bit(Faulty, &rdev->flags)) {
 		if (rdev && !test_bit(Faulty, &rdev->flags)) {
 			struct request_queue *q = bdev_get_queue(rdev->bdev);
 			struct request_queue *q = bdev_get_queue(rdev->bdev);
 
 
@@ -611,13 +631,13 @@ EXPORT_SYMBOL_GPL(md_raid1_congested);
 
 
 static int raid1_congested(void *data, int bits)
 static int raid1_congested(void *data, int bits)
 {
 {
-	mddev_t *mddev = data;
+	struct mddev *mddev = data;
 
 
 	return mddev_congested(mddev, bits) ||
 	return mddev_congested(mddev, bits) ||
 		md_raid1_congested(mddev, bits);
 		md_raid1_congested(mddev, bits);
 }
 }
 
 
-static void flush_pending_writes(conf_t *conf)
+static void flush_pending_writes(struct r1conf *conf)
 {
 {
 	/* Any writes that have been queued but are awaiting
 	/* Any writes that have been queued but are awaiting
 	 * bitmap updates get flushed here.
 	 * bitmap updates get flushed here.
@@ -627,10 +647,12 @@ static void flush_pending_writes(conf_t *conf)
 	if (conf->pending_bio_list.head) {
 	if (conf->pending_bio_list.head) {
 		struct bio *bio;
 		struct bio *bio;
 		bio = bio_list_get(&conf->pending_bio_list);
 		bio = bio_list_get(&conf->pending_bio_list);
+		conf->pending_count = 0;
 		spin_unlock_irq(&conf->device_lock);
 		spin_unlock_irq(&conf->device_lock);
 		/* flush any pending bitmap writes to
 		/* flush any pending bitmap writes to
 		 * disk before proceeding w/ I/O */
 		 * disk before proceeding w/ I/O */
 		bitmap_unplug(conf->mddev->bitmap);
 		bitmap_unplug(conf->mddev->bitmap);
+		wake_up(&conf->wait_barrier);
 
 
 		while (bio) { /* submit pending writes */
 		while (bio) { /* submit pending writes */
 			struct bio *next = bio->bi_next;
 			struct bio *next = bio->bi_next;
@@ -665,7 +687,7 @@ static void flush_pending_writes(conf_t *conf)
  */
  */
 #define RESYNC_DEPTH 32
 #define RESYNC_DEPTH 32
 
 
-static void raise_barrier(conf_t *conf)
+static void raise_barrier(struct r1conf *conf)
 {
 {
 	spin_lock_irq(&conf->resync_lock);
 	spin_lock_irq(&conf->resync_lock);
 
 
@@ -684,7 +706,7 @@ static void raise_barrier(conf_t *conf)
 	spin_unlock_irq(&conf->resync_lock);
 	spin_unlock_irq(&conf->resync_lock);
 }
 }
 
 
-static void lower_barrier(conf_t *conf)
+static void lower_barrier(struct r1conf *conf)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 	BUG_ON(conf->barrier <= 0);
 	BUG_ON(conf->barrier <= 0);
@@ -694,7 +716,7 @@ static void lower_barrier(conf_t *conf)
 	wake_up(&conf->wait_barrier);
 	wake_up(&conf->wait_barrier);
 }
 }
 
 
-static void wait_barrier(conf_t *conf)
+static void wait_barrier(struct r1conf *conf)
 {
 {
 	spin_lock_irq(&conf->resync_lock);
 	spin_lock_irq(&conf->resync_lock);
 	if (conf->barrier) {
 	if (conf->barrier) {
@@ -708,7 +730,7 @@ static void wait_barrier(conf_t *conf)
 	spin_unlock_irq(&conf->resync_lock);
 	spin_unlock_irq(&conf->resync_lock);
 }
 }
 
 
-static void allow_barrier(conf_t *conf)
+static void allow_barrier(struct r1conf *conf)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 	spin_lock_irqsave(&conf->resync_lock, flags);
 	spin_lock_irqsave(&conf->resync_lock, flags);
@@ -717,7 +739,7 @@ static void allow_barrier(conf_t *conf)
 	wake_up(&conf->wait_barrier);
 	wake_up(&conf->wait_barrier);
 }
 }
 
 
-static void freeze_array(conf_t *conf)
+static void freeze_array(struct r1conf *conf)
 {
 {
 	/* stop syncio and normal IO and wait for everything to
 	/* stop syncio and normal IO and wait for everything to
 	 * go quite.
 	 * go quite.
@@ -740,7 +762,7 @@ static void freeze_array(conf_t *conf)
 			    flush_pending_writes(conf));
 			    flush_pending_writes(conf));
 	spin_unlock_irq(&conf->resync_lock);
 	spin_unlock_irq(&conf->resync_lock);
 }
 }
-static void unfreeze_array(conf_t *conf)
+static void unfreeze_array(struct r1conf *conf)
 {
 {
 	/* reverse the effect of the freeze */
 	/* reverse the effect of the freeze */
 	spin_lock_irq(&conf->resync_lock);
 	spin_lock_irq(&conf->resync_lock);
@@ -753,7 +775,7 @@ static void unfreeze_array(conf_t *conf)
 
 
 /* duplicate the data pages for behind I/O 
 /* duplicate the data pages for behind I/O 
  */
  */
-static void alloc_behind_pages(struct bio *bio, r1bio_t *r1_bio)
+static void alloc_behind_pages(struct bio *bio, struct r1bio *r1_bio)
 {
 {
 	int i;
 	int i;
 	struct bio_vec *bvec;
 	struct bio_vec *bvec;
@@ -782,14 +804,14 @@ do_sync_io:
 		if (bvecs[i].bv_page)
 		if (bvecs[i].bv_page)
 			put_page(bvecs[i].bv_page);
 			put_page(bvecs[i].bv_page);
 	kfree(bvecs);
 	kfree(bvecs);
-	PRINTK("%dB behind alloc failed, doing sync I/O\n", bio->bi_size);
+	pr_debug("%dB behind alloc failed, doing sync I/O\n", bio->bi_size);
 }
 }
 
 
-static int make_request(mddev_t *mddev, struct bio * bio)
+static int make_request(struct mddev *mddev, struct bio * bio)
 {
 {
-	conf_t *conf = mddev->private;
-	mirror_info_t *mirror;
-	r1bio_t *r1_bio;
+	struct r1conf *conf = mddev->private;
+	struct mirror_info *mirror;
+	struct r1bio *r1_bio;
 	struct bio *read_bio;
 	struct bio *read_bio;
 	int i, disks;
 	int i, disks;
 	struct bitmap *bitmap;
 	struct bitmap *bitmap;
@@ -797,7 +819,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
 	const int rw = bio_data_dir(bio);
 	const int rw = bio_data_dir(bio);
 	const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
 	const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
 	const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA));
 	const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA));
-	mdk_rdev_t *blocked_rdev;
+	struct md_rdev *blocked_rdev;
 	int plugged;
 	int plugged;
 	int first_clone;
 	int first_clone;
 	int sectors_handled;
 	int sectors_handled;
@@ -934,6 +956,11 @@ read_again:
 	/*
 	/*
 	 * WRITE:
 	 * WRITE:
 	 */
 	 */
+	if (conf->pending_count >= max_queued_requests) {
+		md_wakeup_thread(mddev->thread);
+		wait_event(conf->wait_barrier,
+			   conf->pending_count < max_queued_requests);
+	}
 	/* first select target devices under rcu_lock and
 	/* first select target devices under rcu_lock and
 	 * inc refcount on their rdev.  Record them by setting
 	 * inc refcount on their rdev.  Record them by setting
 	 * bios[x] to bio
 	 * bios[x] to bio
@@ -952,7 +979,7 @@ read_again:
 	rcu_read_lock();
 	rcu_read_lock();
 	max_sectors = r1_bio->sectors;
 	max_sectors = r1_bio->sectors;
 	for (i = 0;  i < disks; i++) {
 	for (i = 0;  i < disks; i++) {
-		mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev);
+		struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
 		if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
 		if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
 			atomic_inc(&rdev->nr_pending);
 			atomic_inc(&rdev->nr_pending);
 			blocked_rdev = rdev;
 			blocked_rdev = rdev;
@@ -1097,6 +1124,7 @@ read_again:
 		atomic_inc(&r1_bio->remaining);
 		atomic_inc(&r1_bio->remaining);
 		spin_lock_irqsave(&conf->device_lock, flags);
 		spin_lock_irqsave(&conf->device_lock, flags);
 		bio_list_add(&conf->pending_bio_list, mbio);
 		bio_list_add(&conf->pending_bio_list, mbio);
+		conf->pending_count++;
 		spin_unlock_irqrestore(&conf->device_lock, flags);
 		spin_unlock_irqrestore(&conf->device_lock, flags);
 	}
 	}
 	/* Mustn't call r1_bio_write_done before this next test,
 	/* Mustn't call r1_bio_write_done before this next test,
@@ -1127,16 +1155,16 @@ read_again:
 	return 0;
 	return 0;
 }
 }
 
 
-static void status(struct seq_file *seq, mddev_t *mddev)
+static void status(struct seq_file *seq, struct mddev *mddev)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r1conf *conf = mddev->private;
 	int i;
 	int i;
 
 
 	seq_printf(seq, " [%d/%d] [", conf->raid_disks,
 	seq_printf(seq, " [%d/%d] [", conf->raid_disks,
 		   conf->raid_disks - mddev->degraded);
 		   conf->raid_disks - mddev->degraded);
 	rcu_read_lock();
 	rcu_read_lock();
 	for (i = 0; i < conf->raid_disks; i++) {
 	for (i = 0; i < conf->raid_disks; i++) {
-		mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev);
+		struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
 		seq_printf(seq, "%s",
 		seq_printf(seq, "%s",
 			   rdev && test_bit(In_sync, &rdev->flags) ? "U" : "_");
 			   rdev && test_bit(In_sync, &rdev->flags) ? "U" : "_");
 	}
 	}
@@ -1145,10 +1173,10 @@ static void status(struct seq_file *seq, mddev_t *mddev)
 }
 }
 
 
 
 
-static void error(mddev_t *mddev, mdk_rdev_t *rdev)
+static void error(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
-	conf_t *conf = mddev->private;
+	struct r1conf *conf = mddev->private;
 
 
 	/*
 	/*
 	 * If it is not operational, then we have already marked it as dead
 	 * If it is not operational, then we have already marked it as dead
@@ -1188,7 +1216,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev)
 	       mdname(mddev), conf->raid_disks - mddev->degraded);
 	       mdname(mddev), conf->raid_disks - mddev->degraded);
 }
 }
 
 
-static void print_conf(conf_t *conf)
+static void print_conf(struct r1conf *conf)
 {
 {
 	int i;
 	int i;
 
 
@@ -1203,7 +1231,7 @@ static void print_conf(conf_t *conf)
 	rcu_read_lock();
 	rcu_read_lock();
 	for (i = 0; i < conf->raid_disks; i++) {
 	for (i = 0; i < conf->raid_disks; i++) {
 		char b[BDEVNAME_SIZE];
 		char b[BDEVNAME_SIZE];
-		mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev);
+		struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
 		if (rdev)
 		if (rdev)
 			printk(KERN_DEBUG " disk %d, wo:%d, o:%d, dev:%s\n",
 			printk(KERN_DEBUG " disk %d, wo:%d, o:%d, dev:%s\n",
 			       i, !test_bit(In_sync, &rdev->flags),
 			       i, !test_bit(In_sync, &rdev->flags),
@@ -1213,7 +1241,7 @@ static void print_conf(conf_t *conf)
 	rcu_read_unlock();
 	rcu_read_unlock();
 }
 }
 
 
-static void close_sync(conf_t *conf)
+static void close_sync(struct r1conf *conf)
 {
 {
 	wait_barrier(conf);
 	wait_barrier(conf);
 	allow_barrier(conf);
 	allow_barrier(conf);
@@ -1222,10 +1250,10 @@ static void close_sync(conf_t *conf)
 	conf->r1buf_pool = NULL;
 	conf->r1buf_pool = NULL;
 }
 }
 
 
-static int raid1_spare_active(mddev_t *mddev)
+static int raid1_spare_active(struct mddev *mddev)
 {
 {
 	int i;
 	int i;
-	conf_t *conf = mddev->private;
+	struct r1conf *conf = mddev->private;
 	int count = 0;
 	int count = 0;
 	unsigned long flags;
 	unsigned long flags;
 
 
@@ -1235,7 +1263,7 @@ static int raid1_spare_active(mddev_t *mddev)
 	 * Called under mddev lock, so rcu protection not needed.
 	 * Called under mddev lock, so rcu protection not needed.
 	 */
 	 */
 	for (i = 0; i < conf->raid_disks; i++) {
 	for (i = 0; i < conf->raid_disks; i++) {
-		mdk_rdev_t *rdev = conf->mirrors[i].rdev;
+		struct md_rdev *rdev = conf->mirrors[i].rdev;
 		if (rdev
 		if (rdev
 		    && !test_bit(Faulty, &rdev->flags)
 		    && !test_bit(Faulty, &rdev->flags)
 		    && !test_and_set_bit(In_sync, &rdev->flags)) {
 		    && !test_and_set_bit(In_sync, &rdev->flags)) {
@@ -1252,12 +1280,12 @@ static int raid1_spare_active(mddev_t *mddev)
 }
 }
 
 
 
 
-static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
+static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r1conf *conf = mddev->private;
 	int err = -EEXIST;
 	int err = -EEXIST;
 	int mirror = 0;
 	int mirror = 0;
-	mirror_info_t *p;
+	struct mirror_info *p;
 	int first = 0;
 	int first = 0;
 	int last = mddev->raid_disks - 1;
 	int last = mddev->raid_disks - 1;
 
 
@@ -1300,12 +1328,12 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 	return err;
 	return err;
 }
 }
 
 
-static int raid1_remove_disk(mddev_t *mddev, int number)
+static int raid1_remove_disk(struct mddev *mddev, int number)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r1conf *conf = mddev->private;
 	int err = 0;
 	int err = 0;
-	mdk_rdev_t *rdev;
-	mirror_info_t *p = conf->mirrors+ number;
+	struct md_rdev *rdev;
+	struct mirror_info *p = conf->mirrors+ number;
 
 
 	print_conf(conf);
 	print_conf(conf);
 	rdev = p->rdev;
 	rdev = p->rdev;
@@ -1343,14 +1371,10 @@ abort:
 
 
 static void end_sync_read(struct bio *bio, int error)
 static void end_sync_read(struct bio *bio, int error)
 {
 {
-	r1bio_t *r1_bio = bio->bi_private;
-	int i;
+	struct r1bio *r1_bio = bio->bi_private;
+
+	update_head_pos(r1_bio->read_disk, r1_bio);
 
 
-	for (i=r1_bio->mddev->raid_disks; i--; )
-		if (r1_bio->bios[i] == bio)
-			break;
-	BUG_ON(i < 0);
-	update_head_pos(i, r1_bio);
 	/*
 	/*
 	 * we have read a block, now it needs to be re-written,
 	 * we have read a block, now it needs to be re-written,
 	 * or re-read if the read failed.
 	 * or re-read if the read failed.
@@ -1366,19 +1390,15 @@ static void end_sync_read(struct bio *bio, int error)
 static void end_sync_write(struct bio *bio, int error)
 static void end_sync_write(struct bio *bio, int error)
 {
 {
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
-	r1bio_t *r1_bio = bio->bi_private;
-	mddev_t *mddev = r1_bio->mddev;
-	conf_t *conf = mddev->private;
-	int i;
+	struct r1bio *r1_bio = bio->bi_private;
+	struct mddev *mddev = r1_bio->mddev;
+	struct r1conf *conf = mddev->private;
 	int mirror=0;
 	int mirror=0;
 	sector_t first_bad;
 	sector_t first_bad;
 	int bad_sectors;
 	int bad_sectors;
 
 
-	for (i = 0; i < conf->raid_disks; i++)
-		if (r1_bio->bios[i] == bio) {
-			mirror = i;
-			break;
-		}
+	mirror = find_bio_disk(r1_bio, bio);
+
 	if (!uptodate) {
 	if (!uptodate) {
 		sector_t sync_blocks = 0;
 		sector_t sync_blocks = 0;
 		sector_t s = r1_bio->sector;
 		sector_t s = r1_bio->sector;
@@ -1404,8 +1424,6 @@ static void end_sync_write(struct bio *bio, int error)
 		)
 		)
 		set_bit(R1BIO_MadeGood, &r1_bio->state);
 		set_bit(R1BIO_MadeGood, &r1_bio->state);
 
 
-	update_head_pos(mirror, r1_bio);
-
 	if (atomic_dec_and_test(&r1_bio->remaining)) {
 	if (atomic_dec_and_test(&r1_bio->remaining)) {
 		int s = r1_bio->sectors;
 		int s = r1_bio->sectors;
 		if (test_bit(R1BIO_MadeGood, &r1_bio->state) ||
 		if (test_bit(R1BIO_MadeGood, &r1_bio->state) ||
@@ -1418,7 +1436,7 @@ static void end_sync_write(struct bio *bio, int error)
 	}
 	}
 }
 }
 
 
-static int r1_sync_page_io(mdk_rdev_t *rdev, sector_t sector,
+static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector,
 			    int sectors, struct page *page, int rw)
 			    int sectors, struct page *page, int rw)
 {
 {
 	if (sync_page_io(rdev, sector, sectors << 9, page, rw, false))
 	if (sync_page_io(rdev, sector, sectors << 9, page, rw, false))
@@ -1432,7 +1450,7 @@ static int r1_sync_page_io(mdk_rdev_t *rdev, sector_t sector,
 	return 0;
 	return 0;
 }
 }
 
 
-static int fix_sync_read_error(r1bio_t *r1_bio)
+static int fix_sync_read_error(struct r1bio *r1_bio)
 {
 {
 	/* Try some synchronous reads of other devices to get
 	/* Try some synchronous reads of other devices to get
 	 * good data, much like with normal read errors.  Only
 	 * good data, much like with normal read errors.  Only
@@ -1445,8 +1463,8 @@ static int fix_sync_read_error(r1bio_t *r1_bio)
 	 * made sure that anything with a bad block in range
 	 * made sure that anything with a bad block in range
 	 * will have bi_end_io clear.
 	 * will have bi_end_io clear.
 	 */
 	 */
-	mddev_t *mddev = r1_bio->mddev;
-	conf_t *conf = mddev->private;
+	struct mddev *mddev = r1_bio->mddev;
+	struct r1conf *conf = mddev->private;
 	struct bio *bio = r1_bio->bios[r1_bio->read_disk];
 	struct bio *bio = r1_bio->bios[r1_bio->read_disk];
 	sector_t sect = r1_bio->sector;
 	sector_t sect = r1_bio->sector;
 	int sectors = r1_bio->sectors;
 	int sectors = r1_bio->sectors;
@@ -1456,7 +1474,7 @@ static int fix_sync_read_error(r1bio_t *r1_bio)
 		int s = sectors;
 		int s = sectors;
 		int d = r1_bio->read_disk;
 		int d = r1_bio->read_disk;
 		int success = 0;
 		int success = 0;
-		mdk_rdev_t *rdev;
+		struct md_rdev *rdev;
 		int start;
 		int start;
 
 
 		if (s > (PAGE_SIZE>>9))
 		if (s > (PAGE_SIZE>>9))
@@ -1501,7 +1519,8 @@ static int fix_sync_read_error(r1bio_t *r1_bio)
 					abort = 1;
 					abort = 1;
 			}
 			}
 			if (abort) {
 			if (abort) {
-				mddev->recovery_disabled = 1;
+				conf->recovery_disabled =
+					mddev->recovery_disabled;
 				set_bit(MD_RECOVERY_INTR, &mddev->recovery);
 				set_bit(MD_RECOVERY_INTR, &mddev->recovery);
 				md_done_sync(mddev, r1_bio->sectors, 0);
 				md_done_sync(mddev, r1_bio->sectors, 0);
 				put_buf(r1_bio);
 				put_buf(r1_bio);
@@ -1552,7 +1571,7 @@ static int fix_sync_read_error(r1bio_t *r1_bio)
 	return 1;
 	return 1;
 }
 }
 
 
-static int process_checks(r1bio_t *r1_bio)
+static int process_checks(struct r1bio *r1_bio)
 {
 {
 	/* We have read all readable devices.  If we haven't
 	/* We have read all readable devices.  If we haven't
 	 * got the block, then there is no hope left.
 	 * got the block, then there is no hope left.
@@ -1561,8 +1580,8 @@ static int process_checks(r1bio_t *r1_bio)
 	 * If any blocks failed to read, then we need to
 	 * If any blocks failed to read, then we need to
 	 * attempt an over-write
 	 * attempt an over-write
 	 */
 	 */
-	mddev_t *mddev = r1_bio->mddev;
-	conf_t *conf = mddev->private;
+	struct mddev *mddev = r1_bio->mddev;
+	struct r1conf *conf = mddev->private;
 	int primary;
 	int primary;
 	int i;
 	int i;
 
 
@@ -1634,9 +1653,9 @@ static int process_checks(r1bio_t *r1_bio)
 	return 0;
 	return 0;
 }
 }
 
 
-static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
+static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r1conf *conf = mddev->private;
 	int i;
 	int i;
 	int disks = conf->raid_disks;
 	int disks = conf->raid_disks;
 	struct bio *bio, *wbio;
 	struct bio *bio, *wbio;
@@ -1686,16 +1705,16 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
  *	3.	Performs writes following reads for array synchronising.
  *	3.	Performs writes following reads for array synchronising.
  */
  */
 
 
-static void fix_read_error(conf_t *conf, int read_disk,
+static void fix_read_error(struct r1conf *conf, int read_disk,
 			   sector_t sect, int sectors)
 			   sector_t sect, int sectors)
 {
 {
-	mddev_t *mddev = conf->mddev;
+	struct mddev *mddev = conf->mddev;
 	while(sectors) {
 	while(sectors) {
 		int s = sectors;
 		int s = sectors;
 		int d = read_disk;
 		int d = read_disk;
 		int success = 0;
 		int success = 0;
 		int start;
 		int start;
-		mdk_rdev_t *rdev;
+		struct md_rdev *rdev;
 
 
 		if (s > (PAGE_SIZE>>9))
 		if (s > (PAGE_SIZE>>9))
 			s = PAGE_SIZE >> 9;
 			s = PAGE_SIZE >> 9;
@@ -1726,7 +1745,7 @@ static void fix_read_error(conf_t *conf, int read_disk,
 
 
 		if (!success) {
 		if (!success) {
 			/* Cannot read from anywhere - mark it bad */
 			/* Cannot read from anywhere - mark it bad */
-			mdk_rdev_t *rdev = conf->mirrors[read_disk].rdev;
+			struct md_rdev *rdev = conf->mirrors[read_disk].rdev;
 			if (!rdev_set_badblocks(rdev, sect, s, 0))
 			if (!rdev_set_badblocks(rdev, sect, s, 0))
 				md_error(mddev, rdev);
 				md_error(mddev, rdev);
 			break;
 			break;
@@ -1789,11 +1808,11 @@ static int submit_bio_wait(int rw, struct bio *bio)
 	return test_bit(BIO_UPTODATE, &bio->bi_flags);
 	return test_bit(BIO_UPTODATE, &bio->bi_flags);
 }
 }
 
 
-static int narrow_write_error(r1bio_t *r1_bio, int i)
+static int narrow_write_error(struct r1bio *r1_bio, int i)
 {
 {
-	mddev_t *mddev = r1_bio->mddev;
-	conf_t *conf = mddev->private;
-	mdk_rdev_t *rdev = conf->mirrors[i].rdev;
+	struct mddev *mddev = r1_bio->mddev;
+	struct r1conf *conf = mddev->private;
+	struct md_rdev *rdev = conf->mirrors[i].rdev;
 	int vcnt, idx;
 	int vcnt, idx;
 	struct bio_vec *vec;
 	struct bio_vec *vec;
 
 
@@ -1865,12 +1884,12 @@ static int narrow_write_error(r1bio_t *r1_bio, int i)
 	return ok;
 	return ok;
 }
 }
 
 
-static void handle_sync_write_finished(conf_t *conf, r1bio_t *r1_bio)
+static void handle_sync_write_finished(struct r1conf *conf, struct r1bio *r1_bio)
 {
 {
 	int m;
 	int m;
 	int s = r1_bio->sectors;
 	int s = r1_bio->sectors;
 	for (m = 0; m < conf->raid_disks ; m++) {
 	for (m = 0; m < conf->raid_disks ; m++) {
-		mdk_rdev_t *rdev = conf->mirrors[m].rdev;
+		struct md_rdev *rdev = conf->mirrors[m].rdev;
 		struct bio *bio = r1_bio->bios[m];
 		struct bio *bio = r1_bio->bios[m];
 		if (bio->bi_end_io == NULL)
 		if (bio->bi_end_io == NULL)
 			continue;
 			continue;
@@ -1888,12 +1907,12 @@ static void handle_sync_write_finished(conf_t *conf, r1bio_t *r1_bio)
 	md_done_sync(conf->mddev, s, 1);
 	md_done_sync(conf->mddev, s, 1);
 }
 }
 
 
-static void handle_write_finished(conf_t *conf, r1bio_t *r1_bio)
+static void handle_write_finished(struct r1conf *conf, struct r1bio *r1_bio)
 {
 {
 	int m;
 	int m;
 	for (m = 0; m < conf->raid_disks ; m++)
 	for (m = 0; m < conf->raid_disks ; m++)
 		if (r1_bio->bios[m] == IO_MADE_GOOD) {
 		if (r1_bio->bios[m] == IO_MADE_GOOD) {
-			mdk_rdev_t *rdev = conf->mirrors[m].rdev;
+			struct md_rdev *rdev = conf->mirrors[m].rdev;
 			rdev_clear_badblocks(rdev,
 			rdev_clear_badblocks(rdev,
 					     r1_bio->sector,
 					     r1_bio->sector,
 					     r1_bio->sectors);
 					     r1_bio->sectors);
@@ -1917,14 +1936,14 @@ static void handle_write_finished(conf_t *conf, r1bio_t *r1_bio)
 	raid_end_bio_io(r1_bio);
 	raid_end_bio_io(r1_bio);
 }
 }
 
 
-static void handle_read_error(conf_t *conf, r1bio_t *r1_bio)
+static void handle_read_error(struct r1conf *conf, struct r1bio *r1_bio)
 {
 {
 	int disk;
 	int disk;
 	int max_sectors;
 	int max_sectors;
-	mddev_t *mddev = conf->mddev;
+	struct mddev *mddev = conf->mddev;
 	struct bio *bio;
 	struct bio *bio;
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	clear_bit(R1BIO_ReadError, &r1_bio->state);
 	clear_bit(R1BIO_ReadError, &r1_bio->state);
 	/* we got a read error. Maybe the drive is bad.  Maybe just
 	/* we got a read error. Maybe the drive is bad.  Maybe just
@@ -2007,11 +2026,11 @@ read_more:
 	}
 	}
 }
 }
 
 
-static void raid1d(mddev_t *mddev)
+static void raid1d(struct mddev *mddev)
 {
 {
-	r1bio_t *r1_bio;
+	struct r1bio *r1_bio;
 	unsigned long flags;
 	unsigned long flags;
-	conf_t *conf = mddev->private;
+	struct r1conf *conf = mddev->private;
 	struct list_head *head = &conf->retry_list;
 	struct list_head *head = &conf->retry_list;
 	struct blk_plug plug;
 	struct blk_plug plug;
 
 
@@ -2028,7 +2047,7 @@ static void raid1d(mddev_t *mddev)
 			spin_unlock_irqrestore(&conf->device_lock, flags);
 			spin_unlock_irqrestore(&conf->device_lock, flags);
 			break;
 			break;
 		}
 		}
-		r1_bio = list_entry(head->prev, r1bio_t, retry_list);
+		r1_bio = list_entry(head->prev, struct r1bio, retry_list);
 		list_del(head->prev);
 		list_del(head->prev);
 		conf->nr_queued--;
 		conf->nr_queued--;
 		spin_unlock_irqrestore(&conf->device_lock, flags);
 		spin_unlock_irqrestore(&conf->device_lock, flags);
@@ -2060,7 +2079,7 @@ static void raid1d(mddev_t *mddev)
 }
 }
 
 
 
 
-static int init_resync(conf_t *conf)
+static int init_resync(struct r1conf *conf)
 {
 {
 	int buffs;
 	int buffs;
 
 
@@ -2084,10 +2103,10 @@ static int init_resync(conf_t *conf)
  * that can be installed to exclude normal IO requests.
  * that can be installed to exclude normal IO requests.
  */
  */
 
 
-static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster)
+static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipped, int go_faster)
 {
 {
-	conf_t *conf = mddev->private;
-	r1bio_t *r1_bio;
+	struct r1conf *conf = mddev->private;
+	struct r1bio *r1_bio;
 	struct bio *bio;
 	struct bio *bio;
 	sector_t max_sector, nr_sectors;
 	sector_t max_sector, nr_sectors;
 	int disk = -1;
 	int disk = -1;
@@ -2167,7 +2186,7 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
 	set_bit(R1BIO_IsSync, &r1_bio->state);
 	set_bit(R1BIO_IsSync, &r1_bio->state);
 
 
 	for (i=0; i < conf->raid_disks; i++) {
 	for (i=0; i < conf->raid_disks; i++) {
-		mdk_rdev_t *rdev;
+		struct md_rdev *rdev;
 		bio = r1_bio->bios[i];
 		bio = r1_bio->bios[i];
 
 
 		/* take from bio_init */
 		/* take from bio_init */
@@ -2239,7 +2258,7 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
 		int ok = 1;
 		int ok = 1;
 		for (i = 0 ; i < conf->raid_disks ; i++)
 		for (i = 0 ; i < conf->raid_disks ; i++)
 			if (r1_bio->bios[i]->bi_end_io == end_sync_write) {
 			if (r1_bio->bios[i]->bi_end_io == end_sync_write) {
-				mdk_rdev_t *rdev =
+				struct md_rdev *rdev =
 					rcu_dereference(conf->mirrors[i].rdev);
 					rcu_dereference(conf->mirrors[i].rdev);
 				ok = rdev_set_badblocks(rdev, sector_nr,
 				ok = rdev_set_badblocks(rdev, sector_nr,
 							min_bad, 0
 							min_bad, 0
@@ -2356,7 +2375,7 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
 	return nr_sectors;
 	return nr_sectors;
 }
 }
 
 
-static sector_t raid1_size(mddev_t *mddev, sector_t sectors, int raid_disks)
+static sector_t raid1_size(struct mddev *mddev, sector_t sectors, int raid_disks)
 {
 {
 	if (sectors)
 	if (sectors)
 		return sectors;
 		return sectors;
@@ -2364,15 +2383,15 @@ static sector_t raid1_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 	return mddev->dev_sectors;
 	return mddev->dev_sectors;
 }
 }
 
 
-static conf_t *setup_conf(mddev_t *mddev)
+static struct r1conf *setup_conf(struct mddev *mddev)
 {
 {
-	conf_t *conf;
+	struct r1conf *conf;
 	int i;
 	int i;
-	mirror_info_t *disk;
-	mdk_rdev_t *rdev;
+	struct mirror_info *disk;
+	struct md_rdev *rdev;
 	int err = -ENOMEM;
 	int err = -ENOMEM;
 
 
-	conf = kzalloc(sizeof(conf_t), GFP_KERNEL);
+	conf = kzalloc(sizeof(struct r1conf), GFP_KERNEL);
 	if (!conf)
 	if (!conf)
 		goto abort;
 		goto abort;
 
 
@@ -2417,6 +2436,8 @@ static conf_t *setup_conf(mddev_t *mddev)
 	init_waitqueue_head(&conf->wait_barrier);
 	init_waitqueue_head(&conf->wait_barrier);
 
 
 	bio_list_init(&conf->pending_bio_list);
 	bio_list_init(&conf->pending_bio_list);
+	conf->pending_count = 0;
+	conf->recovery_disabled = mddev->recovery_disabled - 1;
 
 
 	conf->last_used = -1;
 	conf->last_used = -1;
 	for (i = 0; i < conf->raid_disks; i++) {
 	for (i = 0; i < conf->raid_disks; i++) {
@@ -2465,11 +2486,11 @@ static conf_t *setup_conf(mddev_t *mddev)
 	return ERR_PTR(err);
 	return ERR_PTR(err);
 }
 }
 
 
-static int run(mddev_t *mddev)
+static int run(struct mddev *mddev)
 {
 {
-	conf_t *conf;
+	struct r1conf *conf;
 	int i;
 	int i;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	if (mddev->level != 1) {
 	if (mddev->level != 1) {
 		printk(KERN_ERR "md/raid1:%s: raid level not set to mirroring (%d)\n",
 		printk(KERN_ERR "md/raid1:%s: raid level not set to mirroring (%d)\n",
@@ -2545,9 +2566,9 @@ static int run(mddev_t *mddev)
 	return md_integrity_register(mddev);
 	return md_integrity_register(mddev);
 }
 }
 
 
-static int stop(mddev_t *mddev)
+static int stop(struct mddev *mddev)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r1conf *conf = mddev->private;
 	struct bitmap *bitmap = mddev->bitmap;
 	struct bitmap *bitmap = mddev->bitmap;
 
 
 	/* wait for behind writes to complete */
 	/* wait for behind writes to complete */
@@ -2572,7 +2593,7 @@ static int stop(mddev_t *mddev)
 	return 0;
 	return 0;
 }
 }
 
 
-static int raid1_resize(mddev_t *mddev, sector_t sectors)
+static int raid1_resize(struct mddev *mddev, sector_t sectors)
 {
 {
 	/* no resync is happening, and there is enough space
 	/* no resync is happening, and there is enough space
 	 * on all devices, so we can resize.
 	 * on all devices, so we can resize.
@@ -2596,7 +2617,7 @@ static int raid1_resize(mddev_t *mddev, sector_t sectors)
 	return 0;
 	return 0;
 }
 }
 
 
-static int raid1_reshape(mddev_t *mddev)
+static int raid1_reshape(struct mddev *mddev)
 {
 {
 	/* We need to:
 	/* We need to:
 	 * 1/ resize the r1bio_pool
 	 * 1/ resize the r1bio_pool
@@ -2611,8 +2632,8 @@ static int raid1_reshape(mddev_t *mddev)
 	 */
 	 */
 	mempool_t *newpool, *oldpool;
 	mempool_t *newpool, *oldpool;
 	struct pool_info *newpoolinfo;
 	struct pool_info *newpoolinfo;
-	mirror_info_t *newmirrors;
-	conf_t *conf = mddev->private;
+	struct mirror_info *newmirrors;
+	struct r1conf *conf = mddev->private;
 	int cnt, raid_disks;
 	int cnt, raid_disks;
 	unsigned long flags;
 	unsigned long flags;
 	int d, d2, err;
 	int d, d2, err;
@@ -2668,7 +2689,7 @@ static int raid1_reshape(mddev_t *mddev)
 	conf->r1bio_pool = newpool;
 	conf->r1bio_pool = newpool;
 
 
 	for (d = d2 = 0; d < conf->raid_disks; d++) {
 	for (d = d2 = 0; d < conf->raid_disks; d++) {
-		mdk_rdev_t *rdev = conf->mirrors[d].rdev;
+		struct md_rdev *rdev = conf->mirrors[d].rdev;
 		if (rdev && rdev->raid_disk != d2) {
 		if (rdev && rdev->raid_disk != d2) {
 			sysfs_unlink_rdev(mddev, rdev);
 			sysfs_unlink_rdev(mddev, rdev);
 			rdev->raid_disk = d2;
 			rdev->raid_disk = d2;
@@ -2702,9 +2723,9 @@ static int raid1_reshape(mddev_t *mddev)
 	return 0;
 	return 0;
 }
 }
 
 
-static void raid1_quiesce(mddev_t *mddev, int state)
+static void raid1_quiesce(struct mddev *mddev, int state)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r1conf *conf = mddev->private;
 
 
 	switch(state) {
 	switch(state) {
 	case 2: /* wake for suspend */
 	case 2: /* wake for suspend */
@@ -2719,13 +2740,13 @@ static void raid1_quiesce(mddev_t *mddev, int state)
 	}
 	}
 }
 }
 
 
-static void *raid1_takeover(mddev_t *mddev)
+static void *raid1_takeover(struct mddev *mddev)
 {
 {
 	/* raid1 can take over:
 	/* raid1 can take over:
 	 *  raid5 with 2 devices, any layout or chunk size
 	 *  raid5 with 2 devices, any layout or chunk size
 	 */
 	 */
 	if (mddev->level == 5 && mddev->raid_disks == 2) {
 	if (mddev->level == 5 && mddev->raid_disks == 2) {
-		conf_t *conf;
+		struct r1conf *conf;
 		mddev->new_level = 1;
 		mddev->new_level = 1;
 		mddev->new_layout = 0;
 		mddev->new_layout = 0;
 		mddev->new_chunk_sectors = 0;
 		mddev->new_chunk_sectors = 0;
@@ -2737,7 +2758,7 @@ static void *raid1_takeover(mddev_t *mddev)
 	return ERR_PTR(-EINVAL);
 	return ERR_PTR(-EINVAL);
 }
 }
 
 
-static struct mdk_personality raid1_personality =
+static struct md_personality raid1_personality =
 {
 {
 	.name		= "raid1",
 	.name		= "raid1",
 	.level		= 1,
 	.level		= 1,
@@ -2775,3 +2796,5 @@ MODULE_DESCRIPTION("RAID1 (mirroring) personality for MD");
 MODULE_ALIAS("md-personality-3"); /* RAID1 */
 MODULE_ALIAS("md-personality-3"); /* RAID1 */
 MODULE_ALIAS("md-raid1");
 MODULE_ALIAS("md-raid1");
 MODULE_ALIAS("md-level-1");
 MODULE_ALIAS("md-level-1");
+
+module_param(max_queued_requests, int, S_IRUGO|S_IWUSR);

+ 52 - 33
drivers/md/raid1.h

@@ -1,10 +1,8 @@
 #ifndef _RAID1_H
 #ifndef _RAID1_H
 #define _RAID1_H
 #define _RAID1_H
 
 
-typedef struct mirror_info mirror_info_t;
-
 struct mirror_info {
 struct mirror_info {
-	mdk_rdev_t	*rdev;
+	struct md_rdev	*rdev;
 	sector_t	head_position;
 	sector_t	head_position;
 };
 };
 
 
@@ -17,61 +15,82 @@ struct mirror_info {
  */
  */
 
 
 struct pool_info {
 struct pool_info {
-	mddev_t *mddev;
+	struct mddev *mddev;
 	int	raid_disks;
 	int	raid_disks;
 };
 };
 
 
-
-typedef struct r1bio_s r1bio_t;
-
-struct r1_private_data_s {
-	mddev_t			*mddev;
-	mirror_info_t		*mirrors;
+struct r1conf {
+	struct mddev		*mddev;
+	struct mirror_info		*mirrors;
 	int			raid_disks;
 	int			raid_disks;
+
+	/* When choose the best device for a read (read_balance())
+	 * we try to keep sequential reads one the same device
+	 * using 'last_used' and 'next_seq_sect'
+	 */
 	int			last_used;
 	int			last_used;
 	sector_t		next_seq_sect;
 	sector_t		next_seq_sect;
+	/* During resync, read_balancing is only allowed on the part
+	 * of the array that has been resynced.  'next_resync' tells us
+	 * where that is.
+	 */
+	sector_t		next_resync;
+
 	spinlock_t		device_lock;
 	spinlock_t		device_lock;
 
 
+	/* list of 'struct r1bio' that need to be processed by raid1d,
+	 * whether to retry a read, writeout a resync or recovery
+	 * block, or anything else.
+	 */
 	struct list_head	retry_list;
 	struct list_head	retry_list;
-	/* queue pending writes and submit them on unplug */
-	struct bio_list		pending_bio_list;
 
 
-	/* for use when syncing mirrors: */
+	/* queue pending writes to be submitted on unplug */
+	struct bio_list		pending_bio_list;
+	int			pending_count;
 
 
+	/* for use when syncing mirrors:
+	 * We don't allow both normal IO and resync/recovery IO at
+	 * the same time - resync/recovery can only happen when there
+	 * is no other IO.  So when either is active, the other has to wait.
+	 * See more details description in raid1.c near raise_barrier().
+	 */
+	wait_queue_head_t	wait_barrier;
 	spinlock_t		resync_lock;
 	spinlock_t		resync_lock;
 	int			nr_pending;
 	int			nr_pending;
 	int			nr_waiting;
 	int			nr_waiting;
 	int			nr_queued;
 	int			nr_queued;
 	int			barrier;
 	int			barrier;
-	sector_t		next_resync;
-	int			fullsync;  /* set to 1 if a full sync is needed,
-					    * (fresh device added).
-					    * Cleared when a sync completes.
-					    */
-	int			recovery_disabled; /* when the same as
-						    * mddev->recovery_disabled
-						    * we don't allow recovery
-						    * to be attempted as we
-						    * expect a read error
-						    */
 
 
-	wait_queue_head_t	wait_barrier;
+	/* Set to 1 if a full sync is needed, (fresh device added).
+	 * Cleared when a sync completes.
+	 */
+	int			fullsync;
 
 
+	/* When the same as mddev->recovery_disabled we don't allow
+	 * recovery to be attempted as we expect a read error.
+	 */
+	int			recovery_disabled;
+
+
+	/* poolinfo contains information about the content of the
+	 * mempools - it changes when the array grows or shrinks
+	 */
 	struct pool_info	*poolinfo;
 	struct pool_info	*poolinfo;
+	mempool_t		*r1bio_pool;
+	mempool_t		*r1buf_pool;
 
 
+	/* temporary buffer to synchronous IO when attempting to repair
+	 * a read error.
+	 */
 	struct page		*tmppage;
 	struct page		*tmppage;
 
 
-	mempool_t *r1bio_pool;
-	mempool_t *r1buf_pool;
 
 
 	/* When taking over an array from a different personality, we store
 	/* When taking over an array from a different personality, we store
 	 * the new thread here until we fully activate the array.
 	 * the new thread here until we fully activate the array.
 	 */
 	 */
-	struct mdk_thread_s	*thread;
+	struct md_thread	*thread;
 };
 };
 
 
-typedef struct r1_private_data_s conf_t;
-
 /*
 /*
  * this is our 'private' RAID1 bio.
  * this is our 'private' RAID1 bio.
  *
  *
@@ -79,7 +98,7 @@ typedef struct r1_private_data_s conf_t;
  * for this RAID1 operation, and about their status:
  * for this RAID1 operation, and about their status:
  */
  */
 
 
-struct r1bio_s {
+struct r1bio {
 	atomic_t		remaining; /* 'have we finished' count,
 	atomic_t		remaining; /* 'have we finished' count,
 					    * used from IRQ handlers
 					    * used from IRQ handlers
 					    */
 					    */
@@ -89,7 +108,7 @@ struct r1bio_s {
 	sector_t		sector;
 	sector_t		sector;
 	int			sectors;
 	int			sectors;
 	unsigned long		state;
 	unsigned long		state;
-	mddev_t			*mddev;
+	struct mddev		*mddev;
 	/*
 	/*
 	 * original bio going to /dev/mdx
 	 * original bio going to /dev/mdx
 	 */
 	 */
@@ -148,6 +167,6 @@ struct r1bio_s {
 #define	R1BIO_MadeGood 7
 #define	R1BIO_MadeGood 7
 #define	R1BIO_WriteError 8
 #define	R1BIO_WriteError 8
 
 
-extern int md_raid1_congested(mddev_t *mddev, int bits);
+extern int md_raid1_congested(struct mddev *mddev, int bits);
 
 
 #endif
 #endif

+ 151 - 129
drivers/md/raid10.c

@@ -58,13 +58,19 @@
  */
  */
 #define	NR_RAID10_BIOS 256
 #define	NR_RAID10_BIOS 256
 
 
-static void allow_barrier(conf_t *conf);
-static void lower_barrier(conf_t *conf);
+/* When there are this many requests queue to be written by
+ * the raid10 thread, we become 'congested' to provide back-pressure
+ * for writeback.
+ */
+static int max_queued_requests = 1024;
+
+static void allow_barrier(struct r10conf *conf);
+static void lower_barrier(struct r10conf *conf);
 
 
 static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data)
 static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data)
 {
 {
-	conf_t *conf = data;
-	int size = offsetof(struct r10bio_s, devs[conf->copies]);
+	struct r10conf *conf = data;
+	int size = offsetof(struct r10bio, devs[conf->copies]);
 
 
 	/* allocate a r10bio with room for raid_disks entries in the bios array */
 	/* allocate a r10bio with room for raid_disks entries in the bios array */
 	return kzalloc(size, gfp_flags);
 	return kzalloc(size, gfp_flags);
@@ -92,9 +98,9 @@ static void r10bio_pool_free(void *r10_bio, void *data)
  */
  */
 static void * r10buf_pool_alloc(gfp_t gfp_flags, void *data)
 static void * r10buf_pool_alloc(gfp_t gfp_flags, void *data)
 {
 {
-	conf_t *conf = data;
+	struct r10conf *conf = data;
 	struct page *page;
 	struct page *page;
-	r10bio_t *r10_bio;
+	struct r10bio *r10_bio;
 	struct bio *bio;
 	struct bio *bio;
 	int i, j;
 	int i, j;
 	int nalloc;
 	int nalloc;
@@ -158,8 +164,8 @@ out_free_bio:
 static void r10buf_pool_free(void *__r10_bio, void *data)
 static void r10buf_pool_free(void *__r10_bio, void *data)
 {
 {
 	int i;
 	int i;
-	conf_t *conf = data;
-	r10bio_t *r10bio = __r10_bio;
+	struct r10conf *conf = data;
+	struct r10bio *r10bio = __r10_bio;
 	int j;
 	int j;
 
 
 	for (j=0; j < conf->copies; j++) {
 	for (j=0; j < conf->copies; j++) {
@@ -175,7 +181,7 @@ static void r10buf_pool_free(void *__r10_bio, void *data)
 	r10bio_pool_free(r10bio, conf);
 	r10bio_pool_free(r10bio, conf);
 }
 }
 
 
-static void put_all_bios(conf_t *conf, r10bio_t *r10_bio)
+static void put_all_bios(struct r10conf *conf, struct r10bio *r10_bio)
 {
 {
 	int i;
 	int i;
 
 
@@ -187,28 +193,28 @@ static void put_all_bios(conf_t *conf, r10bio_t *r10_bio)
 	}
 	}
 }
 }
 
 
-static void free_r10bio(r10bio_t *r10_bio)
+static void free_r10bio(struct r10bio *r10_bio)
 {
 {
-	conf_t *conf = r10_bio->mddev->private;
+	struct r10conf *conf = r10_bio->mddev->private;
 
 
 	put_all_bios(conf, r10_bio);
 	put_all_bios(conf, r10_bio);
 	mempool_free(r10_bio, conf->r10bio_pool);
 	mempool_free(r10_bio, conf->r10bio_pool);
 }
 }
 
 
-static void put_buf(r10bio_t *r10_bio)
+static void put_buf(struct r10bio *r10_bio)
 {
 {
-	conf_t *conf = r10_bio->mddev->private;
+	struct r10conf *conf = r10_bio->mddev->private;
 
 
 	mempool_free(r10_bio, conf->r10buf_pool);
 	mempool_free(r10_bio, conf->r10buf_pool);
 
 
 	lower_barrier(conf);
 	lower_barrier(conf);
 }
 }
 
 
-static void reschedule_retry(r10bio_t *r10_bio)
+static void reschedule_retry(struct r10bio *r10_bio)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
-	mddev_t *mddev = r10_bio->mddev;
-	conf_t *conf = mddev->private;
+	struct mddev *mddev = r10_bio->mddev;
+	struct r10conf *conf = mddev->private;
 
 
 	spin_lock_irqsave(&conf->device_lock, flags);
 	spin_lock_irqsave(&conf->device_lock, flags);
 	list_add(&r10_bio->retry_list, &conf->retry_list);
 	list_add(&r10_bio->retry_list, &conf->retry_list);
@@ -226,11 +232,11 @@ static void reschedule_retry(r10bio_t *r10_bio)
  * operation and are ready to return a success/failure code to the buffer
  * operation and are ready to return a success/failure code to the buffer
  * cache layer.
  * cache layer.
  */
  */
-static void raid_end_bio_io(r10bio_t *r10_bio)
+static void raid_end_bio_io(struct r10bio *r10_bio)
 {
 {
 	struct bio *bio = r10_bio->master_bio;
 	struct bio *bio = r10_bio->master_bio;
 	int done;
 	int done;
-	conf_t *conf = r10_bio->mddev->private;
+	struct r10conf *conf = r10_bio->mddev->private;
 
 
 	if (bio->bi_phys_segments) {
 	if (bio->bi_phys_segments) {
 		unsigned long flags;
 		unsigned long flags;
@@ -256,9 +262,9 @@ static void raid_end_bio_io(r10bio_t *r10_bio)
 /*
 /*
  * Update disk head position estimator based on IRQ completion info.
  * Update disk head position estimator based on IRQ completion info.
  */
  */
-static inline void update_head_pos(int slot, r10bio_t *r10_bio)
+static inline void update_head_pos(int slot, struct r10bio *r10_bio)
 {
 {
-	conf_t *conf = r10_bio->mddev->private;
+	struct r10conf *conf = r10_bio->mddev->private;
 
 
 	conf->mirrors[r10_bio->devs[slot].devnum].head_position =
 	conf->mirrors[r10_bio->devs[slot].devnum].head_position =
 		r10_bio->devs[slot].addr + (r10_bio->sectors);
 		r10_bio->devs[slot].addr + (r10_bio->sectors);
@@ -267,7 +273,7 @@ static inline void update_head_pos(int slot, r10bio_t *r10_bio)
 /*
 /*
  * Find the disk number which triggered given bio
  * Find the disk number which triggered given bio
  */
  */
-static int find_bio_disk(conf_t *conf, r10bio_t *r10_bio,
+static int find_bio_disk(struct r10conf *conf, struct r10bio *r10_bio,
 			 struct bio *bio, int *slotp)
 			 struct bio *bio, int *slotp)
 {
 {
 	int slot;
 	int slot;
@@ -287,9 +293,9 @@ static int find_bio_disk(conf_t *conf, r10bio_t *r10_bio,
 static void raid10_end_read_request(struct bio *bio, int error)
 static void raid10_end_read_request(struct bio *bio, int error)
 {
 {
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
-	r10bio_t *r10_bio = bio->bi_private;
+	struct r10bio *r10_bio = bio->bi_private;
 	int slot, dev;
 	int slot, dev;
-	conf_t *conf = r10_bio->mddev->private;
+	struct r10conf *conf = r10_bio->mddev->private;
 
 
 
 
 	slot = r10_bio->read_slot;
 	slot = r10_bio->read_slot;
@@ -327,7 +333,7 @@ static void raid10_end_read_request(struct bio *bio, int error)
 	}
 	}
 }
 }
 
 
-static void close_write(r10bio_t *r10_bio)
+static void close_write(struct r10bio *r10_bio)
 {
 {
 	/* clear the bitmap if all writes complete successfully */
 	/* clear the bitmap if all writes complete successfully */
 	bitmap_endwrite(r10_bio->mddev->bitmap, r10_bio->sector,
 	bitmap_endwrite(r10_bio->mddev->bitmap, r10_bio->sector,
@@ -337,7 +343,7 @@ static void close_write(r10bio_t *r10_bio)
 	md_write_end(r10_bio->mddev);
 	md_write_end(r10_bio->mddev);
 }
 }
 
 
-static void one_write_done(r10bio_t *r10_bio)
+static void one_write_done(struct r10bio *r10_bio)
 {
 {
 	if (atomic_dec_and_test(&r10_bio->remaining)) {
 	if (atomic_dec_and_test(&r10_bio->remaining)) {
 		if (test_bit(R10BIO_WriteError, &r10_bio->state))
 		if (test_bit(R10BIO_WriteError, &r10_bio->state))
@@ -355,10 +361,10 @@ static void one_write_done(r10bio_t *r10_bio)
 static void raid10_end_write_request(struct bio *bio, int error)
 static void raid10_end_write_request(struct bio *bio, int error)
 {
 {
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
-	r10bio_t *r10_bio = bio->bi_private;
+	struct r10bio *r10_bio = bio->bi_private;
 	int dev;
 	int dev;
 	int dec_rdev = 1;
 	int dec_rdev = 1;
-	conf_t *conf = r10_bio->mddev->private;
+	struct r10conf *conf = r10_bio->mddev->private;
 	int slot;
 	int slot;
 
 
 	dev = find_bio_disk(conf, r10_bio, bio, &slot);
 	dev = find_bio_disk(conf, r10_bio, bio, &slot);
@@ -433,7 +439,7 @@ static void raid10_end_write_request(struct bio *bio, int error)
  * sector offset to a virtual address
  * sector offset to a virtual address
  */
  */
 
 
-static void raid10_find_phys(conf_t *conf, r10bio_t *r10bio)
+static void raid10_find_phys(struct r10conf *conf, struct r10bio *r10bio)
 {
 {
 	int n,f;
 	int n,f;
 	sector_t sector;
 	sector_t sector;
@@ -481,7 +487,7 @@ static void raid10_find_phys(conf_t *conf, r10bio_t *r10bio)
 	BUG_ON(slot != conf->copies);
 	BUG_ON(slot != conf->copies);
 }
 }
 
 
-static sector_t raid10_find_virt(conf_t *conf, sector_t sector, int dev)
+static sector_t raid10_find_virt(struct r10conf *conf, sector_t sector, int dev)
 {
 {
 	sector_t offset, chunk, vchunk;
 	sector_t offset, chunk, vchunk;
 
 
@@ -522,7 +528,7 @@ static int raid10_mergeable_bvec(struct request_queue *q,
 				 struct bvec_merge_data *bvm,
 				 struct bvec_merge_data *bvm,
 				 struct bio_vec *biovec)
 				 struct bio_vec *biovec)
 {
 {
-	mddev_t *mddev = q->queuedata;
+	struct mddev *mddev = q->queuedata;
 	sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
 	sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
 	int max;
 	int max;
 	unsigned int chunk_sectors = mddev->chunk_sectors;
 	unsigned int chunk_sectors = mddev->chunk_sectors;
@@ -555,14 +561,14 @@ static int raid10_mergeable_bvec(struct request_queue *q,
  * FIXME: possibly should rethink readbalancing and do it differently
  * FIXME: possibly should rethink readbalancing and do it differently
  * depending on near_copies / far_copies geometry.
  * depending on near_copies / far_copies geometry.
  */
  */
-static int read_balance(conf_t *conf, r10bio_t *r10_bio, int *max_sectors)
+static int read_balance(struct r10conf *conf, struct r10bio *r10_bio, int *max_sectors)
 {
 {
 	const sector_t this_sector = r10_bio->sector;
 	const sector_t this_sector = r10_bio->sector;
 	int disk, slot;
 	int disk, slot;
 	int sectors = r10_bio->sectors;
 	int sectors = r10_bio->sectors;
 	int best_good_sectors;
 	int best_good_sectors;
 	sector_t new_distance, best_dist;
 	sector_t new_distance, best_dist;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	int do_balance;
 	int do_balance;
 	int best_slot;
 	int best_slot;
 
 
@@ -677,15 +683,19 @@ retry:
 
 
 static int raid10_congested(void *data, int bits)
 static int raid10_congested(void *data, int bits)
 {
 {
-	mddev_t *mddev = data;
-	conf_t *conf = mddev->private;
+	struct mddev *mddev = data;
+	struct r10conf *conf = mddev->private;
 	int i, ret = 0;
 	int i, ret = 0;
 
 
+	if ((bits & (1 << BDI_async_congested)) &&
+	    conf->pending_count >= max_queued_requests)
+		return 1;
+
 	if (mddev_congested(mddev, bits))
 	if (mddev_congested(mddev, bits))
 		return 1;
 		return 1;
 	rcu_read_lock();
 	rcu_read_lock();
 	for (i = 0; i < conf->raid_disks && ret == 0; i++) {
 	for (i = 0; i < conf->raid_disks && ret == 0; i++) {
-		mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev);
+		struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
 		if (rdev && !test_bit(Faulty, &rdev->flags)) {
 		if (rdev && !test_bit(Faulty, &rdev->flags)) {
 			struct request_queue *q = bdev_get_queue(rdev->bdev);
 			struct request_queue *q = bdev_get_queue(rdev->bdev);
 
 
@@ -696,7 +706,7 @@ static int raid10_congested(void *data, int bits)
 	return ret;
 	return ret;
 }
 }
 
 
-static void flush_pending_writes(conf_t *conf)
+static void flush_pending_writes(struct r10conf *conf)
 {
 {
 	/* Any writes that have been queued but are awaiting
 	/* Any writes that have been queued but are awaiting
 	 * bitmap updates get flushed here.
 	 * bitmap updates get flushed here.
@@ -706,10 +716,12 @@ static void flush_pending_writes(conf_t *conf)
 	if (conf->pending_bio_list.head) {
 	if (conf->pending_bio_list.head) {
 		struct bio *bio;
 		struct bio *bio;
 		bio = bio_list_get(&conf->pending_bio_list);
 		bio = bio_list_get(&conf->pending_bio_list);
+		conf->pending_count = 0;
 		spin_unlock_irq(&conf->device_lock);
 		spin_unlock_irq(&conf->device_lock);
 		/* flush any pending bitmap writes to disk
 		/* flush any pending bitmap writes to disk
 		 * before proceeding w/ I/O */
 		 * before proceeding w/ I/O */
 		bitmap_unplug(conf->mddev->bitmap);
 		bitmap_unplug(conf->mddev->bitmap);
+		wake_up(&conf->wait_barrier);
 
 
 		while (bio) { /* submit pending writes */
 		while (bio) { /* submit pending writes */
 			struct bio *next = bio->bi_next;
 			struct bio *next = bio->bi_next;
@@ -743,7 +755,7 @@ static void flush_pending_writes(conf_t *conf)
  *    lower_barrier when the particular background IO completes.
  *    lower_barrier when the particular background IO completes.
  */
  */
 
 
-static void raise_barrier(conf_t *conf, int force)
+static void raise_barrier(struct r10conf *conf, int force)
 {
 {
 	BUG_ON(force && !conf->barrier);
 	BUG_ON(force && !conf->barrier);
 	spin_lock_irq(&conf->resync_lock);
 	spin_lock_irq(&conf->resync_lock);
@@ -763,7 +775,7 @@ static void raise_barrier(conf_t *conf, int force)
 	spin_unlock_irq(&conf->resync_lock);
 	spin_unlock_irq(&conf->resync_lock);
 }
 }
 
 
-static void lower_barrier(conf_t *conf)
+static void lower_barrier(struct r10conf *conf)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 	spin_lock_irqsave(&conf->resync_lock, flags);
 	spin_lock_irqsave(&conf->resync_lock, flags);
@@ -772,7 +784,7 @@ static void lower_barrier(conf_t *conf)
 	wake_up(&conf->wait_barrier);
 	wake_up(&conf->wait_barrier);
 }
 }
 
 
-static void wait_barrier(conf_t *conf)
+static void wait_barrier(struct r10conf *conf)
 {
 {
 	spin_lock_irq(&conf->resync_lock);
 	spin_lock_irq(&conf->resync_lock);
 	if (conf->barrier) {
 	if (conf->barrier) {
@@ -786,7 +798,7 @@ static void wait_barrier(conf_t *conf)
 	spin_unlock_irq(&conf->resync_lock);
 	spin_unlock_irq(&conf->resync_lock);
 }
 }
 
 
-static void allow_barrier(conf_t *conf)
+static void allow_barrier(struct r10conf *conf)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 	spin_lock_irqsave(&conf->resync_lock, flags);
 	spin_lock_irqsave(&conf->resync_lock, flags);
@@ -795,7 +807,7 @@ static void allow_barrier(conf_t *conf)
 	wake_up(&conf->wait_barrier);
 	wake_up(&conf->wait_barrier);
 }
 }
 
 
-static void freeze_array(conf_t *conf)
+static void freeze_array(struct r10conf *conf)
 {
 {
 	/* stop syncio and normal IO and wait for everything to
 	/* stop syncio and normal IO and wait for everything to
 	 * go quiet.
 	 * go quiet.
@@ -820,7 +832,7 @@ static void freeze_array(conf_t *conf)
 	spin_unlock_irq(&conf->resync_lock);
 	spin_unlock_irq(&conf->resync_lock);
 }
 }
 
 
-static void unfreeze_array(conf_t *conf)
+static void unfreeze_array(struct r10conf *conf)
 {
 {
 	/* reverse the effect of the freeze */
 	/* reverse the effect of the freeze */
 	spin_lock_irq(&conf->resync_lock);
 	spin_lock_irq(&conf->resync_lock);
@@ -830,11 +842,11 @@ static void unfreeze_array(conf_t *conf)
 	spin_unlock_irq(&conf->resync_lock);
 	spin_unlock_irq(&conf->resync_lock);
 }
 }
 
 
-static int make_request(mddev_t *mddev, struct bio * bio)
+static int make_request(struct mddev *mddev, struct bio * bio)
 {
 {
-	conf_t *conf = mddev->private;
-	mirror_info_t *mirror;
-	r10bio_t *r10_bio;
+	struct r10conf *conf = mddev->private;
+	struct mirror_info *mirror;
+	struct r10bio *r10_bio;
 	struct bio *read_bio;
 	struct bio *read_bio;
 	int i;
 	int i;
 	int chunk_sects = conf->chunk_mask + 1;
 	int chunk_sects = conf->chunk_mask + 1;
@@ -842,7 +854,7 @@ static int make_request(mddev_t *mddev, struct bio * bio)
 	const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
 	const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
 	const unsigned long do_fua = (bio->bi_rw & REQ_FUA);
 	const unsigned long do_fua = (bio->bi_rw & REQ_FUA);
 	unsigned long flags;
 	unsigned long flags;
-	mdk_rdev_t *blocked_rdev;
+	struct md_rdev *blocked_rdev;
 	int plugged;
 	int plugged;
 	int sectors_handled;
 	int sectors_handled;
 	int max_sectors;
 	int max_sectors;
@@ -996,6 +1008,11 @@ read_again:
 	/*
 	/*
 	 * WRITE:
 	 * WRITE:
 	 */
 	 */
+	if (conf->pending_count >= max_queued_requests) {
+		md_wakeup_thread(mddev->thread);
+		wait_event(conf->wait_barrier,
+			   conf->pending_count < max_queued_requests);
+	}
 	/* first select target devices under rcu_lock and
 	/* first select target devices under rcu_lock and
 	 * inc refcount on their rdev.  Record them by setting
 	 * inc refcount on their rdev.  Record them by setting
 	 * bios[x] to bio
 	 * bios[x] to bio
@@ -1017,7 +1034,7 @@ retry_write:
 
 
 	for (i = 0;  i < conf->copies; i++) {
 	for (i = 0;  i < conf->copies; i++) {
 		int d = r10_bio->devs[i].devnum;
 		int d = r10_bio->devs[i].devnum;
-		mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[d].rdev);
+		struct md_rdev *rdev = rcu_dereference(conf->mirrors[d].rdev);
 		if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
 		if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
 			atomic_inc(&rdev->nr_pending);
 			atomic_inc(&rdev->nr_pending);
 			blocked_rdev = rdev;
 			blocked_rdev = rdev;
@@ -1129,6 +1146,7 @@ retry_write:
 		atomic_inc(&r10_bio->remaining);
 		atomic_inc(&r10_bio->remaining);
 		spin_lock_irqsave(&conf->device_lock, flags);
 		spin_lock_irqsave(&conf->device_lock, flags);
 		bio_list_add(&conf->pending_bio_list, mbio);
 		bio_list_add(&conf->pending_bio_list, mbio);
+		conf->pending_count++;
 		spin_unlock_irqrestore(&conf->device_lock, flags);
 		spin_unlock_irqrestore(&conf->device_lock, flags);
 	}
 	}
 
 
@@ -1161,9 +1179,9 @@ retry_write:
 	return 0;
 	return 0;
 }
 }
 
 
-static void status(struct seq_file *seq, mddev_t *mddev)
+static void status(struct seq_file *seq, struct mddev *mddev)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r10conf *conf = mddev->private;
 	int i;
 	int i;
 
 
 	if (conf->near_copies < conf->raid_disks)
 	if (conf->near_copies < conf->raid_disks)
@@ -1190,7 +1208,7 @@ static void status(struct seq_file *seq, mddev_t *mddev)
  * Don't consider the device numbered 'ignore'
  * Don't consider the device numbered 'ignore'
  * as we might be about to remove it.
  * as we might be about to remove it.
  */
  */
-static int enough(conf_t *conf, int ignore)
+static int enough(struct r10conf *conf, int ignore)
 {
 {
 	int first = 0;
 	int first = 0;
 
 
@@ -1209,10 +1227,10 @@ static int enough(conf_t *conf, int ignore)
 	return 1;
 	return 1;
 }
 }
 
 
-static void error(mddev_t *mddev, mdk_rdev_t *rdev)
+static void error(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
-	conf_t *conf = mddev->private;
+	struct r10conf *conf = mddev->private;
 
 
 	/*
 	/*
 	 * If it is not operational, then we have already marked it as dead
 	 * If it is not operational, then we have already marked it as dead
@@ -1246,10 +1264,10 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev)
 	       mdname(mddev), conf->raid_disks - mddev->degraded);
 	       mdname(mddev), conf->raid_disks - mddev->degraded);
 }
 }
 
 
-static void print_conf(conf_t *conf)
+static void print_conf(struct r10conf *conf)
 {
 {
 	int i;
 	int i;
-	mirror_info_t *tmp;
+	struct mirror_info *tmp;
 
 
 	printk(KERN_DEBUG "RAID10 conf printout:\n");
 	printk(KERN_DEBUG "RAID10 conf printout:\n");
 	if (!conf) {
 	if (!conf) {
@@ -1270,7 +1288,7 @@ static void print_conf(conf_t *conf)
 	}
 	}
 }
 }
 
 
-static void close_sync(conf_t *conf)
+static void close_sync(struct r10conf *conf)
 {
 {
 	wait_barrier(conf);
 	wait_barrier(conf);
 	allow_barrier(conf);
 	allow_barrier(conf);
@@ -1279,11 +1297,11 @@ static void close_sync(conf_t *conf)
 	conf->r10buf_pool = NULL;
 	conf->r10buf_pool = NULL;
 }
 }
 
 
-static int raid10_spare_active(mddev_t *mddev)
+static int raid10_spare_active(struct mddev *mddev)
 {
 {
 	int i;
 	int i;
-	conf_t *conf = mddev->private;
-	mirror_info_t *tmp;
+	struct r10conf *conf = mddev->private;
+	struct mirror_info *tmp;
 	int count = 0;
 	int count = 0;
 	unsigned long flags;
 	unsigned long flags;
 
 
@@ -1309,9 +1327,9 @@ static int raid10_spare_active(mddev_t *mddev)
 }
 }
 
 
 
 
-static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
+static int raid10_add_disk(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r10conf *conf = mddev->private;
 	int err = -EEXIST;
 	int err = -EEXIST;
 	int mirror;
 	int mirror;
 	int first = 0;
 	int first = 0;
@@ -1334,7 +1352,7 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 	else
 	else
 		mirror = first;
 		mirror = first;
 	for ( ; mirror <= last ; mirror++) {
 	for ( ; mirror <= last ; mirror++) {
-		mirror_info_t *p = &conf->mirrors[mirror];
+		struct mirror_info *p = &conf->mirrors[mirror];
 		if (p->recovery_disabled == mddev->recovery_disabled)
 		if (p->recovery_disabled == mddev->recovery_disabled)
 			continue;
 			continue;
 		if (!p->rdev)
 		if (!p->rdev)
@@ -1355,6 +1373,7 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 		}
 		}
 
 
 		p->head_position = 0;
 		p->head_position = 0;
+		p->recovery_disabled = mddev->recovery_disabled - 1;
 		rdev->raid_disk = mirror;
 		rdev->raid_disk = mirror;
 		err = 0;
 		err = 0;
 		if (rdev->saved_raid_disk != mirror)
 		if (rdev->saved_raid_disk != mirror)
@@ -1368,12 +1387,12 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 	return err;
 	return err;
 }
 }
 
 
-static int raid10_remove_disk(mddev_t *mddev, int number)
+static int raid10_remove_disk(struct mddev *mddev, int number)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r10conf *conf = mddev->private;
 	int err = 0;
 	int err = 0;
-	mdk_rdev_t *rdev;
-	mirror_info_t *p = conf->mirrors+ number;
+	struct md_rdev *rdev;
+	struct mirror_info *p = conf->mirrors+ number;
 
 
 	print_conf(conf);
 	print_conf(conf);
 	rdev = p->rdev;
 	rdev = p->rdev;
@@ -1411,8 +1430,8 @@ abort:
 
 
 static void end_sync_read(struct bio *bio, int error)
 static void end_sync_read(struct bio *bio, int error)
 {
 {
-	r10bio_t *r10_bio = bio->bi_private;
-	conf_t *conf = r10_bio->mddev->private;
+	struct r10bio *r10_bio = bio->bi_private;
+	struct r10conf *conf = r10_bio->mddev->private;
 	int d;
 	int d;
 
 
 	d = find_bio_disk(conf, r10_bio, bio, NULL);
 	d = find_bio_disk(conf, r10_bio, bio, NULL);
@@ -1439,9 +1458,9 @@ static void end_sync_read(struct bio *bio, int error)
 	}
 	}
 }
 }
 
 
-static void end_sync_request(r10bio_t *r10_bio)
+static void end_sync_request(struct r10bio *r10_bio)
 {
 {
-	mddev_t *mddev = r10_bio->mddev;
+	struct mddev *mddev = r10_bio->mddev;
 
 
 	while (atomic_dec_and_test(&r10_bio->remaining)) {
 	while (atomic_dec_and_test(&r10_bio->remaining)) {
 		if (r10_bio->master_bio == NULL) {
 		if (r10_bio->master_bio == NULL) {
@@ -1455,7 +1474,7 @@ static void end_sync_request(r10bio_t *r10_bio)
 			md_done_sync(mddev, s, 1);
 			md_done_sync(mddev, s, 1);
 			break;
 			break;
 		} else {
 		} else {
-			r10bio_t *r10_bio2 = (r10bio_t *)r10_bio->master_bio;
+			struct r10bio *r10_bio2 = (struct r10bio *)r10_bio->master_bio;
 			if (test_bit(R10BIO_MadeGood, &r10_bio->state) ||
 			if (test_bit(R10BIO_MadeGood, &r10_bio->state) ||
 			    test_bit(R10BIO_WriteError, &r10_bio->state))
 			    test_bit(R10BIO_WriteError, &r10_bio->state))
 				reschedule_retry(r10_bio);
 				reschedule_retry(r10_bio);
@@ -1469,9 +1488,9 @@ static void end_sync_request(r10bio_t *r10_bio)
 static void end_sync_write(struct bio *bio, int error)
 static void end_sync_write(struct bio *bio, int error)
 {
 {
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
-	r10bio_t *r10_bio = bio->bi_private;
-	mddev_t *mddev = r10_bio->mddev;
-	conf_t *conf = mddev->private;
+	struct r10bio *r10_bio = bio->bi_private;
+	struct mddev *mddev = r10_bio->mddev;
+	struct r10conf *conf = mddev->private;
 	int d;
 	int d;
 	sector_t first_bad;
 	sector_t first_bad;
 	int bad_sectors;
 	int bad_sectors;
@@ -1509,9 +1528,9 @@ static void end_sync_write(struct bio *bio, int error)
  * We check if all blocks are in-sync and only write to blocks that
  * We check if all blocks are in-sync and only write to blocks that
  * aren't in sync
  * aren't in sync
  */
  */
-static void sync_request_write(mddev_t *mddev, r10bio_t *r10_bio)
+static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r10conf *conf = mddev->private;
 	int i, first;
 	int i, first;
 	struct bio *tbio, *fbio;
 	struct bio *tbio, *fbio;
 
 
@@ -1609,7 +1628,7 @@ done:
  * The second for writing.
  * The second for writing.
  *
  *
  */
  */
-static void fix_recovery_read_error(r10bio_t *r10_bio)
+static void fix_recovery_read_error(struct r10bio *r10_bio)
 {
 {
 	/* We got a read error during recovery.
 	/* We got a read error during recovery.
 	 * We repeat the read in smaller page-sized sections.
 	 * We repeat the read in smaller page-sized sections.
@@ -1618,8 +1637,8 @@ static void fix_recovery_read_error(r10bio_t *r10_bio)
 	 * If a read fails, record a bad block on both old and
 	 * If a read fails, record a bad block on both old and
 	 * new devices.
 	 * new devices.
 	 */
 	 */
-	mddev_t *mddev = r10_bio->mddev;
-	conf_t *conf = mddev->private;
+	struct mddev *mddev = r10_bio->mddev;
+	struct r10conf *conf = mddev->private;
 	struct bio *bio = r10_bio->devs[0].bio;
 	struct bio *bio = r10_bio->devs[0].bio;
 	sector_t sect = 0;
 	sector_t sect = 0;
 	int sectors = r10_bio->sectors;
 	int sectors = r10_bio->sectors;
@@ -1629,7 +1648,7 @@ static void fix_recovery_read_error(r10bio_t *r10_bio)
 
 
 	while (sectors) {
 	while (sectors) {
 		int s = sectors;
 		int s = sectors;
-		mdk_rdev_t *rdev;
+		struct md_rdev *rdev;
 		sector_t addr;
 		sector_t addr;
 		int ok;
 		int ok;
 
 
@@ -1663,7 +1682,7 @@ static void fix_recovery_read_error(r10bio_t *r10_bio)
 
 
 			if (rdev != conf->mirrors[dw].rdev) {
 			if (rdev != conf->mirrors[dw].rdev) {
 				/* need bad block on destination too */
 				/* need bad block on destination too */
-				mdk_rdev_t *rdev2 = conf->mirrors[dw].rdev;
+				struct md_rdev *rdev2 = conf->mirrors[dw].rdev;
 				addr = r10_bio->devs[1].addr + sect;
 				addr = r10_bio->devs[1].addr + sect;
 				ok = rdev_set_badblocks(rdev2, addr, s, 0);
 				ok = rdev_set_badblocks(rdev2, addr, s, 0);
 				if (!ok) {
 				if (!ok) {
@@ -1688,9 +1707,9 @@ static void fix_recovery_read_error(r10bio_t *r10_bio)
 	}
 	}
 }
 }
 
 
-static void recovery_request_write(mddev_t *mddev, r10bio_t *r10_bio)
+static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r10conf *conf = mddev->private;
 	int d;
 	int d;
 	struct bio *wbio;
 	struct bio *wbio;
 
 
@@ -1719,7 +1738,7 @@ static void recovery_request_write(mddev_t *mddev, r10bio_t *r10_bio)
  * since the last recorded read error.
  * since the last recorded read error.
  *
  *
  */
  */
-static void check_decay_read_errors(mddev_t *mddev, mdk_rdev_t *rdev)
+static void check_decay_read_errors(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	struct timespec cur_time_mon;
 	struct timespec cur_time_mon;
 	unsigned long hours_since_last;
 	unsigned long hours_since_last;
@@ -1750,7 +1769,7 @@ static void check_decay_read_errors(mddev_t *mddev, mdk_rdev_t *rdev)
 		atomic_set(&rdev->read_errors, read_errors >> hours_since_last);
 		atomic_set(&rdev->read_errors, read_errors >> hours_since_last);
 }
 }
 
 
-static int r10_sync_page_io(mdk_rdev_t *rdev, sector_t sector,
+static int r10_sync_page_io(struct md_rdev *rdev, sector_t sector,
 			    int sectors, struct page *page, int rw)
 			    int sectors, struct page *page, int rw)
 {
 {
 	sector_t first_bad;
 	sector_t first_bad;
@@ -1778,11 +1797,11 @@ static int r10_sync_page_io(mdk_rdev_t *rdev, sector_t sector,
  *	3.	Performs writes following reads for array synchronising.
  *	3.	Performs writes following reads for array synchronising.
  */
  */
 
 
-static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio)
+static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10bio *r10_bio)
 {
 {
 	int sect = 0; /* Offset from r10_bio->sector */
 	int sect = 0; /* Offset from r10_bio->sector */
 	int sectors = r10_bio->sectors;
 	int sectors = r10_bio->sectors;
-	mdk_rdev_t*rdev;
+	struct md_rdev*rdev;
 	int max_read_errors = atomic_read(&mddev->max_corr_read_errors);
 	int max_read_errors = atomic_read(&mddev->max_corr_read_errors);
 	int d = r10_bio->devs[r10_bio->read_slot].devnum;
 	int d = r10_bio->devs[r10_bio->read_slot].devnum;
 
 
@@ -1983,12 +2002,12 @@ static int submit_bio_wait(int rw, struct bio *bio)
 	return test_bit(BIO_UPTODATE, &bio->bi_flags);
 	return test_bit(BIO_UPTODATE, &bio->bi_flags);
 }
 }
 
 
-static int narrow_write_error(r10bio_t *r10_bio, int i)
+static int narrow_write_error(struct r10bio *r10_bio, int i)
 {
 {
 	struct bio *bio = r10_bio->master_bio;
 	struct bio *bio = r10_bio->master_bio;
-	mddev_t *mddev = r10_bio->mddev;
-	conf_t *conf = mddev->private;
-	mdk_rdev_t *rdev = conf->mirrors[r10_bio->devs[i].devnum].rdev;
+	struct mddev *mddev = r10_bio->mddev;
+	struct r10conf *conf = mddev->private;
+	struct md_rdev *rdev = conf->mirrors[r10_bio->devs[i].devnum].rdev;
 	/* bio has the data to be written to slot 'i' where
 	/* bio has the data to be written to slot 'i' where
 	 * we just recently had a write error.
 	 * we just recently had a write error.
 	 * We repeatedly clone the bio and trim down to one block,
 	 * We repeatedly clone the bio and trim down to one block,
@@ -2040,13 +2059,13 @@ static int narrow_write_error(r10bio_t *r10_bio, int i)
 	return ok;
 	return ok;
 }
 }
 
 
-static void handle_read_error(mddev_t *mddev, r10bio_t *r10_bio)
+static void handle_read_error(struct mddev *mddev, struct r10bio *r10_bio)
 {
 {
 	int slot = r10_bio->read_slot;
 	int slot = r10_bio->read_slot;
 	int mirror = r10_bio->devs[slot].devnum;
 	int mirror = r10_bio->devs[slot].devnum;
 	struct bio *bio;
 	struct bio *bio;
-	conf_t *conf = mddev->private;
-	mdk_rdev_t *rdev;
+	struct r10conf *conf = mddev->private;
+	struct md_rdev *rdev;
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
 	unsigned long do_sync;
 	unsigned long do_sync;
 	int max_sectors;
 	int max_sectors;
@@ -2139,7 +2158,7 @@ read_more:
 		generic_make_request(bio);
 		generic_make_request(bio);
 }
 }
 
 
-static void handle_write_completed(conf_t *conf, r10bio_t *r10_bio)
+static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio)
 {
 {
 	/* Some sort of write request has finished and it
 	/* Some sort of write request has finished and it
 	 * succeeded in writing where we thought there was a
 	 * succeeded in writing where we thought there was a
@@ -2148,7 +2167,7 @@ static void handle_write_completed(conf_t *conf, r10bio_t *r10_bio)
 	 * a bad block.
 	 * a bad block.
 	 */
 	 */
 	int m;
 	int m;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	if (test_bit(R10BIO_IsSync, &r10_bio->state) ||
 	if (test_bit(R10BIO_IsSync, &r10_bio->state) ||
 	    test_bit(R10BIO_IsRecover, &r10_bio->state)) {
 	    test_bit(R10BIO_IsRecover, &r10_bio->state)) {
@@ -2200,11 +2219,11 @@ static void handle_write_completed(conf_t *conf, r10bio_t *r10_bio)
 	}
 	}
 }
 }
 
 
-static void raid10d(mddev_t *mddev)
+static void raid10d(struct mddev *mddev)
 {
 {
-	r10bio_t *r10_bio;
+	struct r10bio *r10_bio;
 	unsigned long flags;
 	unsigned long flags;
-	conf_t *conf = mddev->private;
+	struct r10conf *conf = mddev->private;
 	struct list_head *head = &conf->retry_list;
 	struct list_head *head = &conf->retry_list;
 	struct blk_plug plug;
 	struct blk_plug plug;
 
 
@@ -2220,7 +2239,7 @@ static void raid10d(mddev_t *mddev)
 			spin_unlock_irqrestore(&conf->device_lock, flags);
 			spin_unlock_irqrestore(&conf->device_lock, flags);
 			break;
 			break;
 		}
 		}
-		r10_bio = list_entry(head->prev, r10bio_t, retry_list);
+		r10_bio = list_entry(head->prev, struct r10bio, retry_list);
 		list_del(head->prev);
 		list_del(head->prev);
 		conf->nr_queued--;
 		conf->nr_queued--;
 		spin_unlock_irqrestore(&conf->device_lock, flags);
 		spin_unlock_irqrestore(&conf->device_lock, flags);
@@ -2252,7 +2271,7 @@ static void raid10d(mddev_t *mddev)
 }
 }
 
 
 
 
-static int init_resync(conf_t *conf)
+static int init_resync(struct r10conf *conf)
 {
 {
 	int buffs;
 	int buffs;
 
 
@@ -2297,11 +2316,11 @@ static int init_resync(conf_t *conf)
  *
  *
  */
  */
 
 
-static sector_t sync_request(mddev_t *mddev, sector_t sector_nr,
+static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
 			     int *skipped, int go_faster)
 			     int *skipped, int go_faster)
 {
 {
-	conf_t *conf = mddev->private;
-	r10bio_t *r10_bio;
+	struct r10conf *conf = mddev->private;
+	struct r10bio *r10_bio;
 	struct bio *biolist = NULL, *bio;
 	struct bio *biolist = NULL, *bio;
 	sector_t max_sector, nr_sectors;
 	sector_t max_sector, nr_sectors;
 	int i;
 	int i;
@@ -2393,7 +2412,7 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr,
 
 
 		for (i=0 ; i<conf->raid_disks; i++) {
 		for (i=0 ; i<conf->raid_disks; i++) {
 			int still_degraded;
 			int still_degraded;
-			r10bio_t *rb2;
+			struct r10bio *rb2;
 			sector_t sect;
 			sector_t sect;
 			int must_sync;
 			int must_sync;
 			int any_working;
 			int any_working;
@@ -2453,7 +2472,7 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr,
 				int k;
 				int k;
 				int d = r10_bio->devs[j].devnum;
 				int d = r10_bio->devs[j].devnum;
 				sector_t from_addr, to_addr;
 				sector_t from_addr, to_addr;
-				mdk_rdev_t *rdev;
+				struct md_rdev *rdev;
 				sector_t sector, first_bad;
 				sector_t sector, first_bad;
 				int bad_sectors;
 				int bad_sectors;
 				if (!conf->mirrors[d].rdev ||
 				if (!conf->mirrors[d].rdev ||
@@ -2547,8 +2566,8 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr,
 		}
 		}
 		if (biolist == NULL) {
 		if (biolist == NULL) {
 			while (r10_bio) {
 			while (r10_bio) {
-				r10bio_t *rb2 = r10_bio;
-				r10_bio = (r10bio_t*) rb2->master_bio;
+				struct r10bio *rb2 = r10_bio;
+				r10_bio = (struct r10bio*) rb2->master_bio;
 				rb2->master_bio = NULL;
 				rb2->master_bio = NULL;
 				put_buf(rb2);
 				put_buf(rb2);
 			}
 			}
@@ -2714,10 +2733,10 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr,
 }
 }
 
 
 static sector_t
 static sector_t
-raid10_size(mddev_t *mddev, sector_t sectors, int raid_disks)
+raid10_size(struct mddev *mddev, sector_t sectors, int raid_disks)
 {
 {
 	sector_t size;
 	sector_t size;
-	conf_t *conf = mddev->private;
+	struct r10conf *conf = mddev->private;
 
 
 	if (!raid_disks)
 	if (!raid_disks)
 		raid_disks = conf->raid_disks;
 		raid_disks = conf->raid_disks;
@@ -2733,9 +2752,9 @@ raid10_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 }
 }
 
 
 
 
-static conf_t *setup_conf(mddev_t *mddev)
+static struct r10conf *setup_conf(struct mddev *mddev)
 {
 {
-	conf_t *conf = NULL;
+	struct r10conf *conf = NULL;
 	int nc, fc, fo;
 	int nc, fc, fo;
 	sector_t stride, size;
 	sector_t stride, size;
 	int err = -EINVAL;
 	int err = -EINVAL;
@@ -2760,7 +2779,7 @@ static conf_t *setup_conf(mddev_t *mddev)
 	}
 	}
 
 
 	err = -ENOMEM;
 	err = -ENOMEM;
-	conf = kzalloc(sizeof(conf_t), GFP_KERNEL);
+	conf = kzalloc(sizeof(struct r10conf), GFP_KERNEL);
 	if (!conf)
 	if (!conf)
 		goto out;
 		goto out;
 
 
@@ -2836,12 +2855,12 @@ static conf_t *setup_conf(mddev_t *mddev)
 	return ERR_PTR(err);
 	return ERR_PTR(err);
 }
 }
 
 
-static int run(mddev_t *mddev)
+static int run(struct mddev *mddev)
 {
 {
-	conf_t *conf;
+	struct r10conf *conf;
 	int i, disk_idx, chunk_size;
 	int i, disk_idx, chunk_size;
-	mirror_info_t *disk;
-	mdk_rdev_t *rdev;
+	struct mirror_info *disk;
+	struct md_rdev *rdev;
 	sector_t size;
 	sector_t size;
 
 
 	/*
 	/*
@@ -2913,6 +2932,7 @@ static int run(mddev_t *mddev)
 			if (disk->rdev)
 			if (disk->rdev)
 				conf->fullsync = 1;
 				conf->fullsync = 1;
 		}
 		}
+		disk->recovery_disabled = mddev->recovery_disabled - 1;
 	}
 	}
 
 
 	if (mddev->recovery_cp != MaxSector)
 	if (mddev->recovery_cp != MaxSector)
@@ -2966,9 +2986,9 @@ out:
 	return -EIO;
 	return -EIO;
 }
 }
 
 
-static int stop(mddev_t *mddev)
+static int stop(struct mddev *mddev)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r10conf *conf = mddev->private;
 
 
 	raise_barrier(conf, 0);
 	raise_barrier(conf, 0);
 	lower_barrier(conf);
 	lower_barrier(conf);
@@ -2983,9 +3003,9 @@ static int stop(mddev_t *mddev)
 	return 0;
 	return 0;
 }
 }
 
 
-static void raid10_quiesce(mddev_t *mddev, int state)
+static void raid10_quiesce(struct mddev *mddev, int state)
 {
 {
-	conf_t *conf = mddev->private;
+	struct r10conf *conf = mddev->private;
 
 
 	switch(state) {
 	switch(state) {
 	case 1:
 	case 1:
@@ -2997,10 +3017,10 @@ static void raid10_quiesce(mddev_t *mddev, int state)
 	}
 	}
 }
 }
 
 
-static void *raid10_takeover_raid0(mddev_t *mddev)
+static void *raid10_takeover_raid0(struct mddev *mddev)
 {
 {
-	mdk_rdev_t *rdev;
-	conf_t *conf;
+	struct md_rdev *rdev;
+	struct r10conf *conf;
 
 
 	if (mddev->degraded > 0) {
 	if (mddev->degraded > 0) {
 		printk(KERN_ERR "md/raid10:%s: Error: degraded raid0!\n",
 		printk(KERN_ERR "md/raid10:%s: Error: degraded raid0!\n",
@@ -3029,17 +3049,17 @@ static void *raid10_takeover_raid0(mddev_t *mddev)
 	return conf;
 	return conf;
 }
 }
 
 
-static void *raid10_takeover(mddev_t *mddev)
+static void *raid10_takeover(struct mddev *mddev)
 {
 {
-	struct raid0_private_data *raid0_priv;
+	struct r0conf *raid0_conf;
 
 
 	/* raid10 can take over:
 	/* raid10 can take over:
 	 *  raid0 - providing it has only two drives
 	 *  raid0 - providing it has only two drives
 	 */
 	 */
 	if (mddev->level == 0) {
 	if (mddev->level == 0) {
 		/* for raid0 takeover only one zone is supported */
 		/* for raid0 takeover only one zone is supported */
-		raid0_priv = mddev->private;
-		if (raid0_priv->nr_strip_zones > 1) {
+		raid0_conf = mddev->private;
+		if (raid0_conf->nr_strip_zones > 1) {
 			printk(KERN_ERR "md/raid10:%s: cannot takeover raid 0"
 			printk(KERN_ERR "md/raid10:%s: cannot takeover raid 0"
 			       " with more than one zone.\n",
 			       " with more than one zone.\n",
 			       mdname(mddev));
 			       mdname(mddev));
@@ -3050,7 +3070,7 @@ static void *raid10_takeover(mddev_t *mddev)
 	return ERR_PTR(-EINVAL);
 	return ERR_PTR(-EINVAL);
 }
 }
 
 
-static struct mdk_personality raid10_personality =
+static struct md_personality raid10_personality =
 {
 {
 	.name		= "raid10",
 	.name		= "raid10",
 	.level		= 10,
 	.level		= 10,
@@ -3086,3 +3106,5 @@ MODULE_DESCRIPTION("RAID10 (striped mirror) personality for MD");
 MODULE_ALIAS("md-personality-9"); /* RAID10 */
 MODULE_ALIAS("md-personality-9"); /* RAID10 */
 MODULE_ALIAS("md-raid10");
 MODULE_ALIAS("md-raid10");
 MODULE_ALIAS("md-level-10");
 MODULE_ALIAS("md-level-10");
+
+module_param(max_queued_requests, int, S_IRUGO|S_IWUSR);

+ 8 - 14
drivers/md/raid10.h

@@ -1,10 +1,8 @@
 #ifndef _RAID10_H
 #ifndef _RAID10_H
 #define _RAID10_H
 #define _RAID10_H
 
 
-typedef struct mirror_info mirror_info_t;
-
 struct mirror_info {
 struct mirror_info {
-	mdk_rdev_t	*rdev;
+	struct md_rdev	*rdev;
 	sector_t	head_position;
 	sector_t	head_position;
 	int		recovery_disabled;	/* matches
 	int		recovery_disabled;	/* matches
 						 * mddev->recovery_disabled
 						 * mddev->recovery_disabled
@@ -13,11 +11,9 @@ struct mirror_info {
 						 */
 						 */
 };
 };
 
 
-typedef struct r10bio_s r10bio_t;
-
-struct r10_private_data_s {
-	mddev_t			*mddev;
-	mirror_info_t		*mirrors;
+struct r10conf {
+	struct mddev		*mddev;
+	struct mirror_info	*mirrors;
 	int			raid_disks;
 	int			raid_disks;
 	spinlock_t		device_lock;
 	spinlock_t		device_lock;
 
 
@@ -46,7 +42,7 @@ struct r10_private_data_s {
 	struct list_head	retry_list;
 	struct list_head	retry_list;
 	/* queue pending writes and submit them on unplug */
 	/* queue pending writes and submit them on unplug */
 	struct bio_list		pending_bio_list;
 	struct bio_list		pending_bio_list;
-
+	int			pending_count;
 
 
 	spinlock_t		resync_lock;
 	spinlock_t		resync_lock;
 	int nr_pending;
 	int nr_pending;
@@ -68,11 +64,9 @@ struct r10_private_data_s {
 	/* When taking over an array from a different personality, we store
 	/* When taking over an array from a different personality, we store
 	 * the new thread here until we fully activate the array.
 	 * the new thread here until we fully activate the array.
 	 */
 	 */
-	struct mdk_thread_s	*thread;
+	struct md_thread	*thread;
 };
 };
 
 
-typedef struct r10_private_data_s conf_t;
-
 /*
 /*
  * this is our 'private' RAID10 bio.
  * this is our 'private' RAID10 bio.
  *
  *
@@ -80,14 +74,14 @@ typedef struct r10_private_data_s conf_t;
  * for this RAID10 operation, and about their status:
  * for this RAID10 operation, and about their status:
  */
  */
 
 
-struct r10bio_s {
+struct r10bio {
 	atomic_t		remaining; /* 'have we finished' count,
 	atomic_t		remaining; /* 'have we finished' count,
 					    * used from IRQ handlers
 					    * used from IRQ handlers
 					    */
 					    */
 	sector_t		sector;	/* virtual sector number */
 	sector_t		sector;	/* virtual sector number */
 	int			sectors;
 	int			sectors;
 	unsigned long		state;
 	unsigned long		state;
-	mddev_t			*mddev;
+	struct mddev		*mddev;
 	/*
 	/*
 	 * original bio going to /dev/mdx
 	 * original bio going to /dev/mdx
 	 */
 	 */

+ 158 - 205
drivers/md/raid5.c

@@ -70,7 +70,11 @@
 #define NR_HASH			(PAGE_SIZE / sizeof(struct hlist_head))
 #define NR_HASH			(PAGE_SIZE / sizeof(struct hlist_head))
 #define HASH_MASK		(NR_HASH - 1)
 #define HASH_MASK		(NR_HASH - 1)
 
 
-#define stripe_hash(conf, sect)	(&((conf)->stripe_hashtbl[((sect) >> STRIPE_SHIFT) & HASH_MASK]))
+static inline struct hlist_head *stripe_hash(struct r5conf *conf, sector_t sect)
+{
+	int hash = (sect >> STRIPE_SHIFT) & HASH_MASK;
+	return &conf->stripe_hashtbl[hash];
+}
 
 
 /* bio's attached to a stripe+device for I/O are linked together in bi_sector
 /* bio's attached to a stripe+device for I/O are linked together in bi_sector
  * order without overlap.  There may be several bio's per stripe+device, and
  * order without overlap.  There may be several bio's per stripe+device, and
@@ -78,24 +82,17 @@
  * When walking this list for a particular stripe+device, we must never proceed
  * When walking this list for a particular stripe+device, we must never proceed
  * beyond a bio that extends past this device, as the next bio might no longer
  * beyond a bio that extends past this device, as the next bio might no longer
  * be valid.
  * be valid.
- * This macro is used to determine the 'next' bio in the list, given the sector
+ * This function is used to determine the 'next' bio in the list, given the sector
  * of the current stripe+device
  * of the current stripe+device
  */
  */
-#define r5_next_bio(bio, sect) ( ( (bio)->bi_sector + ((bio)->bi_size>>9) < sect + STRIPE_SECTORS) ? (bio)->bi_next : NULL)
-/*
- * The following can be used to debug the driver
- */
-#define RAID5_PARANOIA	1
-#if RAID5_PARANOIA && defined(CONFIG_SMP)
-# define CHECK_DEVLOCK() assert_spin_locked(&conf->device_lock)
-#else
-# define CHECK_DEVLOCK()
-#endif
-
-#ifdef DEBUG
-#define inline
-#define __inline__
-#endif
+static inline struct bio *r5_next_bio(struct bio *bio, sector_t sector)
+{
+	int sectors = bio->bi_size >> 9;
+	if (bio->bi_sector + sectors < sector + STRIPE_SECTORS)
+		return bio->bi_next;
+	else
+		return NULL;
+}
 
 
 /*
 /*
  * We maintain a biased count of active stripes in the bottom 16 bits of
  * We maintain a biased count of active stripes in the bottom 16 bits of
@@ -183,7 +180,7 @@ static void return_io(struct bio *return_bi)
 	}
 	}
 }
 }
 
 
-static void print_raid5_conf (raid5_conf_t *conf);
+static void print_raid5_conf (struct r5conf *conf);
 
 
 static int stripe_operations_active(struct stripe_head *sh)
 static int stripe_operations_active(struct stripe_head *sh)
 {
 {
@@ -192,7 +189,7 @@ static int stripe_operations_active(struct stripe_head *sh)
 	       test_bit(STRIPE_COMPUTE_RUN, &sh->state);
 	       test_bit(STRIPE_COMPUTE_RUN, &sh->state);
 }
 }
 
 
-static void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh)
+static void __release_stripe(struct r5conf *conf, struct stripe_head *sh)
 {
 {
 	if (atomic_dec_and_test(&sh->count)) {
 	if (atomic_dec_and_test(&sh->count)) {
 		BUG_ON(!list_empty(&sh->lru));
 		BUG_ON(!list_empty(&sh->lru));
@@ -228,7 +225,7 @@ static void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh)
 
 
 static void release_stripe(struct stripe_head *sh)
 static void release_stripe(struct stripe_head *sh)
 {
 {
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	unsigned long flags;
 	unsigned long flags;
 
 
 	spin_lock_irqsave(&conf->device_lock, flags);
 	spin_lock_irqsave(&conf->device_lock, flags);
@@ -244,25 +241,23 @@ static inline void remove_hash(struct stripe_head *sh)
 	hlist_del_init(&sh->hash);
 	hlist_del_init(&sh->hash);
 }
 }
 
 
-static inline void insert_hash(raid5_conf_t *conf, struct stripe_head *sh)
+static inline void insert_hash(struct r5conf *conf, struct stripe_head *sh)
 {
 {
 	struct hlist_head *hp = stripe_hash(conf, sh->sector);
 	struct hlist_head *hp = stripe_hash(conf, sh->sector);
 
 
 	pr_debug("insert_hash(), stripe %llu\n",
 	pr_debug("insert_hash(), stripe %llu\n",
 		(unsigned long long)sh->sector);
 		(unsigned long long)sh->sector);
 
 
-	CHECK_DEVLOCK();
 	hlist_add_head(&sh->hash, hp);
 	hlist_add_head(&sh->hash, hp);
 }
 }
 
 
 
 
 /* find an idle stripe, make sure it is unhashed, and return it. */
 /* find an idle stripe, make sure it is unhashed, and return it. */
-static struct stripe_head *get_free_stripe(raid5_conf_t *conf)
+static struct stripe_head *get_free_stripe(struct r5conf *conf)
 {
 {
 	struct stripe_head *sh = NULL;
 	struct stripe_head *sh = NULL;
 	struct list_head *first;
 	struct list_head *first;
 
 
-	CHECK_DEVLOCK();
 	if (list_empty(&conf->inactive_list))
 	if (list_empty(&conf->inactive_list))
 		goto out;
 		goto out;
 	first = conf->inactive_list.next;
 	first = conf->inactive_list.next;
@@ -306,19 +301,18 @@ static int grow_buffers(struct stripe_head *sh)
 }
 }
 
 
 static void raid5_build_block(struct stripe_head *sh, int i, int previous);
 static void raid5_build_block(struct stripe_head *sh, int i, int previous);
-static void stripe_set_idx(sector_t stripe, raid5_conf_t *conf, int previous,
+static void stripe_set_idx(sector_t stripe, struct r5conf *conf, int previous,
 			    struct stripe_head *sh);
 			    struct stripe_head *sh);
 
 
 static void init_stripe(struct stripe_head *sh, sector_t sector, int previous)
 static void init_stripe(struct stripe_head *sh, sector_t sector, int previous)
 {
 {
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	int i;
 	int i;
 
 
 	BUG_ON(atomic_read(&sh->count) != 0);
 	BUG_ON(atomic_read(&sh->count) != 0);
 	BUG_ON(test_bit(STRIPE_HANDLE, &sh->state));
 	BUG_ON(test_bit(STRIPE_HANDLE, &sh->state));
 	BUG_ON(stripe_operations_active(sh));
 	BUG_ON(stripe_operations_active(sh));
 
 
-	CHECK_DEVLOCK();
 	pr_debug("init_stripe called, stripe %llu\n",
 	pr_debug("init_stripe called, stripe %llu\n",
 		(unsigned long long)sh->sector);
 		(unsigned long long)sh->sector);
 
 
@@ -348,13 +342,12 @@ static void init_stripe(struct stripe_head *sh, sector_t sector, int previous)
 	insert_hash(conf, sh);
 	insert_hash(conf, sh);
 }
 }
 
 
-static struct stripe_head *__find_stripe(raid5_conf_t *conf, sector_t sector,
+static struct stripe_head *__find_stripe(struct r5conf *conf, sector_t sector,
 					 short generation)
 					 short generation)
 {
 {
 	struct stripe_head *sh;
 	struct stripe_head *sh;
 	struct hlist_node *hn;
 	struct hlist_node *hn;
 
 
-	CHECK_DEVLOCK();
 	pr_debug("__find_stripe, sector %llu\n", (unsigned long long)sector);
 	pr_debug("__find_stripe, sector %llu\n", (unsigned long long)sector);
 	hlist_for_each_entry(sh, hn, stripe_hash(conf, sector), hash)
 	hlist_for_each_entry(sh, hn, stripe_hash(conf, sector), hash)
 		if (sh->sector == sector && sh->generation == generation)
 		if (sh->sector == sector && sh->generation == generation)
@@ -376,7 +369,7 @@ static struct stripe_head *__find_stripe(raid5_conf_t *conf, sector_t sector,
  * of the two sections, and some non-in_sync devices may
  * of the two sections, and some non-in_sync devices may
  * be insync in the section most affected by failed devices.
  * be insync in the section most affected by failed devices.
  */
  */
-static int has_failed(raid5_conf_t *conf)
+static int has_failed(struct r5conf *conf)
 {
 {
 	int degraded;
 	int degraded;
 	int i;
 	int i;
@@ -386,7 +379,7 @@ static int has_failed(raid5_conf_t *conf)
 	rcu_read_lock();
 	rcu_read_lock();
 	degraded = 0;
 	degraded = 0;
 	for (i = 0; i < conf->previous_raid_disks; i++) {
 	for (i = 0; i < conf->previous_raid_disks; i++) {
-		mdk_rdev_t *rdev = rcu_dereference(conf->disks[i].rdev);
+		struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev);
 		if (!rdev || test_bit(Faulty, &rdev->flags))
 		if (!rdev || test_bit(Faulty, &rdev->flags))
 			degraded++;
 			degraded++;
 		else if (test_bit(In_sync, &rdev->flags))
 		else if (test_bit(In_sync, &rdev->flags))
@@ -410,7 +403,7 @@ static int has_failed(raid5_conf_t *conf)
 	rcu_read_lock();
 	rcu_read_lock();
 	degraded = 0;
 	degraded = 0;
 	for (i = 0; i < conf->raid_disks; i++) {
 	for (i = 0; i < conf->raid_disks; i++) {
-		mdk_rdev_t *rdev = rcu_dereference(conf->disks[i].rdev);
+		struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev);
 		if (!rdev || test_bit(Faulty, &rdev->flags))
 		if (!rdev || test_bit(Faulty, &rdev->flags))
 			degraded++;
 			degraded++;
 		else if (test_bit(In_sync, &rdev->flags))
 		else if (test_bit(In_sync, &rdev->flags))
@@ -431,7 +424,7 @@ static int has_failed(raid5_conf_t *conf)
 }
 }
 
 
 static struct stripe_head *
 static struct stripe_head *
-get_active_stripe(raid5_conf_t *conf, sector_t sector,
+get_active_stripe(struct r5conf *conf, sector_t sector,
 		  int previous, int noblock, int noquiesce)
 		  int previous, int noblock, int noquiesce)
 {
 {
 	struct stripe_head *sh;
 	struct stripe_head *sh;
@@ -491,7 +484,7 @@ raid5_end_write_request(struct bio *bi, int error);
 
 
 static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)
 static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)
 {
 {
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	int i, disks = sh->disks;
 	int i, disks = sh->disks;
 
 
 	might_sleep();
 	might_sleep();
@@ -499,7 +492,7 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)
 	for (i = disks; i--; ) {
 	for (i = disks; i--; ) {
 		int rw;
 		int rw;
 		struct bio *bi;
 		struct bio *bi;
-		mdk_rdev_t *rdev;
+		struct md_rdev *rdev;
 		if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags)) {
 		if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags)) {
 			if (test_and_clear_bit(R5_WantFUA, &sh->dev[i].flags))
 			if (test_and_clear_bit(R5_WantFUA, &sh->dev[i].flags))
 				rw = WRITE_FUA;
 				rw = WRITE_FUA;
@@ -650,7 +643,7 @@ static void ops_complete_biofill(void *stripe_head_ref)
 {
 {
 	struct stripe_head *sh = stripe_head_ref;
 	struct stripe_head *sh = stripe_head_ref;
 	struct bio *return_bi = NULL;
 	struct bio *return_bi = NULL;
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	int i;
 	int i;
 
 
 	pr_debug("%s: stripe %llu\n", __func__,
 	pr_debug("%s: stripe %llu\n", __func__,
@@ -695,7 +688,7 @@ static void ops_complete_biofill(void *stripe_head_ref)
 static void ops_run_biofill(struct stripe_head *sh)
 static void ops_run_biofill(struct stripe_head *sh)
 {
 {
 	struct dma_async_tx_descriptor *tx = NULL;
 	struct dma_async_tx_descriptor *tx = NULL;
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	struct async_submit_ctl submit;
 	struct async_submit_ctl submit;
 	int i;
 	int i;
 
 
@@ -1246,7 +1239,7 @@ static void __raid_run_ops(struct stripe_head *sh, unsigned long ops_request)
 {
 {
 	int overlap_clear = 0, i, disks = sh->disks;
 	int overlap_clear = 0, i, disks = sh->disks;
 	struct dma_async_tx_descriptor *tx = NULL;
 	struct dma_async_tx_descriptor *tx = NULL;
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	int level = conf->level;
 	int level = conf->level;
 	struct raid5_percpu *percpu;
 	struct raid5_percpu *percpu;
 	unsigned long cpu;
 	unsigned long cpu;
@@ -1337,7 +1330,7 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request)
 #define raid_run_ops __raid_run_ops
 #define raid_run_ops __raid_run_ops
 #endif
 #endif
 
 
-static int grow_one_stripe(raid5_conf_t *conf)
+static int grow_one_stripe(struct r5conf *conf)
 {
 {
 	struct stripe_head *sh;
 	struct stripe_head *sh;
 	sh = kmem_cache_zalloc(conf->slab_cache, GFP_KERNEL);
 	sh = kmem_cache_zalloc(conf->slab_cache, GFP_KERNEL);
@@ -1362,7 +1355,7 @@ static int grow_one_stripe(raid5_conf_t *conf)
 	return 1;
 	return 1;
 }
 }
 
 
-static int grow_stripes(raid5_conf_t *conf, int num)
+static int grow_stripes(struct r5conf *conf, int num)
 {
 {
 	struct kmem_cache *sc;
 	struct kmem_cache *sc;
 	int devs = max(conf->raid_disks, conf->previous_raid_disks);
 	int devs = max(conf->raid_disks, conf->previous_raid_disks);
@@ -1411,7 +1404,7 @@ static size_t scribble_len(int num)
 	return len;
 	return len;
 }
 }
 
 
-static int resize_stripes(raid5_conf_t *conf, int newsize)
+static int resize_stripes(struct r5conf *conf, int newsize)
 {
 {
 	/* Make all the stripes able to hold 'newsize' devices.
 	/* Make all the stripes able to hold 'newsize' devices.
 	 * New slots in each stripe get 'page' set to a new page.
 	 * New slots in each stripe get 'page' set to a new page.
@@ -1556,7 +1549,7 @@ static int resize_stripes(raid5_conf_t *conf, int newsize)
 	return err;
 	return err;
 }
 }
 
 
-static int drop_one_stripe(raid5_conf_t *conf)
+static int drop_one_stripe(struct r5conf *conf)
 {
 {
 	struct stripe_head *sh;
 	struct stripe_head *sh;
 
 
@@ -1572,7 +1565,7 @@ static int drop_one_stripe(raid5_conf_t *conf)
 	return 1;
 	return 1;
 }
 }
 
 
-static void shrink_stripes(raid5_conf_t *conf)
+static void shrink_stripes(struct r5conf *conf)
 {
 {
 	while (drop_one_stripe(conf))
 	while (drop_one_stripe(conf))
 		;
 		;
@@ -1585,11 +1578,11 @@ static void shrink_stripes(raid5_conf_t *conf)
 static void raid5_end_read_request(struct bio * bi, int error)
 static void raid5_end_read_request(struct bio * bi, int error)
 {
 {
 	struct stripe_head *sh = bi->bi_private;
 	struct stripe_head *sh = bi->bi_private;
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	int disks = sh->disks, i;
 	int disks = sh->disks, i;
 	int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags);
 	int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags);
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 
 
 	for (i=0 ; i<disks; i++)
 	for (i=0 ; i<disks; i++)
@@ -1672,7 +1665,7 @@ static void raid5_end_read_request(struct bio * bi, int error)
 static void raid5_end_write_request(struct bio *bi, int error)
 static void raid5_end_write_request(struct bio *bi, int error)
 {
 {
 	struct stripe_head *sh = bi->bi_private;
 	struct stripe_head *sh = bi->bi_private;
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	int disks = sh->disks, i;
 	int disks = sh->disks, i;
 	int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags);
 	int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags);
 	sector_t first_bad;
 	sector_t first_bad;
@@ -1726,10 +1719,10 @@ static void raid5_build_block(struct stripe_head *sh, int i, int previous)
 	dev->sector = compute_blocknr(sh, i, previous);
 	dev->sector = compute_blocknr(sh, i, previous);
 }
 }
 
 
-static void error(mddev_t *mddev, mdk_rdev_t *rdev)
+static void error(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
 	char b[BDEVNAME_SIZE];
 	char b[BDEVNAME_SIZE];
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	pr_debug("raid456: error called\n");
 	pr_debug("raid456: error called\n");
 
 
 	if (test_and_clear_bit(In_sync, &rdev->flags)) {
 	if (test_and_clear_bit(In_sync, &rdev->flags)) {
@@ -1758,7 +1751,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev)
  * Input: a 'big' sector number,
  * Input: a 'big' sector number,
  * Output: index of the data and parity disk, and the sector # in them.
  * Output: index of the data and parity disk, and the sector # in them.
  */
  */
-static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector,
+static sector_t raid5_compute_sector(struct r5conf *conf, sector_t r_sector,
 				     int previous, int *dd_idx,
 				     int previous, int *dd_idx,
 				     struct stripe_head *sh)
 				     struct stripe_head *sh)
 {
 {
@@ -1963,7 +1956,7 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector,
 
 
 static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous)
 static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous)
 {
 {
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	int raid_disks = sh->disks;
 	int raid_disks = sh->disks;
 	int data_disks = raid_disks - conf->max_degraded;
 	int data_disks = raid_disks - conf->max_degraded;
 	sector_t new_sector = sh->sector, check;
 	sector_t new_sector = sh->sector, check;
@@ -2088,7 +2081,7 @@ schedule_reconstruction(struct stripe_head *sh, struct stripe_head_state *s,
 			 int rcw, int expand)
 			 int rcw, int expand)
 {
 {
 	int i, pd_idx = sh->pd_idx, disks = sh->disks;
 	int i, pd_idx = sh->pd_idx, disks = sh->disks;
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	int level = conf->level;
 	int level = conf->level;
 
 
 	if (rcw) {
 	if (rcw) {
@@ -2173,7 +2166,7 @@ schedule_reconstruction(struct stripe_head *sh, struct stripe_head_state *s,
 static int add_stripe_bio(struct stripe_head *sh, struct bio *bi, int dd_idx, int forwrite)
 static int add_stripe_bio(struct stripe_head *sh, struct bio *bi, int dd_idx, int forwrite)
 {
 {
 	struct bio **bip;
 	struct bio **bip;
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	int firstwrite=0;
 	int firstwrite=0;
 
 
 	pr_debug("adding bi b#%llu to stripe s#%llu\n",
 	pr_debug("adding bi b#%llu to stripe s#%llu\n",
@@ -2235,9 +2228,9 @@ static int add_stripe_bio(struct stripe_head *sh, struct bio *bi, int dd_idx, in
 	return 0;
 	return 0;
 }
 }
 
 
-static void end_reshape(raid5_conf_t *conf);
+static void end_reshape(struct r5conf *conf);
 
 
-static void stripe_set_idx(sector_t stripe, raid5_conf_t *conf, int previous,
+static void stripe_set_idx(sector_t stripe, struct r5conf *conf, int previous,
 			    struct stripe_head *sh)
 			    struct stripe_head *sh)
 {
 {
 	int sectors_per_chunk =
 	int sectors_per_chunk =
@@ -2254,7 +2247,7 @@ static void stripe_set_idx(sector_t stripe, raid5_conf_t *conf, int previous,
 }
 }
 
 
 static void
 static void
-handle_failed_stripe(raid5_conf_t *conf, struct stripe_head *sh,
+handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
 				struct stripe_head_state *s, int disks,
 				struct stripe_head_state *s, int disks,
 				struct bio **return_bi)
 				struct bio **return_bi)
 {
 {
@@ -2264,7 +2257,7 @@ handle_failed_stripe(raid5_conf_t *conf, struct stripe_head *sh,
 		int bitmap_end = 0;
 		int bitmap_end = 0;
 
 
 		if (test_bit(R5_ReadError, &sh->dev[i].flags)) {
 		if (test_bit(R5_ReadError, &sh->dev[i].flags)) {
-			mdk_rdev_t *rdev;
+			struct md_rdev *rdev;
 			rcu_read_lock();
 			rcu_read_lock();
 			rdev = rcu_dereference(conf->disks[i].rdev);
 			rdev = rcu_dereference(conf->disks[i].rdev);
 			if (rdev && test_bit(In_sync, &rdev->flags))
 			if (rdev && test_bit(In_sync, &rdev->flags))
@@ -2359,7 +2352,7 @@ handle_failed_stripe(raid5_conf_t *conf, struct stripe_head *sh,
 }
 }
 
 
 static void
 static void
-handle_failed_sync(raid5_conf_t *conf, struct stripe_head *sh,
+handle_failed_sync(struct r5conf *conf, struct stripe_head *sh,
 		   struct stripe_head_state *s)
 		   struct stripe_head_state *s)
 {
 {
 	int abort = 0;
 	int abort = 0;
@@ -2378,7 +2371,7 @@ handle_failed_sync(raid5_conf_t *conf, struct stripe_head *sh,
 	 * refcounting of rdevs is not needed
 	 * refcounting of rdevs is not needed
 	 */
 	 */
 	for (i = 0; i < conf->raid_disks; i++) {
 	for (i = 0; i < conf->raid_disks; i++) {
-		mdk_rdev_t *rdev = conf->disks[i].rdev;
+		struct md_rdev *rdev = conf->disks[i].rdev;
 		if (!rdev
 		if (!rdev
 		    || test_bit(Faulty, &rdev->flags)
 		    || test_bit(Faulty, &rdev->flags)
 		    || test_bit(In_sync, &rdev->flags))
 		    || test_bit(In_sync, &rdev->flags))
@@ -2508,7 +2501,7 @@ static void handle_stripe_fill(struct stripe_head *sh,
  * Note that if we 'wrote' to a failed drive, it will be UPTODATE, but
  * Note that if we 'wrote' to a failed drive, it will be UPTODATE, but
  * never LOCKED, so we don't need to test 'failed' directly.
  * never LOCKED, so we don't need to test 'failed' directly.
  */
  */
-static void handle_stripe_clean_event(raid5_conf_t *conf,
+static void handle_stripe_clean_event(struct r5conf *conf,
 	struct stripe_head *sh, int disks, struct bio **return_bi)
 	struct stripe_head *sh, int disks, struct bio **return_bi)
 {
 {
 	int i;
 	int i;
@@ -2553,7 +2546,7 @@ static void handle_stripe_clean_event(raid5_conf_t *conf,
 			md_wakeup_thread(conf->mddev->thread);
 			md_wakeup_thread(conf->mddev->thread);
 }
 }
 
 
-static void handle_stripe_dirtying(raid5_conf_t *conf,
+static void handle_stripe_dirtying(struct r5conf *conf,
 				   struct stripe_head *sh,
 				   struct stripe_head *sh,
 				   struct stripe_head_state *s,
 				   struct stripe_head_state *s,
 				   int disks)
 				   int disks)
@@ -2655,7 +2648,7 @@ static void handle_stripe_dirtying(raid5_conf_t *conf,
 		schedule_reconstruction(sh, s, rcw == 0, 0);
 		schedule_reconstruction(sh, s, rcw == 0, 0);
 }
 }
 
 
-static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
+static void handle_parity_checks5(struct r5conf *conf, struct stripe_head *sh,
 				struct stripe_head_state *s, int disks)
 				struct stripe_head_state *s, int disks)
 {
 {
 	struct r5dev *dev = NULL;
 	struct r5dev *dev = NULL;
@@ -2743,7 +2736,7 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
 }
 }
 
 
 
 
-static void handle_parity_checks6(raid5_conf_t *conf, struct stripe_head *sh,
+static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh,
 				  struct stripe_head_state *s,
 				  struct stripe_head_state *s,
 				  int disks)
 				  int disks)
 {
 {
@@ -2906,7 +2899,7 @@ static void handle_parity_checks6(raid5_conf_t *conf, struct stripe_head *sh,
 	}
 	}
 }
 }
 
 
-static void handle_stripe_expansion(raid5_conf_t *conf, struct stripe_head *sh)
+static void handle_stripe_expansion(struct r5conf *conf, struct stripe_head *sh)
 {
 {
 	int i;
 	int i;
 
 
@@ -2985,7 +2978,7 @@ static void handle_stripe_expansion(raid5_conf_t *conf, struct stripe_head *sh)
 
 
 static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s)
 static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s)
 {
 {
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	int disks = sh->disks;
 	int disks = sh->disks;
 	struct r5dev *dev;
 	struct r5dev *dev;
 	int i;
 	int i;
@@ -3002,7 +2995,7 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s)
 	rcu_read_lock();
 	rcu_read_lock();
 	spin_lock_irq(&conf->device_lock);
 	spin_lock_irq(&conf->device_lock);
 	for (i=disks; i--; ) {
 	for (i=disks; i--; ) {
-		mdk_rdev_t *rdev;
+		struct md_rdev *rdev;
 		sector_t first_bad;
 		sector_t first_bad;
 		int bad_sectors;
 		int bad_sectors;
 		int is_bad = 0;
 		int is_bad = 0;
@@ -3069,7 +3062,7 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s)
 			}
 			}
 		} else if (test_bit(In_sync, &rdev->flags))
 		} else if (test_bit(In_sync, &rdev->flags))
 			set_bit(R5_Insync, &dev->flags);
 			set_bit(R5_Insync, &dev->flags);
-		else {
+		else if (!test_bit(Faulty, &rdev->flags)) {
 			/* in sync if before recovery_offset */
 			/* in sync if before recovery_offset */
 			if (sh->sector + STRIPE_SECTORS <= rdev->recovery_offset)
 			if (sh->sector + STRIPE_SECTORS <= rdev->recovery_offset)
 				set_bit(R5_Insync, &dev->flags);
 				set_bit(R5_Insync, &dev->flags);
@@ -3109,7 +3102,7 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s)
 static void handle_stripe(struct stripe_head *sh)
 static void handle_stripe(struct stripe_head *sh)
 {
 {
 	struct stripe_head_state s;
 	struct stripe_head_state s;
-	raid5_conf_t *conf = sh->raid_conf;
+	struct r5conf *conf = sh->raid_conf;
 	int i;
 	int i;
 	int prexor;
 	int prexor;
 	int disks = sh->disks;
 	int disks = sh->disks;
@@ -3341,7 +3334,7 @@ finish:
 
 
 	if (s.handle_bad_blocks)
 	if (s.handle_bad_blocks)
 		for (i = disks; i--; ) {
 		for (i = disks; i--; ) {
-			mdk_rdev_t *rdev;
+			struct md_rdev *rdev;
 			struct r5dev *dev = &sh->dev[i];
 			struct r5dev *dev = &sh->dev[i];
 			if (test_and_clear_bit(R5_WriteError, &dev->flags)) {
 			if (test_and_clear_bit(R5_WriteError, &dev->flags)) {
 				/* We own a safe reference to the rdev */
 				/* We own a safe reference to the rdev */
@@ -3380,7 +3373,7 @@ finish:
 	clear_bit(STRIPE_ACTIVE, &sh->state);
 	clear_bit(STRIPE_ACTIVE, &sh->state);
 }
 }
 
 
-static void raid5_activate_delayed(raid5_conf_t *conf)
+static void raid5_activate_delayed(struct r5conf *conf)
 {
 {
 	if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD) {
 	if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD) {
 		while (!list_empty(&conf->delayed_list)) {
 		while (!list_empty(&conf->delayed_list)) {
@@ -3396,7 +3389,7 @@ static void raid5_activate_delayed(raid5_conf_t *conf)
 	}
 	}
 }
 }
 
 
-static void activate_bit_delay(raid5_conf_t *conf)
+static void activate_bit_delay(struct r5conf *conf)
 {
 {
 	/* device_lock is held */
 	/* device_lock is held */
 	struct list_head head;
 	struct list_head head;
@@ -3410,9 +3403,9 @@ static void activate_bit_delay(raid5_conf_t *conf)
 	}
 	}
 }
 }
 
 
-int md_raid5_congested(mddev_t *mddev, int bits)
+int md_raid5_congested(struct mddev *mddev, int bits)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 
 
 	/* No difference between reads and writes.  Just check
 	/* No difference between reads and writes.  Just check
 	 * how busy the stripe_cache is
 	 * how busy the stripe_cache is
@@ -3431,7 +3424,7 @@ EXPORT_SYMBOL_GPL(md_raid5_congested);
 
 
 static int raid5_congested(void *data, int bits)
 static int raid5_congested(void *data, int bits)
 {
 {
-	mddev_t *mddev = data;
+	struct mddev *mddev = data;
 
 
 	return mddev_congested(mddev, bits) ||
 	return mddev_congested(mddev, bits) ||
 		md_raid5_congested(mddev, bits);
 		md_raid5_congested(mddev, bits);
@@ -3444,7 +3437,7 @@ static int raid5_mergeable_bvec(struct request_queue *q,
 				struct bvec_merge_data *bvm,
 				struct bvec_merge_data *bvm,
 				struct bio_vec *biovec)
 				struct bio_vec *biovec)
 {
 {
-	mddev_t *mddev = q->queuedata;
+	struct mddev *mddev = q->queuedata;
 	sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
 	sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
 	int max;
 	int max;
 	unsigned int chunk_sectors = mddev->chunk_sectors;
 	unsigned int chunk_sectors = mddev->chunk_sectors;
@@ -3464,7 +3457,7 @@ static int raid5_mergeable_bvec(struct request_queue *q,
 }
 }
 
 
 
 
-static int in_chunk_boundary(mddev_t *mddev, struct bio *bio)
+static int in_chunk_boundary(struct mddev *mddev, struct bio *bio)
 {
 {
 	sector_t sector = bio->bi_sector + get_start_sect(bio->bi_bdev);
 	sector_t sector = bio->bi_sector + get_start_sect(bio->bi_bdev);
 	unsigned int chunk_sectors = mddev->chunk_sectors;
 	unsigned int chunk_sectors = mddev->chunk_sectors;
@@ -3480,7 +3473,7 @@ static int in_chunk_boundary(mddev_t *mddev, struct bio *bio)
  *  add bio to the retry LIFO  ( in O(1) ... we are in interrupt )
  *  add bio to the retry LIFO  ( in O(1) ... we are in interrupt )
  *  later sampled by raid5d.
  *  later sampled by raid5d.
  */
  */
-static void add_bio_to_retry(struct bio *bi,raid5_conf_t *conf)
+static void add_bio_to_retry(struct bio *bi,struct r5conf *conf)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 
 
@@ -3494,7 +3487,7 @@ static void add_bio_to_retry(struct bio *bi,raid5_conf_t *conf)
 }
 }
 
 
 
 
-static struct bio *remove_bio_from_retry(raid5_conf_t *conf)
+static struct bio *remove_bio_from_retry(struct r5conf *conf)
 {
 {
 	struct bio *bi;
 	struct bio *bi;
 
 
@@ -3527,10 +3520,10 @@ static struct bio *remove_bio_from_retry(raid5_conf_t *conf)
 static void raid5_align_endio(struct bio *bi, int error)
 static void raid5_align_endio(struct bio *bi, int error)
 {
 {
 	struct bio* raid_bi  = bi->bi_private;
 	struct bio* raid_bi  = bi->bi_private;
-	mddev_t *mddev;
-	raid5_conf_t *conf;
+	struct mddev *mddev;
+	struct r5conf *conf;
 	int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags);
 	int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags);
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	bio_put(bi);
 	bio_put(bi);
 
 
@@ -3574,12 +3567,12 @@ static int bio_fits_rdev(struct bio *bi)
 }
 }
 
 
 
 
-static int chunk_aligned_read(mddev_t *mddev, struct bio * raid_bio)
+static int chunk_aligned_read(struct mddev *mddev, struct bio * raid_bio)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	int dd_idx;
 	int dd_idx;
 	struct bio* align_bi;
 	struct bio* align_bi;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 
 
 	if (!in_chunk_boundary(mddev, raid_bio)) {
 	if (!in_chunk_boundary(mddev, raid_bio)) {
 		pr_debug("chunk_aligned_read : non aligned\n");
 		pr_debug("chunk_aligned_read : non aligned\n");
@@ -3652,7 +3645,7 @@ static int chunk_aligned_read(mddev_t *mddev, struct bio * raid_bio)
  * head of the hold_list has changed, i.e. the head was promoted to the
  * head of the hold_list has changed, i.e. the head was promoted to the
  * handle_list.
  * handle_list.
  */
  */
-static struct stripe_head *__get_priority_stripe(raid5_conf_t *conf)
+static struct stripe_head *__get_priority_stripe(struct r5conf *conf)
 {
 {
 	struct stripe_head *sh;
 	struct stripe_head *sh;
 
 
@@ -3695,9 +3688,9 @@ static struct stripe_head *__get_priority_stripe(raid5_conf_t *conf)
 	return sh;
 	return sh;
 }
 }
 
 
-static int make_request(mddev_t *mddev, struct bio * bi)
+static int make_request(struct mddev *mddev, struct bio * bi)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	int dd_idx;
 	int dd_idx;
 	sector_t new_sector;
 	sector_t new_sector;
 	sector_t logical_sector, last_sector;
 	sector_t logical_sector, last_sector;
@@ -3855,9 +3848,9 @@ static int make_request(mddev_t *mddev, struct bio * bi)
 	return 0;
 	return 0;
 }
 }
 
 
-static sector_t raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks);
+static sector_t raid5_size(struct mddev *mddev, sector_t sectors, int raid_disks);
 
 
-static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped)
+static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *skipped)
 {
 {
 	/* reshaping is quite different to recovery/resync so it is
 	/* reshaping is quite different to recovery/resync so it is
 	 * handled quite separately ... here.
 	 * handled quite separately ... here.
@@ -3868,7 +3861,7 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped
 	 * As the reads complete, handle_stripe will copy the data
 	 * As the reads complete, handle_stripe will copy the data
 	 * into the destination stripe and release that stripe.
 	 * into the destination stripe and release that stripe.
 	 */
 	 */
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	struct stripe_head *sh;
 	struct stripe_head *sh;
 	sector_t first_sector, last_sector;
 	sector_t first_sector, last_sector;
 	int raid_disks = conf->previous_raid_disks;
 	int raid_disks = conf->previous_raid_disks;
@@ -4075,9 +4068,9 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped
 }
 }
 
 
 /* FIXME go_faster isn't used */
 /* FIXME go_faster isn't used */
-static inline sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster)
+static inline sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipped, int go_faster)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	struct stripe_head *sh;
 	struct stripe_head *sh;
 	sector_t max_sector = mddev->dev_sectors;
 	sector_t max_sector = mddev->dev_sectors;
 	sector_t sync_blocks;
 	sector_t sync_blocks;
@@ -4162,7 +4155,7 @@ static inline sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *ski
 	return STRIPE_SECTORS;
 	return STRIPE_SECTORS;
 }
 }
 
 
-static int  retry_aligned_read(raid5_conf_t *conf, struct bio *raid_bio)
+static int  retry_aligned_read(struct r5conf *conf, struct bio *raid_bio)
 {
 {
 	/* We may not be able to submit a whole bio at once as there
 	/* We may not be able to submit a whole bio at once as there
 	 * may not be enough stripe_heads available.
 	 * may not be enough stripe_heads available.
@@ -4234,10 +4227,10 @@ static int  retry_aligned_read(raid5_conf_t *conf, struct bio *raid_bio)
  * During the scan, completed stripes are saved for us by the interrupt
  * During the scan, completed stripes are saved for us by the interrupt
  * handler, so that they will not have to wait for our next wakeup.
  * handler, so that they will not have to wait for our next wakeup.
  */
  */
-static void raid5d(mddev_t *mddev)
+static void raid5d(struct mddev *mddev)
 {
 {
 	struct stripe_head *sh;
 	struct stripe_head *sh;
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	int handled;
 	int handled;
 	struct blk_plug plug;
 	struct blk_plug plug;
 
 
@@ -4301,9 +4294,9 @@ static void raid5d(mddev_t *mddev)
 }
 }
 
 
 static ssize_t
 static ssize_t
-raid5_show_stripe_cache_size(mddev_t *mddev, char *page)
+raid5_show_stripe_cache_size(struct mddev *mddev, char *page)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	if (conf)
 	if (conf)
 		return sprintf(page, "%d\n", conf->max_nr_stripes);
 		return sprintf(page, "%d\n", conf->max_nr_stripes);
 	else
 	else
@@ -4311,9 +4304,9 @@ raid5_show_stripe_cache_size(mddev_t *mddev, char *page)
 }
 }
 
 
 int
 int
-raid5_set_cache_size(mddev_t *mddev, int size)
+raid5_set_cache_size(struct mddev *mddev, int size)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	int err;
 	int err;
 
 
 	if (size <= 16 || size > 32768)
 	if (size <= 16 || size > 32768)
@@ -4337,9 +4330,9 @@ raid5_set_cache_size(mddev_t *mddev, int size)
 EXPORT_SYMBOL(raid5_set_cache_size);
 EXPORT_SYMBOL(raid5_set_cache_size);
 
 
 static ssize_t
 static ssize_t
-raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len)
+raid5_store_stripe_cache_size(struct mddev *mddev, const char *page, size_t len)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	unsigned long new;
 	unsigned long new;
 	int err;
 	int err;
 
 
@@ -4362,9 +4355,9 @@ raid5_stripecache_size = __ATTR(stripe_cache_size, S_IRUGO | S_IWUSR,
 				raid5_store_stripe_cache_size);
 				raid5_store_stripe_cache_size);
 
 
 static ssize_t
 static ssize_t
-raid5_show_preread_threshold(mddev_t *mddev, char *page)
+raid5_show_preread_threshold(struct mddev *mddev, char *page)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	if (conf)
 	if (conf)
 		return sprintf(page, "%d\n", conf->bypass_threshold);
 		return sprintf(page, "%d\n", conf->bypass_threshold);
 	else
 	else
@@ -4372,9 +4365,9 @@ raid5_show_preread_threshold(mddev_t *mddev, char *page)
 }
 }
 
 
 static ssize_t
 static ssize_t
-raid5_store_preread_threshold(mddev_t *mddev, const char *page, size_t len)
+raid5_store_preread_threshold(struct mddev *mddev, const char *page, size_t len)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	unsigned long new;
 	unsigned long new;
 	if (len >= PAGE_SIZE)
 	if (len >= PAGE_SIZE)
 		return -EINVAL;
 		return -EINVAL;
@@ -4396,9 +4389,9 @@ raid5_preread_bypass_threshold = __ATTR(preread_bypass_threshold,
 					raid5_store_preread_threshold);
 					raid5_store_preread_threshold);
 
 
 static ssize_t
 static ssize_t
-stripe_cache_active_show(mddev_t *mddev, char *page)
+stripe_cache_active_show(struct mddev *mddev, char *page)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	if (conf)
 	if (conf)
 		return sprintf(page, "%d\n", atomic_read(&conf->active_stripes));
 		return sprintf(page, "%d\n", atomic_read(&conf->active_stripes));
 	else
 	else
@@ -4420,9 +4413,9 @@ static struct attribute_group raid5_attrs_group = {
 };
 };
 
 
 static sector_t
 static sector_t
-raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks)
+raid5_size(struct mddev *mddev, sector_t sectors, int raid_disks)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 
 
 	if (!sectors)
 	if (!sectors)
 		sectors = mddev->dev_sectors;
 		sectors = mddev->dev_sectors;
@@ -4435,7 +4428,7 @@ raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 	return sectors * (raid_disks - conf->max_degraded);
 	return sectors * (raid_disks - conf->max_degraded);
 }
 }
 
 
-static void raid5_free_percpu(raid5_conf_t *conf)
+static void raid5_free_percpu(struct r5conf *conf)
 {
 {
 	struct raid5_percpu *percpu;
 	struct raid5_percpu *percpu;
 	unsigned long cpu;
 	unsigned long cpu;
@@ -4457,7 +4450,7 @@ static void raid5_free_percpu(raid5_conf_t *conf)
 	free_percpu(conf->percpu);
 	free_percpu(conf->percpu);
 }
 }
 
 
-static void free_conf(raid5_conf_t *conf)
+static void free_conf(struct r5conf *conf)
 {
 {
 	shrink_stripes(conf);
 	shrink_stripes(conf);
 	raid5_free_percpu(conf);
 	raid5_free_percpu(conf);
@@ -4470,7 +4463,7 @@ static void free_conf(raid5_conf_t *conf)
 static int raid456_cpu_notify(struct notifier_block *nfb, unsigned long action,
 static int raid456_cpu_notify(struct notifier_block *nfb, unsigned long action,
 			      void *hcpu)
 			      void *hcpu)
 {
 {
-	raid5_conf_t *conf = container_of(nfb, raid5_conf_t, cpu_notify);
+	struct r5conf *conf = container_of(nfb, struct r5conf, cpu_notify);
 	long cpu = (long)hcpu;
 	long cpu = (long)hcpu;
 	struct raid5_percpu *percpu = per_cpu_ptr(conf->percpu, cpu);
 	struct raid5_percpu *percpu = per_cpu_ptr(conf->percpu, cpu);
 
 
@@ -4505,7 +4498,7 @@ static int raid456_cpu_notify(struct notifier_block *nfb, unsigned long action,
 }
 }
 #endif
 #endif
 
 
-static int raid5_alloc_percpu(raid5_conf_t *conf)
+static int raid5_alloc_percpu(struct r5conf *conf)
 {
 {
 	unsigned long cpu;
 	unsigned long cpu;
 	struct page *spare_page;
 	struct page *spare_page;
@@ -4547,11 +4540,11 @@ static int raid5_alloc_percpu(raid5_conf_t *conf)
 	return err;
 	return err;
 }
 }
 
 
-static raid5_conf_t *setup_conf(mddev_t *mddev)
+static struct r5conf *setup_conf(struct mddev *mddev)
 {
 {
-	raid5_conf_t *conf;
+	struct r5conf *conf;
 	int raid_disk, memory, max_disks;
 	int raid_disk, memory, max_disks;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	struct disk_info *disk;
 	struct disk_info *disk;
 
 
 	if (mddev->new_level != 5
 	if (mddev->new_level != 5
@@ -4583,7 +4576,7 @@ static raid5_conf_t *setup_conf(mddev_t *mddev)
 		return ERR_PTR(-EINVAL);
 		return ERR_PTR(-EINVAL);
 	}
 	}
 
 
-	conf = kzalloc(sizeof(raid5_conf_t), GFP_KERNEL);
+	conf = kzalloc(sizeof(struct r5conf), GFP_KERNEL);
 	if (conf == NULL)
 	if (conf == NULL)
 		goto abort;
 		goto abort;
 	spin_lock_init(&conf->device_lock);
 	spin_lock_init(&conf->device_lock);
@@ -4598,6 +4591,7 @@ static raid5_conf_t *setup_conf(mddev_t *mddev)
 	atomic_set(&conf->preread_active_stripes, 0);
 	atomic_set(&conf->preread_active_stripes, 0);
 	atomic_set(&conf->active_aligned_reads, 0);
 	atomic_set(&conf->active_aligned_reads, 0);
 	conf->bypass_threshold = BYPASS_THRESHOLD;
 	conf->bypass_threshold = BYPASS_THRESHOLD;
+	conf->recovery_disabled = mddev->recovery_disabled - 1;
 
 
 	conf->raid_disks = mddev->raid_disks;
 	conf->raid_disks = mddev->raid_disks;
 	if (mddev->reshape_position == MaxSector)
 	if (mddev->reshape_position == MaxSector)
@@ -4712,12 +4706,12 @@ static int only_parity(int raid_disk, int algo, int raid_disks, int max_degraded
 	return 0;
 	return 0;
 }
 }
 
 
-static int run(mddev_t *mddev)
+static int run(struct mddev *mddev)
 {
 {
-	raid5_conf_t *conf;
+	struct r5conf *conf;
 	int working_disks = 0;
 	int working_disks = 0;
 	int dirty_parity_disks = 0;
 	int dirty_parity_disks = 0;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	sector_t reshape_offset = 0;
 	sector_t reshape_offset = 0;
 
 
 	if (mddev->recovery_cp != MaxSector)
 	if (mddev->recovery_cp != MaxSector)
@@ -4942,18 +4936,16 @@ static int run(mddev_t *mddev)
 	return 0;
 	return 0;
 abort:
 abort:
 	md_unregister_thread(&mddev->thread);
 	md_unregister_thread(&mddev->thread);
-	if (conf) {
-		print_raid5_conf(conf);
-		free_conf(conf);
-	}
+	print_raid5_conf(conf);
+	free_conf(conf);
 	mddev->private = NULL;
 	mddev->private = NULL;
 	printk(KERN_ALERT "md/raid:%s: failed to run raid set.\n", mdname(mddev));
 	printk(KERN_ALERT "md/raid:%s: failed to run raid set.\n", mdname(mddev));
 	return -EIO;
 	return -EIO;
 }
 }
 
 
-static int stop(mddev_t *mddev)
+static int stop(struct mddev *mddev)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 
 
 	md_unregister_thread(&mddev->thread);
 	md_unregister_thread(&mddev->thread);
 	if (mddev->queue)
 	if (mddev->queue)
@@ -4964,44 +4956,9 @@ static int stop(mddev_t *mddev)
 	return 0;
 	return 0;
 }
 }
 
 
-#ifdef DEBUG
-static void print_sh(struct seq_file *seq, struct stripe_head *sh)
-{
-	int i;
-
-	seq_printf(seq, "sh %llu, pd_idx %d, state %ld.\n",
-		   (unsigned long long)sh->sector, sh->pd_idx, sh->state);
-	seq_printf(seq, "sh %llu,  count %d.\n",
-		   (unsigned long long)sh->sector, atomic_read(&sh->count));
-	seq_printf(seq, "sh %llu, ", (unsigned long long)sh->sector);
-	for (i = 0; i < sh->disks; i++) {
-		seq_printf(seq, "(cache%d: %p %ld) ",
-			   i, sh->dev[i].page, sh->dev[i].flags);
-	}
-	seq_printf(seq, "\n");
-}
-
-static void printall(struct seq_file *seq, raid5_conf_t *conf)
+static void status(struct seq_file *seq, struct mddev *mddev)
 {
 {
-	struct stripe_head *sh;
-	struct hlist_node *hn;
-	int i;
-
-	spin_lock_irq(&conf->device_lock);
-	for (i = 0; i < NR_HASH; i++) {
-		hlist_for_each_entry(sh, hn, &conf->stripe_hashtbl[i], hash) {
-			if (sh->raid_conf != conf)
-				continue;
-			print_sh(seq, sh);
-		}
-	}
-	spin_unlock_irq(&conf->device_lock);
-}
-#endif
-
-static void status(struct seq_file *seq, mddev_t *mddev)
-{
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	int i;
 	int i;
 
 
 	seq_printf(seq, " level %d, %dk chunk, algorithm %d", mddev->level,
 	seq_printf(seq, " level %d, %dk chunk, algorithm %d", mddev->level,
@@ -5012,13 +4969,9 @@ static void status(struct seq_file *seq, mddev_t *mddev)
 			       conf->disks[i].rdev &&
 			       conf->disks[i].rdev &&
 			       test_bit(In_sync, &conf->disks[i].rdev->flags) ? "U" : "_");
 			       test_bit(In_sync, &conf->disks[i].rdev->flags) ? "U" : "_");
 	seq_printf (seq, "]");
 	seq_printf (seq, "]");
-#ifdef DEBUG
-	seq_printf (seq, "\n");
-	printall(seq, conf);
-#endif
 }
 }
 
 
-static void print_raid5_conf (raid5_conf_t *conf)
+static void print_raid5_conf (struct r5conf *conf)
 {
 {
 	int i;
 	int i;
 	struct disk_info *tmp;
 	struct disk_info *tmp;
@@ -5042,10 +4995,10 @@ static void print_raid5_conf (raid5_conf_t *conf)
 	}
 	}
 }
 }
 
 
-static int raid5_spare_active(mddev_t *mddev)
+static int raid5_spare_active(struct mddev *mddev)
 {
 {
 	int i;
 	int i;
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	struct disk_info *tmp;
 	struct disk_info *tmp;
 	int count = 0;
 	int count = 0;
 	unsigned long flags;
 	unsigned long flags;
@@ -5067,11 +5020,11 @@ static int raid5_spare_active(mddev_t *mddev)
 	return count;
 	return count;
 }
 }
 
 
-static int raid5_remove_disk(mddev_t *mddev, int number)
+static int raid5_remove_disk(struct mddev *mddev, int number)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	int err = 0;
 	int err = 0;
-	mdk_rdev_t *rdev;
+	struct md_rdev *rdev;
 	struct disk_info *p = conf->disks + number;
 	struct disk_info *p = conf->disks + number;
 
 
 	print_raid5_conf(conf);
 	print_raid5_conf(conf);
@@ -5110,9 +5063,9 @@ abort:
 	return err;
 	return err;
 }
 }
 
 
-static int raid5_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
+static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	int err = -EEXIST;
 	int err = -EEXIST;
 	int disk;
 	int disk;
 	struct disk_info *p;
 	struct disk_info *p;
@@ -5153,7 +5106,7 @@ static int raid5_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 	return err;
 	return err;
 }
 }
 
 
-static int raid5_resize(mddev_t *mddev, sector_t sectors)
+static int raid5_resize(struct mddev *mddev, sector_t sectors)
 {
 {
 	/* no resync is happening, and there is enough space
 	/* no resync is happening, and there is enough space
 	 * on all devices, so we can resize.
 	 * on all devices, so we can resize.
@@ -5180,7 +5133,7 @@ static int raid5_resize(mddev_t *mddev, sector_t sectors)
 	return 0;
 	return 0;
 }
 }
 
 
-static int check_stripe_cache(mddev_t *mddev)
+static int check_stripe_cache(struct mddev *mddev)
 {
 {
 	/* Can only proceed if there are plenty of stripe_heads.
 	/* Can only proceed if there are plenty of stripe_heads.
 	 * We need a minimum of one full stripe,, and for sensible progress
 	 * We need a minimum of one full stripe,, and for sensible progress
@@ -5190,7 +5143,7 @@ static int check_stripe_cache(mddev_t *mddev)
 	 * If the chunk size is greater, user-space should request more
 	 * If the chunk size is greater, user-space should request more
 	 * stripe_heads first.
 	 * stripe_heads first.
 	 */
 	 */
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	if (((mddev->chunk_sectors << 9) / STRIPE_SIZE) * 4
 	if (((mddev->chunk_sectors << 9) / STRIPE_SIZE) * 4
 	    > conf->max_nr_stripes ||
 	    > conf->max_nr_stripes ||
 	    ((mddev->new_chunk_sectors << 9) / STRIPE_SIZE) * 4
 	    ((mddev->new_chunk_sectors << 9) / STRIPE_SIZE) * 4
@@ -5204,9 +5157,9 @@ static int check_stripe_cache(mddev_t *mddev)
 	return 1;
 	return 1;
 }
 }
 
 
-static int check_reshape(mddev_t *mddev)
+static int check_reshape(struct mddev *mddev)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 
 
 	if (mddev->delta_disks == 0 &&
 	if (mddev->delta_disks == 0 &&
 	    mddev->new_layout == mddev->layout &&
 	    mddev->new_layout == mddev->layout &&
@@ -5236,10 +5189,10 @@ static int check_reshape(mddev_t *mddev)
 	return resize_stripes(conf, conf->raid_disks + mddev->delta_disks);
 	return resize_stripes(conf, conf->raid_disks + mddev->delta_disks);
 }
 }
 
 
-static int raid5_start_reshape(mddev_t *mddev)
+static int raid5_start_reshape(struct mddev *mddev)
 {
 {
-	raid5_conf_t *conf = mddev->private;
-	mdk_rdev_t *rdev;
+	struct r5conf *conf = mddev->private;
+	struct md_rdev *rdev;
 	int spares = 0;
 	int spares = 0;
 	unsigned long flags;
 	unsigned long flags;
 
 
@@ -5353,7 +5306,7 @@ static int raid5_start_reshape(mddev_t *mddev)
 /* This is called from the reshape thread and should make any
 /* This is called from the reshape thread and should make any
  * changes needed in 'conf'
  * changes needed in 'conf'
  */
  */
-static void end_reshape(raid5_conf_t *conf)
+static void end_reshape(struct r5conf *conf)
 {
 {
 
 
 	if (!test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) {
 	if (!test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) {
@@ -5380,9 +5333,9 @@ static void end_reshape(raid5_conf_t *conf)
 /* This is called from the raid5d thread with mddev_lock held.
 /* This is called from the raid5d thread with mddev_lock held.
  * It makes config changes to the device.
  * It makes config changes to the device.
  */
  */
-static void raid5_finish_reshape(mddev_t *mddev)
+static void raid5_finish_reshape(struct mddev *mddev)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 
 
 	if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
 	if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
 
 
@@ -5401,7 +5354,7 @@ static void raid5_finish_reshape(mddev_t *mddev)
 			for (d = conf->raid_disks ;
 			for (d = conf->raid_disks ;
 			     d < conf->raid_disks - mddev->delta_disks;
 			     d < conf->raid_disks - mddev->delta_disks;
 			     d++) {
 			     d++) {
-				mdk_rdev_t *rdev = conf->disks[d].rdev;
+				struct md_rdev *rdev = conf->disks[d].rdev;
 				if (rdev && raid5_remove_disk(mddev, d) == 0) {
 				if (rdev && raid5_remove_disk(mddev, d) == 0) {
 					sysfs_unlink_rdev(mddev, rdev);
 					sysfs_unlink_rdev(mddev, rdev);
 					rdev->raid_disk = -1;
 					rdev->raid_disk = -1;
@@ -5415,9 +5368,9 @@ static void raid5_finish_reshape(mddev_t *mddev)
 	}
 	}
 }
 }
 
 
-static void raid5_quiesce(mddev_t *mddev, int state)
+static void raid5_quiesce(struct mddev *mddev, int state)
 {
 {
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 
 
 	switch(state) {
 	switch(state) {
 	case 2: /* resume for a suspend */
 	case 2: /* resume for a suspend */
@@ -5451,20 +5404,20 @@ static void raid5_quiesce(mddev_t *mddev, int state)
 }
 }
 
 
 
 
-static void *raid45_takeover_raid0(mddev_t *mddev, int level)
+static void *raid45_takeover_raid0(struct mddev *mddev, int level)
 {
 {
-	struct raid0_private_data *raid0_priv = mddev->private;
+	struct r0conf *raid0_conf = mddev->private;
 	sector_t sectors;
 	sector_t sectors;
 
 
 	/* for raid0 takeover only one zone is supported */
 	/* for raid0 takeover only one zone is supported */
-	if (raid0_priv->nr_strip_zones > 1) {
+	if (raid0_conf->nr_strip_zones > 1) {
 		printk(KERN_ERR "md/raid:%s: cannot takeover raid0 with more than one zone.\n",
 		printk(KERN_ERR "md/raid:%s: cannot takeover raid0 with more than one zone.\n",
 		       mdname(mddev));
 		       mdname(mddev));
 		return ERR_PTR(-EINVAL);
 		return ERR_PTR(-EINVAL);
 	}
 	}
 
 
-	sectors = raid0_priv->strip_zone[0].zone_end;
-	sector_div(sectors, raid0_priv->strip_zone[0].nb_dev);
+	sectors = raid0_conf->strip_zone[0].zone_end;
+	sector_div(sectors, raid0_conf->strip_zone[0].nb_dev);
 	mddev->dev_sectors = sectors;
 	mddev->dev_sectors = sectors;
 	mddev->new_level = level;
 	mddev->new_level = level;
 	mddev->new_layout = ALGORITHM_PARITY_N;
 	mddev->new_layout = ALGORITHM_PARITY_N;
@@ -5478,7 +5431,7 @@ static void *raid45_takeover_raid0(mddev_t *mddev, int level)
 }
 }
 
 
 
 
-static void *raid5_takeover_raid1(mddev_t *mddev)
+static void *raid5_takeover_raid1(struct mddev *mddev)
 {
 {
 	int chunksect;
 	int chunksect;
 
 
@@ -5505,7 +5458,7 @@ static void *raid5_takeover_raid1(mddev_t *mddev)
 	return setup_conf(mddev);
 	return setup_conf(mddev);
 }
 }
 
 
-static void *raid5_takeover_raid6(mddev_t *mddev)
+static void *raid5_takeover_raid6(struct mddev *mddev)
 {
 {
 	int new_layout;
 	int new_layout;
 
 
@@ -5539,14 +5492,14 @@ static void *raid5_takeover_raid6(mddev_t *mddev)
 }
 }
 
 
 
 
-static int raid5_check_reshape(mddev_t *mddev)
+static int raid5_check_reshape(struct mddev *mddev)
 {
 {
 	/* For a 2-drive array, the layout and chunk size can be changed
 	/* For a 2-drive array, the layout and chunk size can be changed
 	 * immediately as not restriping is needed.
 	 * immediately as not restriping is needed.
 	 * For larger arrays we record the new value - after validation
 	 * For larger arrays we record the new value - after validation
 	 * to be used by a reshape pass.
 	 * to be used by a reshape pass.
 	 */
 	 */
-	raid5_conf_t *conf = mddev->private;
+	struct r5conf *conf = mddev->private;
 	int new_chunk = mddev->new_chunk_sectors;
 	int new_chunk = mddev->new_chunk_sectors;
 
 
 	if (mddev->new_layout >= 0 && !algorithm_valid_raid5(mddev->new_layout))
 	if (mddev->new_layout >= 0 && !algorithm_valid_raid5(mddev->new_layout))
@@ -5579,7 +5532,7 @@ static int raid5_check_reshape(mddev_t *mddev)
 	return check_reshape(mddev);
 	return check_reshape(mddev);
 }
 }
 
 
-static int raid6_check_reshape(mddev_t *mddev)
+static int raid6_check_reshape(struct mddev *mddev)
 {
 {
 	int new_chunk = mddev->new_chunk_sectors;
 	int new_chunk = mddev->new_chunk_sectors;
 
 
@@ -5599,7 +5552,7 @@ static int raid6_check_reshape(mddev_t *mddev)
 	return check_reshape(mddev);
 	return check_reshape(mddev);
 }
 }
 
 
-static void *raid5_takeover(mddev_t *mddev)
+static void *raid5_takeover(struct mddev *mddev)
 {
 {
 	/* raid5 can take over:
 	/* raid5 can take over:
 	 *  raid0 - if there is only one strip zone - make it a raid4 layout
 	 *  raid0 - if there is only one strip zone - make it a raid4 layout
@@ -5622,7 +5575,7 @@ static void *raid5_takeover(mddev_t *mddev)
 	return ERR_PTR(-EINVAL);
 	return ERR_PTR(-EINVAL);
 }
 }
 
 
-static void *raid4_takeover(mddev_t *mddev)
+static void *raid4_takeover(struct mddev *mddev)
 {
 {
 	/* raid4 can take over:
 	/* raid4 can take over:
 	 *  raid0 - if there is only one strip zone
 	 *  raid0 - if there is only one strip zone
@@ -5639,9 +5592,9 @@ static void *raid4_takeover(mddev_t *mddev)
 	return ERR_PTR(-EINVAL);
 	return ERR_PTR(-EINVAL);
 }
 }
 
 
-static struct mdk_personality raid5_personality;
+static struct md_personality raid5_personality;
 
 
-static void *raid6_takeover(mddev_t *mddev)
+static void *raid6_takeover(struct mddev *mddev)
 {
 {
 	/* Currently can only take over a raid5.  We map the
 	/* Currently can only take over a raid5.  We map the
 	 * personality to an equivalent raid6 personality
 	 * personality to an equivalent raid6 personality
@@ -5688,7 +5641,7 @@ static void *raid6_takeover(mddev_t *mddev)
 }
 }
 
 
 
 
-static struct mdk_personality raid6_personality =
+static struct md_personality raid6_personality =
 {
 {
 	.name		= "raid6",
 	.name		= "raid6",
 	.level		= 6,
 	.level		= 6,
@@ -5710,7 +5663,7 @@ static struct mdk_personality raid6_personality =
 	.quiesce	= raid5_quiesce,
 	.quiesce	= raid5_quiesce,
 	.takeover	= raid6_takeover,
 	.takeover	= raid6_takeover,
 };
 };
-static struct mdk_personality raid5_personality =
+static struct md_personality raid5_personality =
 {
 {
 	.name		= "raid5",
 	.name		= "raid5",
 	.level		= 5,
 	.level		= 5,
@@ -5733,7 +5686,7 @@ static struct mdk_personality raid5_personality =
 	.takeover	= raid5_takeover,
 	.takeover	= raid5_takeover,
 };
 };
 
 
-static struct mdk_personality raid4_personality =
+static struct md_personality raid4_personality =
 {
 {
 	.name		= "raid4",
 	.name		= "raid4",
 	.level		= 4,
 	.level		= 4,

+ 9 - 11
drivers/md/raid5.h

@@ -197,7 +197,7 @@ enum reconstruct_states {
 struct stripe_head {
 struct stripe_head {
 	struct hlist_node	hash;
 	struct hlist_node	hash;
 	struct list_head	lru;	      /* inactive_list or handle_list */
 	struct list_head	lru;	      /* inactive_list or handle_list */
-	struct raid5_private_data *raid_conf;
+	struct r5conf		*raid_conf;
 	short			generation;	/* increments with every
 	short			generation;	/* increments with every
 						 * reshape */
 						 * reshape */
 	sector_t		sector;		/* sector of this row */
 	sector_t		sector;		/* sector of this row */
@@ -248,7 +248,7 @@ struct stripe_head_state {
 	unsigned long ops_request;
 	unsigned long ops_request;
 
 
 	struct bio *return_bi;
 	struct bio *return_bi;
-	mdk_rdev_t *blocked_rdev;
+	struct md_rdev *blocked_rdev;
 	int handle_bad_blocks;
 	int handle_bad_blocks;
 };
 };
 
 
@@ -344,12 +344,12 @@ enum {
 
 
 
 
 struct disk_info {
 struct disk_info {
-	mdk_rdev_t	*rdev;
+	struct md_rdev	*rdev;
 };
 };
 
 
-struct raid5_private_data {
+struct r5conf {
 	struct hlist_head	*stripe_hashtbl;
 	struct hlist_head	*stripe_hashtbl;
-	mddev_t			*mddev;
+	struct mddev		*mddev;
 	struct disk_info	*spare;
 	struct disk_info	*spare;
 	int			chunk_sectors;
 	int			chunk_sectors;
 	int			level, algorithm;
 	int			level, algorithm;
@@ -436,11 +436,9 @@ struct raid5_private_data {
 	/* When taking over an array from a different personality, we store
 	/* When taking over an array from a different personality, we store
 	 * the new thread here until we fully activate the array.
 	 * the new thread here until we fully activate the array.
 	 */
 	 */
-	struct mdk_thread_s	*thread;
+	struct md_thread	*thread;
 };
 };
 
 
-typedef struct raid5_private_data raid5_conf_t;
-
 /*
 /*
  * Our supported algorithms
  * Our supported algorithms
  */
  */
@@ -503,7 +501,7 @@ static inline int algorithm_is_DDF(int layout)
 	return layout >= 8 && layout <= 10;
 	return layout >= 8 && layout <= 10;
 }
 }
 
 
-extern int md_raid5_congested(mddev_t *mddev, int bits);
-extern void md_raid5_kick_device(raid5_conf_t *conf);
-extern int raid5_set_cache_size(mddev_t *mddev, int size);
+extern int md_raid5_congested(struct mddev *mddev, int bits);
+extern void md_raid5_kick_device(struct r5conf *conf);
+extern int raid5_set_cache_size(struct mddev *mddev, int size);
 #endif
 #endif

+ 1 - 1
lib/raid6/int.uc

@@ -11,7 +11,7 @@
  * ----------------------------------------------------------------------- */
  * ----------------------------------------------------------------------- */
 
 
 /*
 /*
- * raid6int$#.c
+ * int$#.c
  *
  *
  * $#-way unrolled portable integer math RAID-6 instruction set
  * $#-way unrolled portable integer math RAID-6 instruction set
  *
  *