diff options
| -rw-r--r-- | net/rds/ib_send.c | 5 | ||||
| -rw-r--r-- | net/rds/loop.c | 11 |
2 files changed, 12 insertions, 4 deletions
diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c index 71f373c421b..c47a511f203 100644 --- a/net/rds/ib_send.c +++ b/net/rds/ib_send.c | |||
| @@ -551,7 +551,10 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
| 551 | if (conn->c_loopback | 551 | if (conn->c_loopback |
| 552 | && rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { | 552 | && rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { |
| 553 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); | 553 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); |
| 554 | return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | 554 | scat = &rm->data.op_sg[sg]; |
| 555 | ret = sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | ||
| 556 | ret = min_t(int, ret, scat->length - conn->c_xmit_data_off); | ||
| 557 | return ret; | ||
| 555 | } | 558 | } |
| 556 | 559 | ||
| 557 | /* FIXME we may overallocate here */ | 560 | /* FIXME we may overallocate here */ |
diff --git a/net/rds/loop.c b/net/rds/loop.c index aeec1d483b1..bca6761a3ca 100644 --- a/net/rds/loop.c +++ b/net/rds/loop.c | |||
| @@ -61,10 +61,15 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
| 61 | unsigned int hdr_off, unsigned int sg, | 61 | unsigned int hdr_off, unsigned int sg, |
| 62 | unsigned int off) | 62 | unsigned int off) |
| 63 | { | 63 | { |
| 64 | struct scatterlist *sgp = &rm->data.op_sg[sg]; | ||
| 65 | int ret = sizeof(struct rds_header) + | ||
| 66 | be32_to_cpu(rm->m_inc.i_hdr.h_len); | ||
| 67 | |||
| 64 | /* Do not send cong updates to loopback */ | 68 | /* Do not send cong updates to loopback */ |
| 65 | if (rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { | 69 | if (rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { |
| 66 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); | 70 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); |
| 67 | return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | 71 | ret = min_t(int, ret, sgp->length - conn->c_xmit_data_off); |
| 72 | goto out; | ||
| 68 | } | 73 | } |
| 69 | 74 | ||
| 70 | BUG_ON(hdr_off || sg || off); | 75 | BUG_ON(hdr_off || sg || off); |
| @@ -80,8 +85,8 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
| 80 | NULL); | 85 | NULL); |
| 81 | 86 | ||
| 82 | rds_inc_put(&rm->m_inc); | 87 | rds_inc_put(&rm->m_inc); |
| 83 | 88 | out: | |
| 84 | return sizeof(struct rds_header) + be32_to_cpu(rm->m_inc.i_hdr.h_len); | 89 | return ret; |
| 85 | } | 90 | } |
| 86 | 91 | ||
| 87 | /* | 92 | /* |
