mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-09 14:56:54 -04:00
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: Li Xi <lixi@ddn.com> Signed-off-by: Patrick Farrell <paf@cray.com> Reviewed-on: http://review.whamcloud.com/8200 Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-3680 Reviewed-by: John L. Hammond <john.hammond@intel.com> Signed-off-by: Oleg Drokin <oleg.drokin@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2d5eafc179
commit
a34041af9e
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user