/branches/18.06.1/target/linux/generic/pending-4.14/440-block2mtd_init.patch |
@@ -0,0 +1,116 @@ |
From: Felix Fietkau <nbd@nbd.name> |
Subject: block2mtd |
|
Signed-off-by: Felix Fietkau <nbd@nbd.name> |
--- |
drivers/mtd/devices/block2mtd.c | 30 ++++++++++++++++++++---------- |
1 file changed, 20 insertions(+), 10 deletions(-) |
|
--- a/drivers/mtd/devices/block2mtd.c |
+++ b/drivers/mtd/devices/block2mtd.c |
@@ -26,6 +26,7 @@ |
#include <linux/list.h> |
#include <linux/init.h> |
#include <linux/mtd/mtd.h> |
+#include <linux/mtd/partitions.h> |
#include <linux/mutex.h> |
#include <linux/mount.h> |
#include <linux/slab.h> |
@@ -219,7 +220,7 @@ static void block2mtd_free_device(struct |
|
|
static struct block2mtd_dev *add_device(char *devname, int erase_size, |
- int timeout) |
+ const char *mtdname, int timeout) |
{ |
#ifndef MODULE |
int i; |
@@ -227,6 +228,7 @@ static struct block2mtd_dev *add_device( |
const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL; |
struct block_device *bdev = ERR_PTR(-ENODEV); |
struct block2mtd_dev *dev; |
+ struct mtd_partition *part; |
char *name; |
|
if (!devname) |
@@ -283,13 +285,16 @@ static struct block2mtd_dev *add_device( |
|
/* Setup the MTD structure */ |
/* make the name contain the block device in */ |
- name = kasprintf(GFP_KERNEL, "block2mtd: %s", devname); |
+ if (!mtdname) |
+ mtdname = devname; |
+ name = kmalloc(strlen(mtdname) + 1, GFP_KERNEL); |
if (!name) |
goto err_destroy_mutex; |
|
+ strcpy(name, mtdname); |
dev->mtd.name = name; |
|
- dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK; |
+ dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK & ~(erase_size - 1); |
dev->mtd.erasesize = erase_size; |
dev->mtd.writesize = 1; |
dev->mtd.writebufsize = PAGE_SIZE; |
@@ -302,7 +307,11 @@ static struct block2mtd_dev *add_device( |
dev->mtd.priv = dev; |
dev->mtd.owner = THIS_MODULE; |
|
- if (mtd_device_register(&dev->mtd, NULL, 0)) { |
+ part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL); |
+ part->name = name; |
+ part->offset = 0; |
+ part->size = dev->mtd.size; |
+ if (mtd_device_register(&dev->mtd, part, 1)) { |
/* Device didn't get added, so free the entry */ |
goto err_destroy_mutex; |
} |
@@ -310,8 +319,7 @@ static struct block2mtd_dev *add_device( |
list_add(&dev->list, &blkmtd_device_list); |
pr_info("mtd%d: [%s] erase_size = %dKiB [%d]\n", |
dev->mtd.index, |
- dev->mtd.name + strlen("block2mtd: "), |
- dev->mtd.erasesize >> 10, dev->mtd.erasesize); |
+ mtdname, dev->mtd.erasesize >> 10, dev->mtd.erasesize); |
return dev; |
|
err_destroy_mutex: |
@@ -384,7 +392,7 @@ static int block2mtd_setup2(const char * |
/* 80 for device, 12 for erase size, 80 for name, 8 for timeout */ |
char buf[80 + 12 + 80 + 8]; |
char *str = buf; |
- char *token[2]; |
+ char *token[3]; |
char *name; |
size_t erase_size = PAGE_SIZE; |
unsigned long timeout = MTD_DEFAULT_TIMEOUT; |
@@ -398,7 +406,7 @@ static int block2mtd_setup2(const char * |
strcpy(str, val); |
kill_final_newline(str); |
|
- for (i = 0; i < 2; i++) |
+ for (i = 0; i < 3; i++) |
token[i] = strsep(&str, ","); |
|
if (str) { |
@@ -424,8 +432,10 @@ static int block2mtd_setup2(const char * |
return 0; |
} |
} |
+ if (token[2] && (strlen(token[2]) + 1 > 80)) |
+ pr_err("mtd device name too long\n"); |
|
- add_device(name, erase_size, timeout); |
+ add_device(name, erase_size, token[2], timeout); |
|
return 0; |
} |
@@ -459,7 +469,7 @@ static int block2mtd_setup(const char *v |
|
|
module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200); |
-MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>]\""); |
+MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\""); |
|
static int __init block2mtd_init(void) |
{ |