+2005-07-18 Martin Hunt <hunt@redhat.com>
+
+ * transport.h (_stp_transport_write): Call _stp_relay_write().
+
+ * transport.c (_stp_cleanup_and_exit): Print transport
+ failure count.
+ (_stp_relay_write): Like relay_write() except returns
+ -1 on error.
+
2005-07-14 Tom Zanussi <zanussi@us.ibm.com>
* netlink.c (_stp_netlink_open): Add missing delayed_pkts
int trylimit = 50;
if (_stp_exit_called == 0) {
+
+ int failures = atomic_read(&_stp_transport_failures);
_stp_exit_called = 1;
probe_exit();
+ if (failures)
+ _stp_warn ("There were %d transport failures.\n", failures);
_stp_transport_flush();
}
-
+
while (_stp_ctrl_send(STP_EXIT, name, strlen(name)+1, _stp_tport->pid) < 0 && trylimit--)
msleep (5);
}
/*
* Call probe_exit() if necessary and send a message to stpd to unload the module.
*/
+
+
+
static void stp_exit_helper (void *data)
{
_stp_cleanup_and_exit(__this_module.name);
{
if (!_stp_tport)
return;
-
+
_stp_ctrl_unregister(_stp_tport->pid);
if (!_stp_streaming())
_stp_relayfs_close(_stp_tport->chan, _stp_tport->dir);
return err;
}
+/* like relay_write except returns an error code */
+
+static int _stp_relay_write (struct rchan *chan,
+ const void *data,
+ unsigned length)
+{
+ unsigned long flags;
+ struct rchan_buf *buf;
+
+ if (unlikely(length == 0))
+ return 0;
+
+ local_irq_save(flags);
+ buf = chan->buf[smp_processor_id()];
+ if (unlikely(buf->offset + length > chan->subbuf_size))
+ length = relay_switch_subbuf(buf, length);
+ memcpy(buf->data + buf->offset, data, length);
+ buf->offset += length;
+ local_irq_restore(flags);
+
+ if (unlikely(length == 0))
+ return -1;
+
+ return length;
+}
+
/** @} */
#endif /* _TRANSPORT_C_ */
#include "netlink.h"
#include "relayfs.h"
+void _stp_warn (const char *fmt, ...);
+
static unsigned n_subbufs = 4;
static unsigned subbuf_size = 65536;
#ifdef STP_NETLINK_ONLY
#define _stp_transport_write(t, data, len) _stp_transport_send (t->pid, data, len)
#else
-#define _stp_transport_write(t, data, len) relay_write(t->chan, data, len)
+#define _stp_transport_write(t, data, len) _stp_relay_write(t->chan, data, len)
#endif
extern void _stp_transport_cleanup(void);