*
 ***************************************************************************/
 
-void
-vchiq_dump(void *dump_context, const char *str, int len)
+int vchiq_dump(void *dump_context, const char *str, int len)
 {
        struct dump_context *context = (struct dump_context *)dump_context;
        int copy_bytes;
 
        if (context->actual >= context->space)
-               return;
+               return 0;
 
        if (context->offset > 0) {
                int skip_bytes = min_t(int, len, context->offset);
                len -= skip_bytes;
                context->offset -= skip_bytes;
                if (context->offset > 0)
-                       return;
+                       return 0;
        }
        copy_bytes = min_t(int, len, context->space - context->actual);
        if (copy_bytes == 0)
-               return;
+               return 0;
        if (copy_to_user(context->buf + context->actual, str,
                         copy_bytes))
-               context->actual = -EFAULT;
+               return -EFAULT;
        context->actual += copy_bytes;
        len -= copy_bytes;
 
 
                if (copy_to_user(context->buf + context->actual - 1,
                                 &cr, 1))
-                       context->actual = -EFAULT;
+                       return -EFAULT;
        }
+       return 0;
 }
 
 /****************************************************************************
 *
 ***************************************************************************/
 
-void
-vchiq_dump_platform_instances(void *dump_context)
+int vchiq_dump_platform_instances(void *dump_context)
 {
        struct vchiq_state *state = vchiq_get_state();
        char buf[80];
        for (i = 0; i < state->unused_service; i++) {
                struct vchiq_service *service = state->services[i];
                struct vchiq_instance *instance;
+               int err;
 
                if (!service || service->base.callback != service_callback)
                        continue;
                               instance->completion_remove,
                               MAX_COMPLETIONS);
 
-               vchiq_dump(dump_context, buf, len + 1);
+               err = vchiq_dump(dump_context, buf, len + 1);
+               if (err)
+                       return err;
                instance->mark = 1;
        }
+       return 0;
 }
 
 /****************************************************************************
 *
 ***************************************************************************/
 
-void
-vchiq_dump_platform_service_state(void *dump_context,
-                                 struct vchiq_service *service)
+int vchiq_dump_platform_service_state(void *dump_context,
+                                     struct vchiq_service *service)
 {
        struct user_service *user_service =
                        (struct user_service *)service->base.userdata;
                                " (dequeue pending)");
        }
 
-       vchiq_dump(dump_context, buf, len + 1);
+       return vchiq_dump(dump_context, buf, len + 1);
 }
 
 /****************************************************************************
        size_t count, loff_t *ppos)
 {
        struct dump_context context;
+       int err;
 
        context.buf = buf;
        context.actual = 0;
        context.space = count;
        context.offset = *ppos;
 
-       vchiq_dump_state(&context, &g_state);
+       err = vchiq_dump_state(&context, &g_state);
+       if (err)
+               return err;
 
        *ppos += context.actual;
 
 
        return status;
 }
 
-static void
+static int
 vchiq_dump_shared_state(void *dump_context, struct vchiq_state *state,
                        struct vchiq_shared_state *shared, const char *label)
 {
        int i;
        char buf[80];
        int len;
+       int err;
 
        len = scnprintf(buf, sizeof(buf),
                "  %s: slots %d-%d tx_pos=%x recycle=%x",
                label, shared->slot_first, shared->slot_last,
                shared->tx_pos, shared->slot_queue_recycle);
-       vchiq_dump(dump_context, buf, len + 1);
+       err = vchiq_dump(dump_context, buf, len + 1);
+       if (err)
+               return err;
 
        len = scnprintf(buf, sizeof(buf),
                "    Slots claimed:");
-       vchiq_dump(dump_context, buf, len + 1);
+       err = vchiq_dump(dump_context, buf, len + 1);
+       if (err)
+               return err;
 
        for (i = shared->slot_first; i <= shared->slot_last; i++) {
                struct vchiq_slot_info slot_info =
                        len = scnprintf(buf, sizeof(buf),
                                "      %d: %d/%d", i, slot_info.use_count,
                                slot_info.release_count);
-                       vchiq_dump(dump_context, buf, len + 1);
+                       err = vchiq_dump(dump_context, buf, len + 1);
+                       if (err)
+                               return err;
                }
        }
 
        for (i = 1; i < shared->debug[DEBUG_ENTRIES]; i++) {
                len = scnprintf(buf, sizeof(buf), "    DEBUG: %s = %d(%x)",
                        debug_names[i], shared->debug[i], shared->debug[i]);
-               vchiq_dump(dump_context, buf, len + 1);
+               err = vchiq_dump(dump_context, buf, len + 1);
+               if (err)
+                       return err;
        }
+       return 0;
 }
 
-void
-vchiq_dump_state(void *dump_context, struct vchiq_state *state)
+int vchiq_dump_state(void *dump_context, struct vchiq_state *state)
 {
        char buf[80];
        int len;
        int i;
+       int err;
 
        len = scnprintf(buf, sizeof(buf), "State %d: %s", state->id,
                conn_state_names[state->conn_state]);
-       vchiq_dump(dump_context, buf, len + 1);
+       err = vchiq_dump(dump_context, buf, len + 1);
+       if (err)
+               return err;
 
        len = scnprintf(buf, sizeof(buf),
                "  tx_pos=%x(@%pK), rx_pos=%x(@%pK)",
                state->tx_data + (state->local_tx_pos & VCHIQ_SLOT_MASK),
                state->rx_pos,
                state->rx_data + (state->rx_pos & VCHIQ_SLOT_MASK));
-       vchiq_dump(dump_context, buf, len + 1);
+       err = vchiq_dump(dump_context, buf, len + 1);
+       if (err)
+               return err;
 
        len = scnprintf(buf, sizeof(buf),
                "  Version: %d (min %d)",
                VCHIQ_VERSION, VCHIQ_VERSION_MIN);
-       vchiq_dump(dump_context, buf, len + 1);
+       err = vchiq_dump(dump_context, buf, len + 1);
+       if (err)
+               return err;
 
        if (VCHIQ_ENABLE_STATS) {
                len = scnprintf(buf, sizeof(buf),
                        "error_count=%d",
                        state->stats.ctrl_tx_count, state->stats.ctrl_rx_count,
                        state->stats.error_count);
-               vchiq_dump(dump_context, buf, len + 1);
+               err = vchiq_dump(dump_context, buf, len + 1);
+               if (err)
+                       return err;
        }
 
        len = scnprintf(buf, sizeof(buf),
                state->data_quota - state->data_use_count,
                state->local->slot_queue_recycle - state->slot_queue_available,
                state->stats.slot_stalls, state->stats.data_stalls);
-       vchiq_dump(dump_context, buf, len + 1);
-
-       vchiq_dump_platform_state(dump_context);
-
-       vchiq_dump_shared_state(dump_context, state, state->local, "Local");
-       vchiq_dump_shared_state(dump_context, state, state->remote, "Remote");
-
-       vchiq_dump_platform_instances(dump_context);
+       err = vchiq_dump(dump_context, buf, len + 1);
+       if (err)
+               return err;
+
+       err = vchiq_dump_platform_state(dump_context);
+       if (err)
+               return err;
+
+       err = vchiq_dump_shared_state(dump_context,
+                                     state,
+                                     state->local,
+                                     "Local");
+       if (err)
+               return err;
+       err = vchiq_dump_shared_state(dump_context,
+                                     state,
+                                     state->remote,
+                                     "Remote");
+       if (err)
+               return err;
+
+       err = vchiq_dump_platform_instances(dump_context);
+       if (err)
+               return err;
 
        for (i = 0; i < state->unused_service; i++) {
                struct vchiq_service *service = find_service_by_port(state, i);
 
                if (service) {
-                       vchiq_dump_service_state(dump_context, service);
+                       err = vchiq_dump_service_state(dump_context, service);
                        unlock_service(service);
+                       if (err)
+                               return err;
                }
        }
+       return 0;
 }
 
-void
-vchiq_dump_service_state(void *dump_context, struct vchiq_service *service)
+int vchiq_dump_service_state(void *dump_context, struct vchiq_service *service)
 {
        char buf[80];
        int len;
+       int err;
 
        len = scnprintf(buf, sizeof(buf), "Service %u: %s (ref %u)",
                service->localport, srvstate_names[service->srvstate],
                        service_quota->slot_use_count,
                        service_quota->slot_quota);
 
-               vchiq_dump(dump_context, buf, len + 1);
+               err = vchiq_dump(dump_context, buf, len + 1);
+               if (err)
+                       return err;
 
                tx_pending = service->bulk_tx.local_insert -
                        service->bulk_tx.remote_insert;
                        BULK_INDEX(service->bulk_rx.remove)].size : 0);
 
                if (VCHIQ_ENABLE_STATS) {
-                       vchiq_dump(dump_context, buf, len + 1);
+                       err = vchiq_dump(dump_context, buf, len + 1);
+                       if (err)
+                               return err;
 
                        len = scnprintf(buf, sizeof(buf),
                                "  Ctrl: tx_count=%d, tx_bytes=%llu, "
                                service->stats.ctrl_tx_bytes,
                                service->stats.ctrl_rx_count,
                                service->stats.ctrl_rx_bytes);
-                       vchiq_dump(dump_context, buf, len + 1);
+                       err = vchiq_dump(dump_context, buf, len + 1);
+                       if (err)
+                               return err;
 
                        len = scnprintf(buf, sizeof(buf),
                                "  Bulk: tx_count=%d, tx_bytes=%llu, "
                                service->stats.bulk_tx_bytes,
                                service->stats.bulk_rx_count,
                                service->stats.bulk_rx_bytes);
-                       vchiq_dump(dump_context, buf, len + 1);
+                       err = vchiq_dump(dump_context, buf, len + 1);
+                       if (err)
+                               return err;
 
                        len = scnprintf(buf, sizeof(buf),
                                "  %d quota stalls, %d slot stalls, "
                }
        }
 
-       vchiq_dump(dump_context, buf, len + 1);
+       err = vchiq_dump(dump_context, buf, len + 1);
+       if (err)
+               return err;
 
        if (service->srvstate != VCHIQ_SRVSTATE_FREE)
-               vchiq_dump_platform_service_state(dump_context, service);
+               err = vchiq_dump_platform_service_state(dump_context, service);
+       return err;
 }
 
 void