printk tgt->error if dm_table_add_target() fails. --- diff/drivers/md/dm-table.c 2002-12-17 15:59:03.000000000 +0000 +++ source/drivers/md/dm-table.c 2002-12-17 15:59:16.000000000 +0000 @@ -510,9 +510,8 @@ int dm_table_add_target(struct dm_table *t, const char *type, sector_t start, sector_t len, char *params) { - int r, argc; + int r = -EINVAL, argc; char *argv[32]; - struct target_type *tt; struct dm_target *tgt; if ((r = check_space(t))) @@ -521,14 +520,13 @@ tgt = t->targets + t->num_targets; memset(tgt, 0, sizeof(*tgt)); - tt = dm_get_target_type(type); - if (!tt) { + tgt->type = dm_get_target_type(type); + if (!tgt->type) { tgt->error = "unknown target type"; - return -EINVAL; + goto bad; } tgt->table = t; - tgt->type = tt; tgt->begin = start; tgt->len = len; tgt->error = "Unknown error"; @@ -537,26 +535,27 @@ * Does this target adjoin the previous one ? */ if (!adjoin(t, tgt)) { - DMERR("Gap in table"); - dm_put_target_type(tt); - return -EINVAL; + tgt->error = "Gap in table"; + goto bad; } r = split_args(ARRAY_SIZE(argv), &argc, argv, params); if (r) { tgt->error = "couldn't split parameters"; - dm_put_target_type(tt); - return r; + goto bad; } - r = tt->ctr(tgt, argc, argv); - if (r) { - dm_put_target_type(tt); - return r; - } + r = tgt->type->ctr(tgt, argc, argv); + if (r) + goto bad; t->highs[t->num_targets++] = tgt->begin + tgt->len - 1; return 0; + + bad: + printk(KERN_ERR DM_NAME ": %s\n", tgt->error); + dm_put_target_type(tgt->type); + return r; } static int setup_indexes(struct dm_table *t)