From: Andy Grover <andy.grover@oracle.com>
Date: Thu, 4 Feb 2010 03:40:32 +0000 (-0800)
Subject: RDS: Do not set op_active in r_m_copy_from_user().
X-Git-Tag: firefly_0821_release~7613^2~3670^2~499^2~74
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=372cd7dedfd1ea93a9ae8d9c282e910dc1b76773;p=firefly-linux-kernel-4.4.55.git

RDS: Do not set op_active in r_m_copy_from_user().

Do not allocate sgs for data for 0-length datagrams

Set data.op_active in rds_sendmsg() instead of
rds_message_copy_from_user().

Signed-off-by: Andy Grover <andy.grover@oracle.com>
---

diff --git a/net/rds/message.c b/net/rds/message.c
index 4bd9504ca048..f4c3be0878e9 100644
--- a/net/rds/message.c
+++ b/net/rds/message.c
@@ -330,8 +330,6 @@ int rds_message_copy_from_user(struct rds_message *rm, struct iovec *first_iov,
 			sg++;
 	}
 
-	rm->data.op_active = 1;
-
 out:
 	return ret;
 }
diff --git a/net/rds/send.c b/net/rds/send.c
index 66dc6b045261..ad89a63c4304 100644
--- a/net/rds/send.c
+++ b/net/rds/send.c
@@ -970,11 +970,14 @@ int rds_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
 		goto out;
 	}
 
-	rm->data.op_sg = rds_message_alloc_sgs(rm, ceil(payload_len, PAGE_SIZE));
-	/* XXX fix this to not allocate memory */
-	ret = rds_message_copy_from_user(rm, msg->msg_iov, payload_len);
-	if (ret)
-		goto out;
+	/* Attach data to the rm */
+	if (payload_len) {
+		rm->data.op_sg = rds_message_alloc_sgs(rm, ceil(payload_len, PAGE_SIZE));
+		ret = rds_message_copy_from_user(rm, msg->msg_iov, payload_len);
+		if (ret)
+			goto out;
+	}
+	rm->data.op_active = 1;
 
 	rm->m_daddr = daddr;