Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a34041af authored by Patrick Farrell's avatar Patrick Farrell Committed by Greg Kroah-Hartman
Browse files

staging/lustre/ptlrpc: Fix assertion failure of null_alloc_rs()



lustre_get_emerg_rs() set the size of the reply buffer to zero
by mistake, which will cause LBUG in null_alloc_rs() when memory
pressure is high. This patch fix this problem and adds a size
check to avoid the problem of insufficient buffer size.

Signed-off-by: default avatarLi Xi <lixi@ddn.com>
Signed-off-by: default avatarPatrick Farrell <paf@cray.com>
Reviewed-on: http://review.whamcloud.com/8200
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-3680


Reviewed-by: default avatarJohn L. Hammond <john.hammond@intel.com>
Signed-off-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2d5eafc1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -300,6 +300,7 @@ lustre_get_emerg_rs(struct ptlrpc_service_part *svcpt)
	spin_unlock(&svcpt->scp_rep_lock);

	memset(rs, 0, svcpt->scp_service->srv_max_reply_size);
	rs->rs_size = svcpt->scp_service->srv_max_reply_size;
	rs->rs_svcpt = svcpt;
	rs->rs_prealloc = 1;
out:
+11 −1
Original line number Diff line number Diff line
@@ -2086,8 +2086,18 @@ int sptlrpc_svc_alloc_rs(struct ptlrpc_request *req, int msglen)

	rc = policy->sp_sops->alloc_rs(req, msglen);
	if (unlikely(rc == -ENOMEM)) {
		struct ptlrpc_service_part *svcpt = req->rq_rqbd->rqbd_svcpt;
		if (svcpt->scp_service->srv_max_reply_size <
		   msglen + sizeof(struct ptlrpc_reply_state)) {
			/* Just return failure if the size is too big */
			CERROR("size of message is too big (%zd), %d allowed",
				msglen + sizeof(struct ptlrpc_reply_state),
				svcpt->scp_service->srv_max_reply_size);
			return -ENOMEM;
		}

		/* failed alloc, try emergency pool */
		rs = lustre_get_emerg_rs(req->rq_rqbd->rqbd_svcpt);
		rs = lustre_get_emerg_rs(svcpt);
		if (rs == NULL)
			return -ENOMEM;