[PATCH 14/23] mtd: give mtdconcat devices their own backing_dev_info

Peter Zijlstra
2007-08-03T12:57:55Z

[-- Attachment #1: bdi_mtdconcat.patch --]
[-- Type: text/plain, Size: 3282 bytes --]

These are actual devices, give them their own BDI.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Robert Kaiser <rkaiser@sysgo.de>
---
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);

--