Commit 88ed806a authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'md/3.18' of git://neil.brown.name/md

Pull md updates from Neil Brown:
 - a few minor bug fixes
 - quite a lot of code tidy-up and simplification
 - remove PRINT_RAID_DEBUG ioctl.  I'm fairly sure it is unused, and it
   isn't particularly useful.

* tag 'md/3.18' of git://neil.brown.name/md: (21 commits)
  lib/raid6: Add log level to printks
  md: move EXPORT_SYMBOL to after function in md.c
  md: discard PRINT_RAID_DEBUG ioctl
  md: remove MD_BUG()
  md: clean up 'exit' labels in md_ioctl().
  md: remove unnecessary test for MD_MAJOR in md_ioctl()
  md: don't allow "-sync" to be set for device in an active array.
  md: remove unwanted white space from md.c
  md: don't start resync thread directly from md thread.
  md: Just use RCU when checking for overlap between arrays.
  md: avoid potential long delay under pers_lock
  md: simplify export_array()
  md: discard find_rdev_nr in favour of find_rdev_nr_rcu
  md: use wait_event() to simplify md_super_wait()
  md: be more relaxed about stopping an array which isn't started.
  md/raid1: process_checks doesn't use its return value.
  md/raid5: fix init_stripe() inconsistencies
  md/raid10: another memory leak due to reshape.
  md: use set_bit/clear_bit instead of shift/mask for bi_flags changes.
  md/raid1: minor typos and reformatting.
  ...
parents e56d9fcc b395f75e
...@@ -879,7 +879,6 @@ void bitmap_unplug(struct bitmap *bitmap) ...@@ -879,7 +879,6 @@ void bitmap_unplug(struct bitmap *bitmap)
{ {
unsigned long i; unsigned long i;
int dirty, need_write; int dirty, need_write;
int wait = 0;
if (!bitmap || !bitmap->storage.filemap || if (!bitmap || !bitmap->storage.filemap ||
test_bit(BITMAP_STALE, &bitmap->flags)) test_bit(BITMAP_STALE, &bitmap->flags))
...@@ -897,16 +896,13 @@ void bitmap_unplug(struct bitmap *bitmap) ...@@ -897,16 +896,13 @@ void bitmap_unplug(struct bitmap *bitmap)
clear_page_attr(bitmap, i, BITMAP_PAGE_PENDING); clear_page_attr(bitmap, i, BITMAP_PAGE_PENDING);
write_page(bitmap, bitmap->storage.filemap[i], 0); write_page(bitmap, bitmap->storage.filemap[i], 0);
} }
if (dirty)
wait = 1;
} }
if (wait) { /* if any writes were performed, we need to wait on them */
if (bitmap->storage.file) if (bitmap->storage.file)
wait_event(bitmap->write_wait, wait_event(bitmap->write_wait,
atomic_read(&bitmap->pending_writes)==0); atomic_read(&bitmap->pending_writes)==0);
else else
md_super_wait(bitmap->mddev); md_super_wait(bitmap->mddev);
}
if (test_bit(BITMAP_WRITE_ERROR, &bitmap->flags)) if (test_bit(BITMAP_WRITE_ERROR, &bitmap->flags))
bitmap_file_kick(bitmap); bitmap_file_kick(bitmap);
} }
......
...@@ -355,7 +355,6 @@ static void linear_status (struct seq_file *seq, struct mddev *mddev) ...@@ -355,7 +355,6 @@ 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 md_personality linear_personality = static struct md_personality linear_personality =
{ {
.name = "linear", .name = "linear",
...@@ -379,7 +378,6 @@ static void linear_exit (void) ...@@ -379,7 +378,6 @@ static void linear_exit (void)
unregister_md_personality (&linear_personality); unregister_md_personality (&linear_personality);
} }
module_init(linear_init); module_init(linear_init);
module_exit(linear_exit); module_exit(linear_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
......
...@@ -66,8 +66,6 @@ static void autostart_arrays(int part); ...@@ -66,8 +66,6 @@ static void autostart_arrays(int part);
static LIST_HEAD(pers_list); static LIST_HEAD(pers_list);
static DEFINE_SPINLOCK(pers_lock); static DEFINE_SPINLOCK(pers_lock);
static void md_print_devices(void);
static DECLARE_WAIT_QUEUE_HEAD(resync_wait); static DECLARE_WAIT_QUEUE_HEAD(resync_wait);
static struct workqueue_struct *md_wq; static struct workqueue_struct *md_wq;
static struct workqueue_struct *md_misc_wq; static struct workqueue_struct *md_misc_wq;
...@@ -75,8 +73,6 @@ static struct workqueue_struct *md_misc_wq; ...@@ -75,8 +73,6 @@ static struct workqueue_struct *md_misc_wq;
static int remove_and_add_spares(struct mddev *mddev, static int remove_and_add_spares(struct mddev *mddev,
struct md_rdev *this); struct md_rdev *this);
#define MD_BUG(x...) { printk("md: bug in file %s, line %d\n", __FILE__, __LINE__); md_print_devices(); }
/* /*
* Default number of read corrections we'll attempt on an rdev * Default number of read corrections we'll attempt on an rdev
* before ejecting it from the array. We divide the read error * before ejecting it from the array. We divide the read error
...@@ -218,7 +214,6 @@ static void md_new_event_inintr(struct mddev *mddev) ...@@ -218,7 +214,6 @@ static void md_new_event_inintr(struct mddev *mddev)
static LIST_HEAD(all_mddevs); static LIST_HEAD(all_mddevs);
static DEFINE_SPINLOCK(all_mddevs_lock); static DEFINE_SPINLOCK(all_mddevs_lock);
/* /*
* iterates through all used mddevs in the system. * iterates through all used mddevs in the system.
* We take care to grab the all_mddevs_lock whenever navigating * We take care to grab the all_mddevs_lock whenever navigating
...@@ -241,7 +236,6 @@ static DEFINE_SPINLOCK(all_mddevs_lock); ...@@ -241,7 +236,6 @@ static DEFINE_SPINLOCK(all_mddevs_lock);
_tmp = _tmp->next;}) \ _tmp = _tmp->next;}) \
) )
/* Rather than calling directly into the personality make_request function, /* Rather than calling directly into the personality make_request function,
* IO requests come here first so that we can check if the device is * IO requests come here first so that we can check if the device is
* being suspended pending a reconfiguration. * being suspended pending a reconfiguration.
...@@ -488,7 +482,7 @@ void mddev_init(struct mddev *mddev) ...@@ -488,7 +482,7 @@ void mddev_init(struct mddev *mddev)
} }
EXPORT_SYMBOL_GPL(mddev_init); EXPORT_SYMBOL_GPL(mddev_init);
static struct mddev * mddev_find(dev_t unit) static struct mddev *mddev_find(dev_t unit)
{ {
struct mddev *mddev, *new = NULL; struct mddev *mddev, *new = NULL;
...@@ -562,7 +556,7 @@ static struct mddev * mddev_find(dev_t unit) ...@@ -562,7 +556,7 @@ static struct mddev * mddev_find(dev_t unit)
goto retry; goto retry;
} }
static inline int __must_check mddev_lock(struct mddev * mddev) static inline int __must_check mddev_lock(struct mddev *mddev)
{ {
return mutex_lock_interruptible(&mddev->reconfig_mutex); return mutex_lock_interruptible(&mddev->reconfig_mutex);
} }
...@@ -570,7 +564,7 @@ static inline int __must_check mddev_lock(struct mddev * mddev) ...@@ -570,7 +564,7 @@ static inline int __must_check mddev_lock(struct mddev * mddev)
/* Sometimes we need to take the lock in a situation where /* Sometimes we need to take the lock in a situation where
* failure due to interrupts is not acceptable. * failure due to interrupts is not acceptable.
*/ */
static inline void mddev_lock_nointr(struct mddev * mddev) static inline void mddev_lock_nointr(struct mddev *mddev)
{ {
mutex_lock(&mddev->reconfig_mutex); mutex_lock(&mddev->reconfig_mutex);
} }
...@@ -580,14 +574,14 @@ static inline int mddev_is_locked(struct mddev *mddev) ...@@ -580,14 +574,14 @@ static inline int mddev_is_locked(struct mddev *mddev)
return mutex_is_locked(&mddev->reconfig_mutex); return mutex_is_locked(&mddev->reconfig_mutex);
} }
static inline int mddev_trylock(struct mddev * mddev) static inline int mddev_trylock(struct mddev *mddev)
{ {
return mutex_trylock(&mddev->reconfig_mutex); return mutex_trylock(&mddev->reconfig_mutex);
} }
static struct attribute_group md_redundancy_group; static struct attribute_group md_redundancy_group;
static void mddev_unlock(struct mddev * mddev) static void mddev_unlock(struct mddev *mddev)
{ {
if (mddev->to_remove) { if (mddev->to_remove) {
/* These cannot be removed under reconfig_mutex as /* These cannot be removed under reconfig_mutex as
...@@ -630,17 +624,6 @@ static void mddev_unlock(struct mddev * mddev) ...@@ -630,17 +624,6 @@ static void mddev_unlock(struct mddev * mddev)
spin_unlock(&pers_lock); spin_unlock(&pers_lock);
} }
static struct md_rdev * find_rdev_nr(struct mddev *mddev, int nr)
{
struct md_rdev *rdev;
rdev_for_each(rdev, mddev)
if (rdev->desc_nr == nr)
return rdev;
return NULL;
}
static struct md_rdev *find_rdev_nr_rcu(struct mddev *mddev, int nr) static struct md_rdev *find_rdev_nr_rcu(struct mddev *mddev, int nr)
{ {
struct md_rdev *rdev; struct md_rdev *rdev;
...@@ -693,11 +676,8 @@ static inline sector_t calc_dev_sboffset(struct md_rdev *rdev) ...@@ -693,11 +676,8 @@ static inline sector_t calc_dev_sboffset(struct md_rdev *rdev)
return MD_NEW_SIZE_SECTORS(num_sectors); return MD_NEW_SIZE_SECTORS(num_sectors);
} }
static int alloc_disk_sb(struct md_rdev * rdev) static int alloc_disk_sb(struct md_rdev *rdev)
{ {
if (rdev->sb_page)
MD_BUG();
rdev->sb_page = alloc_page(GFP_KERNEL); rdev->sb_page = alloc_page(GFP_KERNEL);
if (!rdev->sb_page) { if (!rdev->sb_page) {
printk(KERN_ALERT "md: out of memory.\n"); printk(KERN_ALERT "md: out of memory.\n");
...@@ -766,14 +746,7 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev, ...@@ -766,14 +746,7 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
void md_super_wait(struct mddev *mddev) void md_super_wait(struct mddev *mddev)
{ {
/* wait for all superblock writes that were scheduled to complete */ /* wait for all superblock writes that were scheduled to complete */
DEFINE_WAIT(wq); wait_event(mddev->sb_wait, atomic_read(&mddev->pending_writes)==0);
for(;;) {
prepare_to_wait(&mddev->sb_wait, &wq, TASK_UNINTERRUPTIBLE);
if (atomic_read(&mddev->pending_writes)==0)
break;
schedule();
}
finish_wait(&mddev->sb_wait, &wq);
} }
int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,
...@@ -801,17 +774,13 @@ int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, ...@@ -801,17 +774,13 @@ int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,
} }
EXPORT_SYMBOL_GPL(sync_page_io); EXPORT_SYMBOL_GPL(sync_page_io);
static int read_disk_sb(struct md_rdev * rdev, int size) static int read_disk_sb(struct md_rdev *rdev, int size)
{ {
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
if (!rdev->sb_page) {
MD_BUG();
return -EINVAL;
}
if (rdev->sb_loaded) if (rdev->sb_loaded)
return 0; return 0;
if (!sync_page_io(rdev, 0, size, rdev->sb_page, READ, true)) if (!sync_page_io(rdev, 0, size, rdev->sb_page, READ, true))
goto fail; goto fail;
rdev->sb_loaded = 1; rdev->sb_loaded = 1;
...@@ -861,14 +830,13 @@ static int sb_equal(mdp_super_t *sb1, mdp_super_t *sb2) ...@@ -861,14 +830,13 @@ static int sb_equal(mdp_super_t *sb1, mdp_super_t *sb2)
return ret; return ret;
} }
static u32 md_csum_fold(u32 csum) static u32 md_csum_fold(u32 csum)
{ {
csum = (csum & 0xffff) + (csum >> 16); csum = (csum & 0xffff) + (csum >> 16);
return (csum & 0xffff) + (csum >> 16); return (csum & 0xffff) + (csum >> 16);
} }
static unsigned int calc_sb_csum(mdp_super_t * sb) static unsigned int calc_sb_csum(mdp_super_t *sb)
{ {
u64 newcsum = 0; u64 newcsum = 0;
u32 *sb32 = (u32*)sb; u32 *sb32 = (u32*)sb;
...@@ -882,7 +850,6 @@ static unsigned int calc_sb_csum(mdp_super_t * sb) ...@@ -882,7 +850,6 @@ static unsigned int calc_sb_csum(mdp_super_t * sb)
newcsum += sb32[i]; newcsum += sb32[i];
csum = (newcsum & 0xffffffff) + (newcsum>>32); csum = (newcsum & 0xffffffff) + (newcsum>>32);
#ifdef CONFIG_ALPHA #ifdef CONFIG_ALPHA
/* This used to use csum_partial, which was wrong for several /* This used to use csum_partial, which was wrong for several
* reasons including that different results are returned on * reasons including that different results are returned on
...@@ -899,7 +866,6 @@ static unsigned int calc_sb_csum(mdp_super_t * sb) ...@@ -899,7 +866,6 @@ static unsigned int calc_sb_csum(mdp_super_t * sb)
return csum; return csum;
} }
/* /*
* Handle superblock details. * Handle superblock details.
* We want to be able to handle multiple superblock formats * We want to be able to handle multiple superblock formats
...@@ -1197,7 +1163,6 @@ static void super_90_sync(struct mddev *mddev, struct md_rdev *rdev) ...@@ -1197,7 +1163,6 @@ static void super_90_sync(struct mddev *mddev, struct md_rdev *rdev)
struct md_rdev *rdev2; struct md_rdev *rdev2;
int next_spare = mddev->raid_disks; int next_spare = mddev->raid_disks;
/* make rdev->sb match mddev data.. /* make rdev->sb match mddev data..
* *
* 1/ zero out disks * 1/ zero out disks
...@@ -1366,7 +1331,7 @@ super_90_allow_new_offset(struct md_rdev *rdev, unsigned long long new_offset) ...@@ -1366,7 +1331,7 @@ super_90_allow_new_offset(struct md_rdev *rdev, unsigned long long new_offset)
* version 1 superblock * version 1 superblock
*/ */
static __le32 calc_sb_1_csum(struct mdp_superblock_1 * sb) static __le32 calc_sb_1_csum(struct mdp_superblock_1 *sb)
{ {
__le32 disk_csum; __le32 disk_csum;
u32 csum; u32 csum;
...@@ -1430,7 +1395,6 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ ...@@ -1430,7 +1395,6 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_
ret = read_disk_sb(rdev, 4096); ret = read_disk_sb(rdev, 4096);
if (ret) return ret; if (ret) return ret;
sb = page_address(rdev->sb_page); sb = page_address(rdev->sb_page);
if (sb->magic != cpu_to_le32(MD_SB_MAGIC) || if (sb->magic != cpu_to_le32(MD_SB_MAGIC) ||
...@@ -2033,18 +1997,13 @@ void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev) ...@@ -2033,18 +1997,13 @@ void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev)
} }
EXPORT_SYMBOL(md_integrity_add_rdev); EXPORT_SYMBOL(md_integrity_add_rdev);
static int bind_rdev_to_array(struct md_rdev * rdev, struct mddev * mddev) static int bind_rdev_to_array(struct md_rdev *rdev, struct mddev *mddev)
{ {
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
struct kobject *ko; struct kobject *ko;
char *s; char *s;
int err; int err;
if (rdev->mddev) {
MD_BUG();
return -EINVAL;
}
/* prevent duplicates */ /* prevent duplicates */
if (find_rdev(mddev, rdev->bdev->bd_dev)) if (find_rdev(mddev, rdev->bdev->bd_dev))
return -EEXIST; return -EEXIST;
...@@ -2067,16 +2026,21 @@ static int bind_rdev_to_array(struct md_rdev * rdev, struct mddev * mddev) ...@@ -2067,16 +2026,21 @@ static int bind_rdev_to_array(struct md_rdev * rdev, struct mddev * mddev)
* If it is -1, assign a free number, else * If it is -1, assign a free number, else
* check number is not in use * check number is not in use
*/ */
rcu_read_lock();
if (rdev->desc_nr < 0) { if (rdev->desc_nr < 0) {
int choice = 0; int choice = 0;
if (mddev->pers) choice = mddev->raid_disks; if (mddev->pers)
while (find_rdev_nr(mddev, choice)) choice = mddev->raid_disks;
while (find_rdev_nr_rcu(mddev, choice))
choice++; choice++;
rdev->desc_nr = choice; rdev->desc_nr = choice;
} else { } else {
if (find_rdev_nr(mddev, rdev->desc_nr)) if (find_rdev_nr_rcu(mddev, rdev->desc_nr)) {
rcu_read_unlock();
return -EBUSY; return -EBUSY;
} }
}
rcu_read_unlock();
if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) { if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) {
printk(KERN_WARNING "md: %s: array is limited to %d devices\n", printk(KERN_WARNING "md: %s: array is limited to %d devices\n",
mdname(mddev), mddev->max_disks); mdname(mddev), mddev->max_disks);
...@@ -2118,13 +2082,10 @@ static void md_delayed_delete(struct work_struct *ws) ...@@ -2118,13 +2082,10 @@ static void md_delayed_delete(struct work_struct *ws)
kobject_put(&rdev->kobj); kobject_put(&rdev->kobj);
} }
static void unbind_rdev_from_array(struct md_rdev * rdev) static void unbind_rdev_from_array(struct md_rdev *rdev)
{ {
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
if (!rdev->mddev) {
MD_BUG();
return;
}
bd_unlink_disk_holder(rdev->bdev, rdev->mddev->gendisk); bd_unlink_disk_holder(rdev->bdev, rdev->mddev->gendisk);
list_del_rcu(&rdev->same_set); list_del_rcu(&rdev->same_set);
printk(KERN_INFO "md: unbind<%s>\n", bdevname(rdev->bdev,b)); printk(KERN_INFO "md: unbind<%s>\n", bdevname(rdev->bdev,b));
...@@ -2169,20 +2130,17 @@ static void unlock_rdev(struct md_rdev *rdev) ...@@ -2169,20 +2130,17 @@ static void unlock_rdev(struct md_rdev *rdev)
{ {
struct block_device *bdev = rdev->bdev; struct block_device *bdev = rdev->bdev;
rdev->bdev = NULL; rdev->bdev = NULL;
if (!bdev)
MD_BUG();
blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
} }
void md_autodetect_dev(dev_t dev); void md_autodetect_dev(dev_t dev);
static void export_rdev(struct md_rdev * rdev) static void export_rdev(struct md_rdev *rdev)
{ {
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
printk(KERN_INFO "md: export_rdev(%s)\n", printk(KERN_INFO "md: export_rdev(%s)\n",
bdevname(rdev->bdev,b)); bdevname(rdev->bdev,b));
if (rdev->mddev)
MD_BUG();
md_rdev_clear(rdev); md_rdev_clear(rdev);
#ifndef MODULE #ifndef MODULE
if (test_bit(AutoDetected, &rdev->flags)) if (test_bit(AutoDetected, &rdev->flags))
...@@ -2192,7 +2150,7 @@ static void export_rdev(struct md_rdev * rdev) ...@@ -2192,7 +2150,7 @@ static void export_rdev(struct md_rdev * rdev)
kobject_put(&rdev->kobj); kobject_put(&rdev->kobj);
} }
static void kick_rdev_from_array(struct md_rdev * rdev) static void kick_rdev_from_array(struct md_rdev *rdev)
{ {
unbind_rdev_from_array(rdev); unbind_rdev_from_array(rdev);
export_rdev(rdev); export_rdev(rdev);
...@@ -2200,153 +2158,18 @@ static void kick_rdev_from_array(struct md_rdev * rdev) ...@@ -2200,153 +2158,18 @@ static void kick_rdev_from_array(struct md_rdev * rdev)
static void export_array(struct mddev *mddev) static void export_array(struct mddev *mddev)
{ {
struct md_rdev *rdev, *tmp; struct md_rdev *rdev;
rdev_for_each_safe(rdev, tmp, mddev) { while (!list_empty(&mddev->disks)) {
if (!rdev->mddev) { rdev = list_first_entry(&mddev->disks, struct md_rdev,
MD_BUG(); same_set);
continue;
}
kick_rdev_from_array(rdev); kick_rdev_from_array(rdev);
} }
if (!list_empty(&mddev->disks))
MD_BUG();
mddev->raid_disks = 0; mddev->raid_disks = 0;
mddev->major_version = 0; mddev->major_version = 0;
} }
static void print_desc(mdp_disk_t *desc) static void sync_sbs(struct mddev *mddev, int nospares)
{
printk(" DISK<N:%d,(%d,%d),R:%d,S:%d>\n", desc->number,
desc->major,desc->minor,desc->raid_disk,desc->state);
}
static void print_sb_90(mdp_super_t *sb)
{
int i;
printk(KERN_INFO
"md: SB: (V:%d.%d.%d) ID:<%08x.%08x.%08x.%08x> CT:%08x\n",
sb->major_version, sb->minor_version, sb->patch_version,
sb->set_uuid0, sb->set_uuid1, sb->set_uuid2, sb->set_uuid3,
sb->ctime);
printk(KERN_INFO "md: L%d S%08d ND:%d RD:%d md%d LO:%d CS:%d\n",
sb->level, sb->size, sb->nr_disks, sb->raid_disks,
sb->md_minor, sb->layout, sb->chunk_size);
printk(KERN_INFO "md: UT:%08x ST:%d AD:%d WD:%d"
" FD:%d SD:%d CSUM:%08x E:%08lx\n",
sb->utime, sb->state, sb->active_disks, sb->working_disks,
sb->failed_disks, sb->spare_disks,
sb->sb_csum, (unsigned long)sb->events_lo);
printk(KERN_INFO);
for (i = 0; i < MD_SB_DISKS; i++) {
mdp_disk_t *desc;
desc = sb->disks + i;
if (desc->number || desc->major || desc->minor ||
desc->raid_disk || (desc->state && (desc->state != 4))) {
printk(" D %2d: ", i);
print_desc(desc);
}
}
printk(KERN_INFO "md: THIS: ");
print_desc(&sb->this_disk);
}
static void print_sb_1(struct mdp_superblock_1 *sb)
{
__u8 *uuid;
uuid = sb->set_uuid;
printk(KERN_INFO
"md: SB: (V:%u) (F:0x%08x) Array-ID:<%pU>\n"
"md: Name: \"%s\" CT:%llu\n",
le32_to_cpu(sb->major_version),
le32_to_cpu(sb->feature_map),
uuid,
sb->set_name,
(unsigned long long)le64_to_cpu(sb->ctime)
& MD_SUPERBLOCK_1_TIME_SEC_MASK);
uuid = sb->device_uuid;
printk(KERN_INFO
"md: L%u SZ%llu RD:%u LO:%u CS:%u DO:%llu DS:%llu SO:%llu"
" RO:%llu\n"
"md: Dev:%08x UUID: %pU\n"
"md: (F:0x%08x) UT:%llu Events:%llu ResyncOffset:%llu CSUM:0x%08x\n"
"md: (MaxDev:%u) \n",
le32_to_cpu(sb->level),
(unsigned long long)le64_to_cpu(sb->size),
le32_to_cpu(sb->raid_disks),
le32_to_cpu(sb->layout),
le32_to_cpu(sb->chunksize),
(unsigned long long)le64_to_cpu(sb->data_offset),
(unsigned long long)le64_to_cpu(sb->data_size),
(unsigned long long)le64_to_cpu(sb->super_offset),
(unsigned long long)le64_to_cpu(sb->recovery_offset),
le32_to_cpu(sb->dev_number),
uuid,
sb->devflags,
(unsigned long long)le64_to_cpu(sb->utime) & MD_SUPERBLOCK_1_TIME_SEC_MASK,
(unsigned long long)le64_to_cpu(sb->events),
(unsigned long long)le64_to_cpu(sb->resync_offset),
le32_to_cpu(sb->sb_csum),
le32_to_cpu(sb->max_dev)
);
}
static void print_rdev(struct md_rdev *rdev, int major_version)
{
char b[BDEVNAME_SIZE];
printk(KERN_INFO "md: rdev %s, Sect:%08llu F:%d S:%d DN:%u\n",
bdevname(rdev->bdev, b), (unsigned long long)rdev->sectors,
test_bit(Faulty, &rdev->flags), test_bit(In_sync, &rdev->flags),
rdev->desc_nr);
if (rdev->sb_loaded) {
printk(KERN_INFO "md: rdev superblock (MJ:%d):\n", major_version);
switch (major_version) {
case 0:
print_sb_90(page_address(rdev->sb_page));
break;
case 1:
print_sb_1(page_address(rdev->sb_page));
break;
}
} else
printk(KERN_INFO "md: no rdev superblock!\n");
}
static void md_print_devices(void)
{
struct list_head *tmp;
struct md_rdev *rdev;
struct mddev *mddev;
char b[BDEVNAME_SIZE];
printk("\n");
printk("md: **********************************\n");
printk("md: * <COMPLETE RAID STATE PRINTOUT> *\n");
printk("md: **********************************\n");
for_each_mddev(mddev, tmp) {
if (mddev->bitmap)
bitmap_print_sb(mddev->bitmap);
else
printk("%s: ", mdname(mddev));
rdev_for_each(rdev, mddev)
printk("<%s>", bdevname(rdev->bdev,b));
printk("\n");
rdev_for_each(rdev, mddev)
print_rdev(rdev, mddev->major_version);
}
printk("md: **********************************\n");
printk("\n");
}
static void sync_sbs(struct mddev * mddev, int nospares)
{ {
/* Update each superblock (in-memory image), but /* Update each superblock (in-memory image), but
* if we are allowed to, skip spares which already * if we are allowed to, skip spares which already
...@@ -2369,7 +2192,7 @@ static void sync_sbs(struct mddev * mddev, int nospares) ...@@ -2369,7 +2192,7 @@ static void sync_sbs(struct mddev * mddev, int nospares)
} }
} }
static void md_update_sb(struct mddev * mddev, int force_change) static void md_update_sb(struct mddev *mddev, int force_change)
{ {
struct md_rdev *rdev; struct md_rdev *rdev;
int sync_req; int sync_req;
...@@ -2453,15 +2276,12 @@ static void md_update_sb(struct mddev * mddev, int force_change) ...@@ -2453,15 +2276,12 @@ static void md_update_sb(struct mddev * mddev, int force_change)
mddev->can_decrease_events = nospares; mddev->can_decrease_events = nospares;
} }
if (!mddev->events) {
/* /*
* oops, this 64-bit counter should never wrap. * This 64-bit counter should never wrap.
* Either we are in around ~1 trillion A.C., assuming * Either we are in around ~1 trillion A.C., assuming
* 1 reboot per second, or we have a bug: * 1 reboot per second, or we have a bug...
*/ */
MD_BUG(); WARN_ON(mddev->events == 0);
mddev->events --;
}
rdev_for_each(rdev, mddev) { rdev_for_each(rdev, mddev) {
if (rdev->badblocks.changed) if (rdev->badblocks.changed)
...@@ -2668,10 +2488,12 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len) ...@@ -2668,10 +2488,12 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
set_bit(In_sync, &rdev->flags); set_bit(In_sync, &rdev->flags);
err = 0; err = 0;
} else if (cmd_match(buf, "-insync") && rdev->raid_disk >= 0) { } else if (cmd_match(buf, "-insync") && rdev->raid_disk >= 0) {
if (rdev->mddev->pers == NULL) {
clear_bit(In_sync, &rdev->flags); clear_bit(In_sync, &rdev->flags);
rdev->saved_raid_disk = rdev->raid_disk; rdev->saved_raid_disk = rdev->raid_disk;
rdev->raid_disk = -1; rdev->raid_disk = -1;
err = 0; err = 0;
}
} else if (cmd_match(buf, "write_error")) { } else if (cmd_match(buf, "write_error")) {
set_bit(WriteErrorSeen, &rdev->flags); set_bit(WriteErrorSeen, &rdev->flags);
err = 0; err = 0;
...@@ -2829,7 +2651,6 @@ slot_store(struct md_rdev *rdev, const char *buf, size_t len) ...@@ -2829,7 +2651,6 @@ slot_store(struct md_rdev *rdev, const char *buf, size_t len)
return len; return len;
} }
static struct rdev_sysfs_entry rdev_slot = static struct rdev_sysfs_entry rdev_slot =
__ATTR(slot, S_IRUGO|S_IWUSR, slot_show, slot_store); __ATTR(slot, S_IRUGO|S_IWUSR, slot_show, slot_store);
...@@ -2980,20 +2801,20 @@ rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len) ...@@ -2980,20 +2801,20 @@ rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len)
rdev->sectors = sectors; rdev->sectors = sectors;
if (sectors > oldsectors && my_mddev->external) { if (sectors > oldsectors && my_mddev->external) {
/* need to check that all other rdevs with the same ->bdev /* Need to check that all other rdevs with the same
* do not overlap. We need to unlock the mddev to avoid * ->bdev do not overlap. 'rcu' is sufficient to walk
* a deadlock. We have already changed rdev->sectors, and if * the rdev lists safely.
* we have to change it back, we will have the lock again. * This check does not provide a hard guarantee, it
* just helps avoid dangerous mistakes.
*/ */
struct mddev *mddev; struct mddev *mddev;
int overlap = 0; int overlap = 0;
struct list_head *tmp; struct list_head *tmp;
mddev_unlock(my_mddev); rcu_read_lock();
for_each_mddev(mddev, tmp) { for_each_mddev(mddev, tmp) {
struct md_rdev *rdev2; struct md_rdev *rdev2;
mddev_lock_nointr(mddev);
rdev_for_each(rdev2, mddev) rdev_for_each(rdev2, mddev)
if (rdev->bdev == rdev2->bdev && if (rdev->bdev == rdev2->bdev &&
rdev != rdev2 && rdev != rdev2 &&
...@@ -3003,13 +2824,12 @@ rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len) ...@@ -3003,13 +2824,12 @@ rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len)
overlap = 1; overlap = 1;
break; break;
} }
mddev_unlock(mddev);
if (overlap) { if (overlap) {
mddev_put(mddev); mddev_put(mddev);
break; break;
} }
} }
mddev_lock_nointr(my_mddev); rcu_read_unlock();
if (overlap) { if (overlap) {
/* Someone else could have slipped in a size /* Someone else could have slipped in a size
* change here, but doing so is just silly. * change here, but doing so is just silly.
...@@ -3027,7 +2847,6 @@ rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len) ...@@ -3027,7 +2847,6 @@ rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len)
static struct rdev_sysfs_entry rdev_size = static struct rdev_sysfs_entry rdev_size =
__ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store); __ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store);
static ssize_t recovery_start_show(struct md_rdev *rdev, char *page) static ssize_t recovery_start_show(struct md_rdev *rdev, char *page)
{ {
unsigned long long recovery_start = rdev->recovery_offset; unsigned long long recovery_start = rdev->recovery_offset;
...@@ -3063,7 +2882,6 @@ static ssize_t recovery_start_store(struct md_rdev *rdev, const char *buf, size_ ...@@ -3063,7 +2882,6 @@ static ssize_t recovery_start_store(struct md_rdev *rdev, const char *buf, size_
static struct rdev_sysfs_entry rdev_recovery_start = static struct rdev_sysfs_entry rdev_recovery_start =
__ATTR(recovery_start, S_IRUGO|S_IWUSR, recovery_start_show, recovery_start_store); __ATTR(recovery_start, S_IRUGO|S_IWUSR, recovery_start_show, recovery_start_store);
static ssize_t static ssize_t
badblocks_show(struct badblocks *bb, char *page, int unack); badblocks_show(struct badblocks *bb, char *page, int unack);
static ssize_t static ssize_t
...@@ -3084,7 +2902,6 @@ static ssize_t bb_store(struct md_rdev *rdev, const char *page, size_t len) ...@@ -3084,7 +2902,6 @@ static ssize_t bb_store(struct md_rdev *rdev, const char *page, size_t len)
static struct rdev_sysfs_entry rdev_bad_blocks = static struct rdev_sysfs_entry rdev_bad_blocks =
__ATTR(bad_blocks, S_IRUGO|S_IWUSR, bb_show, bb_store); __ATTR(bad_blocks, S_IRUGO|S_IWUSR, bb_show, bb_store);
static ssize_t ubb_show(struct md_rdev *rdev, char *page) static ssize_t ubb_show(struct md_rdev *rdev, char *page)
{ {
return badblocks_show(&rdev->badblocks, page, 1); return badblocks_show(&rdev->badblocks, page, 1);
...@@ -3281,8 +3098,7 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe ...@@ -3281,8 +3098,7 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe
* Check a full RAID array for plausibility * Check a full RAID array for plausibility
*/ */
static void analyze_sbs(struct mddev *mddev)
static void analyze_sbs(struct mddev * mddev)
{ {
int i; int i;
struct md_rdev *rdev, *freshest, *tmp; struct md_rdev *rdev, *freshest, *tmp;
...@@ -3305,7 +3121,6 @@ static void analyze_sbs(struct mddev * mddev) ...@@ -3305,7 +3121,6 @@ static void analyze_sbs(struct mddev * mddev)
kick_rdev_from_array(rdev); kick_rdev_from_array(rdev);
} }
super_types[mddev->major_version]. super_types[mddev->major_version].
validate_super(mddev, freshest); validate_super(mddev, freshest);
...@@ -3381,7 +3196,6 @@ int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale) ...@@ -3381,7 +3196,6 @@ int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale)
return 0; return 0;
} }
static void md_safemode_timeout(unsigned long data); static void md_safemode_timeout(unsigned long data);
static ssize_t static ssize_t
...@@ -3611,7 +3425,6 @@ level_store(struct mddev *mddev, const char *buf, size_t len) ...@@ -3611,7 +3425,6 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
static struct md_sysfs_entry md_level = static struct md_sysfs_entry md_level =
__ATTR(level, S_IRUGO|S_IWUSR, level_show, level_store); __ATTR(level, S_IRUGO|S_IWUSR, level_show, level_store);
static ssize_t static ssize_t
layout_show(struct mddev *mddev, char *page) layout_show(struct mddev *mddev, char *page)
{ {
...@@ -3654,7 +3467,6 @@ layout_store(struct mddev *mddev, const char *buf, size_t len) ...@@ -3654,7 +3467,6 @@ layout_store(struct mddev *mddev, const char *buf, size_t len)
static struct md_sysfs_entry md_layout = static struct md_sysfs_entry md_layout =
__ATTR(layout, S_IRUGO|S_IWUSR, layout_show, layout_store); __ATTR(layout, S_IRUGO|S_IWUSR, layout_show, layout_store);
static ssize_t static ssize_t
raid_disks_show(struct mddev *mddev, char *page) raid_disks_show(struct mddev *mddev, char *page)
{ {
...@@ -3859,9 +3671,9 @@ array_state_show(struct mddev *mddev, char *page) ...@@ -3859,9 +3671,9 @@ array_state_show(struct mddev *mddev, char *page)
return sprintf(page, "%s\n", array_states[st]); return sprintf(page, "%s\n", array_states[st]);
} }
static int do_md_stop(struct mddev * mddev, int ro, struct block_device *bdev); static int do_md_stop(struct mddev *mddev, int ro, struct block_device *bdev);
static int md_set_readonly(struct mddev * mddev, struct block_device *bdev); static int md_set_readonly(struct mddev *mddev, struct block_device *bdev);
static int do_md_run(struct mddev * mddev); static int do_md_run(struct mddev *mddev);
static int restart_array(struct mddev *mddev); static int restart_array(struct mddev *mddev);
static ssize_t static ssize_t
...@@ -4012,7 +3824,6 @@ new_dev_store(struct mddev *mddev, const char *buf, size_t len) ...@@ -4012,7 +3824,6 @@ new_dev_store(struct mddev *mddev, const char *buf, size_t len)
minor != MINOR(dev)) minor != MINOR(dev))
return -EOVERFLOW; return -EOVERFLOW;
if (mddev->persistent) { if (mddev->persistent) {
rdev = md_import_device(dev, mddev->major_version, rdev = md_import_device(dev, mddev->major_version,
mddev->minor_version); mddev->minor_version);
...@@ -4108,7 +3919,6 @@ size_store(struct mddev *mddev, const char *buf, size_t len) ...@@ -4108,7 +3919,6 @@ size_store(struct mddev *mddev, const char *buf, size_t len)
static struct md_sysfs_entry md_size = static struct md_sysfs_entry md_size =
__ATTR(component_size, S_IRUGO|S_IWUSR, size_show, size_store); __ATTR(component_size, S_IRUGO|S_IWUSR, size_show, size_store);
/* Metadata version. /* Metadata version.
* This is one of * This is one of
* 'none' for arrays with no metadata (good luck...) * 'none' for arrays with no metadata (good luck...)
...@@ -4510,7 +4320,6 @@ suspend_lo_store(struct mddev *mddev, const char *buf, size_t len) ...@@ -4510,7 +4320,6 @@ suspend_lo_store(struct mddev *mddev, const char *buf, size_t len)
static struct md_sysfs_entry md_suspend_lo = static struct md_sysfs_entry md_suspend_lo =
__ATTR(suspend_lo, S_IRUGO|S_IWUSR, suspend_lo_show, suspend_lo_store); __ATTR(suspend_lo, S_IRUGO|S_IWUSR, suspend_lo_show, suspend_lo_store);
static ssize_t static ssize_t
suspend_hi_show(struct mddev *mddev, char *page) suspend_hi_show(struct mddev *mddev, char *page)
{ {
...@@ -4698,7 +4507,6 @@ static struct attribute_group md_redundancy_group = { ...@@ -4698,7 +4507,6 @@ static struct attribute_group md_redundancy_group = {
.attrs = md_redundancy_attrs, .attrs = md_redundancy_attrs,
}; };
static ssize_t static ssize_t
md_attr_show(struct kobject *kobj, struct attribute *attr, char *page) md_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
{ {
...@@ -5307,7 +5115,7 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) ...@@ -5307,7 +5115,7 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev)
mddev_lock_nointr(mddev); mddev_lock_nointr(mddev);
mutex_lock(&mddev->open_mutex); mutex_lock(&mddev->open_mutex);
if (atomic_read(&mddev->openers) > !!bdev || if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) ||
mddev->sync_thread || mddev->sync_thread ||
(bdev && !test_bit(MD_STILL_CLOSED, &mddev->flags))) { (bdev && !test_bit(MD_STILL_CLOSED, &mddev->flags))) {
printk("md: %s still in use.\n",mdname(mddev)); printk("md: %s still in use.\n",mdname(mddev));
...@@ -5339,7 +5147,7 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) ...@@ -5339,7 +5147,7 @@ static int md_set_readonly(struct mddev *mddev, struct block_device *bdev)
* 0 - completely stop and dis-assemble array * 0 - completely stop and dis-assemble array
* 2 - stop but do not disassemble array * 2 - stop but do not disassemble array
*/ */
static int do_md_stop(struct mddev * mddev, int mode, static int do_md_stop(struct mddev *mddev, int mode,
struct block_device *bdev) struct block_device *bdev)
{ {
struct gendisk *disk = mddev->gendisk; struct gendisk *disk = mddev->gendisk;
...@@ -5362,7 +5170,7 @@ static int do_md_stop(struct mddev * mddev, int mode, ...@@ -5362,7 +5170,7 @@ static int do_md_stop(struct mddev * mddev, int mode,
mddev_lock_nointr(mddev); mddev_lock_nointr(mddev);
mutex_lock(&mddev->open_mutex); mutex_lock(&mddev->open_mutex);
if (atomic_read(&mddev->openers) > !!bdev || if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) ||
mddev->sysfs_active || mddev->sysfs_active ||
mddev->sync_thread || mddev->sync_thread ||
(bdev && !test_bit(MD_STILL_CLOSED, &mddev->flags))) { (bdev && !test_bit(MD_STILL_CLOSED, &mddev->flags))) {
...@@ -5545,7 +5353,7 @@ static void autorun_devices(int part) ...@@ -5545,7 +5353,7 @@ static void autorun_devices(int part)
} }
#endif /* !MODULE */ #endif /* !MODULE */
static int get_version(void __user * arg) static int get_version(void __user *arg)
{ {
mdu_version_t ver; mdu_version_t ver;
...@@ -5559,7 +5367,7 @@ static int get_version(void __user * arg) ...@@ -5559,7 +5367,7 @@ static int get_version(void __user * arg)
return 0; return 0;
} }
static int get_array_info(struct mddev * mddev, void __user * arg) static int get_array_info(struct mddev *mddev, void __user *arg)
{ {
mdu_array_info_t info; mdu_array_info_t info;
int nr,working,insync,failed,spare; int nr,working,insync,failed,spare;
...@@ -5614,7 +5422,7 @@ static int get_array_info(struct mddev * mddev, void __user * arg) ...@@ -5614,7 +5422,7 @@ static int get_array_info(struct mddev * mddev, void __user * arg)
return 0; return 0;
} }
static int get_bitmap_file(struct mddev * mddev, void __user * arg) static int get_bitmap_file(struct mddev *mddev, void __user * arg)
{ {
mdu_bitmap_file_t *file = NULL; /* too big for stack allocation */ mdu_bitmap_file_t *file = NULL; /* too big for stack allocation */
char *ptr, *buf = NULL; char *ptr, *buf = NULL;
...@@ -5652,7 +5460,7 @@ static int get_bitmap_file(struct mddev * mddev, void __user * arg) ...@@ -5652,7 +5460,7 @@ static int get_bitmap_file(struct mddev * mddev, void __user * arg)
return err; return err;
} }
static int get_disk_info(struct mddev * mddev, void __user * arg) static int get_disk_info(struct mddev *mddev, void __user * arg)
{ {
mdu_disk_info_t info; mdu_disk_info_t info;
struct md_rdev *rdev; struct md_rdev *rdev;
...@@ -5688,7 +5496,7 @@ static int get_disk_info(struct mddev * mddev, void __user * arg) ...@@ -5688,7 +5496,7 @@ static int get_disk_info(struct mddev * mddev, void __user * arg)
return 0; return 0;
} }
static int add_new_disk(struct mddev * mddev, mdu_disk_info_t *info) static int add_new_disk(struct mddev *mddev, mdu_disk_info_t *info)
{ {
char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
struct md_rdev *rdev; struct md_rdev *rdev;
...@@ -5856,7 +5664,7 @@ static int add_new_disk(struct mddev * mddev, mdu_disk_info_t *info) ...@@ -5856,7 +5664,7 @@ static int add_new_disk(struct mddev * mddev, mdu_disk_info_t *info)
return 0; return 0;
} }
static int hot_remove_disk(struct mddev * mddev, dev_t dev) static int hot_remove_disk(struct mddev *mddev, dev_t dev)
{ {
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
struct md_rdev *rdev; struct md_rdev *rdev;
...@@ -5882,7 +5690,7 @@ static int hot_remove_disk(struct mddev * mddev, dev_t dev) ...@@ -5882,7 +5690,7 @@ static int hot_remove_disk(struct mddev * mddev, dev_t dev)
return -EBUSY; return -EBUSY;
} }
static int hot_add_disk(struct mddev * mddev, dev_t dev) static int hot_add_disk(struct mddev *mddev, dev_t dev)
{ {
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
int err; int err;
...@@ -5968,7 +5776,6 @@ static int set_bitmap_file(struct mddev *mddev, int fd) ...@@ -5968,7 +5776,6 @@ static int set_bitmap_file(struct mddev *mddev, int fd)
/* we should be able to change the bitmap.. */ /* we should be able to change the bitmap.. */
} }
if (fd >= 0) { if (fd >= 0) {
struct inode *inode; struct inode *inode;
if (mddev->bitmap) if (mddev->bitmap)
...@@ -6039,7 +5846,7 @@ static int set_bitmap_file(struct mddev *mddev, int fd) ...@@ -6039,7 +5846,7 @@ static int set_bitmap_file(struct mddev *mddev, int fd)
* The minor and patch _version numbers are also kept incase the * The minor and patch _version numbers are also kept incase the
* super_block handler wishes to interpret them. * super_block handler wishes to interpret them.
*/ */
static int set_array_info(struct mddev * mddev, mdu_array_info_t *info) static int set_array_info(struct mddev *mddev, mdu_array_info_t *info)
{ {
if (info->raid_disks == 0) { if (info->raid_disks == 0) {
...@@ -6196,7 +6003,6 @@ static int update_raid_disks(struct mddev *mddev, int raid_disks) ...@@ -6196,7 +6003,6 @@ static int update_raid_disks(struct mddev *mddev, int raid_disks)
return rv; return rv;
} }
/* /*
* update_array_info is used to change the configuration of an * update_array_info is used to change the configuration of an
* on-line array. * on-line array.
...@@ -6347,7 +6153,6 @@ static inline bool md_ioctl_valid(unsigned int cmd) ...@@ -6347,7 +6153,6 @@ static inline bool md_ioctl_valid(unsigned int cmd)
case GET_DISK_INFO: case GET_DISK_INFO:
case HOT_ADD_DISK: case HOT_ADD_DISK:
case HOT_REMOVE_DISK: case HOT_REMOVE_DISK:
case PRINT_RAID_DEBUG:
case RAID_AUTORUN: case RAID_AUTORUN:
case RAID_VERSION: case RAID_VERSION:
case RESTART_ARRAY_RW: case RESTART_ARRAY_RW:
...@@ -6391,18 +6196,13 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6391,18 +6196,13 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
switch (cmd) { switch (cmd) {
case RAID_VERSION: case RAID_VERSION:
err = get_version(argp); err = get_version(argp);
goto done; goto out;
case PRINT_RAID_DEBUG:
err = 0;
md_print_devices();
goto done;
#ifndef MODULE #ifndef MODULE
case RAID_AUTORUN: case RAID_AUTORUN:
err = 0; err = 0;
autostart_arrays(arg); autostart_arrays(arg);
goto done; goto out;
#endif #endif
default:; default:;
} }
...@@ -6415,7 +6215,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6415,7 +6215,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
if (!mddev) { if (!mddev) {
BUG(); BUG();
goto abort; goto out;
} }
/* Some actions do not requires the mutex */ /* Some actions do not requires the mutex */
...@@ -6425,18 +6225,18 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6425,18 +6225,18 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
err = -ENODEV; err = -ENODEV;
else else
err = get_array_info(mddev, argp); err = get_array_info(mddev, argp);
goto abort; goto out;
case GET_DISK_INFO: case GET_DISK_INFO:
if (!mddev->raid_disks && !mddev->external) if (!mddev->raid_disks && !mddev->external)
err = -ENODEV; err = -ENODEV;
else else
err = get_disk_info(mddev, argp); err = get_disk_info(mddev, argp);
goto abort; goto out;
case SET_DISK_FAULTY: case SET_DISK_FAULTY:
err = set_disk_faulty(mddev, new_decode_dev(arg)); err = set_disk_faulty(mddev, new_decode_dev(arg));
goto abort; goto out;
} }
if (cmd == ADD_NEW_DISK) if (cmd == ADD_NEW_DISK)
...@@ -6454,10 +6254,10 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6454,10 +6254,10 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
* and writes * and writes
*/ */
mutex_lock(&mddev->open_mutex); mutex_lock(&mddev->open_mutex);
if (atomic_read(&mddev->openers) > 1) { if (mddev->pers && atomic_read(&mddev->openers) > 1) {
mutex_unlock(&mddev->open_mutex); mutex_unlock(&mddev->open_mutex);
err = -EBUSY; err = -EBUSY;
goto abort; goto out;
} }
set_bit(MD_STILL_CLOSED, &mddev->flags); set_bit(MD_STILL_CLOSED, &mddev->flags);
mutex_unlock(&mddev->open_mutex); mutex_unlock(&mddev->open_mutex);
...@@ -6468,7 +6268,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6468,7 +6268,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
printk(KERN_INFO printk(KERN_INFO
"md: ioctl lock interrupted, reason %d, cmd %d\n", "md: ioctl lock interrupted, reason %d, cmd %d\n",
err, cmd); err, cmd);
goto abort; goto out;
} }
if (cmd == SET_ARRAY_INFO) { if (cmd == SET_ARRAY_INFO) {
...@@ -6477,38 +6277,38 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6477,38 +6277,38 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
memset(&info, 0, sizeof(info)); memset(&info, 0, sizeof(info));
else if (copy_from_user(&info, argp, sizeof(info))) { else if (copy_from_user(&info, argp, sizeof(info))) {
err = -EFAULT; err = -EFAULT;
goto abort_unlock; goto unlock;
} }
if (mddev->pers) { if (mddev->pers) {
err = update_array_info(mddev, &info); err = update_array_info(mddev, &info);
if (err) { if (err) {
printk(KERN_WARNING "md: couldn't update" printk(KERN_WARNING "md: couldn't update"
" array info. %d\n", err); " array info. %d\n", err);
goto abort_unlock; goto unlock;
} }
goto done_unlock; goto unlock;
} }
if (!list_empty(&mddev->disks)) { if (!list_empty(&mddev->disks)) {
printk(KERN_WARNING printk(KERN_WARNING
"md: array %s already has disks!\n", "md: array %s already has disks!\n",
mdname(mddev)); mdname(mddev));
err = -EBUSY; err = -EBUSY;
goto abort_unlock; goto unlock;
} }
if (mddev->raid_disks) { if (mddev->raid_disks) {
printk(KERN_WARNING printk(KERN_WARNING
"md: array %s already initialised!\n", "md: array %s already initialised!\n",
mdname(mddev)); mdname(mddev));
err = -EBUSY; err = -EBUSY;
goto abort_unlock; goto unlock;
} }
err = set_array_info(mddev, &info); err = set_array_info(mddev, &info);
if (err) { if (err) {
printk(KERN_WARNING "md: couldn't set" printk(KERN_WARNING "md: couldn't set"
" array info. %d\n", err); " array info. %d\n", err);
goto abort_unlock; goto unlock;
} }
goto done_unlock; goto unlock;
} }
/* /*
...@@ -6521,7 +6321,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6521,7 +6321,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
&& cmd != RUN_ARRAY && cmd != SET_BITMAP_FILE && cmd != RUN_ARRAY && cmd != SET_BITMAP_FILE
&& cmd != GET_BITMAP_FILE) { && cmd != GET_BITMAP_FILE) {
err = -ENODEV; err = -ENODEV;
goto abort_unlock; goto unlock;
} }
/* /*
...@@ -6530,23 +6330,23 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6530,23 +6330,23 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
switch (cmd) { switch (cmd) {
case GET_BITMAP_FILE: case GET_BITMAP_FILE:
err = get_bitmap_file(mddev, argp); err = get_bitmap_file(mddev, argp);
goto done_unlock; goto unlock;
case RESTART_ARRAY_RW: case RESTART_ARRAY_RW:
err = restart_array(mddev); err = restart_array(mddev);
goto done_unlock; goto unlock;
case STOP_ARRAY: case STOP_ARRAY:
err = do_md_stop(mddev, 0, bdev); err = do_md_stop(mddev, 0, bdev);
goto done_unlock; goto unlock;
case STOP_ARRAY_RO: case STOP_ARRAY_RO:
err = md_set_readonly(mddev, bdev); err = md_set_readonly(mddev, bdev);
goto done_unlock; goto unlock;
case HOT_REMOVE_DISK: case HOT_REMOVE_DISK:
err = hot_remove_disk(mddev, new_decode_dev(arg)); err = hot_remove_disk(mddev, new_decode_dev(arg));
goto done_unlock; goto unlock;
case ADD_NEW_DISK: case ADD_NEW_DISK:
/* We can support ADD_NEW_DISK on read-only arrays /* We can support ADD_NEW_DISK on read-only arrays
...@@ -6562,14 +6362,14 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6562,14 +6362,14 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
break; break;
else else
err = add_new_disk(mddev, &info); err = add_new_disk(mddev, &info);
goto done_unlock; goto unlock;
} }
break; break;
case BLKROSET: case BLKROSET:
if (get_user(ro, (int __user *)(arg))) { if (get_user(ro, (int __user *)(arg))) {
err = -EFAULT; err = -EFAULT;
goto done_unlock; goto unlock;
} }
err = -EINVAL; err = -EINVAL;
...@@ -6577,11 +6377,11 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6577,11 +6377,11 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
* does not matter, no writes are coming * does not matter, no writes are coming
*/ */
if (ro) if (ro)
goto done_unlock; goto unlock;
/* are we are already prepared for writes? */ /* are we are already prepared for writes? */
if (mddev->ro != 1) if (mddev->ro != 1)
goto done_unlock; goto unlock;
/* transitioning to readauto need only happen for /* transitioning to readauto need only happen for
* arrays that call md_write_start * arrays that call md_write_start
...@@ -6593,17 +6393,14 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6593,17 +6393,14 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
set_disk_ro(mddev->gendisk, 0); set_disk_ro(mddev->gendisk, 0);
} }
} }
goto done_unlock; goto unlock;
} }
/* /*
* The remaining ioctls are changing the state of the * The remaining ioctls are changing the state of the
* superblock, so we do not allow them on read-only arrays. * superblock, so we do not allow them on read-only arrays.
* However non-MD ioctls (e.g. get-size) will still come through
* here and hit the 'default' below, so only disallow
* 'md' ioctls, and switch to rw mode if started auto-readonly.
*/ */
if (_IOC_TYPE(cmd) == MD_MAJOR && mddev->ro && mddev->pers) { if (mddev->ro && mddev->pers) {
if (mddev->ro == 2) { if (mddev->ro == 2) {
mddev->ro = 0; mddev->ro = 0;
sysfs_notify_dirent_safe(mddev->sysfs_state); sysfs_notify_dirent_safe(mddev->sysfs_state);
...@@ -6621,7 +6418,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6621,7 +6418,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
} }
} else { } else {
err = -EROFS; err = -EROFS;
goto abort_unlock; goto unlock;
} }
} }
...@@ -6633,38 +6430,32 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -6633,38 +6430,32 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
err = -EFAULT; err = -EFAULT;
else else
err = add_new_disk(mddev, &info); err = add_new_disk(mddev, &info);
goto done_unlock; goto unlock;
} }
case HOT_ADD_DISK: case HOT_ADD_DISK:
err = hot_add_disk(mddev, new_decode_dev(arg)); err = hot_add_disk(mddev, new_decode_dev(arg));
goto done_unlock; goto unlock;
case RUN_ARRAY: case RUN_ARRAY:
err = do_md_run(mddev); err = do_md_run(mddev);
goto done_unlock; goto unlock;
case SET_BITMAP_FILE: case SET_BITMAP_FILE:
err = set_bitmap_file(mddev, (int)arg); err = set_bitmap_file(mddev, (int)arg);
goto done_unlock; goto unlock;
default: default:
err = -EINVAL; err = -EINVAL;
goto abort_unlock; goto unlock;
} }
done_unlock: unlock:
abort_unlock:
if (mddev->hold_active == UNTIL_IOCTL && if (mddev->hold_active == UNTIL_IOCTL &&
err != -EINVAL) err != -EINVAL)
mddev->hold_active = 0; mddev->hold_active = 0;
mddev_unlock(mddev); mddev_unlock(mddev);
out:
return err;
done:
if (err)
MD_BUG();
abort:
return err; return err;
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
...@@ -6761,7 +6552,7 @@ static const struct block_device_operations md_fops = ...@@ -6761,7 +6552,7 @@ static const struct block_device_operations md_fops =
.revalidate_disk= md_revalidate, .revalidate_disk= md_revalidate,
}; };
static int md_thread(void * arg) static int md_thread(void *arg)
{ {
struct md_thread *thread = arg; struct md_thread *thread = arg;
...@@ -6810,6 +6601,7 @@ void md_wakeup_thread(struct md_thread *thread) ...@@ -6810,6 +6601,7 @@ void md_wakeup_thread(struct md_thread *thread)
wake_up(&thread->wqueue); wake_up(&thread->wqueue);
} }
} }
EXPORT_SYMBOL(md_wakeup_thread);
struct md_thread *md_register_thread(void (*run) (struct md_thread *), struct md_thread *md_register_thread(void (*run) (struct md_thread *),
struct mddev *mddev, const char *name) struct mddev *mddev, const char *name)
...@@ -6835,6 +6627,7 @@ struct md_thread *md_register_thread(void (*run) (struct md_thread *), ...@@ -6835,6 +6627,7 @@ struct md_thread *md_register_thread(void (*run) (struct md_thread *),
} }
return thread; return thread;
} }
EXPORT_SYMBOL(md_register_thread);
void md_unregister_thread(struct md_thread **threadp) void md_unregister_thread(struct md_thread **threadp)
{ {
...@@ -6852,14 +6645,10 @@ void md_unregister_thread(struct md_thread **threadp) ...@@ -6852,14 +6645,10 @@ void md_unregister_thread(struct md_thread **threadp)
kthread_stop(thread->tsk); kthread_stop(thread->tsk);
kfree(thread); kfree(thread);
} }
EXPORT_SYMBOL(md_unregister_thread);
void md_error(struct mddev *mddev, struct md_rdev *rdev) void md_error(struct mddev *mddev, struct md_rdev *rdev)
{ {
if (!mddev) {
MD_BUG();
return;
}
if (!rdev || test_bit(Faulty, &rdev->flags)) if (!rdev || test_bit(Faulty, &rdev->flags))
return; return;
...@@ -6876,6 +6665,7 @@ void md_error(struct mddev *mddev, struct md_rdev *rdev) ...@@ -6876,6 +6665,7 @@ void md_error(struct mddev *mddev, struct md_rdev *rdev)
queue_work(md_misc_wq, &mddev->event_work); queue_work(md_misc_wq, &mddev->event_work);
md_new_event_inintr(mddev); md_new_event_inintr(mddev);
} }
EXPORT_SYMBOL(md_error);
/* seq_file implementation /proc/mdstat */ /* seq_file implementation /proc/mdstat */
...@@ -6898,8 +6688,7 @@ static void status_unused(struct seq_file *seq) ...@@ -6898,8 +6688,7 @@ static void status_unused(struct seq_file *seq)
seq_printf(seq, "\n"); seq_printf(seq, "\n");
} }
static void status_resync(struct seq_file *seq, struct mddev *mddev)
static void status_resync(struct seq_file *seq, struct mddev * mddev)
{ {
sector_t max_sectors, resync, res; sector_t max_sectors, resync, res;
unsigned long dt, db; unsigned long dt, db;
...@@ -6919,13 +6708,7 @@ static void status_resync(struct seq_file *seq, struct mddev * mddev) ...@@ -6919,13 +6708,7 @@ static void status_resync(struct seq_file *seq, struct mddev * mddev)
else else
max_sectors = mddev->dev_sectors; max_sectors = mddev->dev_sectors;
/* WARN_ON(max_sectors == 0);
* Should not happen.
*/
if (!max_sectors) {
MD_BUG();
return;
}
/* Pick 'scale' such that (resync>>scale)*1000 will fit /* Pick 'scale' such that (resync>>scale)*1000 will fit
* in a sector_t, and (max_sectors>>scale) will fit in a * in a sector_t, and (max_sectors>>scale) will fit in a
* u32, as those are the requirements for sector_div. * u32, as those are the requirements for sector_div.
...@@ -7204,12 +6987,14 @@ static const struct file_operations md_seq_fops = { ...@@ -7204,12 +6987,14 @@ static const struct file_operations md_seq_fops = {
int register_md_personality(struct md_personality *p) int register_md_personality(struct md_personality *p)
{ {
printk(KERN_INFO "md: %s personality registered for level %d\n",
p->name, p->level);
spin_lock(&pers_lock); spin_lock(&pers_lock);
list_add_tail(&p->list, &pers_list); list_add_tail(&p->list, &pers_list);
printk(KERN_INFO "md: %s personality registered for level %d\n", p->name, p->level);
spin_unlock(&pers_lock); spin_unlock(&pers_lock);
return 0; return 0;
} }
EXPORT_SYMBOL(register_md_personality);
int unregister_md_personality(struct md_personality *p) int unregister_md_personality(struct md_personality *p)
{ {
...@@ -7219,10 +7004,11 @@ int unregister_md_personality(struct md_personality *p) ...@@ -7219,10 +7004,11 @@ int unregister_md_personality(struct md_personality *p)
spin_unlock(&pers_lock); spin_unlock(&pers_lock);
return 0; return 0;
} }
EXPORT_SYMBOL(unregister_md_personality);
static int is_mddev_idle(struct mddev *mddev, int init) static int is_mddev_idle(struct mddev *mddev, int init)
{ {
struct md_rdev * rdev; struct md_rdev *rdev;
int idle; int idle;
int curr_events; int curr_events;
...@@ -7276,7 +7062,7 @@ void md_done_sync(struct mddev *mddev, int blocks, int ok) ...@@ -7276,7 +7062,7 @@ void md_done_sync(struct mddev *mddev, int blocks, int ok)
// stop recovery, signal do_sync .... // stop recovery, signal do_sync ....
} }
} }
EXPORT_SYMBOL(md_done_sync);
/* md_write_start(mddev, bi) /* md_write_start(mddev, bi)
* If we need to update some array metadata (e.g. 'active' flag * If we need to update some array metadata (e.g. 'active' flag
...@@ -7317,6 +7103,7 @@ void md_write_start(struct mddev *mddev, struct bio *bi) ...@@ -7317,6 +7103,7 @@ void md_write_start(struct mddev *mddev, struct bio *bi)
wait_event(mddev->sb_wait, wait_event(mddev->sb_wait,
!test_bit(MD_CHANGE_PENDING, &mddev->flags)); !test_bit(MD_CHANGE_PENDING, &mddev->flags));
} }
EXPORT_SYMBOL(md_write_start);
void md_write_end(struct mddev *mddev) void md_write_end(struct mddev *mddev)
{ {
...@@ -7327,6 +7114,7 @@ void md_write_end(struct mddev *mddev) ...@@ -7327,6 +7114,7 @@ void md_write_end(struct mddev *mddev)
mod_timer(&mddev->safemode_timer, jiffies + mddev->safemode_delay); mod_timer(&mddev->safemode_timer, jiffies + mddev->safemode_delay);
} }
} }
EXPORT_SYMBOL(md_write_end);
/* md_allow_write(mddev) /* md_allow_write(mddev)
* Calling this ensures that the array is marked 'active' so that writes * Calling this ensures that the array is marked 'active' so that writes
...@@ -7784,6 +7572,33 @@ static int remove_and_add_spares(struct mddev *mddev, ...@@ -7784,6 +7572,33 @@ static int remove_and_add_spares(struct mddev *mddev,
return spares; return spares;
} }
static void md_start_sync(struct work_struct *ws)
{
struct mddev *mddev = container_of(ws, struct mddev, del_work);
mddev->sync_thread = md_register_thread(md_do_sync,
mddev,
"resync");
if (!mddev->sync_thread) {
printk(KERN_ERR "%s: could not start resync"
" thread...\n",
mdname(mddev));
/* leave the spares where they are, it shouldn't hurt */
clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
if (test_and_clear_bit(MD_RECOVERY_RECOVER,
&mddev->recovery))
if (mddev->sysfs_action)
sysfs_notify_dirent_safe(mddev->sysfs_action);
} else
md_wakeup_thread(mddev->sync_thread);
sysfs_notify_dirent_safe(mddev->sysfs_action);
md_new_event(mddev);
}
/* /*
* This routine is regularly called by all per-raid-array threads to * This routine is regularly called by all per-raid-array threads to
* deal with generic issues like resync and super-block update. * deal with generic issues like resync and super-block update.
...@@ -7900,7 +7715,7 @@ void md_check_recovery(struct mddev *mddev) ...@@ -7900,7 +7715,7 @@ void md_check_recovery(struct mddev *mddev)
if (!test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || if (!test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) test_bit(MD_RECOVERY_FROZEN, &mddev->recovery))
goto unlock; goto not_running;
/* no recovery is running. /* no recovery is running.
* remove any failed drives, then * remove any failed drives, then
* add spares if possible. * add spares if possible.
...@@ -7912,7 +7727,7 @@ void md_check_recovery(struct mddev *mddev) ...@@ -7912,7 +7727,7 @@ void md_check_recovery(struct mddev *mddev)
if (mddev->pers->check_reshape == NULL || if (mddev->pers->check_reshape == NULL ||
mddev->pers->check_reshape(mddev) != 0) mddev->pers->check_reshape(mddev) != 0)
/* Cannot proceed */ /* Cannot proceed */
goto unlock; goto not_running;
set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
} else if ((spares = remove_and_add_spares(mddev, NULL))) { } else if ((spares = remove_and_add_spares(mddev, NULL))) {
...@@ -7925,7 +7740,7 @@ void md_check_recovery(struct mddev *mddev) ...@@ -7925,7 +7740,7 @@ void md_check_recovery(struct mddev *mddev)
clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
} else if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) } else if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery))
/* nothing to be done ... */ /* nothing to be done ... */
goto unlock; goto not_running;
if (mddev->pers->sync_request) { if (mddev->pers->sync_request) {
if (spares) { if (spares) {
...@@ -7935,27 +7750,11 @@ void md_check_recovery(struct mddev *mddev) ...@@ -7935,27 +7750,11 @@ void md_check_recovery(struct mddev *mddev)
*/ */
bitmap_write_all(mddev->bitmap); bitmap_write_all(mddev->bitmap);
} }
mddev->sync_thread = md_register_thread(md_do_sync, INIT_WORK(&mddev->del_work, md_start_sync);
mddev, queue_work(md_misc_wq, &mddev->del_work);
"resync"); goto unlock;
if (!mddev->sync_thread) {
printk(KERN_ERR "%s: could not start resync"
" thread...\n",
mdname(mddev));
/* leave the spares where they are, it shouldn't hurt */
clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
} else
md_wakeup_thread(mddev->sync_thread);
sysfs_notify_dirent_safe(mddev->sysfs_action);
md_new_event(mddev);
} }
unlock: not_running:
wake_up(&mddev->sb_wait);
if (!mddev->sync_thread) { if (!mddev->sync_thread) {
clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
if (test_and_clear_bit(MD_RECOVERY_RECOVER, if (test_and_clear_bit(MD_RECOVERY_RECOVER,
...@@ -7963,9 +7762,12 @@ void md_check_recovery(struct mddev *mddev) ...@@ -7963,9 +7762,12 @@ void md_check_recovery(struct mddev *mddev)
if (mddev->sysfs_action) if (mddev->sysfs_action)
sysfs_notify_dirent_safe(mddev->sysfs_action); sysfs_notify_dirent_safe(mddev->sysfs_action);
} }
unlock:
wake_up(&mddev->sb_wait);
mddev_unlock(mddev); mddev_unlock(mddev);
} }
} }
EXPORT_SYMBOL(md_check_recovery);
void md_reap_sync_thread(struct mddev *mddev) void md_reap_sync_thread(struct mddev *mddev)
{ {
...@@ -8008,6 +7810,7 @@ void md_reap_sync_thread(struct mddev *mddev) ...@@ -8008,6 +7810,7 @@ void md_reap_sync_thread(struct mddev *mddev)
if (mddev->event_work.func) if (mddev->event_work.func)
queue_work(md_misc_wq, &mddev->event_work); queue_work(md_misc_wq, &mddev->event_work);
} }
EXPORT_SYMBOL(md_reap_sync_thread);
void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev) void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev)
{ {
...@@ -8641,7 +8444,6 @@ void md_autodetect_dev(dev_t dev) ...@@ -8641,7 +8444,6 @@ void md_autodetect_dev(dev_t dev)
} }
} }
static void autostart_arrays(int part) static void autostart_arrays(int part)
{ {
struct md_rdev *rdev; struct md_rdev *rdev;
...@@ -8665,10 +8467,9 @@ static void autostart_arrays(int part) ...@@ -8665,10 +8467,9 @@ static void autostart_arrays(int part)
if (IS_ERR(rdev)) if (IS_ERR(rdev))
continue; continue;
if (test_bit(Faulty, &rdev->flags)) { if (test_bit(Faulty, &rdev->flags))
MD_BUG();
continue; continue;
}
set_bit(AutoDetected, &rdev->flags); set_bit(AutoDetected, &rdev->flags);
list_add(&rdev->same_set, &pending_raid_disks); list_add(&rdev->same_set, &pending_raid_disks);
i_passed++; i_passed++;
...@@ -8736,20 +8537,8 @@ static int set_ro(const char *val, struct kernel_param *kp) ...@@ -8736,20 +8537,8 @@ static int set_ro(const char *val, struct kernel_param *kp)
module_param_call(start_ro, set_ro, get_ro, NULL, S_IRUSR|S_IWUSR); module_param_call(start_ro, set_ro, get_ro, NULL, S_IRUSR|S_IWUSR);
module_param(start_dirty_degraded, int, S_IRUGO|S_IWUSR); module_param(start_dirty_degraded, int, S_IRUGO|S_IWUSR);
module_param_call(new_array, add_named_array, NULL, NULL, S_IWUSR); module_param_call(new_array, add_named_array, NULL, NULL, S_IWUSR);
EXPORT_SYMBOL(register_md_personality);
EXPORT_SYMBOL(unregister_md_personality);
EXPORT_SYMBOL(md_error);
EXPORT_SYMBOL(md_done_sync);
EXPORT_SYMBOL(md_write_start);
EXPORT_SYMBOL(md_write_end);
EXPORT_SYMBOL(md_register_thread);
EXPORT_SYMBOL(md_unregister_thread);
EXPORT_SYMBOL(md_wakeup_thread);
EXPORT_SYMBOL(md_check_recovery);
EXPORT_SYMBOL(md_reap_sync_thread);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("MD RAID framework"); MODULE_DESCRIPTION("MD RAID framework");
MODULE_ALIAS("md"); MODULE_ALIAS("md");
......
...@@ -439,7 +439,6 @@ struct mddev { ...@@ -439,7 +439,6 @@ struct mddev {
void (*sync_super)(struct mddev *mddev, struct md_rdev *rdev); void (*sync_super)(struct mddev *mddev, struct md_rdev *rdev);
}; };
static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *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);
...@@ -493,7 +492,6 @@ struct md_personality ...@@ -493,7 +492,6 @@ struct md_personality
void *(*takeover) (struct mddev *mddev); void *(*takeover) (struct mddev *mddev);
}; };
struct md_sysfs_entry { struct md_sysfs_entry {
struct attribute attr; struct attribute attr;
ssize_t (*show)(struct mddev *, char *); ssize_t (*show)(struct mddev *, char *);
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#define NR_RESERVED_BUFS 32 #define NR_RESERVED_BUFS 32
static int multipath_map (struct mpconf *conf) static int multipath_map (struct mpconf *conf)
{ {
int i, disks = conf->raid_disks; int i, disks = conf->raid_disks;
...@@ -68,7 +67,6 @@ static void multipath_reschedule_retry (struct multipath_bh *mp_bh) ...@@ -68,7 +67,6 @@ static void multipath_reschedule_retry (struct multipath_bh *mp_bh)
md_wakeup_thread(mddev->thread); md_wakeup_thread(mddev->thread);
} }
/* /*
* multipath_end_bh_io() is called when we have finished servicing a multipathed * multipath_end_bh_io() is called when we have finished servicing a multipathed
* operation and are ready to return a success/failure code to the buffer * operation and are ready to return a success/failure code to the buffer
...@@ -242,7 +240,6 @@ static void print_multipath_conf (struct mpconf *conf) ...@@ -242,7 +240,6 @@ static void print_multipath_conf (struct mpconf *conf)
} }
} }
static int multipath_add_disk(struct mddev *mddev, struct md_rdev *rdev) static int multipath_add_disk(struct mddev *mddev, struct md_rdev *rdev)
{ {
struct mpconf *conf = mddev->private; struct mpconf *conf = mddev->private;
...@@ -325,8 +322,6 @@ static int multipath_remove_disk(struct mddev *mddev, struct md_rdev *rdev) ...@@ -325,8 +322,6 @@ static int multipath_remove_disk(struct mddev *mddev, struct md_rdev *rdev)
return err; return err;
} }
/* /*
* This is a kernel thread which: * This is a kernel thread which:
* *
...@@ -512,7 +507,6 @@ static int multipath_run (struct mddev *mddev) ...@@ -512,7 +507,6 @@ static int multipath_run (struct mddev *mddev)
return -EIO; return -EIO;
} }
static int multipath_stop (struct mddev *mddev) static int multipath_stop (struct mddev *mddev)
{ {
struct mpconf *conf = mddev->private; struct mpconf *conf = mddev->private;
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
<maz@gloups.fdn.fr> <maz@gloups.fdn.fr>
Copyright (C) 1999, 2000 Ingo Molnar, Red Hat Copyright (C) 1999, 2000 Ingo Molnar, Red Hat
RAID-0 management functions. RAID-0 management functions.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
......
...@@ -494,7 +494,6 @@ static void raid1_end_write_request(struct bio *bio, int error) ...@@ -494,7 +494,6 @@ static void raid1_end_write_request(struct bio *bio, int error)
bio_put(to_put); bio_put(to_put);
} }
/* /*
* This routine returns the disk from which the requested read should * This routine returns the disk from which the requested read should
* be done. There is a per-array 'next expected sequential IO' sector * be done. There is a per-array 'next expected sequential IO' sector
...@@ -901,10 +900,10 @@ static sector_t wait_barrier(struct r1conf *conf, struct bio *bio) ...@@ -901,10 +900,10 @@ static sector_t wait_barrier(struct r1conf *conf, struct bio *bio)
* However if there are already pending * However if there are already pending
* requests (preventing the barrier from * requests (preventing the barrier from
* rising completely), and the * rising completely), and the
* pre-process bio queue isn't empty, * per-process bio queue isn't empty,
* then don't wait, as we need to empty * then don't wait, as we need to empty
* that queue to get the nr_pending * that queue to allow conf->start_next_window
* count down. * to increase.
*/ */
wait_event_lock_irq(conf->wait_barrier, wait_event_lock_irq(conf->wait_barrier,
!conf->array_frozen && !conf->array_frozen &&
...@@ -1001,7 +1000,6 @@ static void unfreeze_array(struct r1conf *conf) ...@@ -1001,7 +1000,6 @@ static void unfreeze_array(struct r1conf *conf)
spin_unlock_irq(&conf->resync_lock); spin_unlock_irq(&conf->resync_lock);
} }
/* duplicate the data pages for behind I/O /* duplicate the data pages for behind I/O
*/ */
static void alloc_behind_pages(struct bio *bio, struct r1bio *r1_bio) static void alloc_behind_pages(struct bio *bio, struct r1bio *r1_bio)
...@@ -1471,7 +1469,6 @@ static void status(struct seq_file *seq, struct mddev *mddev) ...@@ -1471,7 +1469,6 @@ static void status(struct seq_file *seq, struct mddev *mddev)
seq_printf(seq, "]"); seq_printf(seq, "]");
} }
static void error(struct mddev *mddev, struct md_rdev *rdev) static void error(struct mddev *mddev, struct md_rdev *rdev)
{ {
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
...@@ -1606,7 +1603,6 @@ static int raid1_spare_active(struct mddev *mddev) ...@@ -1606,7 +1603,6 @@ static int raid1_spare_active(struct mddev *mddev)
return count; return count;
} }
static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev) static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev)
{ {
struct r1conf *conf = mddev->private; struct r1conf *conf = mddev->private;
...@@ -1735,7 +1731,6 @@ static int raid1_remove_disk(struct mddev *mddev, struct md_rdev *rdev) ...@@ -1735,7 +1731,6 @@ static int raid1_remove_disk(struct mddev *mddev, struct md_rdev *rdev)
return err; return err;
} }
static void end_sync_read(struct bio *bio, int error) static void end_sync_read(struct bio *bio, int error)
{ {
struct r1bio *r1_bio = bio->bi_private; struct r1bio *r1_bio = bio->bi_private;
...@@ -1947,7 +1942,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) ...@@ -1947,7 +1942,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
return 1; return 1;
} }
static int process_checks(struct r1bio *r1_bio) static void process_checks(struct r1bio *r1_bio)
{ {
/* We have read all readable devices. If we haven't /* We have read all readable devices. If we haven't
* got the block, then there is no hope left. * got the block, then there is no hope left.
...@@ -2039,7 +2034,6 @@ static int process_checks(struct r1bio *r1_bio) ...@@ -2039,7 +2034,6 @@ static int process_checks(struct r1bio *r1_bio)
bio_copy_data(sbio, pbio); bio_copy_data(sbio, pbio);
} }
return 0;
} }
static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio) static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
...@@ -2057,8 +2051,8 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio) ...@@ -2057,8 +2051,8 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
return; return;
if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
if (process_checks(r1_bio) < 0) process_checks(r1_bio);
return;
/* /*
* schedule writes * schedule writes
*/ */
...@@ -2458,7 +2452,6 @@ static void raid1d(struct md_thread *thread) ...@@ -2458,7 +2452,6 @@ static void raid1d(struct md_thread *thread)
blk_finish_plug(&plug); blk_finish_plug(&plug);
} }
static int init_resync(struct r1conf *conf) static int init_resync(struct r1conf *conf)
{ {
int buffs; int buffs;
...@@ -2722,7 +2715,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp ...@@ -2722,7 +2715,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp
/* remove last page from this bio */ /* remove last page from this bio */
bio->bi_vcnt--; bio->bi_vcnt--;
bio->bi_iter.bi_size -= len; bio->bi_iter.bi_size -= len;
bio->bi_flags &= ~(1<< BIO_SEG_VALID); __clear_bit(BIO_SEG_VALID, &bio->bi_flags);
} }
goto bio_full; goto bio_full;
} }
......
...@@ -90,7 +90,6 @@ struct r1conf { ...@@ -90,7 +90,6 @@ struct r1conf {
*/ */
int recovery_disabled; int recovery_disabled;
/* poolinfo contains information about the content of the /* poolinfo contains information about the content of the
* mempools - it changes when the array grows or shrinks * mempools - it changes when the array grows or shrinks
*/ */
...@@ -103,7 +102,6 @@ struct r1conf { ...@@ -103,7 +102,6 @@ struct r1conf {
*/ */
struct page *tmppage; struct page *tmppage;
/* 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.
*/ */
......
...@@ -366,7 +366,6 @@ static void raid10_end_read_request(struct bio *bio, int error) ...@@ -366,7 +366,6 @@ static void raid10_end_read_request(struct bio *bio, int error)
struct md_rdev *rdev; struct md_rdev *rdev;
struct r10conf *conf = r10_bio->mddev->private; struct r10conf *conf = r10_bio->mddev->private;
slot = r10_bio->read_slot; slot = r10_bio->read_slot;
dev = r10_bio->devs[slot].devnum; dev = r10_bio->devs[slot].devnum;
rdev = r10_bio->devs[slot].rdev; rdev = r10_bio->devs[slot].rdev;
...@@ -1559,7 +1558,6 @@ static void make_request(struct mddev *mddev, struct bio *bio) ...@@ -1559,7 +1558,6 @@ static void make_request(struct mddev *mddev, struct bio *bio)
md_write_start(mddev, bio); md_write_start(mddev, bio);
do { do {
/* /*
...@@ -1782,7 +1780,6 @@ static int raid10_spare_active(struct mddev *mddev) ...@@ -1782,7 +1780,6 @@ static int raid10_spare_active(struct mddev *mddev)
return count; return count;
} }
static int raid10_add_disk(struct mddev *mddev, struct md_rdev *rdev) static int raid10_add_disk(struct mddev *mddev, struct md_rdev *rdev)
{ {
struct r10conf *conf = mddev->private; struct r10conf *conf = mddev->private;
...@@ -1929,7 +1926,6 @@ static int raid10_remove_disk(struct mddev *mddev, struct md_rdev *rdev) ...@@ -1929,7 +1926,6 @@ static int raid10_remove_disk(struct mddev *mddev, struct md_rdev *rdev)
return err; return err;
} }
static void end_sync_read(struct bio *bio, int error) static void end_sync_read(struct bio *bio, int error)
{ {
struct r10bio *r10_bio = bio->bi_private; struct r10bio *r10_bio = bio->bi_private;
...@@ -2295,7 +2291,6 @@ static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio) ...@@ -2295,7 +2291,6 @@ static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio)
} }
} }
/* /*
* Used by fix_read_error() to decay the per rdev read_errors. * Used by fix_read_error() to decay the per rdev read_errors.
* We halve the read error count for every hour that has elapsed * We halve the read error count for every hour that has elapsed
...@@ -2852,7 +2847,6 @@ static void raid10d(struct md_thread *thread) ...@@ -2852,7 +2847,6 @@ static void raid10d(struct md_thread *thread)
blk_finish_plug(&plug); blk_finish_plug(&plug);
} }
static int init_resync(struct r10conf *conf) static int init_resync(struct r10conf *conf)
{ {
int buffs; int buffs;
...@@ -3388,7 +3382,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, ...@@ -3388,7 +3382,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
/* remove last page from this bio */ /* remove last page from this bio */
bio2->bi_vcnt--; bio2->bi_vcnt--;
bio2->bi_iter.bi_size -= len; bio2->bi_iter.bi_size -= len;
bio2->bi_flags &= ~(1<< BIO_SEG_VALID); __clear_bit(BIO_SEG_VALID, &bio2->bi_flags);
} }
goto bio_full; goto bio_full;
} }
...@@ -3776,7 +3770,6 @@ static int run(struct mddev *mddev) ...@@ -3776,7 +3770,6 @@ static int run(struct mddev *mddev)
blk_queue_merge_bvec(mddev->queue, raid10_mergeable_bvec); blk_queue_merge_bvec(mddev->queue, raid10_mergeable_bvec);
} }
if (md_integrity_register(mddev)) if (md_integrity_register(mddev))
goto out_free_conf; goto out_free_conf;
...@@ -3834,6 +3827,8 @@ static int stop(struct mddev *mddev) ...@@ -3834,6 +3827,8 @@ static int stop(struct mddev *mddev)
mempool_destroy(conf->r10bio_pool); mempool_destroy(conf->r10bio_pool);
safe_put_page(conf->tmppage); safe_put_page(conf->tmppage);
kfree(conf->mirrors); kfree(conf->mirrors);
kfree(conf->mirrors_old);
kfree(conf->mirrors_new);
kfree(conf); kfree(conf);
mddev->private = NULL; mddev->private = NULL;
return 0; return 0;
...@@ -4121,7 +4116,7 @@ static int raid10_start_reshape(struct mddev *mddev) ...@@ -4121,7 +4116,7 @@ static int raid10_start_reshape(struct mddev *mddev)
memcpy(conf->mirrors_new, conf->mirrors, memcpy(conf->mirrors_new, conf->mirrors,
sizeof(struct raid10_info)*conf->prev.raid_disks); sizeof(struct raid10_info)*conf->prev.raid_disks);
smp_mb(); smp_mb();
kfree(conf->mirrors_old); /* FIXME and elsewhere */ kfree(conf->mirrors_old);
conf->mirrors_old = conf->mirrors; conf->mirrors_old = conf->mirrors;
conf->mirrors = conf->mirrors_new; conf->mirrors = conf->mirrors_new;
conf->mirrors_new = NULL; conf->mirrors_new = NULL;
...@@ -4416,7 +4411,7 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, ...@@ -4416,7 +4411,7 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr,
read_bio->bi_end_io = end_sync_read; read_bio->bi_end_io = end_sync_read;
read_bio->bi_rw = READ; read_bio->bi_rw = READ;
read_bio->bi_flags &= (~0UL << BIO_RESET_BITS); read_bio->bi_flags &= (~0UL << BIO_RESET_BITS);
read_bio->bi_flags |= 1 << BIO_UPTODATE; __set_bit(BIO_UPTODATE, &read_bio->bi_flags);
read_bio->bi_vcnt = 0; read_bio->bi_vcnt = 0;
read_bio->bi_iter.bi_size = 0; read_bio->bi_iter.bi_size = 0;
r10_bio->master_bio = read_bio; r10_bio->master_bio = read_bio;
...@@ -4473,7 +4468,7 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, ...@@ -4473,7 +4468,7 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr,
/* Remove last page from this bio */ /* Remove last page from this bio */
bio2->bi_vcnt--; bio2->bi_vcnt--;
bio2->bi_iter.bi_size -= len; bio2->bi_iter.bi_size -= len;
bio2->bi_flags &= ~(1<<BIO_SEG_VALID); __clear_bit(BIO_SEG_VALID, &bio2->bi_flags);
} }
goto bio_full; goto bio_full;
} }
...@@ -4575,7 +4570,6 @@ static void end_reshape(struct r10conf *conf) ...@@ -4575,7 +4570,6 @@ static void end_reshape(struct r10conf *conf)
conf->fullsync = 0; conf->fullsync = 0;
} }
static int handle_reshape_read_error(struct mddev *mddev, static int handle_reshape_read_error(struct mddev *mddev,
struct r10bio *r10_bio) struct r10bio *r10_bio)
{ {
......
...@@ -463,7 +463,6 @@ static inline void insert_hash(struct r5conf *conf, struct stripe_head *sh) ...@@ -463,7 +463,6 @@ static inline void insert_hash(struct r5conf *conf, struct stripe_head *sh)
hlist_add_head(&sh->hash, hp); hlist_add_head(&sh->hash, hp);
} }
/* find an idle stripe, make sure it is unhashed, and return it. */ /* find an idle stripe, make sure it is unhashed, and return it. */
static struct stripe_head *get_free_stripe(struct r5conf *conf, int hash) static struct stripe_head *get_free_stripe(struct r5conf *conf, int hash)
{ {
...@@ -531,9 +530,7 @@ static void init_stripe(struct stripe_head *sh, sector_t sector, int previous) ...@@ -531,9 +530,7 @@ static void init_stripe(struct stripe_head *sh, sector_t sector, int previous)
BUG_ON(stripe_operations_active(sh)); BUG_ON(stripe_operations_active(sh));
pr_debug("init_stripe called, stripe %llu\n", pr_debug("init_stripe called, stripe %llu\n",
(unsigned long long)sh->sector); (unsigned long long)sector);
remove_hash(sh);
retry: retry:
seq = read_seqcount_begin(&conf->gen_lock); seq = read_seqcount_begin(&conf->gen_lock);
sh->generation = conf->generation - previous; sh->generation = conf->generation - previous;
...@@ -542,7 +539,6 @@ static void init_stripe(struct stripe_head *sh, sector_t sector, int previous) ...@@ -542,7 +539,6 @@ static void init_stripe(struct stripe_head *sh, sector_t sector, int previous)
stripe_set_idx(sector, conf, previous, sh); stripe_set_idx(sector, conf, previous, sh);
sh->state = 0; sh->state = 0;
for (i = sh->disks; i--; ) { for (i = sh->disks; i--; ) {
struct r5dev *dev = &sh->dev[i]; struct r5dev *dev = &sh->dev[i];
...@@ -1350,7 +1346,6 @@ ops_run_compute6_2(struct stripe_head *sh, struct raid5_percpu *percpu) ...@@ -1350,7 +1346,6 @@ ops_run_compute6_2(struct stripe_head *sh, struct raid5_percpu *percpu)
} }
} }
static void ops_complete_prexor(void *stripe_head_ref) static void ops_complete_prexor(void *stripe_head_ref)
{ {
struct stripe_head *sh = stripe_head_ref; struct stripe_head *sh = stripe_head_ref;
...@@ -2419,7 +2414,6 @@ static sector_t raid5_compute_sector(struct r5conf *conf, sector_t r_sector, ...@@ -2419,7 +2414,6 @@ static sector_t raid5_compute_sector(struct r5conf *conf, sector_t r_sector,
return new_sector; return new_sector;
} }
static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous) static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous)
{ {
struct r5conf *conf = sh->raid_conf; struct r5conf *conf = sh->raid_conf;
...@@ -2437,7 +2431,6 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous) ...@@ -2437,7 +2431,6 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous)
sector_t r_sector; sector_t r_sector;
struct stripe_head sh2; struct stripe_head sh2;
chunk_offset = sector_div(new_sector, sectors_per_chunk); chunk_offset = sector_div(new_sector, sectors_per_chunk);
stripe = new_sector; stripe = new_sector;
...@@ -2541,7 +2534,6 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous) ...@@ -2541,7 +2534,6 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous)
return r_sector; return r_sector;
} }
static void static void
schedule_reconstruction(struct stripe_head *sh, struct stripe_head_state *s, schedule_reconstruction(struct stripe_head *sh, struct stripe_head_state *s,
int rcw, int expand) int rcw, int expand)
...@@ -3013,7 +3005,6 @@ static void handle_stripe_fill(struct stripe_head *sh, ...@@ -3013,7 +3005,6 @@ static void handle_stripe_fill(struct stripe_head *sh,
set_bit(STRIPE_HANDLE, &sh->state); set_bit(STRIPE_HANDLE, &sh->state);
} }
/* handle_stripe_clean_event /* handle_stripe_clean_event
* any written block on an uptodate or failed drive can be returned. * any written block on an uptodate or failed drive can be returned.
* Note that if we 'wrote' to a failed drive, it will be UPTODATE, but * Note that if we 'wrote' to a failed drive, it will be UPTODATE, but
...@@ -3304,7 +3295,6 @@ static void handle_parity_checks5(struct r5conf *conf, struct stripe_head *sh, ...@@ -3304,7 +3295,6 @@ static void handle_parity_checks5(struct r5conf *conf, struct stripe_head *sh,
} }
} }
static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh, static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh,
struct stripe_head_state *s, struct stripe_head_state *s,
int disks) int disks)
...@@ -3939,7 +3929,6 @@ static void handle_stripe(struct stripe_head *sh) ...@@ -3939,7 +3929,6 @@ static void handle_stripe(struct stripe_head *sh)
} }
} }
/* Finish reconstruct operations initiated by the expansion process */ /* Finish reconstruct operations initiated by the expansion process */
if (sh->reconstruct_state == reconstruct_state_result) { if (sh->reconstruct_state == reconstruct_state_result) {
struct stripe_head *sh_src struct stripe_head *sh_src
...@@ -4137,7 +4126,6 @@ static int raid5_mergeable_bvec(struct request_queue *q, ...@@ -4137,7 +4126,6 @@ static int raid5_mergeable_bvec(struct request_queue *q,
return max; return max;
} }
static int in_chunk_boundary(struct mddev *mddev, struct bio *bio) static int in_chunk_boundary(struct mddev *mddev, struct bio *bio)
{ {
sector_t sector = bio->bi_iter.bi_sector + get_start_sect(bio->bi_bdev); sector_t sector = bio->bi_iter.bi_sector + get_start_sect(bio->bi_bdev);
...@@ -4167,7 +4155,6 @@ static void add_bio_to_retry(struct bio *bi,struct r5conf *conf) ...@@ -4167,7 +4155,6 @@ static void add_bio_to_retry(struct bio *bi,struct r5conf *conf)
md_wakeup_thread(conf->mddev->thread); md_wakeup_thread(conf->mddev->thread);
} }
static struct bio *remove_bio_from_retry(struct r5conf *conf) static struct bio *remove_bio_from_retry(struct r5conf *conf)
{ {
struct bio *bi; struct bio *bi;
...@@ -4191,7 +4178,6 @@ static struct bio *remove_bio_from_retry(struct r5conf *conf) ...@@ -4191,7 +4178,6 @@ static struct bio *remove_bio_from_retry(struct r5conf *conf)
return bi; return bi;
} }
/* /*
* The "raid5_align_endio" should check if the read succeeded and if it * The "raid5_align_endio" should check if the read succeeded and if it
* did, call bio_endio on the original bio (having bio_put the new bio * did, call bio_endio on the original bio (having bio_put the new bio
...@@ -4224,7 +4210,6 @@ static void raid5_align_endio(struct bio *bi, int error) ...@@ -4224,7 +4210,6 @@ static void raid5_align_endio(struct bio *bi, int error)
return; return;
} }
pr_debug("raid5_align_endio : io error...handing IO for a retry\n"); pr_debug("raid5_align_endio : io error...handing IO for a retry\n");
add_bio_to_retry(raid_bi, conf); add_bio_to_retry(raid_bi, conf);
...@@ -4249,7 +4234,6 @@ static int bio_fits_rdev(struct bio *bi) ...@@ -4249,7 +4234,6 @@ static int bio_fits_rdev(struct bio *bi)
return 1; return 1;
} }
static int chunk_aligned_read(struct mddev *mddev, struct bio * raid_bio) static int chunk_aligned_read(struct mddev *mddev, struct bio * raid_bio)
{ {
struct r5conf *conf = mddev->private; struct r5conf *conf = mddev->private;
...@@ -4301,7 +4285,7 @@ static int chunk_aligned_read(struct mddev *mddev, struct bio * raid_bio) ...@@ -4301,7 +4285,7 @@ static int chunk_aligned_read(struct mddev *mddev, struct bio * raid_bio)
rcu_read_unlock(); rcu_read_unlock();
raid_bio->bi_next = (void*)rdev; raid_bio->bi_next = (void*)rdev;
align_bi->bi_bdev = rdev->bdev; align_bi->bi_bdev = rdev->bdev;
align_bi->bi_flags &= ~(1 << BIO_SEG_VALID); __clear_bit(BIO_SEG_VALID, &align_bi->bi_flags);
if (!bio_fits_rdev(align_bi) || if (!bio_fits_rdev(align_bi) ||
is_badblock(rdev, align_bi->bi_iter.bi_sector, is_badblock(rdev, align_bi->bi_iter.bi_sector,
...@@ -5446,7 +5430,6 @@ raid5_skip_copy = __ATTR(skip_copy, S_IRUGO | S_IWUSR, ...@@ -5446,7 +5430,6 @@ raid5_skip_copy = __ATTR(skip_copy, S_IRUGO | S_IWUSR,
raid5_show_skip_copy, raid5_show_skip_copy,
raid5_store_skip_copy); raid5_store_skip_copy);
static ssize_t static ssize_t
stripe_cache_active_show(struct mddev *mddev, char *page) stripe_cache_active_show(struct mddev *mddev, char *page)
{ {
...@@ -5898,7 +5881,6 @@ static struct r5conf *setup_conf(struct mddev *mddev) ...@@ -5898,7 +5881,6 @@ static struct r5conf *setup_conf(struct mddev *mddev)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
static int only_parity(int raid_disk, int algo, int raid_disks, int max_degraded) static int only_parity(int raid_disk, int algo, int raid_disks, int max_degraded)
{ {
switch (algo) { switch (algo) {
...@@ -6165,7 +6147,6 @@ static int run(struct mddev *mddev) ...@@ -6165,7 +6147,6 @@ static int run(struct mddev *mddev)
"reshape"); "reshape");
} }
/* Ok, everything is just fine now */ /* Ok, everything is just fine now */
if (mddev->to_remove == &raid5_attrs_group) if (mddev->to_remove == &raid5_attrs_group)
mddev->to_remove = NULL; mddev->to_remove = NULL;
...@@ -6814,7 +6795,6 @@ static void raid5_quiesce(struct mddev *mddev, int state) ...@@ -6814,7 +6795,6 @@ static void raid5_quiesce(struct mddev *mddev, int state)
} }
} }
static void *raid45_takeover_raid0(struct mddev *mddev, int level) static void *raid45_takeover_raid0(struct mddev *mddev, int level)
{ {
struct r0conf *raid0_conf = mddev->private; struct r0conf *raid0_conf = mddev->private;
...@@ -6841,7 +6821,6 @@ static void *raid45_takeover_raid0(struct mddev *mddev, int level) ...@@ -6841,7 +6821,6 @@ static void *raid45_takeover_raid0(struct mddev *mddev, int level)
return setup_conf(mddev); return setup_conf(mddev);
} }
static void *raid5_takeover_raid1(struct mddev *mddev) static void *raid5_takeover_raid1(struct mddev *mddev)
{ {
int chunksect; int chunksect;
...@@ -6902,7 +6881,6 @@ static void *raid5_takeover_raid6(struct mddev *mddev) ...@@ -6902,7 +6881,6 @@ static void *raid5_takeover_raid6(struct mddev *mddev)
return setup_conf(mddev); return setup_conf(mddev);
} }
static int raid5_check_reshape(struct mddev *mddev) static int raid5_check_reshape(struct mddev *mddev)
{ {
/* For a 2-drive array, the layout and chunk size can be changed /* For a 2-drive array, the layout and chunk size can be changed
...@@ -7051,7 +7029,6 @@ static void *raid6_takeover(struct mddev *mddev) ...@@ -7051,7 +7029,6 @@ static void *raid6_takeover(struct mddev *mddev)
return setup_conf(mddev); return setup_conf(mddev);
} }
static struct md_personality raid6_personality = static struct md_personality raid6_personality =
{ {
.name = "raid6", .name = "raid6",
......
...@@ -364,7 +364,6 @@ enum { ...@@ -364,7 +364,6 @@ enum {
* HANDLE gets cleared if stripe_handle leaves nothing locked. * HANDLE gets cleared if stripe_handle leaves nothing locked.
*/ */
struct disk_info { struct disk_info {
struct md_rdev *rdev, *replacement; struct md_rdev *rdev, *replacement;
}; };
...@@ -528,7 +527,6 @@ struct r5conf { ...@@ -528,7 +527,6 @@ struct r5conf {
#define ALGORITHM_ROTATING_N_RESTART 9 /* DDF PRL=6 RLQ=2 */ #define ALGORITHM_ROTATING_N_RESTART 9 /* DDF PRL=6 RLQ=2 */
#define ALGORITHM_ROTATING_N_CONTINUE 10 /*DDF PRL=6 RLQ=3 */ #define ALGORITHM_ROTATING_N_CONTINUE 10 /*DDF PRL=6 RLQ=3 */
/* For every RAID5 algorithm we define a RAID6 algorithm /* For every RAID5 algorithm we define a RAID6 algorithm
* with exactly the same layout for data and parity, and * with exactly the same layout for data and parity, and
* with the Q block always on the last device (N-1). * with the Q block always on the last device (N-1).
......
...@@ -39,7 +39,6 @@ ...@@ -39,7 +39,6 @@
#define RAID_VERSION _IOR (MD_MAJOR, 0x10, mdu_version_t) #define RAID_VERSION _IOR (MD_MAJOR, 0x10, mdu_version_t)
#define GET_ARRAY_INFO _IOR (MD_MAJOR, 0x11, mdu_array_info_t) #define GET_ARRAY_INFO _IOR (MD_MAJOR, 0x11, mdu_array_info_t)
#define GET_DISK_INFO _IOR (MD_MAJOR, 0x12, mdu_disk_info_t) #define GET_DISK_INFO _IOR (MD_MAJOR, 0x12, mdu_disk_info_t)
#define PRINT_RAID_DEBUG _IO (MD_MAJOR, 0x13)
#define RAID_AUTORUN _IO (MD_MAJOR, 0x14) #define RAID_AUTORUN _IO (MD_MAJOR, 0x14)
#define GET_BITMAP_FILE _IOR (MD_MAJOR, 0x15, mdu_bitmap_file_t) #define GET_BITMAP_FILE _IOR (MD_MAJOR, 0x15, mdu_bitmap_file_t)
......
...@@ -121,9 +121,9 @@ static inline const struct raid6_recov_calls *raid6_choose_recov(void) ...@@ -121,9 +121,9 @@ static inline const struct raid6_recov_calls *raid6_choose_recov(void)
raid6_2data_recov = best->data2; raid6_2data_recov = best->data2;
raid6_datap_recov = best->datap; raid6_datap_recov = best->datap;
printk("raid6: using %s recovery algorithm\n", best->name); pr_info("raid6: using %s recovery algorithm\n", best->name);
} else } else
printk("raid6: Yikes! No recovery algorithm found!\n"); pr_err("raid6: Yikes! No recovery algorithm found!\n");
return best; return best;
} }
...@@ -157,18 +157,18 @@ static inline const struct raid6_calls *raid6_choose_gen( ...@@ -157,18 +157,18 @@ static inline const struct raid6_calls *raid6_choose_gen(
bestperf = perf; bestperf = perf;
best = *algo; best = *algo;
} }
printk("raid6: %-8s %5ld MB/s\n", (*algo)->name, pr_info("raid6: %-8s %5ld MB/s\n", (*algo)->name,
(perf*HZ) >> (20-16+RAID6_TIME_JIFFIES_LG2)); (perf*HZ) >> (20-16+RAID6_TIME_JIFFIES_LG2));
} }
} }
if (best) { if (best) {
printk("raid6: using algorithm %s (%ld MB/s)\n", pr_info("raid6: using algorithm %s (%ld MB/s)\n",
best->name, best->name,
(bestperf*HZ) >> (20-16+RAID6_TIME_JIFFIES_LG2)); (bestperf*HZ) >> (20-16+RAID6_TIME_JIFFIES_LG2));
raid6_call = *best; raid6_call = *best;
} else } else
printk("raid6: Yikes! No algorithm found!\n"); pr_err("raid6: Yikes! No algorithm found!\n");
return best; return best;
} }
...@@ -194,7 +194,7 @@ int __init raid6_select_algo(void) ...@@ -194,7 +194,7 @@ int __init raid6_select_algo(void)
syndromes = (void *) __get_free_pages(GFP_KERNEL, 1); syndromes = (void *) __get_free_pages(GFP_KERNEL, 1);
if (!syndromes) { if (!syndromes) {
printk("raid6: Yikes! No memory available.\n"); pr_err("raid6: Yikes! No memory available.\n");
return -ENOMEM; return -ENOMEM;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment