pstore: Introduce write_buf backend callback
authorAnton Vorontsov <anton.vorontsov@linaro.org>
Tue, 10 Jul 2012 00:10:40 +0000 (17:10 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 17 Jul 2012 16:51:38 +0000 (09:51 -0700)
For function tracing we need to stop using pstore.buf directly, since
in a tracing callback we can't use spinlocks, and thus we can't safely
use the global buffer.

With write_buf callback, backends no longer need to access pstore.buf
directly, and thus we can pass any buffers (e.g. allocated on stack).

Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/pstore/platform.c
include/linux/pstore.h

index 6b3ff045fe6e9ef9c5043ec0898a3548c0e27efe..ef5ca8a0255c8926d8f65fed389a73fae2862327 100644 (file)
@@ -188,6 +188,14 @@ static void pstore_register_console(void)
 static void pstore_register_console(void) {}
 #endif
 
+static int pstore_write_compat(enum pstore_type_id type,
+                              enum kmsg_dump_reason reason,
+                              u64 *id, unsigned int part,
+                              size_t size, struct pstore_info *psi)
+{
+       return psi->write_buf(type, reason, id, part, psinfo->buf, size, psi);
+}
+
 /*
  * platform specific persistent storage driver registers with
  * us here. If pstore is already mounted, call the platform
@@ -212,6 +220,8 @@ int pstore_register(struct pstore_info *psi)
                return -EINVAL;
        }
 
+       if (!psi->write)
+               psi->write = pstore_write_compat;
        psinfo = psi;
        mutex_init(&psinfo->read_mutex);
        spin_unlock(&pstore_lock);
index 1bd014b8e432f331a0e8b14e03007e15c9d55e4b..b107484192fc1263348375ca21898f92cd6778a2 100644 (file)
@@ -48,6 +48,10 @@ struct pstore_info {
        int             (*write)(enum pstore_type_id type,
                        enum kmsg_dump_reason reason, u64 *id,
                        unsigned int part, size_t size, struct pstore_info *psi);
+       int             (*write_buf)(enum pstore_type_id type,
+                       enum kmsg_dump_reason reason, u64 *id,
+                       unsigned int part, const char *buf, size_t size,
+                       struct pstore_info *psi);
        int             (*erase)(enum pstore_type_id type, u64 id,
                        struct pstore_info *psi);
        void            *data;