Commit 9729a6eb authored by Linus Torvalds's avatar Linus Torvalds

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

* 'for-linus' of git://neil.brown.name/md: (39 commits)
  md/raid5: correctly update sync_completed when we reach max_resync
  md/raid5: add missing call to schedule() after prepare_to_wait()
  md/linear: use call_rcu to free obsolete 'conf' structures.
  md linear: Protecting mddev with rcu locks to avoid races
  md: Move check for bitmap presence to personality code.
  md: remove chunksize rounding from common code.
  md: raid0/linear: ensure device sizes are rounded to chunk size.
  md: move assignment of ->utime so that it never gets skipped.
  md: Push down reconstruction log message to personality code.
  md: merge reconfig and check_reshape methods.
  md: remove unnecessary arguments from ->reconfig method.
  md: raid5: check stripe cache is large enough in start_reshape
  md: raid0: chunk_sectors cleanups.
  md: fix some comments.
  md/raid5: Use is_power_of_2() in raid5_reconfig()/raid6_reconfig().
  md: convert conf->chunk_size and conf->prev_chunk to sectors.
  md: Convert mddev->new_chunk to sectors.
  md: Make mddev->chunk_size sector-based.
  md: raid0 :Enables chunk size other than powers of 2.
  md: prepare for non-power-of-two chunk sizes
  ...
parents 5ae8606d 48606a9f
...@@ -255,14 +255,14 @@ static void status(struct seq_file *seq, mddev_t *mddev) ...@@ -255,14 +255,14 @@ static void status(struct seq_file *seq, mddev_t *mddev)
} }
static int reconfig(mddev_t *mddev, int layout, int chunk_size) static int reshape(mddev_t *mddev)
{ {
int mode = layout & ModeMask; int mode = mddev->new_layout & ModeMask;
int count = layout >> ModeShift; int count = mddev->new_layout >> ModeShift;
conf_t *conf = mddev->private; conf_t *conf = mddev->private;
if (chunk_size != -1) if (mddev->new_layout < 0)
return -EINVAL; return 0;
/* new layout */ /* new layout */
if (mode == ClearFaults) if (mode == ClearFaults)
...@@ -279,6 +279,7 @@ static int reconfig(mddev_t *mddev, int layout, int chunk_size) ...@@ -279,6 +279,7 @@ static int reconfig(mddev_t *mddev, int layout, int chunk_size)
atomic_set(&conf->counters[mode], count); atomic_set(&conf->counters[mode], count);
} else } else
return -EINVAL; return -EINVAL;
mddev->new_layout = -1;
mddev->layout = -1; /* makes sure further changes come through */ mddev->layout = -1; /* makes sure further changes come through */
return 0; return 0;
} }
...@@ -298,8 +299,12 @@ static int run(mddev_t *mddev) ...@@ -298,8 +299,12 @@ static int run(mddev_t *mddev)
{ {
mdk_rdev_t *rdev; mdk_rdev_t *rdev;
int i; int i;
conf_t *conf;
if (md_check_no_bitmap(mddev))
return -EINVAL;
conf_t *conf = kmalloc(sizeof(*conf), GFP_KERNEL); conf = kmalloc(sizeof(*conf), GFP_KERNEL);
if (!conf) if (!conf)
return -ENOMEM; return -ENOMEM;
...@@ -315,7 +320,7 @@ static int run(mddev_t *mddev) ...@@ -315,7 +320,7 @@ static int run(mddev_t *mddev)
md_set_array_sectors(mddev, faulty_size(mddev, 0, 0)); md_set_array_sectors(mddev, faulty_size(mddev, 0, 0));
mddev->private = conf; mddev->private = conf;
reconfig(mddev, mddev->layout, -1); reshape(mddev);
return 0; return 0;
} }
...@@ -338,7 +343,7 @@ static struct mdk_personality faulty_personality = ...@@ -338,7 +343,7 @@ static struct mdk_personality faulty_personality =
.run = run, .run = run,
.stop = stop, .stop = stop,
.status = status, .status = status,
.reconfig = reconfig, .check_reshape = reshape,
.size = faulty_size, .size = faulty_size,
}; };
......
This diff is collapsed.
...@@ -3,27 +3,19 @@ ...@@ -3,27 +3,19 @@
struct dev_info { struct dev_info {
mdk_rdev_t *rdev; mdk_rdev_t *rdev;
sector_t num_sectors; sector_t end_sector;
sector_t start_sector;
}; };
typedef struct dev_info dev_info_t; typedef struct dev_info dev_info_t;
struct linear_private_data struct linear_private_data
{ {
struct linear_private_data *prev; /* earlier version */
dev_info_t **hash_table;
sector_t spacing;
sector_t array_sectors; sector_t array_sectors;
int sector_shift; /* shift before dividing
* by spacing
*/
dev_info_t disks[0]; dev_info_t disks[0];
struct rcu_head rcu;
}; };
typedef struct linear_private_data linear_conf_t; typedef struct linear_private_data linear_conf_t;
#define mddev_to_conf(mddev) ((linear_conf_t *) mddev->private)
#endif #endif
This diff is collapsed.
...@@ -29,13 +29,6 @@ ...@@ -29,13 +29,6 @@
typedef struct mddev_s mddev_t; typedef struct mddev_s mddev_t;
typedef struct mdk_rdev_s mdk_rdev_t; typedef struct mdk_rdev_s mdk_rdev_t;
/*
* options passed in raidrun:
*/
/* Currently this must fit in an 'int' */
#define MAX_CHUNK_SIZE (1<<30)
/* /*
* MD's 'extended' device * MD's 'extended' device
*/ */
...@@ -145,7 +138,7 @@ struct mddev_s ...@@ -145,7 +138,7 @@ struct mddev_s
int external; /* metadata is int external; /* metadata is
* managed externally */ * managed externally */
char metadata_type[17]; /* externally set*/ char metadata_type[17]; /* externally set*/
int chunk_size; int chunk_sectors;
time_t ctime, utime; time_t ctime, utime;
int level, layout; int level, layout;
char clevel[16]; char clevel[16];
...@@ -166,7 +159,8 @@ struct mddev_s ...@@ -166,7 +159,8 @@ struct mddev_s
* If reshape_position is MaxSector, then no reshape is happening (yet). * If reshape_position is MaxSector, then no reshape is happening (yet).
*/ */
sector_t reshape_position; sector_t reshape_position;
int delta_disks, new_level, new_layout, new_chunk; int delta_disks, new_level, new_layout;
int new_chunk_sectors;
struct mdk_thread_s *thread; /* management thread */ struct mdk_thread_s *thread; /* management thread */
struct mdk_thread_s *sync_thread; /* doing resync or reconstruct */ struct mdk_thread_s *sync_thread; /* doing resync or reconstruct */
...@@ -325,7 +319,6 @@ struct mdk_personality ...@@ -325,7 +319,6 @@ struct mdk_personality
int (*check_reshape) (mddev_t *mddev); int (*check_reshape) (mddev_t *mddev);
int (*start_reshape) (mddev_t *mddev); int (*start_reshape) (mddev_t *mddev);
void (*finish_reshape) (mddev_t *mddev); void (*finish_reshape) (mddev_t *mddev);
int (*reconfig) (mddev_t *mddev, int layout, int chunk_size);
/* quiesce moves between quiescence states /* quiesce moves between quiescence states
* 0 - fully active * 0 - fully active
* 1 - no new requests allowed * 1 - no new requests allowed
...@@ -437,5 +430,6 @@ extern void md_new_event(mddev_t *mddev); ...@@ -437,5 +430,6 @@ extern void md_new_event(mddev_t *mddev);
extern int md_allow_write(mddev_t *mddev); extern int md_allow_write(mddev_t *mddev);
extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev); extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev);
extern void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors); extern void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors);
extern int md_check_no_bitmap(mddev_t *mddev);
#endif /* _MD_MD_H */ #endif /* _MD_MD_H */
...@@ -58,7 +58,7 @@ static void multipath_reschedule_retry (struct multipath_bh *mp_bh) ...@@ -58,7 +58,7 @@ static void multipath_reschedule_retry (struct multipath_bh *mp_bh)
{ {
unsigned long flags; unsigned long flags;
mddev_t *mddev = mp_bh->mddev; mddev_t *mddev = mp_bh->mddev;
multipath_conf_t *conf = mddev_to_conf(mddev); multipath_conf_t *conf = mddev->private;
spin_lock_irqsave(&conf->device_lock, flags); spin_lock_irqsave(&conf->device_lock, flags);
list_add(&mp_bh->retry_list, &conf->retry_list); list_add(&mp_bh->retry_list, &conf->retry_list);
...@@ -75,7 +75,7 @@ static void multipath_reschedule_retry (struct multipath_bh *mp_bh) ...@@ -75,7 +75,7 @@ static void multipath_reschedule_retry (struct multipath_bh *mp_bh)
static void multipath_end_bh_io (struct multipath_bh *mp_bh, int err) static void multipath_end_bh_io (struct multipath_bh *mp_bh, int err)
{ {
struct bio *bio = mp_bh->master_bio; struct bio *bio = mp_bh->master_bio;
multipath_conf_t *conf = mddev_to_conf(mp_bh->mddev); multipath_conf_t *conf = mp_bh->mddev->private;
bio_endio(bio, err); bio_endio(bio, err);
mempool_free(mp_bh, conf->pool); mempool_free(mp_bh, conf->pool);
...@@ -85,7 +85,7 @@ static void multipath_end_request(struct bio *bio, int error) ...@@ -85,7 +85,7 @@ static void multipath_end_request(struct bio *bio, int error)
{ {
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
struct multipath_bh * mp_bh = (struct multipath_bh *)(bio->bi_private); struct multipath_bh * mp_bh = (struct multipath_bh *)(bio->bi_private);
multipath_conf_t *conf = mddev_to_conf(mp_bh->mddev); multipath_conf_t *conf = mp_bh->mddev->private;
mdk_rdev_t *rdev = conf->multipaths[mp_bh->path].rdev; mdk_rdev_t *rdev = conf->multipaths[mp_bh->path].rdev;
if (uptodate) if (uptodate)
...@@ -107,7 +107,7 @@ static void multipath_end_request(struct bio *bio, int error) ...@@ -107,7 +107,7 @@ static void multipath_end_request(struct bio *bio, int error)
static void unplug_slaves(mddev_t *mddev) static void unplug_slaves(mddev_t *mddev)
{ {
multipath_conf_t *conf = mddev_to_conf(mddev); multipath_conf_t *conf = mddev->private;
int i; int i;
rcu_read_lock(); rcu_read_lock();
...@@ -138,7 +138,7 @@ static void multipath_unplug(struct request_queue *q) ...@@ -138,7 +138,7 @@ static void multipath_unplug(struct request_queue *q)
static int multipath_make_request (struct request_queue *q, struct bio * bio) static int multipath_make_request (struct request_queue *q, struct bio * bio)
{ {
mddev_t *mddev = q->queuedata; mddev_t *mddev = q->queuedata;
multipath_conf_t *conf = mddev_to_conf(mddev); multipath_conf_t *conf = mddev->private;
struct multipath_bh * mp_bh; struct multipath_bh * mp_bh;
struct multipath_info *multipath; struct multipath_info *multipath;
const int rw = bio_data_dir(bio); const int rw = bio_data_dir(bio);
...@@ -180,7 +180,7 @@ static int multipath_make_request (struct request_queue *q, struct bio * bio) ...@@ -180,7 +180,7 @@ static int multipath_make_request (struct request_queue *q, struct bio * bio)
static void multipath_status (struct seq_file *seq, mddev_t *mddev) static void multipath_status (struct seq_file *seq, mddev_t *mddev)
{ {
multipath_conf_t *conf = mddev_to_conf(mddev); multipath_conf_t *conf = mddev->private;
int i; int i;
seq_printf (seq, " [%d/%d] [", conf->raid_disks, seq_printf (seq, " [%d/%d] [", conf->raid_disks,
...@@ -195,7 +195,7 @@ static void multipath_status (struct seq_file *seq, mddev_t *mddev) ...@@ -195,7 +195,7 @@ static void multipath_status (struct seq_file *seq, mddev_t *mddev)
static int multipath_congested(void *data, int bits) static int multipath_congested(void *data, int bits)
{ {
mddev_t *mddev = data; mddev_t *mddev = data;
multipath_conf_t *conf = mddev_to_conf(mddev); multipath_conf_t *conf = mddev->private;
int i, ret = 0; int i, ret = 0;
rcu_read_lock(); rcu_read_lock();
...@@ -220,7 +220,7 @@ static int multipath_congested(void *data, int bits) ...@@ -220,7 +220,7 @@ static int multipath_congested(void *data, int bits)
*/ */
static void multipath_error (mddev_t *mddev, mdk_rdev_t *rdev) static void multipath_error (mddev_t *mddev, mdk_rdev_t *rdev)
{ {
multipath_conf_t *conf = mddev_to_conf(mddev); multipath_conf_t *conf = mddev->private;
if (conf->working_disks <= 1) { if (conf->working_disks <= 1) {
/* /*
...@@ -367,7 +367,7 @@ static void multipathd (mddev_t *mddev) ...@@ -367,7 +367,7 @@ static void multipathd (mddev_t *mddev)
struct multipath_bh *mp_bh; struct multipath_bh *mp_bh;
struct bio *bio; struct bio *bio;
unsigned long flags; unsigned long flags;
multipath_conf_t *conf = mddev_to_conf(mddev); multipath_conf_t *conf = mddev->private;
struct list_head *head = &conf->retry_list; struct list_head *head = &conf->retry_list;
md_check_recovery(mddev); md_check_recovery(mddev);
...@@ -421,6 +421,9 @@ static int multipath_run (mddev_t *mddev) ...@@ -421,6 +421,9 @@ static int multipath_run (mddev_t *mddev)
struct multipath_info *disk; struct multipath_info *disk;
mdk_rdev_t *rdev; mdk_rdev_t *rdev;
if (md_check_no_bitmap(mddev))
return -EINVAL;
if (mddev->level != LEVEL_MULTIPATH) { if (mddev->level != LEVEL_MULTIPATH) {
printk("multipath: %s: raid level not set to multipath IO (%d)\n", printk("multipath: %s: raid level not set to multipath IO (%d)\n",
mdname(mddev), mddev->level); mdname(mddev), mddev->level);
...@@ -531,7 +534,7 @@ static int multipath_run (mddev_t *mddev) ...@@ -531,7 +534,7 @@ static int multipath_run (mddev_t *mddev)
static int multipath_stop (mddev_t *mddev) static int multipath_stop (mddev_t *mddev)
{ {
multipath_conf_t *conf = mddev_to_conf(mddev); multipath_conf_t *conf = mddev->private;
md_unregister_thread(mddev->thread); md_unregister_thread(mddev->thread);
mddev->thread = NULL; mddev->thread = NULL;
......
...@@ -18,12 +18,6 @@ struct multipath_private_data { ...@@ -18,12 +18,6 @@ struct multipath_private_data {
typedef struct multipath_private_data multipath_conf_t; typedef struct multipath_private_data multipath_conf_t;
/*
* this is the only point in the RAID code where we violate
* C type safety. mddev->private is an 'opaque' pointer.
*/
#define mddev_to_conf(mddev) ((multipath_conf_t *) mddev->private)
/* /*
* this is our 'private' 'collective' MULTIPATH buffer head. * this is our 'private' 'collective' MULTIPATH buffer head.
* it contains information about what kind of IO operations were started * it contains information about what kind of IO operations were started
......
This diff is collapsed.
...@@ -3,26 +3,18 @@ ...@@ -3,26 +3,18 @@
struct strip_zone struct strip_zone
{ {
sector_t zone_start; /* Zone offset in md_dev (in sectors) */ sector_t zone_end; /* Start of the next zone (in sectors) */
sector_t dev_start; /* Zone offset in real dev (in sectors) */ sector_t dev_start; /* Zone offset in real dev (in sectors) */
sector_t sectors; /* Zone size in sectors */
int nb_dev; /* # of devices attached to the zone */ int nb_dev; /* # of devices attached to the zone */
mdk_rdev_t **dev; /* Devices attached to the zone */
}; };
struct raid0_private_data struct raid0_private_data
{ {
struct strip_zone **hash_table; /* Table of indexes into strip_zone */
struct strip_zone *strip_zone; struct strip_zone *strip_zone;
mdk_rdev_t **devlist; /* lists of rdevs, pointed to by strip_zone->dev */ mdk_rdev_t **devlist; /* lists of rdevs, pointed to by strip_zone->dev */
int nr_strip_zones; int nr_strip_zones;
sector_t spacing;
int sector_shift; /* shift this before divide by spacing */
}; };
typedef struct raid0_private_data raid0_conf_t; typedef struct raid0_private_data raid0_conf_t;
#define mddev_to_conf(mddev) ((raid0_conf_t *) mddev->private)
#endif #endif
...@@ -182,7 +182,7 @@ static void put_all_bios(conf_t *conf, r1bio_t *r1_bio) ...@@ -182,7 +182,7 @@ static void put_all_bios(conf_t *conf, r1bio_t *r1_bio)
static void free_r1bio(r1bio_t *r1_bio) static void free_r1bio(r1bio_t *r1_bio)
{ {
conf_t *conf = mddev_to_conf(r1_bio->mddev); conf_t *conf = r1_bio->mddev->private;
/* /*
* Wake up any possible resync thread that waits for the device * Wake up any possible resync thread that waits for the device
...@@ -196,7 +196,7 @@ static void free_r1bio(r1bio_t *r1_bio) ...@@ -196,7 +196,7 @@ static void free_r1bio(r1bio_t *r1_bio)
static void put_buf(r1bio_t *r1_bio) static void put_buf(r1bio_t *r1_bio)
{ {
conf_t *conf = mddev_to_conf(r1_bio->mddev); conf_t *conf = r1_bio->mddev->private;
int i; int i;
for (i=0; i<conf->raid_disks; i++) { for (i=0; i<conf->raid_disks; i++) {
...@@ -214,7 +214,7 @@ static void reschedule_retry(r1bio_t *r1_bio) ...@@ -214,7 +214,7 @@ static void reschedule_retry(r1bio_t *r1_bio)
{ {
unsigned long flags; unsigned long flags;
mddev_t *mddev = r1_bio->mddev; mddev_t *mddev = r1_bio->mddev;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
spin_lock_irqsave(&conf->device_lock, flags); spin_lock_irqsave(&conf->device_lock, flags);
list_add(&r1_bio->retry_list, &conf->retry_list); list_add(&r1_bio->retry_list, &conf->retry_list);
...@@ -253,7 +253,7 @@ static void raid_end_bio_io(r1bio_t *r1_bio) ...@@ -253,7 +253,7 @@ static void raid_end_bio_io(r1bio_t *r1_bio)
*/ */
static inline void update_head_pos(int disk, r1bio_t *r1_bio) static inline void update_head_pos(int disk, r1bio_t *r1_bio)
{ {
conf_t *conf = mddev_to_conf(r1_bio->mddev); conf_t *conf = r1_bio->mddev->private;
conf->mirrors[disk].head_position = conf->mirrors[disk].head_position =
r1_bio->sector + (r1_bio->sectors); r1_bio->sector + (r1_bio->sectors);
...@@ -264,7 +264,7 @@ static void raid1_end_read_request(struct bio *bio, int error) ...@@ -264,7 +264,7 @@ static void raid1_end_read_request(struct bio *bio, int error)
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private); r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private);
int mirror; int mirror;
conf_t *conf = mddev_to_conf(r1_bio->mddev); conf_t *conf = r1_bio->mddev->private;
mirror = r1_bio->read_disk; mirror = r1_bio->read_disk;
/* /*
...@@ -309,7 +309,7 @@ static void raid1_end_write_request(struct bio *bio, int error) ...@@ -309,7 +309,7 @@ static void raid1_end_write_request(struct bio *bio, int error)
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private); r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private);
int mirror, behind = test_bit(R1BIO_BehindIO, &r1_bio->state); int mirror, behind = test_bit(R1BIO_BehindIO, &r1_bio->state);
conf_t *conf = mddev_to_conf(r1_bio->mddev); conf_t *conf = r1_bio->mddev->private;
struct bio *to_put = NULL; struct bio *to_put = NULL;
...@@ -541,7 +541,7 @@ static int read_balance(conf_t *conf, r1bio_t *r1_bio) ...@@ -541,7 +541,7 @@ static int read_balance(conf_t *conf, r1bio_t *r1_bio)
static void unplug_slaves(mddev_t *mddev) static void unplug_slaves(mddev_t *mddev)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int i; int i;
rcu_read_lock(); rcu_read_lock();
...@@ -573,7 +573,7 @@ static void raid1_unplug(struct request_queue *q) ...@@ -573,7 +573,7 @@ static void raid1_unplug(struct request_queue *q)
static int raid1_congested(void *data, int bits) static int raid1_congested(void *data, int bits)
{ {
mddev_t *mddev = data; mddev_t *mddev = data;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int i, ret = 0; int i, ret = 0;
rcu_read_lock(); rcu_read_lock();
...@@ -772,7 +772,7 @@ static struct page **alloc_behind_pages(struct bio *bio) ...@@ -772,7 +772,7 @@ static struct page **alloc_behind_pages(struct bio *bio)
static int make_request(struct request_queue *q, struct bio * bio) static int make_request(struct request_queue *q, struct bio * bio)
{ {
mddev_t *mddev = q->queuedata; mddev_t *mddev = q->queuedata;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
mirror_info_t *mirror; mirror_info_t *mirror;
r1bio_t *r1_bio; r1bio_t *r1_bio;
struct bio *read_bio; struct bio *read_bio;
...@@ -991,7 +991,7 @@ static int make_request(struct request_queue *q, struct bio * bio) ...@@ -991,7 +991,7 @@ static int make_request(struct request_queue *q, struct bio * bio)
static void status(struct seq_file *seq, mddev_t *mddev) static void status(struct seq_file *seq, mddev_t *mddev)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int i; int i;
seq_printf(seq, " [%d/%d] [", conf->raid_disks, seq_printf(seq, " [%d/%d] [", conf->raid_disks,
...@@ -1010,7 +1010,7 @@ static void status(struct seq_file *seq, mddev_t *mddev) ...@@ -1010,7 +1010,7 @@ static void status(struct seq_file *seq, mddev_t *mddev)
static void error(mddev_t *mddev, mdk_rdev_t *rdev) static void error(mddev_t *mddev, mdk_rdev_t *rdev)
{ {
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
/* /*
* If it is not operational, then we have already marked it as dead * If it is not operational, then we have already marked it as dead
...@@ -1214,7 +1214,7 @@ static void end_sync_write(struct bio *bio, int error) ...@@ -1214,7 +1214,7 @@ static void end_sync_write(struct bio *bio, int error)
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private); r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private);
mddev_t *mddev = r1_bio->mddev; mddev_t *mddev = r1_bio->mddev;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int i; int i;
int mirror=0; int mirror=0;
...@@ -1248,7 +1248,7 @@ static void end_sync_write(struct bio *bio, int error) ...@@ -1248,7 +1248,7 @@ static void end_sync_write(struct bio *bio, int error)
static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio) static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int i; int i;
int disks = conf->raid_disks; int disks = conf->raid_disks;
struct bio *bio, *wbio; struct bio *bio, *wbio;
...@@ -1562,7 +1562,7 @@ static void raid1d(mddev_t *mddev) ...@@ -1562,7 +1562,7 @@ static void raid1d(mddev_t *mddev)
r1bio_t *r1_bio; r1bio_t *r1_bio;
struct bio *bio; struct bio *bio;
unsigned long flags; unsigned long flags;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
struct list_head *head = &conf->retry_list; struct list_head *head = &conf->retry_list;
int unplug=0; int unplug=0;
mdk_rdev_t *rdev; mdk_rdev_t *rdev;
...@@ -1585,7 +1585,7 @@ static void raid1d(mddev_t *mddev) ...@@ -1585,7 +1585,7 @@ static void raid1d(mddev_t *mddev)
spin_unlock_irqrestore(&conf->device_lock, flags); spin_unlock_irqrestore(&conf->device_lock, flags);
mddev = r1_bio->mddev; mddev = r1_bio->mddev;
conf = mddev_to_conf(mddev); conf = mddev->private;
if (test_bit(R1BIO_IsSync, &r1_bio->state)) { if (test_bit(R1BIO_IsSync, &r1_bio->state)) {
sync_request_write(mddev, r1_bio); sync_request_write(mddev, r1_bio);
unplug = 1; unplug = 1;
...@@ -1706,7 +1706,7 @@ static int init_resync(conf_t *conf) ...@@ -1706,7 +1706,7 @@ static int init_resync(conf_t *conf)
static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster) static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
r1bio_t *r1_bio; r1bio_t *r1_bio;
struct bio *bio; struct bio *bio;
sector_t max_sector, nr_sectors; sector_t max_sector, nr_sectors;
...@@ -2052,6 +2052,10 @@ static int run(mddev_t *mddev) ...@@ -2052,6 +2052,10 @@ static int run(mddev_t *mddev)
goto out_free_conf; goto out_free_conf;
} }
if (mddev->recovery_cp != MaxSector)
printk(KERN_NOTICE "raid1: %s is not clean"
" -- starting background reconstruction\n",
mdname(mddev));
printk(KERN_INFO printk(KERN_INFO
"raid1: raid set %s active with %d out of %d mirrors\n", "raid1: raid set %s active with %d out of %d mirrors\n",
mdname(mddev), mddev->raid_disks - mddev->degraded, mdname(mddev), mddev->raid_disks - mddev->degraded,
...@@ -2087,7 +2091,7 @@ static int run(mddev_t *mddev) ...@@ -2087,7 +2091,7 @@ static int run(mddev_t *mddev)
static int stop(mddev_t *mddev) static int stop(mddev_t *mddev)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
struct bitmap *bitmap = mddev->bitmap; struct bitmap *bitmap = mddev->bitmap;
int behind_wait = 0; int behind_wait = 0;
...@@ -2155,16 +2159,16 @@ static int raid1_reshape(mddev_t *mddev) ...@@ -2155,16 +2159,16 @@ static int raid1_reshape(mddev_t *mddev)
mempool_t *newpool, *oldpool; mempool_t *newpool, *oldpool;
struct pool_info *newpoolinfo; struct pool_info *newpoolinfo;
mirror_info_t *newmirrors; mirror_info_t *newmirrors;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int cnt, raid_disks; int cnt, raid_disks;
unsigned long flags; unsigned long flags;
int d, d2, err; int d, d2, err;
/* Cannot change chunk_size, layout, or level */ /* Cannot change chunk_size, layout, or level */
if (mddev->chunk_size != mddev->new_chunk || if (mddev->chunk_sectors != mddev->new_chunk_sectors ||
mddev->layout != mddev->new_layout || mddev->layout != mddev->new_layout ||
mddev->level != mddev->new_level) { mddev->level != mddev->new_level) {
mddev->new_chunk = mddev->chunk_size; mddev->new_chunk_sectors = mddev->chunk_sectors;
mddev->new_layout = mddev->layout; mddev->new_layout = mddev->layout;
mddev->new_level = mddev->level; mddev->new_level = mddev->level;
return -EINVAL; return -EINVAL;
...@@ -2252,7 +2256,7 @@ static int raid1_reshape(mddev_t *mddev) ...@@ -2252,7 +2256,7 @@ static int raid1_reshape(mddev_t *mddev)
static void raid1_quiesce(mddev_t *mddev, int state) static void raid1_quiesce(mddev_t *mddev, int state)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
switch(state) { switch(state) {
case 1: case 1:
......
...@@ -63,12 +63,6 @@ struct r1_private_data_s { ...@@ -63,12 +63,6 @@ struct r1_private_data_s {
typedef struct r1_private_data_s conf_t; typedef struct r1_private_data_s conf_t;
/*
* this is the only point in the RAID code where we violate
* C type safety. mddev->private is an 'opaque' pointer.
*/
#define mddev_to_conf(mddev) ((conf_t *) mddev->private)
/* /*
* this is our 'private' RAID1 bio. * this is our 'private' RAID1 bio.
* *
......
...@@ -188,7 +188,7 @@ static void put_all_bios(conf_t *conf, r10bio_t *r10_bio) ...@@ -188,7 +188,7 @@ static void put_all_bios(conf_t *conf, r10bio_t *r10_bio)
static void free_r10bio(r10bio_t *r10_bio) static void free_r10bio(r10bio_t *r10_bio)
{ {
conf_t *conf = mddev_to_conf(r10_bio->mddev); conf_t *conf = r10_bio->mddev->private;
/* /*
* Wake up any possible resync thread that waits for the device * Wake up any possible resync thread that waits for the device
...@@ -202,7 +202,7 @@ static void free_r10bio(r10bio_t *r10_bio) ...@@ -202,7 +202,7 @@ static void free_r10bio(r10bio_t *r10_bio)
static void put_buf(r10bio_t *r10_bio) static void put_buf(r10bio_t *r10_bio)
{ {
conf_t *conf = mddev_to_conf(r10_bio->mddev); conf_t *conf = r10_bio->mddev->private;
mempool_free(r10_bio, conf->r10buf_pool); mempool_free(r10_bio, conf->r10buf_pool);
...@@ -213,7 +213,7 @@ static void reschedule_retry(r10bio_t *r10_bio) ...@@ -213,7 +213,7 @@ static void reschedule_retry(r10bio_t *r10_bio)
{ {
unsigned long flags; unsigned long flags;
mddev_t *mddev = r10_bio->mddev; mddev_t *mddev = r10_bio->mddev;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
spin_lock_irqsave(&conf->device_lock, flags); spin_lock_irqsave(&conf->device_lock, flags);
list_add(&r10_bio->retry_list, &conf->retry_list); list_add(&r10_bio->retry_list, &conf->retry_list);
...@@ -245,7 +245,7 @@ static void raid_end_bio_io(r10bio_t *r10_bio) ...@@ -245,7 +245,7 @@ static void raid_end_bio_io(r10bio_t *r10_bio)
*/ */
static inline void update_head_pos(int slot, r10bio_t *r10_bio) static inline void update_head_pos(int slot, r10bio_t *r10_bio)
{ {
conf_t *conf = mddev_to_conf(r10_bio->mddev); conf_t *conf = r10_bio->mddev->private;
conf->mirrors[r10_bio->devs[slot].devnum].head_position = conf->mirrors[r10_bio->devs[slot].devnum].head_position =
r10_bio->devs[slot].addr + (r10_bio->sectors); r10_bio->devs[slot].addr + (r10_bio->sectors);
...@@ -256,7 +256,7 @@ static void raid10_end_read_request(struct bio *bio, int error) ...@@ -256,7 +256,7 @@ static void raid10_end_read_request(struct bio *bio, int error)
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
r10bio_t * r10_bio = (r10bio_t *)(bio->bi_private); r10bio_t * r10_bio = (r10bio_t *)(bio->bi_private);
int slot, dev; int slot, dev;
conf_t *conf = mddev_to_conf(r10_bio->mddev); conf_t *conf = r10_bio->mddev->private;
slot = r10_bio->read_slot; slot = r10_bio->read_slot;
...@@ -297,7 +297,7 @@ static void raid10_end_write_request(struct bio *bio, int error) ...@@ -297,7 +297,7 @@ static void raid10_end_write_request(struct bio *bio, int error)
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
r10bio_t * r10_bio = (r10bio_t *)(bio->bi_private); r10bio_t * r10_bio = (r10bio_t *)(bio->bi_private);
int slot, dev; int slot, dev;
conf_t *conf = mddev_to_conf(r10_bio->mddev); conf_t *conf = r10_bio->mddev->private;
for (slot = 0; slot < conf->copies; slot++) for (slot = 0; slot < conf->copies; slot++)
if (r10_bio->devs[slot].bio == bio) if (r10_bio->devs[slot].bio == bio)
...@@ -461,7 +461,7 @@ static int raid10_mergeable_bvec(struct request_queue *q, ...@@ -461,7 +461,7 @@ static int raid10_mergeable_bvec(struct request_queue *q,
mddev_t *mddev = q->queuedata; mddev_t *mddev = q->queuedata;
sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev); sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
int max; int max;
unsigned int chunk_sectors = mddev->chunk_size >> 9; unsigned int chunk_sectors = mddev->chunk_sectors;
unsigned int bio_sectors = bvm->bi_size >> 9; unsigned int bio_sectors = bvm->bi_size >> 9;
max = (chunk_sectors - ((sector & (chunk_sectors - 1)) + bio_sectors)) << 9; max = (chunk_sectors - ((sector & (chunk_sectors - 1)) + bio_sectors)) << 9;
...@@ -596,7 +596,7 @@ static int read_balance(conf_t *conf, r10bio_t *r10_bio) ...@@ -596,7 +596,7 @@ static int read_balance(conf_t *conf, r10bio_t *r10_bio)
static void unplug_slaves(mddev_t *mddev) static void unplug_slaves(mddev_t *mddev)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int i; int i;
rcu_read_lock(); rcu_read_lock();
...@@ -628,7 +628,7 @@ static void raid10_unplug(struct request_queue *q) ...@@ -628,7 +628,7 @@ static void raid10_unplug(struct request_queue *q)
static int raid10_congested(void *data, int bits) static int raid10_congested(void *data, int bits)
{ {
mddev_t *mddev = data; mddev_t *mddev = data;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int i, ret = 0; int i, ret = 0;
rcu_read_lock(); rcu_read_lock();
...@@ -788,7 +788,7 @@ static void unfreeze_array(conf_t *conf) ...@@ -788,7 +788,7 @@ static void unfreeze_array(conf_t *conf)
static int make_request(struct request_queue *q, struct bio * bio) static int make_request(struct request_queue *q, struct bio * bio)
{ {
mddev_t *mddev = q->queuedata; mddev_t *mddev = q->queuedata;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
mirror_info_t *mirror; mirror_info_t *mirror;
r10bio_t *r10_bio; r10bio_t *r10_bio;
struct bio *read_bio; struct bio *read_bio;
...@@ -981,11 +981,11 @@ static int make_request(struct request_queue *q, struct bio * bio) ...@@ -981,11 +981,11 @@ static int make_request(struct request_queue *q, struct bio * bio)
static void status(struct seq_file *seq, mddev_t *mddev) static void status(struct seq_file *seq, mddev_t *mddev)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int i; int i;
if (conf->near_copies < conf->raid_disks) if (conf->near_copies < conf->raid_disks)
seq_printf(seq, " %dK chunks", mddev->chunk_size/1024); seq_printf(seq, " %dK chunks", mddev->chunk_sectors / 2);
if (conf->near_copies > 1) if (conf->near_copies > 1)
seq_printf(seq, " %d near-copies", conf->near_copies); seq_printf(seq, " %d near-copies", conf->near_copies);
if (conf->far_copies > 1) { if (conf->far_copies > 1) {
...@@ -1006,7 +1006,7 @@ static void status(struct seq_file *seq, mddev_t *mddev) ...@@ -1006,7 +1006,7 @@ static void status(struct seq_file *seq, mddev_t *mddev)
static void error(mddev_t *mddev, mdk_rdev_t *rdev) static void error(mddev_t *mddev, mdk_rdev_t *rdev)
{ {
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
/* /*
* If it is not operational, then we have already marked it as dead * If it is not operational, then we have already marked it as dead
...@@ -1215,7 +1215,7 @@ static int raid10_remove_disk(mddev_t *mddev, int number) ...@@ -1215,7 +1215,7 @@ static int raid10_remove_disk(mddev_t *mddev, int number)
static void end_sync_read(struct bio *bio, int error) static void end_sync_read(struct bio *bio, int error)
{ {
r10bio_t * r10_bio = (r10bio_t *)(bio->bi_private); r10bio_t * r10_bio = (r10bio_t *)(bio->bi_private);
conf_t *conf = mddev_to_conf(r10_bio->mddev); conf_t *conf = r10_bio->mddev->private;
int i,d; int i,d;
for (i=0; i<conf->copies; i++) for (i=0; i<conf->copies; i++)
...@@ -1253,7 +1253,7 @@ static void end_sync_write(struct bio *bio, int error) ...@@ -1253,7 +1253,7 @@ static void end_sync_write(struct bio *bio, int error)
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
r10bio_t * r10_bio = (r10bio_t *)(bio->bi_private); r10bio_t * r10_bio = (r10bio_t *)(bio->bi_private);
mddev_t *mddev = r10_bio->mddev; mddev_t *mddev = r10_bio->mddev;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int i,d; int i,d;
for (i = 0; i < conf->copies; i++) for (i = 0; i < conf->copies; i++)
...@@ -1300,7 +1300,7 @@ static void end_sync_write(struct bio *bio, int error) ...@@ -1300,7 +1300,7 @@ static void end_sync_write(struct bio *bio, int error)
*/ */
static void sync_request_write(mddev_t *mddev, r10bio_t *r10_bio) static void sync_request_write(mddev_t *mddev, r10bio_t *r10_bio)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int i, first; int i, first;
struct bio *tbio, *fbio; struct bio *tbio, *fbio;
...@@ -1400,7 +1400,7 @@ static void sync_request_write(mddev_t *mddev, r10bio_t *r10_bio) ...@@ -1400,7 +1400,7 @@ static void sync_request_write(mddev_t *mddev, r10bio_t *r10_bio)
static void recovery_request_write(mddev_t *mddev, r10bio_t *r10_bio) static void recovery_request_write(mddev_t *mddev, r10bio_t *r10_bio)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
int i, d; int i, d;
struct bio *bio, *wbio; struct bio *bio, *wbio;
...@@ -1549,7 +1549,7 @@ static void raid10d(mddev_t *mddev) ...@@ -1549,7 +1549,7 @@ static void raid10d(mddev_t *mddev)
r10bio_t *r10_bio; r10bio_t *r10_bio;
struct bio *bio; struct bio *bio;
unsigned long flags; unsigned long flags;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
struct list_head *head = &conf->retry_list; struct list_head *head = &conf->retry_list;
int unplug=0; int unplug=0;
mdk_rdev_t *rdev; mdk_rdev_t *rdev;
...@@ -1572,7 +1572,7 @@ static void raid10d(mddev_t *mddev) ...@@ -1572,7 +1572,7 @@ static void raid10d(mddev_t *mddev)
spin_unlock_irqrestore(&conf->device_lock, flags); spin_unlock_irqrestore(&conf->device_lock, flags);
mddev = r10_bio->mddev; mddev = r10_bio->mddev;
conf = mddev_to_conf(mddev); conf = mddev->private;
if (test_bit(R10BIO_IsSync, &r10_bio->state)) { if (test_bit(R10BIO_IsSync, &r10_bio->state)) {
sync_request_write(mddev, r10_bio); sync_request_write(mddev, r10_bio);
unplug = 1; unplug = 1;
...@@ -1680,7 +1680,7 @@ static int init_resync(conf_t *conf) ...@@ -1680,7 +1680,7 @@ static int init_resync(conf_t *conf)
static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster) static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
r10bio_t *r10_bio; r10bio_t *r10_bio;
struct bio *biolist = NULL, *bio; struct bio *biolist = NULL, *bio;
sector_t max_sector, nr_sectors; sector_t max_sector, nr_sectors;
...@@ -2026,7 +2026,7 @@ static sector_t ...@@ -2026,7 +2026,7 @@ static sector_t
raid10_size(mddev_t *mddev, sector_t sectors, int raid_disks) raid10_size(mddev_t *mddev, sector_t sectors, int raid_disks)
{ {
sector_t size; sector_t size;
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
if (!raid_disks) if (!raid_disks)
raid_disks = mddev->raid_disks; raid_disks = mddev->raid_disks;
...@@ -2050,9 +2050,10 @@ static int run(mddev_t *mddev) ...@@ -2050,9 +2050,10 @@ static int run(mddev_t *mddev)
int nc, fc, fo; int nc, fc, fo;
sector_t stride, size; sector_t stride, size;
if (mddev->chunk_size < PAGE_SIZE) { if (mddev->chunk_sectors < (PAGE_SIZE >> 9) ||
!is_power_of_2(mddev->chunk_sectors)) {
printk(KERN_ERR "md/raid10: chunk size must be " printk(KERN_ERR "md/raid10: chunk size must be "
"at least PAGE_SIZE(%ld).\n", PAGE_SIZE); "at least PAGE_SIZE(%ld) and be a power of 2.\n", PAGE_SIZE);
return -EINVAL; return -EINVAL;
} }
...@@ -2095,8 +2096,8 @@ static int run(mddev_t *mddev) ...@@ -2095,8 +2096,8 @@ static int run(mddev_t *mddev)
conf->far_copies = fc; conf->far_copies = fc;
conf->copies = nc*fc; conf->copies = nc*fc;
conf->far_offset = fo; conf->far_offset = fo;
conf->chunk_mask = (sector_t)(mddev->chunk_size>>9)-1; conf->chunk_mask = mddev->chunk_sectors - 1;
conf->chunk_shift = ffz(~mddev->chunk_size) - 9; conf->chunk_shift = ffz(~mddev->chunk_sectors);
size = mddev->dev_sectors >> conf->chunk_shift; size = mddev->dev_sectors >> conf->chunk_shift;
sector_div(size, fc); sector_div(size, fc);
size = size * conf->raid_disks; size = size * conf->raid_disks;
...@@ -2185,6 +2186,10 @@ static int run(mddev_t *mddev) ...@@ -2185,6 +2186,10 @@ static int run(mddev_t *mddev)
goto out_free_conf; goto out_free_conf;
} }
if (mddev->recovery_cp != MaxSector)
printk(KERN_NOTICE "raid10: %s is not clean"
" -- starting background reconstruction\n",
mdname(mddev));
printk(KERN_INFO printk(KERN_INFO
"raid10: raid set %s active with %d out of %d devices\n", "raid10: raid set %s active with %d out of %d devices\n",
mdname(mddev), mddev->raid_disks - mddev->degraded, mdname(mddev), mddev->raid_disks - mddev->degraded,
...@@ -2204,7 +2209,8 @@ static int run(mddev_t *mddev) ...@@ -2204,7 +2209,8 @@ static int run(mddev_t *mddev)
* maybe... * maybe...
*/ */
{ {
int stripe = conf->raid_disks * (mddev->chunk_size / PAGE_SIZE); int stripe = conf->raid_disks *
((mddev->chunk_sectors << 9) / PAGE_SIZE);
stripe /= conf->near_copies; stripe /= conf->near_copies;
if (mddev->queue->backing_dev_info.ra_pages < 2* stripe) if (mddev->queue->backing_dev_info.ra_pages < 2* stripe)
mddev->queue->backing_dev_info.ra_pages = 2* stripe; mddev->queue->backing_dev_info.ra_pages = 2* stripe;
...@@ -2227,7 +2233,7 @@ static int run(mddev_t *mddev) ...@@ -2227,7 +2233,7 @@ static int run(mddev_t *mddev)
static int stop(mddev_t *mddev) static int stop(mddev_t *mddev)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
raise_barrier(conf, 0); raise_barrier(conf, 0);
lower_barrier(conf); lower_barrier(conf);
...@@ -2245,7 +2251,7 @@ static int stop(mddev_t *mddev) ...@@ -2245,7 +2251,7 @@ static int stop(mddev_t *mddev)
static void raid10_quiesce(mddev_t *mddev, int state) static void raid10_quiesce(mddev_t *mddev, int state)
{ {
conf_t *conf = mddev_to_conf(mddev); conf_t *conf = mddev->private;
switch(state) { switch(state) {
case 1: case 1:
......
...@@ -61,12 +61,6 @@ struct r10_private_data_s { ...@@ -61,12 +61,6 @@ struct r10_private_data_s {
typedef struct r10_private_data_s conf_t; typedef struct r10_private_data_s conf_t;
/*
* this is the only point in the RAID code where we violate
* C type safety. mddev->private is an 'opaque' pointer.
*/
#define mddev_to_conf(mddev) ((conf_t *) mddev->private)
/* /*
* this is our 'private' RAID10 bio. * this is our 'private' RAID10 bio.
* *
......
This diff is collapsed.
...@@ -334,7 +334,8 @@ struct raid5_private_data { ...@@ -334,7 +334,8 @@ struct raid5_private_data {
struct hlist_head *stripe_hashtbl; struct hlist_head *stripe_hashtbl;
mddev_t *mddev; mddev_t *mddev;
struct disk_info *spare; struct disk_info *spare;
int chunk_size, level, algorithm; int chunk_sectors;
int level, algorithm;
int max_degraded; int max_degraded;
int raid_disks; int raid_disks;
int max_nr_stripes; int max_nr_stripes;
...@@ -350,7 +351,8 @@ struct raid5_private_data { ...@@ -350,7 +351,8 @@ struct raid5_private_data {
*/ */
sector_t reshape_safe; sector_t reshape_safe;
int previous_raid_disks; int previous_raid_disks;
int prev_chunk, prev_algo; int prev_chunk_sectors;
int prev_algo;
short generation; /* increments with every reshape */ short generation; /* increments with every reshape */
unsigned long reshape_checkpoint; /* Time we last updated unsigned long reshape_checkpoint; /* Time we last updated
* metadata */ * metadata */
...@@ -408,8 +410,6 @@ struct raid5_private_data { ...@@ -408,8 +410,6 @@ struct raid5_private_data {
typedef struct raid5_private_data raid5_conf_t; typedef struct raid5_private_data raid5_conf_t;
#define mddev_to_conf(mddev) ((raid5_conf_t *) mddev->private)
/* /*
* Our supported algorithms * Our supported algorithms
*/ */
......
...@@ -232,7 +232,7 @@ struct mdp_superblock_1 { ...@@ -232,7 +232,7 @@ struct mdp_superblock_1 {
__le64 reshape_position; /* next address in array-space for reshape */ __le64 reshape_position; /* next address in array-space for reshape */
__le32 delta_disks; /* change in number of raid_disks */ __le32 delta_disks; /* change in number of raid_disks */
__le32 new_layout; /* new layout */ __le32 new_layout; /* new layout */
__le32 new_chunk; /* new chunk size (bytes) */ __le32 new_chunk; /* new chunk size (512byte sectors) */
__u8 pad1[128-124]; /* set to 0 when written */ __u8 pad1[128-124]; /* set to 0 when written */
/* constant this-device information - 64 bytes */ /* constant this-device information - 64 bytes */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment