Merge git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-2.6-dm
* git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-2.6-dm: dm: detect lost queue dm: publish dm_vcalloc dm: publish dm_table_unplug_all dm: publish dm_get_mapinfo dm: export struct dm_dev dm crypt: avoid unnecessary wait when splitting bio dm crypt: tidy ctx pending dm crypt: fix async inc_pending dm crypt: move dec_pending on error into write_io_submit dm crypt: remove inc_pending from write_io_submit dm crypt: tidy write loop pending dm crypt: tidy crypt alloc dm crypt: tidy inc pending dm exception store: use chunk_t for_areas dm exception store: introduce area_location function dm raid1: kcopyd should stop on error if errors handled dm mpath: remove is_active from struct dm_path dm mpath: use more error codes Fixed up trivial conflict in drivers/md/dm-mpath.c manually.
This commit is contained in:
@ -30,6 +30,7 @@ struct pgpath {
|
||||
struct list_head list;
|
||||
|
||||
struct priority_group *pg; /* Owning PG */
|
||||
unsigned is_active; /* Path status */
|
||||
unsigned fail_count; /* Cumulative failure count */
|
||||
|
||||
struct dm_path path;
|
||||
@ -125,7 +126,7 @@ static struct pgpath *alloc_pgpath(void)
|
||||
struct pgpath *pgpath = kzalloc(sizeof(*pgpath), GFP_KERNEL);
|
||||
|
||||
if (pgpath) {
|
||||
pgpath->path.is_active = 1;
|
||||
pgpath->is_active = 1;
|
||||
INIT_WORK(&pgpath->deactivate_path, deactivate_path);
|
||||
}
|
||||
|
||||
@ -575,12 +576,12 @@ static struct pgpath *parse_path(struct arg_set *as, struct path_selector *ps,
|
||||
/* we need at least a path arg */
|
||||
if (as->argc < 1) {
|
||||
ti->error = "no device given";
|
||||
return NULL;
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
p = alloc_pgpath();
|
||||
if (!p)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
r = dm_get_device(ti, shift(as), ti->begin, ti->len,
|
||||
dm_table_get_mode(ti->table), &p->path.dev);
|
||||
@ -608,7 +609,7 @@ static struct pgpath *parse_path(struct arg_set *as, struct path_selector *ps,
|
||||
|
||||
bad:
|
||||
free_pgpath(p);
|
||||
return NULL;
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
|
||||
static struct priority_group *parse_priority_group(struct arg_set *as,
|
||||
@ -626,14 +627,14 @@ static struct priority_group *parse_priority_group(struct arg_set *as,
|
||||
|
||||
if (as->argc < 2) {
|
||||
as->argc = 0;
|
||||
ti->error = "not enough priority group aruments";
|
||||
return NULL;
|
||||
ti->error = "not enough priority group arguments";
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
pg = alloc_priority_group();
|
||||
if (!pg) {
|
||||
ti->error = "couldn't allocate priority group";
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
pg->m = m;
|
||||
|
||||
@ -666,8 +667,10 @@ static struct priority_group *parse_priority_group(struct arg_set *as,
|
||||
path_args.argv = as->argv;
|
||||
|
||||
pgpath = parse_path(&path_args, &pg->ps, ti);
|
||||
if (!pgpath)
|
||||
if (IS_ERR(pgpath)) {
|
||||
r = PTR_ERR(pgpath);
|
||||
goto bad;
|
||||
}
|
||||
|
||||
pgpath->pg = pg;
|
||||
list_add_tail(&pgpath->list, &pg->pgpaths);
|
||||
@ -678,7 +681,7 @@ static struct priority_group *parse_priority_group(struct arg_set *as,
|
||||
|
||||
bad:
|
||||
free_priority_group(pg, ti);
|
||||
return NULL;
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
|
||||
static int parse_hw_handler(struct arg_set *as, struct multipath *m)
|
||||
@ -797,8 +800,8 @@ static int multipath_ctr(struct dm_target *ti, unsigned int argc,
|
||||
struct priority_group *pg;
|
||||
|
||||
pg = parse_priority_group(&as, m);
|
||||
if (!pg) {
|
||||
r = -EINVAL;
|
||||
if (IS_ERR(pg)) {
|
||||
r = PTR_ERR(pg);
|
||||
goto bad;
|
||||
}
|
||||
|
||||
@ -864,13 +867,13 @@ static int fail_path(struct pgpath *pgpath)
|
||||
|
||||
spin_lock_irqsave(&m->lock, flags);
|
||||
|
||||
if (!pgpath->path.is_active)
|
||||
if (!pgpath->is_active)
|
||||
goto out;
|
||||
|
||||
DMWARN("Failing path %s.", pgpath->path.dev->name);
|
||||
|
||||
pgpath->pg->ps.type->fail_path(&pgpath->pg->ps, &pgpath->path);
|
||||
pgpath->path.is_active = 0;
|
||||
pgpath->is_active = 0;
|
||||
pgpath->fail_count++;
|
||||
|
||||
m->nr_valid_paths--;
|
||||
@ -901,7 +904,7 @@ static int reinstate_path(struct pgpath *pgpath)
|
||||
|
||||
spin_lock_irqsave(&m->lock, flags);
|
||||
|
||||
if (pgpath->path.is_active)
|
||||
if (pgpath->is_active)
|
||||
goto out;
|
||||
|
||||
if (!pgpath->pg->ps.type->reinstate_path) {
|
||||
@ -915,7 +918,7 @@ static int reinstate_path(struct pgpath *pgpath)
|
||||
if (r)
|
||||
goto out;
|
||||
|
||||
pgpath->path.is_active = 1;
|
||||
pgpath->is_active = 1;
|
||||
|
||||
m->current_pgpath = NULL;
|
||||
if (!m->nr_valid_paths++ && m->queue_size)
|
||||
@ -1303,7 +1306,7 @@ static int multipath_status(struct dm_target *ti, status_type_t type,
|
||||
|
||||
list_for_each_entry(p, &pg->pgpaths, list) {
|
||||
DMEMIT("%s %s %u ", p->path.dev->name,
|
||||
p->path.is_active ? "A" : "F",
|
||||
p->is_active ? "A" : "F",
|
||||
p->fail_count);
|
||||
if (pg->ps.type->status)
|
||||
sz += pg->ps.type->status(&pg->ps,
|
||||
|
Reference in New Issue
Block a user