aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Bityutskiy <artem.bityutskiy@linux.intel.com>2011-12-23 11:03:17 -0500
committerDavid Woodhouse <David.Woodhouse@intel.com>2012-01-09 13:25:22 -0500
commit7ae79d7ff1769a3e9c47076b46e4eaa11204a2ee (patch)
tree34c084261dd52d4f015f2399405824b9fcebda6f
parenteda95cbf75193808f62948fb0142ba0901d8bee2 (diff)
mtd: introduce mtd_panic_write interface
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r--drivers/mtd/mtdoops.c4
-rw-r--r--drivers/mtd/mtdpart.c4
-rw-r--r--include/linux/mtd/mtd.h25
3 files changed, 19 insertions, 14 deletions
diff --git a/drivers/mtd/mtdoops.c b/drivers/mtd/mtdoops.c
index 9c9d58617c98..7be2018ffbcc 100644
--- a/drivers/mtd/mtdoops.c
+++ b/drivers/mtd/mtdoops.c
@@ -222,8 +222,8 @@ static void mtdoops_write(struct mtdoops_context *cxt, int panic)
222 hdr[1] = MTDOOPS_KERNMSG_MAGIC; 222 hdr[1] = MTDOOPS_KERNMSG_MAGIC;
223 223
224 if (panic) 224 if (panic)
225 ret = mtd->panic_write(mtd, cxt->nextpage * record_size, 225 ret = mtd_panic_write(mtd, cxt->nextpage * record_size,
226 record_size, &retlen, cxt->oops_buf); 226 record_size, &retlen, cxt->oops_buf);
227 else 227 else
228 ret = mtd_write(mtd, cxt->nextpage * record_size, 228 ret = mtd_write(mtd, cxt->nextpage * record_size,
229 record_size, &retlen, cxt->oops_buf); 229 record_size, &retlen, cxt->oops_buf);
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index 96574a036567..9ed58f7d7466 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -201,8 +201,8 @@ static int part_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
201 len = 0; 201 len = 0;
202 else if (to + len > mtd->size) 202 else if (to + len > mtd->size)
203 len = mtd->size - to; 203 len = mtd->size - to;
204 return part->master->panic_write(part->master, to + part->offset, 204 return mtd_panic_write(part->master, to + part->offset, len, retlen,
205 len, retlen, buf); 205 buf);
206} 206}
207 207
208static int part_write_oob(struct mtd_info *mtd, loff_t to, 208static int part_write_oob(struct mtd_info *mtd, loff_t to,
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index 1da7f4a6ef88..2fb83cd3d264 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -186,6 +186,8 @@ struct mtd_info {
186 size_t *retlen, u_char *buf); 186 size_t *retlen, u_char *buf);
187 int (*write) (struct mtd_info *mtd, loff_t to, size_t len, 187 int (*write) (struct mtd_info *mtd, loff_t to, size_t len,
188 size_t *retlen, const u_char *buf); 188 size_t *retlen, const u_char *buf);
189 int (*panic_write) (struct mtd_info *mtd, loff_t to, size_t len,
190 size_t *retlen, const u_char *buf);
189 191
190 /* Backing device capabilities for this device 192 /* Backing device capabilities for this device
191 * - provides mmap capabilities 193 * - provides mmap capabilities
@@ -193,16 +195,6 @@ struct mtd_info {
193 struct backing_dev_info *backing_dev_info; 195 struct backing_dev_info *backing_dev_info;
194 196
195 197
196
197 /* In blackbox flight recorder like scenarios we want to make successful
198 writes in interrupt context. panic_write() is only intended to be
199 called when its known the kernel is about to panic and we need the
200 write to succeed. Since the kernel is not going to be running for much
201 longer, this function can break locks and delay to ensure the write
202 succeeds (but not sleep). */
203
204 int (*panic_write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
205
206 int (*read_oob) (struct mtd_info *mtd, loff_t from, 198 int (*read_oob) (struct mtd_info *mtd, loff_t from,
207 struct mtd_oob_ops *ops); 199 struct mtd_oob_ops *ops);
208 int (*write_oob) (struct mtd_info *mtd, loff_t to, 200 int (*write_oob) (struct mtd_info *mtd, loff_t to,
@@ -315,6 +307,19 @@ static inline int mtd_write(struct mtd_info *mtd, loff_t to, size_t len,
315 return mtd->write(mtd, to, len, retlen, buf); 307 return mtd->write(mtd, to, len, retlen, buf);
316} 308}
317 309
310/*
311 * In blackbox flight recorder like scenarios we want to make successful writes
312 * in interrupt context. panic_write() is only intended to be called when its
313 * known the kernel is about to panic and we need the write to succeed. Since
314 * the kernel is not going to be running for much longer, this function can
315 * break locks and delay to ensure the write succeeds (but not sleep).
316 */
317static inline int mtd_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
318 size_t *retlen, const u_char *buf)
319{
320 return mtd->panic_write(mtd, to, len, retlen, buf);
321}
322
318static inline struct mtd_info *dev_to_mtd(struct device *dev) 323static inline struct mtd_info *dev_to_mtd(struct device *dev)
319{ 324{
320 return dev ? dev_get_drvdata(dev) : NULL; 325 return dev ? dev_get_drvdata(dev) : NULL;