diff options
-rw-r--r-- | drivers/mtd/mtdpart.c | 17 | ||||
-rw-r--r-- | include/linux/mtd/mtd.h | 9 |
2 files changed, 26 insertions, 0 deletions
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index 6174a97d7902..c66902df3171 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c | |||
@@ -151,6 +151,20 @@ static int part_write (struct mtd_info *mtd, loff_t to, size_t len, | |||
151 | len, retlen, buf); | 151 | len, retlen, buf); |
152 | } | 152 | } |
153 | 153 | ||
154 | static int part_panic_write (struct mtd_info *mtd, loff_t to, size_t len, | ||
155 | size_t *retlen, const u_char *buf) | ||
156 | { | ||
157 | struct mtd_part *part = PART(mtd); | ||
158 | if (!(mtd->flags & MTD_WRITEABLE)) | ||
159 | return -EROFS; | ||
160 | if (to >= mtd->size) | ||
161 | len = 0; | ||
162 | else if (to + len > mtd->size) | ||
163 | len = mtd->size - to; | ||
164 | return part->master->panic_write (part->master, to + part->offset, | ||
165 | len, retlen, buf); | ||
166 | } | ||
167 | |||
154 | static int part_write_oob(struct mtd_info *mtd, loff_t to, | 168 | static int part_write_oob(struct mtd_info *mtd, loff_t to, |
155 | struct mtd_oob_ops *ops) | 169 | struct mtd_oob_ops *ops) |
156 | { | 170 | { |
@@ -352,6 +366,9 @@ int add_mtd_partitions(struct mtd_info *master, | |||
352 | slave->mtd.read = part_read; | 366 | slave->mtd.read = part_read; |
353 | slave->mtd.write = part_write; | 367 | slave->mtd.write = part_write; |
354 | 368 | ||
369 | if (master->panic_write) | ||
370 | slave->mtd.panic_write = part_panic_write; | ||
371 | |||
355 | if(master->point && master->unpoint){ | 372 | if(master->point && master->unpoint){ |
356 | slave->mtd.point = part_point; | 373 | slave->mtd.point = part_point; |
357 | slave->mtd.unpoint = part_unpoint; | 374 | slave->mtd.unpoint = part_unpoint; |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 783fc983417c..0a13bb35f044 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
@@ -152,6 +152,15 @@ struct mtd_info { | |||
152 | int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); | 152 | int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); |
153 | int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); | 153 | int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); |
154 | 154 | ||
155 | /* In blackbox flight recorder like scenarios we want to make successful | ||
156 | writes in interrupt context. panic_write() is only intended to be | ||
157 | called when its known the kernel is about to panic and we need the | ||
158 | write to succeed. Since the kernel is not going to be running for much | ||
159 | longer, this function can break locks and delay to ensure the write | ||
160 | succeeds (but not sleep). */ | ||
161 | |||
162 | int (*panic_write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); | ||
163 | |||
155 | int (*read_oob) (struct mtd_info *mtd, loff_t from, | 164 | int (*read_oob) (struct mtd_info *mtd, loff_t from, |
156 | struct mtd_oob_ops *ops); | 165 | struct mtd_oob_ops *ops); |
157 | int (*write_oob) (struct mtd_info *mtd, loff_t to, | 166 | int (*write_oob) (struct mtd_info *mtd, loff_t to, |