These are actual devices, give them their own BDI. Signed-off-by: Peter Zijlstra Cc: Robert Kaiser --- drivers/mtd/mtdconcat.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) Index: linux-2.6/drivers/mtd/mtdconcat.c =================================================================== --- linux-2.6.orig/drivers/mtd/mtdconcat.c 2007-04-22 18:55:17.000000000 +0200 +++ linux-2.6/drivers/mtd/mtdconcat.c 2007-04-22 19:01:42.000000000 +0200 @@ -32,6 +32,7 @@ struct mtd_concat { struct mtd_info mtd; int num_subdev; struct mtd_info **subdev; + struct backing_dev_info backing_dev_info; }; /* @@ -782,10 +783,9 @@ struct mtd_info *mtd_concat_create(struc for (i = 1; i < num_devs; i++) { if (concat->mtd.type != subdev[i]->type) { - kfree(concat); printk("Incompatible device type on \"%s\"\n", subdev[i]->name); - return NULL; + goto error; } if (concat->mtd.flags != subdev[i]->flags) { /* @@ -794,10 +794,9 @@ struct mtd_info *mtd_concat_create(struc */ if ((concat->mtd.flags ^ subdev[i]-> flags) & ~MTD_WRITEABLE) { - kfree(concat); printk("Incompatible device flags on \"%s\"\n", subdev[i]->name); - return NULL; + goto error; } else /* if writeable attribute differs, make super device writeable */ @@ -809,9 +808,12 @@ struct mtd_info *mtd_concat_create(struc * - copy-mapping is still permitted */ if (concat->mtd.backing_dev_info != - subdev[i]->backing_dev_info) + subdev[i]->backing_dev_info) { + concat->backing_dev_info = default_backing_dev_info; + bdi_init(&concat->backing_dev_info); concat->mtd.backing_dev_info = - &default_backing_dev_info; + &concat->backing_dev_info; + } concat->mtd.size += subdev[i]->size; concat->mtd.ecc_stats.badblocks += @@ -821,10 +823,9 @@ struct mtd_info *mtd_concat_create(struc concat->mtd.oobsize != subdev[i]->oobsize || !concat->mtd.read_oob != !subdev[i]->read_oob || !concat->mtd.write_oob != !subdev[i]->write_oob) { - kfree(concat); printk("Incompatible OOB or ECC data on \"%s\"\n", subdev[i]->name); - return NULL; + goto error; } concat->subdev[i] = subdev[i]; @@ -903,11 +904,10 @@ struct mtd_info *mtd_concat_create(struc kmalloc(num_erase_region * sizeof (struct mtd_erase_region_info), GFP_KERNEL); if (!erase_region_p) { - kfree(concat); printk ("memory allocation error while creating erase region list" " for device \"%s\"\n", name); - return NULL; + goto error; } /* @@ -968,6 +968,12 @@ struct mtd_info *mtd_concat_create(struc } return &concat->mtd; + +error: + if (concat->mtd.backing_dev_info == &concat->backing_dev_info) + bdi_destroy(&concat->backing_dev_info); + kfree(concat); + return NULL; } /* @@ -977,6 +983,8 @@ struct mtd_info *mtd_concat_create(struc void mtd_concat_destroy(struct mtd_info *mtd) { struct mtd_concat *concat = CONCAT(mtd); + if (concat->mtd.backing_dev_info == &concat->backing_dev_info) + bdi_destroy(&concat->backing_dev_info); if (concat->mtd.numeraseregions) kfree(concat->mtd.eraseregions); kfree(concat); -- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/