/******************************************************************************
*******************************************************************************
**
** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
** Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved.
**
** This copyrighted material is made available to anyone wishing to use,
** modify, copy, or redistribute it subject to the terms and conditions
** of the GNU General Public License v.2.
**
*******************************************************************************
******************************************************************************/
/*
* midcomms.c
*
* This is the appallingly named "mid-level" comms layer.
*
* Its purpose is to take packets from the "real" comms layer,
* split them up into packets and pass them to the interested
* part of the locking mechanism.
*
* It also takes messages from the locking layer, formats them
* into packets and sends them to the comms layer.
*/
#include "dlm_internal.h"
#include "lowcomms.h"
#include "config.h"
#include "lock.h"
#include "midcomms.h"
static void copy_from_cb(void *dst, const void *base, unsigned offset,
unsigned len, unsigned limit)
{
unsigned copy = len;
if ((copy + offset) > limit)
copy = limit - offset;
memcpy(dst, base + offset, copy);
len -= copy;
if (len)
memcpy(dst + copy, base, len);
}
/*
* Called from the low-level comms layer to process a buffer of
* commands.
*
* Only complete messages are processed here, any "spare" bytes from
* the end of a buffer are saved and tacked onto the front of the next
* message that comes in. I doubt this will happen very often but we
* need to be able to cope with it and I don't want the task to be waiting
* for packets to come in when there is useful work to be done.
*/
int dlm_process_incoming_buffer(int nodeid, const void *base,
unsigned offset, unsigned len, unsigned limit)
{
union {
unsigned char __buf[DLM_INBUF_LEN];
/* this is to force proper alignment on some arches */
union dlm_packet p;
} __tmp;
union dlm_packet *p = &__tmp.p;
int ret = 0;
int err = 0;
uint16_t msglen;
uint32_t lockspace;
while (len > sizeof(struct dlm_header)) {
/* Copy just the header to check the total length. The
message may wrap around the end of the buffer back to the
start, so we need to use a temp buffer and copy_from_cb. */
copy_from_cb(p, base, offset, sizeof(struct dlm_header),
limit);
msglen = le16_to_cpu(p->header.h_length);
lockspace = p->header.h_lockspace;
err = -EINVAL;
if (msglen < sizeof(struct dlm_header))
break;
if (p->header.h_cmd == DLM_MSG) {
if (msglen < sizeof(struct dlm_message))
break;
} else {
if (msglen < sizeof(struct dlm_rcom))
break;
}
err = -E2BIG;
if (msglen > dlm_config.ci_buffer_size) {
log_print("message size %d from %d too big, buf len %d",
msglen, nodeid, len);
break;
}
err = 0;
/* If only part of the full message is contained in this
buffer, then do nothing and wait for lowcomms to call
us again later with more data. We return 0 meaning
we've consumed none of the input buffer. */
if (msglen > len)
break;
/* Allocate a larger temp buffer if the full message won't fit
in the buffer on the stack (which should work for most
ordinary messages). */
if (msglen > sizeof(__tmp) && p == &__tmp.p) {
p = kmalloc(dlm_config.ci_buffer_size, GFP_NOFS);
if (p == NULL)
return ret;
}
copy_from_cb(p, base, offset, msglen, limit);
BUG_ON(lockspace != p->header.h_lockspace);
ret += msglen;
offset += msglen;
offset &= (limit - 1);
len -= msglen;
dlm_receive_buffer(p, nodeid);
}
if (p != &__tmp.p)
kfree(p);
return err ? err : ret;
}
gs/clock/alphascale,asm9260.h?id=6bdded59c8933940ac7e5b416448276ac89d1144'>plain
-rw-r--r-- | at91.h | 751 | logplain |
-rw-r--r-- | ath79-clk.h | 479 | logplain |
-rw-r--r-- | axis,artpec6-clkctrl.h | 1112 | logplain |
-rw-r--r-- | bcm-cygnus.h | 3135 | logplain |
-rw-r--r-- | bcm-ns2.h | 2915 | logplain |
-rw-r--r-- | bcm-nsp.h | 2148 | logplain |
-rw-r--r-- | bcm21664.h | 1984 | logplain |
-rw-r--r-- | bcm281xx.h | 2456 | logplain |
-rw-r--r-- | bcm2835-aux.h | 635 | logplain |
-rw-r--r-- | bcm2835.h | 1962 | logplain |
-rw-r--r-- | berlin2.h | 1034 | logplain |
-rw-r--r-- | berlin2q.h | 695 | logplain |
-rw-r--r-- | clps711x-clock.h | 718 | logplain |
-rw-r--r-- | efm32-cmu.h | 1112 | logplain |
-rw-r--r-- | exynos-audss-clk.h | 597 | logplain |
-rw-r--r-- | exynos3250.h | 9083 | logplain |
-rw-r--r-- | exynos4.h | 8284 | logplain |
-rw-r--r-- | exynos4415.h | 9828 | logplain |
-rw-r--r-- | exynos5250.h | 4616 | logplain |
-rw-r--r-- | exynos5260-clk.h | 14876 | logplain |
-rw-r--r-- | exynos5410.h | 1689 | logplain |
-rw-r--r-- | exynos5420.h | 6857 | logplain |
-rw-r--r-- | exynos5433.h | 45372 | logplain |
-rw-r--r-- | exynos5440.h | 1141 | logplain |
-rw-r--r-- | exynos7-clk.h | 5281 | logplain |
-rw-r--r-- | gxbb-aoclkc.h | 2866 | logplain |
-rw-r--r-- | gxbb-clkc.h | 592 | logplain |
-rw-r--r-- | hi3516cv300-clock.h | 1668 | logplain |
-rw-r--r-- | hi3519-clock.h | 1328 | logplain |
-rw-r--r-- | hi3620-clock.h | 4496 | logplain |
-rw-r--r-- | hi6220-clock.h | 4508 | logplain |
-rw-r--r-- | hip04-clock.h | 1137 | logplain |
-rw-r--r-- | histb-clock.h | 2012 | logplain |
-rw-r--r-- | hix5hd2-clock.h | 2415 | logplain |
-rw-r--r-- | imx1-clock.h | 1055 | logplain |
-rw-r--r-- | imx21-clock.h | 2461 | logplain |
-rw-r--r-- | imx27-clock.h | 3494 | logplain |
-rw-r--r-- | imx5-clock.h | 7212 | logplain |
-rw-r--r-- | imx6qdl-clock.h | 9593 | logplain |
-rw-r--r-- | imx6sl-clock.h | 5849 | logplain |
-rw-r--r-- | imx6sx-clock.h | 9099 | logplain |
-rw-r--r-- | imx6ul-clock.h | 8203 | logplain |
-rw-r--r-- | imx7d-clock.h | 15974 | logplain |
-rw-r--r-- | jz4740-cgu.h | 1028 | logplain |
-rw-r--r-- | jz4780-cgu.h | 2470 | logplain |
-rw-r--r-- | lpc18xx-ccu.h | 2134 | logplain |
-rw-r--r-- | lpc18xx-cgu.h | 1142 | logplain |
-rw-r--r-- | lpc32xx-clock.h | 1633 | logplain |
-rw-r--r-- | lsi,axm5516-clks.h | 974 | logplain |
-rw-r--r-- | marvell,mmp2.h | 2022 | logplain |
-rw-r--r-- | marvell,pxa168.h | 1654 | logplain |
-rw-r--r-- | marvell,pxa1928.h | 1535 | logplain |
-rw-r--r-- | marvell,pxa910.h | 1598 | logplain |
-rw-r--r-- | maxim,max77620.h | 632 | logplain |
-rw-r--r-- | maxim,max77686.h | 648 | logplain |
-rw-r--r-- | maxim,max77802.h | 630 | logplain |
-rw-r--r-- | meson8b-clkc.h | 523 | logplain |
-rw-r--r-- | microchip,pic32-clock.h | 1150 | logplain |
-rw-r--r-- | mpc512x-clock.h | 2236 | logplain |
-rw-r--r-- | mt2701-clk.h | 13832 | logplain |
-rw-r--r-- | mt8135-clk.h | 5641 | logplain |
-rw-r--r-- | mt8173-clk.h | 9293 | logplain |
-rw-r--r-- | oxsemi,ox810se.h | 1002 | logplain |
-rw-r--r-- | oxsemi,ox820.h | 1203 | logplain |
-rw-r--r-- | pistachio-clk.h | 4863 | logplain |
-rw-r--r-- | pxa-clock.h | 1715 | logplain |
-rw-r--r-- | qcom,gcc-apq8084.h | 12872 | logplain |
-rw-r--r-- | qcom,gcc-ipq4019.h | 5423 | logplain |
-rw-r--r-- | qcom,gcc-ipq806x.h | 8574 | logplain |
-rw-r--r-- | qcom,gcc-mdm9615.h | 9497 | logplain |
-rw-r--r-- | qcom,gcc-msm8660.h | 7932 | logplain |
-rw-r--r-- | qcom,gcc-msm8916.h | 6190 | logplain |
-rw-r--r-- | qcom,gcc-msm8960.h | 9342 | logplain |
-rw-r--r-- | qcom,gcc-msm8974.h | 12340 | logplain |
-rw-r--r-- | qcom,gcc-msm8994.h | 4858 | logplain |
-rw-r--r-- | qcom,gcc-msm8996.h | 12575 | logplain |
-rw-r--r-- | qcom,lcc-ipq806x.h | 899 | logplain |
-rw-r--r-- | qcom,lcc-mdm9615.h | 1701 | logplain |
-rw-r--r-- | qcom,lcc-msm8960.h | 1616 | logplain |
-rw-r--r-- | qcom,mmcc-apq8084.h | 5722 | logplain |
-rw-r--r-- | qcom,mmcc-msm8960.h | 4109 | logplain |
-rw-r--r-- | qcom,mmcc-msm8974.h | 5223 | logplain |
-rw-r--r-- | qcom,mmcc-msm8996.h | 9403 | logplain |
-rw-r--r-- | qcom,rpmcc.h | 2101 | logplain |
-rw-r--r-- | r7s72100-clock.h | 1218 | logplain |
-rw-r--r-- | r8a73a4-clock.h | 1596 | logplain |
-rw-r--r-- | r8a7740-clock.h | 1992 | logplain |
-rw-r--r-- | r8a7743-cpg-mssr.h | 1269 | logplain |
-rw-r--r-- | r8a7745-cpg-mssr.h | 1298 | logplain |
-rw-r--r-- | r8a7778-clock.h | 1855 | logplain |
-rw-r--r-- | r8a7779-clock.h | 1647 | logplain |
-rw-r--r-- | r8a7790-clock.h | 4367 | logplain |
-rw-r--r-- | r8a7791-clock.h | 4388 | logplain |
-rw-r--r-- | r8a7792-clock.h | 2562 | logplain |
-rw-r--r-- | r8a7793-clock.h | 4561 | logplain |
-rw-r--r-- | r8a7794-clock.h | 3679 | logplain |
-rw-r--r-- | r8a7795-cpg-mssr.h | 1890 | logplain |
-rw-r--r-- | r8a7796-cpg-mssr.h | 2066 | logplain |
-rw-r--r-- | renesas-cpg-mssr.h | 542 | logplain |
-rw-r--r-- | rk1108-cru.h | 6605 | logplain |
-rw-r--r-- | rk3036-cru.h | 4584 | logplain |
-rw-r--r-- | rk3066a-cru.h | 1068 | logplain |
-rw-r--r-- | rk3188-cru-common.h | 6105 | logplain |
-rw-r--r-- | rk3188-cru.h | 1435 | logplain |