diff options
Diffstat (limited to 'drivers/md/faulty.c')
| -rw-r--r-- | drivers/md/faulty.c | 79 | 
1 files changed, 43 insertions, 36 deletions
diff --git a/drivers/md/faulty.c b/drivers/md/faulty.c index 339fdc67075..e8b4574956c 100644 --- a/drivers/md/faulty.c +++ b/drivers/md/faulty.c @@ -30,7 +30,7 @@   *   * Different modes can be active at a time, but only   * one can be set at array creation.  Others can be added later. - * A mode can be one-shot or recurrent with the recurrance being + * A mode can be one-shot or recurrent with the recurrence being   * once in every N requests.   * The bottom 5 bits of the "layout" indicate the mode.  The   * remainder indicate a period, or 0 for one-shot. @@ -63,6 +63,7 @@  #define MaxFault	50  #include <linux/blkdev.h> +#include <linux/module.h>  #include <linux/raid/md_u.h>  #include <linux/slab.h>  #include "md.h" @@ -73,24 +74,24 @@ static void faulty_fail(struct bio *bio, int error)  {  	struct bio *b = bio->bi_private; -	b->bi_size = bio->bi_size; -	b->bi_sector = bio->bi_sector; +	b->bi_iter.bi_size = bio->bi_iter.bi_size; +	b->bi_iter.bi_sector = bio->bi_iter.bi_sector;  	bio_put(bio);  	bio_io_error(b);  } -typedef struct faulty_conf { +struct faulty_conf {  	int period[Modes];  	atomic_t counters[Modes];  	sector_t faults[MaxFault];  	int	modes[MaxFault];  	int nfaults; -	mdk_rdev_t *rdev; -} conf_t; +	struct md_rdev *rdev; +}; -static int check_mode(conf_t *conf, int mode) +static int check_mode(struct faulty_conf *conf, int mode)  {  	if (conf->period[mode] == 0 &&  	    atomic_read(&conf->counters[mode]) <= 0) @@ -105,7 +106,7 @@ static int check_mode(conf_t *conf, int mode)  	return 0;  } -static int check_sector(conf_t *conf, sector_t start, sector_t end, int dir) +static int check_sector(struct faulty_conf *conf, sector_t start, sector_t end, int dir)  {  	/* If we find a ReadFixable sector, we fix it ... */  	int i; @@ -129,7 +130,7 @@ static int check_sector(conf_t *conf, sector_t start, sector_t end, int dir)  	return 0;  } -static void add_sector(conf_t *conf, sector_t start, int mode) +static void add_sector(struct faulty_conf *conf, sector_t start, int mode)  {  	int i;  	int n = conf->nfaults; @@ -169,9 +170,9 @@ static void add_sector(conf_t *conf, sector_t start, int mode)  		conf->nfaults = n+1;  } -static int make_request(mddev_t *mddev, struct bio *bio) +static void make_request(struct mddev *mddev, struct bio *bio)  { -	conf_t *conf = mddev->private; +	struct faulty_conf *conf = mddev->private;  	int failit = 0;  	if (bio_data_dir(bio) == WRITE) { @@ -181,50 +182,53 @@ static int make_request(mddev_t *mddev, struct bio *bio)  			 * just fail immediately  			 */  			bio_endio(bio, -EIO); -			return 0; +			return;  		} -		if (check_sector(conf, bio->bi_sector, bio->bi_sector+(bio->bi_size>>9), -				 WRITE)) +		if (check_sector(conf, bio->bi_iter.bi_sector, +				 bio_end_sector(bio), WRITE))  			failit = 1;  		if (check_mode(conf, WritePersistent)) { -			add_sector(conf, bio->bi_sector, WritePersistent); +			add_sector(conf, bio->bi_iter.bi_sector, +				   WritePersistent);  			failit = 1;  		}  		if (check_mode(conf, WriteTransient))  			failit = 1;  	} else {  		/* read request */ -		if (check_sector(conf, bio->bi_sector, bio->bi_sector + (bio->bi_size>>9), -				 READ)) +		if (check_sector(conf, bio->bi_iter.bi_sector, +				 bio_end_sector(bio), READ))  			failit = 1;  		if (check_mode(conf, ReadTransient))  			failit = 1;  		if (check_mode(conf, ReadPersistent)) { -			add_sector(conf, bio->bi_sector, ReadPersistent); +			add_sector(conf, bio->bi_iter.bi_sector, +				   ReadPersistent);  			failit = 1;  		}  		if (check_mode(conf, ReadFixable)) { -			add_sector(conf, bio->bi_sector, ReadFixable); +			add_sector(conf, bio->bi_iter.bi_sector, +				   ReadFixable);  			failit = 1;  		}  	}  	if (failit) {  		struct bio *b = bio_clone_mddev(bio, GFP_NOIO, mddev); +  		b->bi_bdev = conf->rdev->bdev;  		b->bi_private = bio;  		b->bi_end_io = faulty_fail; -		generic_make_request(b); -		return 0; -	} else { +		bio = b; +	} else  		bio->bi_bdev = conf->rdev->bdev; -		return 1; -	} + +	generic_make_request(bio);  } -static void status(struct seq_file *seq, mddev_t *mddev) +static void status(struct seq_file *seq, struct mddev *mddev)  { -	conf_t *conf = mddev->private; +	struct faulty_conf *conf = mddev->private;  	int n;  	if ((n=atomic_read(&conf->counters[WriteTransient])) != 0) @@ -255,11 +259,11 @@ static void status(struct seq_file *seq, mddev_t *mddev)  } -static int reshape(mddev_t *mddev) +static int reshape(struct mddev *mddev)  {  	int mode = mddev->new_layout & ModeMask;  	int count = mddev->new_layout >> ModeShift; -	conf_t *conf = mddev->private; +	struct faulty_conf *conf = mddev->private;  	if (mddev->new_layout < 0)  		return 0; @@ -284,7 +288,7 @@ static int reshape(mddev_t *mddev)  	return 0;  } -static sector_t faulty_size(mddev_t *mddev, sector_t sectors, int raid_disks) +static sector_t faulty_size(struct mddev *mddev, sector_t sectors, int raid_disks)  {  	WARN_ONCE(raid_disks,  		  "%s does not support generic reshape\n", __func__); @@ -295,11 +299,11 @@ static sector_t faulty_size(mddev_t *mddev, sector_t sectors, int raid_disks)  	return sectors;  } -static int run(mddev_t *mddev) +static int run(struct mddev *mddev)  { -	mdk_rdev_t *rdev; +	struct md_rdev *rdev;  	int i; -	conf_t *conf; +	struct faulty_conf *conf;  	if (md_check_no_bitmap(mddev))  		return -EINVAL; @@ -314,8 +318,11 @@ static int run(mddev_t *mddev)  	}  	conf->nfaults = 0; -	list_for_each_entry(rdev, &mddev->disks, same_set) +	rdev_for_each(rdev, mddev) {  		conf->rdev = rdev; +		disk_stack_limits(mddev->gendisk, rdev->bdev, +				  rdev->data_offset << 9); +	}  	md_set_array_sectors(mddev, faulty_size(mddev, 0, 0));  	mddev->private = conf; @@ -325,16 +332,16 @@ static int run(mddev_t *mddev)  	return 0;  } -static int stop(mddev_t *mddev) +static int stop(struct mddev *mddev)  { -	conf_t *conf = mddev->private; +	struct faulty_conf *conf = mddev->private;  	kfree(conf);  	mddev->private = NULL;  	return 0;  } -static struct mdk_personality faulty_personality = +static struct md_personality faulty_personality =  {  	.name		= "faulty",  	.level		= LEVEL_FAULTY,  | 
