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