提交 c3ae1f33 编写于 作者: L Linus Torvalds

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
  ...
...@@ -29,35 +29,6 @@ ...@@ -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) ...@@ -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", pr_debug("%s: bitmap_alloc_page: allocated page at %p\n",
bmname(bitmap), page); bmname(bitmap), page);
return page; return page;
} }
...@@ -88,7 +55,7 @@ static unsigned char *bitmap_alloc_page(struct bitmap *bitmap) ...@@ -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) ...@@ -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", pr_debug("%s: bitmap map page allocation failed, hijacking\n",
bmname(bitmap)); 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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, pr_debug("read bitmap file (%dB @ %llu)\n", (int)PAGE_SIZE,
(unsigned long long)index << PAGE_SHIFT); (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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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)) { if (test_page_attr(bitmap, lastpage,
clear_page_attr(bitmap, lastpage, BITMAP_PAGE_NEEDWRITE); 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) ...@@ -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)
if (*bmc) j |= PAGE_COUNTER_MASK;
bitmap->allclean = 0; else if (*bmc) {
if (*bmc == 1 && !bitmap->need_sync) {
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) {
/* 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) ...@@ -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, file_page_offset(bitmap,
j), j),
paddr); 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) ...@@ -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 ...@@ -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", pr_debug("inc write-behind count %d/%lu\n",
bw, bitmap->max_write_behind); 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 ...@@ -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 ...@@ -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", pr_debug("dec write-behind count %d/%lu\n",
atomic_read(&bitmap->behind_writes), bitmap->max_write_behind); 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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ int bitmap_load(mddev_t *mddev) ...@@ -1870,7 +1836,7 @@ int bitmap_load(mddev_t *mddev)
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) ...@@ -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 = ...@@ -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) ...@@ -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 = ...@@ -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 = ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 = ...@@ -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) ...@@ -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;
......
...@@ -193,7 +193,7 @@ struct bitmap { ...@@ -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 { ...@@ -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_create(struct mddev *mddev);
int bitmap_load(mddev_t *mddev); int bitmap_load(struct mddev *mddev);
void bitmap_flush(mddev_t *mddev); void bitmap_flush(struct mddev *mddev);
void bitmap_destroy(mddev_t *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); ...@@ -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
...@@ -37,7 +37,7 @@ struct raid_dev { ...@@ -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 { ...@@ -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 { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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; struct md_rdev *rdev, *freshest, *tmp;
mddev_t *mddev = &rs->md; 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) ...@@ -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, ...@@ -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) ...@@ -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));
......
...@@ -81,16 +81,16 @@ static void faulty_fail(struct bio *bio, int error) ...@@ -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; struct md_rdev *rdev;
} conf_t; };
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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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,
......
...@@ -26,10 +26,10 @@ ...@@ -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, ...@@ -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; struct mddev *mddev = q->queuedata;
dev_info_t *dev0; 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, ...@@ -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; struct mddev *mddev = data;
linear_conf_t *conf; 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) ...@@ -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) ...@@ -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; struct linear_conf *conf;
mdk_rdev_t *rdev; 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) ...@@ -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 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) ...@@ -194,9 +194,9 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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,
......
...@@ -2,20 +2,14 @@ ...@@ -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_conf
struct linear_private_data
{ {
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
此差异已折叠。
/* /*
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 @@ ...@@ -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; ...@@ -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 ...@@ -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, ...@@ -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 ...@@ -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 md_thread *thread; /* management thread */
struct mdk_thread_s *sync_thread; /* doing resync or reconstruct */ 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 ...@@ -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 ...@@ -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 (*make_request)(struct mddev *mddev, struct bio *bio);
int (*run)(mddev_t *mddev); int (*run)(struct mddev *mddev);
int (*stop)(mddev_t *mddev); int (*stop)(struct mddev *mddev);
void (*status)(struct seq_file *seq, mddev_t *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); void (*error_handler)(struct mddev *mddev, struct md_rdev *rdev);
int (*hot_add_disk) (mddev_t *mddev, mdk_rdev_t *rdev); int (*hot_add_disk) (struct mddev *mddev, struct md_rdev *rdev);
int (*hot_remove_disk) (mddev_t *mddev, int number); int (*hot_remove_disk) (struct mddev *mddev, int number);
int (*spare_active) (mddev_t *mddev); int (*spare_active) (struct mddev *mddev);
sector_t (*sync_request)(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster); sector_t (*sync_request)(struct mddev *mddev, sector_t sector_nr, int *skipped, int go_faster);
int (*resize) (mddev_t *mddev, sector_t sectors); int (*resize) (struct mddev *mddev, sector_t sectors);
sector_t (*size) (mddev_t *mddev, sector_t sectors, int raid_disks); sector_t (*size) (struct mddev *mddev, sector_t sectors, int raid_disks);
int (*check_reshape) (mddev_t *mddev); int (*check_reshape) (struct mddev *mddev);
int (*start_reshape) (mddev_t *mddev); int (*start_reshape) (struct mddev *mddev);
void (*finish_reshape) (mddev_t *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 ...@@ -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 (*show)(struct mddev *, char *);
ssize_t (*store)(mddev_t *, const char *, size_t); 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) ...@@ -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) ...@@ -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 { struct md_thread {
void (*run) (mddev_t *mddev); void (*run) (struct mddev *mddev);
mddev_t *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) ...@@ -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 register_md_personality(struct md_personality *p);
extern int unregister_md_personality(struct mdk_personality *p); extern int unregister_md_personality(struct md_personality *p);
extern mdk_thread_t * md_register_thread(void (*run) (mddev_t *mddev), extern struct md_thread *md_register_thread(
mddev_t *mddev, const char *name); void (*run)(struct mddev *mddev),
extern void md_unregister_thread(mdk_thread_t **threadp); struct mddev *mddev,
extern void md_wakeup_thread(mdk_thread_t *thread); const char *name);
extern void md_check_recovery(mddev_t *mddev); extern void md_unregister_thread(struct md_thread **threadp);
extern void md_write_start(mddev_t *mddev, struct bio *bi); extern void md_wakeup_thread(struct md_thread *thread);
extern void md_write_end(mddev_t *mddev); extern void md_check_recovery(struct mddev *mddev);
extern void md_done_sync(mddev_t *mddev, int blocks, int ok); extern void md_write_start(struct mddev *mddev, struct bio *bi);
extern void md_error(mddev_t *mddev, mdk_rdev_t *rdev); extern void md_write_end(struct mddev *mddev);
extern void md_done_sync(struct mddev *mddev, int blocks, int ok);
extern int mddev_congested(mddev_t *mddev, int bits); extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
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 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 void md_super_wait(struct mddev *mddev);
extern int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size, 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_do_sync(struct mddev *mddev);
extern void md_new_event(mddev_t *mddev); extern void md_new_event(struct mddev *mddev);
extern int md_allow_write(mddev_t *mddev); extern int md_allow_write(struct mddev *mddev);
extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev); extern void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev);
extern void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors); extern void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors);
extern int md_check_no_bitmap(mddev_t *mddev); extern int md_check_no_bitmap(struct mddev *mddev);
extern int md_integrity_register(mddev_t *mddev); extern int md_integrity_register(struct mddev *mddev);
extern void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *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 void mddev_init(struct mddev *mddev);
extern int md_run(mddev_t *mddev); extern int md_run(struct mddev *mddev);
extern void md_stop(mddev_t *mddev); extern void md_stop(struct mddev *mddev);
extern void md_stop_writes(mddev_t *mddev); extern void md_stop_writes(struct mddev *mddev);
extern int md_rdev_init(mdk_rdev_t *rdev); extern int md_rdev_init(struct md_rdev *rdev);
extern void mddev_suspend(mddev_t *mddev); extern void mddev_suspend(struct mddev *mddev);
extern void mddev_resume(mddev_t *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); struct mddev *mddev);
extern int mddev_check_plugged(mddev_t *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 */
...@@ -31,7 +31,7 @@ ...@@ -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) ...@@ -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) ...@@ -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; struct mddev *mddev = mp_bh->mddev;
multipath_conf_t *conf = mddev->private; 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) ...@@ -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) ...@@ -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; struct mpconf *conf = mp_bh->mddev->private;
mdk_rdev_t *rdev = conf->multipaths[mp_bh->path].rdev; 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) ...@@ -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) ...@@ -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) ...@@ -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; struct mddev *mddev = data;
multipath_conf_t *conf = mddev->private; 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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ static int multipath_remove_disk(mddev_t *mddev, int number) ...@@ -335,12 +335,12 @@ static int multipath_remove_disk(mddev_t *mddev, int number)
* 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) ...@@ -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) ...@@ -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) ...@@ -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 @@ static int multipath_run (mddev_t *mddev) ...@@ -510,9 +510,9 @@ static int multipath_run (mddev_t *mddev)
} }
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) ...@@ -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,
......
...@@ -2,11 +2,11 @@ ...@@ -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 { struct mpconf {
mddev_t *mddev; 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 { ...@@ -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; ...@@ -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;
......
...@@ -27,9 +27,9 @@ ...@@ -27,9 +27,9 @@
static int raid0_congested(void *data, int bits) static int raid0_congested(void *data, int bits)
{ {
mddev_t *mddev = data; struct mddev *mddev = data;
raid0_conf_t *conf = mddev->private; struct r0conf *conf = mddev->private;
mdk_rdev_t **devlist = conf->devlist; 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) ...@@ -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", printk(KERN_INFO "md: RAID0 configuration for %s - %d zone%s\n",
mdname(mddev)); mdname(mddev),
h = 0; 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 " printk(KERN_INFO " zone-offset=%10lluKB, "
"device offset=%llukb size=%llukb\n", "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", pr_debug("md/raid0:%s: looking at %s\n",
mdname(mddev), mdname(mddev),
bdevname(rdev1->bdev, b)); 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) ...@@ -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)", pr_debug("md/raid0:%s: comparing %s(%llu)"
mdname(mddev), " with %s(%llu)\n",
bdevname(rdev1->bdev,b), mdname(mddev),
(unsigned long long)rdev1->sectors); bdevname(rdev1->bdev,b),
printk(KERN_CONT " with %s(%llu)\n", (unsigned long long)rdev1->sectors,
bdevname(rdev2->bdev,b), bdevname(rdev2->bdev,b2),
(unsigned long long)rdev2->sectors); (unsigned long long)rdev2->sectors);
if (rdev2 == rdev1) { if (rdev2 == rdev1) {
printk(KERN_INFO "md/raid0:%s: END\n", pr_debug("md/raid0:%s: END\n",
mdname(mddev)); 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) ...@@ -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", pr_debug("md/raid0:%s: EQUAL\n",
mdname(mddev)); mdname(mddev));
c = 1; c = 1;
break; break;
} }
printk(KERN_INFO "md/raid0:%s: NOT EQUAL\n", pr_debug("md/raid0:%s: NOT EQUAL\n",
mdname(mddev)); mdname(mddev));
} }
if (!c) { if (!c) {
printk(KERN_INFO "md/raid0:%s: ==> UNIQUE\n", pr_debug("md/raid0:%s: ==> UNIQUE\n",
mdname(mddev)); mdname(mddev));
conf->nr_strip_zones++; conf->nr_strip_zones++;
printk(KERN_INFO "md/raid0:%s: %d zones\n", pr_debug("md/raid0:%s: %d zones\n",
mdname(mddev), conf->nr_strip_zones); mdname(mddev), conf->nr_strip_zones);
} }
} }
printk(KERN_INFO "md/raid0:%s: FINAL %d zones\n", pr_debug("md/raid0:%s: FINAL %d zones\n",
mdname(mddev), conf->nr_strip_zones); 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) ...@@ -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", pr_debug("md/raid0:%s: zone %d\n", mdname(mddev), i);
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", pr_debug("md/raid0:%s: (%llu) is smallest!.\n",
mdname(mddev), mdname(mddev),
(unsigned long long)rdev->sectors); (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", pr_debug("md/raid0:%s: zone->nb_dev: %d, sectors: %llu\n",
mdname(mddev), mdname(mddev),
zone->nb_dev, (unsigned long long)sectors); 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", pr_debug("md/raid0:%s: current zone start: %llu\n",
mdname(mddev), mdname(mddev),
(unsigned long long)smallest->sectors); (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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 @@ static int raid0_make_request(mddev_t *mddev, struct bio *bio) ...@@ -526,43 +528,16 @@ static int raid0_make_request(mddev_t *mddev, struct bio *bio)
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; struct md_rdev *rdev;
raid0_conf_t *priv_conf; 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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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,
......
#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
此差异已折叠。
#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 { ...@@ -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;
}; };
struct r1conf {
typedef struct r1bio_s r1bio_t; struct mddev *mddev;
struct mirror_info *mirrors;
struct r1_private_data_s {
mddev_t *mddev;
mirror_info_t *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; ...@@ -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 { ...@@ -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 { ...@@ -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
此差异已折叠。
#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 { ...@@ -13,11 +11,9 @@ struct mirror_info {
*/ */
}; };
typedef struct r10bio_s r10bio_t; struct r10conf {
struct mddev *mddev;
struct r10_private_data_s { struct mirror_info *mirrors;
mddev_t *mddev;
mirror_info_t *mirrors;
int raid_disks; int raid_disks;
spinlock_t device_lock; spinlock_t device_lock;
...@@ -46,7 +42,7 @@ struct r10_private_data_s { ...@@ -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 { ...@@ -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; ...@@ -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
*/ */
......
此差异已折叠。
此差异已折叠。
...@@ -11,7 +11,7 @@ ...@@ -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
* *
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册