diff options
author | Joern Engel <joern@wohnheim.fh-wedel.de> | 2005-03-07 16:43:42 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@mtd.linutronix.de> | 2005-05-23 06:51:00 -0400 |
commit | 663259a44f440249cab1b0f3f4b82cfab8e4758d (patch) | |
tree | 65f6b03238819d4706325923fe8aa3c4c2aa1f15 /drivers/mtd/devices/phram.c | |
parent | 711c11b78d00c0652d38893c558a2bcca55d96d4 (diff) |
[MTD] phram: Allow short reads.
Jffs2 apparently needs this.
Accept newline at the end of input.
Signed-off-by: Joern Engel <joern@wohnheim.fh-wedel.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/mtd/devices/phram.c')
-rw-r--r-- | drivers/mtd/devices/phram.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/drivers/mtd/devices/phram.c b/drivers/mtd/devices/phram.c index 57454df639fb..a423a382095a 100644 --- a/drivers/mtd/devices/phram.c +++ b/drivers/mtd/devices/phram.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /** | 1 | /** |
2 | * $Id: phram.c,v 1.12 2005/02/23 19:37:07 joern Exp $ | 2 | * $Id: phram.c,v 1.14 2005/03/07 21:43:38 joern Exp $ |
3 | * | 3 | * |
4 | * Copyright (c) ???? Jochen Schäuble <psionic@psionic.de> | 4 | * Copyright (c) ???? Jochen Schäuble <psionic@psionic.de> |
5 | * Copyright (c) 2003-2004 Jörn Engel <joern@wh.fh-wedel.de> | 5 | * Copyright (c) 2003-2004 Jörn Engel <joern@wh.fh-wedel.de> |
@@ -15,9 +15,7 @@ | |||
15 | * | 15 | * |
16 | * Example: | 16 | * Example: |
17 | * phram=swap,64Mi,128Mi phram=test,900Mi,1Mi | 17 | * phram=swap,64Mi,128Mi phram=test,900Mi,1Mi |
18 | * | ||
19 | */ | 18 | */ |
20 | |||
21 | #include <asm/io.h> | 19 | #include <asm/io.h> |
22 | #include <linux/init.h> | 20 | #include <linux/init.h> |
23 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
@@ -36,7 +34,6 @@ struct phram_mtd_list { | |||
36 | static LIST_HEAD(phram_list); | 34 | static LIST_HEAD(phram_list); |
37 | 35 | ||
38 | 36 | ||
39 | |||
40 | static int phram_erase(struct mtd_info *mtd, struct erase_info *instr) | 37 | static int phram_erase(struct mtd_info *mtd, struct erase_info *instr) |
41 | { | 38 | { |
42 | u_char *start = mtd->priv; | 39 | u_char *start = mtd->priv; |
@@ -71,7 +68,8 @@ static int phram_point(struct mtd_info *mtd, loff_t from, size_t len, | |||
71 | return 0; | 68 | return 0; |
72 | } | 69 | } |
73 | 70 | ||
74 | static void phram_unpoint(struct mtd_info *mtd, u_char *addr, loff_t from, size_t len) | 71 | static void phram_unpoint(struct mtd_info *mtd, u_char *addr, loff_t from, |
72 | size_t len) | ||
75 | { | 73 | { |
76 | } | 74 | } |
77 | 75 | ||
@@ -80,8 +78,11 @@ static int phram_read(struct mtd_info *mtd, loff_t from, size_t len, | |||
80 | { | 78 | { |
81 | u_char *start = mtd->priv; | 79 | u_char *start = mtd->priv; |
82 | 80 | ||
83 | if (from + len > mtd->size) | 81 | if (from >= mtd->size) |
84 | return -EINVAL; | 82 | return -EINVAL; |
83 | |||
84 | if (len > mtd->size - from) | ||
85 | len = mtd->size - from; | ||
85 | 86 | ||
86 | memcpy(buf, start + from, len); | 87 | memcpy(buf, start + from, len); |
87 | 88 | ||
@@ -94,8 +95,11 @@ static int phram_write(struct mtd_info *mtd, loff_t to, size_t len, | |||
94 | { | 95 | { |
95 | u_char *start = mtd->priv; | 96 | u_char *start = mtd->priv; |
96 | 97 | ||
97 | if (to + len > mtd->size) | 98 | if (to >= mtd->size) |
98 | return -EINVAL; | 99 | return -EINVAL; |
100 | |||
101 | if (len > mtd->size - to) | ||
102 | len = mtd->size - to; | ||
99 | 103 | ||
100 | memcpy(start + to, buf, len); | 104 | memcpy(start + to, buf, len); |
101 | 105 | ||
@@ -145,7 +149,7 @@ static int register_device(char *name, unsigned long start, unsigned long len) | |||
145 | new->mtd.write = phram_write; | 149 | new->mtd.write = phram_write; |
146 | new->mtd.owner = THIS_MODULE; | 150 | new->mtd.owner = THIS_MODULE; |
147 | new->mtd.type = MTD_RAM; | 151 | new->mtd.type = MTD_RAM; |
148 | new->mtd.erasesize = 0; | 152 | new->mtd.erasesize = PAGE_SIZE; |
149 | 153 | ||
150 | ret = -EAGAIN; | 154 | ret = -EAGAIN; |
151 | if (add_mtd_device(&new->mtd)) { | 155 | if (add_mtd_device(&new->mtd)) { |
@@ -214,6 +218,15 @@ static int parse_name(char **pname, const char *token) | |||
214 | return 0; | 218 | return 0; |
215 | } | 219 | } |
216 | 220 | ||
221 | |||
222 | static inline void kill_final_newline(char *str) | ||
223 | { | ||
224 | char *newline = strrchr(str, '\n'); | ||
225 | if (newline && !newline[1]) | ||
226 | *newline = 0; | ||
227 | } | ||
228 | |||
229 | |||
217 | #define parse_err(fmt, args...) do { \ | 230 | #define parse_err(fmt, args...) do { \ |
218 | ERROR(fmt , ## args); \ | 231 | ERROR(fmt , ## args); \ |
219 | return 0; \ | 232 | return 0; \ |
@@ -232,6 +245,7 @@ static int phram_setup(const char *val, struct kernel_param *kp) | |||
232 | parse_err("parameter too long\n"); | 245 | parse_err("parameter too long\n"); |
233 | 246 | ||
234 | strcpy(str, val); | 247 | strcpy(str, val); |
248 | kill_final_newline(str); | ||
235 | 249 | ||
236 | for (i=0; i<3; i++) | 250 | for (i=0; i<3; i++) |
237 | token[i] = strsep(&str, ","); | 251 | token[i] = strsep(&str, ","); |