From 6d3efc01b170284404d3963ddac5b3723d8dd7d1 Mon Sep 17 00:00:00 2001 From: tianzy Date: Fri, 24 Oct 2008 10:52:53 +0000 Subject: [PATCH] Branch b1_6 handle errors returned by lustre_swab_re{q,p}buf in quota_get_qdata() and quota_copy_qdata() b=17324 i=johann i=panda --- lustre/ldlm/ldlm_lib.c | 8 ++++---- lustre/ptlrpc/pack_generic.c | 22 +++++++++++++++------- lustre/quota/quota_context.c | 9 +++++---- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index 52f69b8..10bf8f6 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -1786,8 +1786,8 @@ int target_handle_dqacq_callback(struct ptlrpc_request *req) RETURN(-ENOMEM); rc = quota_get_qdata(req, qdata, QUOTA_REQUEST, QUOTA_EXPORT); if (rc < 0) { - CDEBUG(D_ERROR, "Can't unpack qunit_data\n"); - GOTO(out, rc = -EPROTO); + CDEBUG(D_ERROR, "Can't unpack qunit_data(rc: %d)\n", rc); + GOTO(out, rc); } /* we use the observer */ @@ -1823,8 +1823,8 @@ int target_handle_dqacq_callback(struct ptlrpc_request *req) * adjust the same form to different forms slaves needed */ rc = quota_copy_qdata(req, qdata, QUOTA_REPLY, QUOTA_EXPORT); if (rc < 0) { - CDEBUG(D_ERROR, "Can't pack qunit_data\n"); - GOTO(out, rc = -EPROTO); + CDEBUG(D_ERROR, "Can't pack qunit_data(rc: %d)\n", rc); + GOTO(out, rc); } /* Block the quota req. b=14840 */ diff --git a/lustre/ptlrpc/pack_generic.c b/lustre/ptlrpc/pack_generic.c index 0ce50b4..84ec8aa 100644 --- a/lustre/ptlrpc/pack_generic.c +++ b/lustre/ptlrpc/pack_generic.c @@ -2473,6 +2473,7 @@ int quota_get_qdata(void *request, struct qunit_data *qdata, int size2 = sizeof(struct qunit_data_old2); __u64 flags = is_exp ? req->rq_export->exp_connect_flags : req->rq_import->imp_connect_data.ocd_connect_flags; + int rc = 0; LASSERT(req); LASSERT(qdata); @@ -2505,6 +2506,8 @@ int quota_get_qdata(void *request, struct qunit_data *qdata, new = lustre_swab_repbuf(req, REPLY_REC_OFF, sizeof(struct qunit_data), lustre_swab_qdata); + if (new == NULL) + GOTO(out, rc = -EPROTO); *qdata = *new; QDATA_SET_CHANGE_QS(qdata); return 0; @@ -2523,6 +2526,8 @@ without_change_qs: else old2 = lustre_swab_repbuf(req, REPLY_REC_OFF, size2, lustre_swab_qdata_old2); + if (old2 == NULL) + GOTO(out, rc = -EPROTO); qdata_v2_to_v3(old2, qdata); return 0; @@ -2540,12 +2545,14 @@ quota32: else old = lustre_swab_repbuf(req, REPLY_REC_OFF, size, lustre_swab_qdata_old); + if (old == NULL) + GOTO(out, rc = -EPROTO); qdata_v1_v3(old, qdata); #else #warning "remove quota code above for format absolete in new release" #endif - - return 0; +out: + return rc; } EXPORT_SYMBOL(quota_get_qdata); @@ -2559,6 +2566,7 @@ int quota_copy_qdata(void *request, struct qunit_data *qdata, struct qunit_data_old2 *old2; __u64 flags = is_exp ? req->rq_export->exp_connect_flags : req->rq_import->imp_connect_data.ocd_connect_flags; + int rc = 0; LASSERT(req); LASSERT(qdata); @@ -2590,7 +2598,7 @@ int quota_copy_qdata(void *request, struct qunit_data *qdata, target = lustre_msg_buf(req->rq_repmsg, REPLY_REC_OFF, sizeof(struct qunit_data)); if (!target) - return -EINVAL; + GOTO(out, rc = -EPROTO); memcpy(target, qdata, sizeof(*qdata)); return 0; } @@ -2606,7 +2614,7 @@ without_change_qs: target = lustre_msg_buf(req->rq_repmsg, REPLY_REC_OFF, sizeof(struct qunit_data_old2)); if (!target) - return -EINVAL; + GOTO(out, rc = -EPROTO); old2 = qdata_v3_to_v2(qdata); memcpy(target, old2, sizeof(*old2)); return 0; @@ -2625,14 +2633,14 @@ quota32: target = lustre_msg_buf(req->rq_repmsg, REPLY_REC_OFF, sizeof(struct qunit_data_old)); if (!target) - return -EINVAL; + GOTO(out, rc = -EPROTO); old = qdata_v3_to_v1(qdata); memcpy(target, old, sizeof(*old)); #else #warning "remove quota code above for format absolete in new release" #endif - - return 0; +out: + return rc; } EXPORT_SYMBOL(quota_copy_qdata); diff --git a/lustre/quota/quota_context.c b/lustre/quota/quota_context.c index 75d4762..274a952 100644 --- a/lustre/quota/quota_context.c +++ b/lustre/quota/quota_context.c @@ -759,8 +759,9 @@ static int dqacq_interpret(struct ptlrpc_request *req, void *data, int rc) QUOTA_NOSENT(rc) ? QUOTA_REQUEST : QUOTA_REPLY, QUOTA_IMPORT); if (rc1 < 0) { - DEBUG_REQ(D_ERROR, req, "error unpacking qunit_data\n"); - GOTO(exit, rc = -EPROTO); + DEBUG_REQ(D_ERROR, req, + "error unpacking qunit_data(rc: %d)\n", rc1); + GOTO(exit, rc = rc1); } QDATA_DEBUG(qdata, "qdata: interpret rc(%d).\n", rc); @@ -959,9 +960,9 @@ schedule_dqacq(struct obd_device *obd, struct lustre_quota_ctxt *qctxt, qdata->qd_count, should_translate_quota(imp)); rc = quota_copy_qdata(req, qdata, QUOTA_REQUEST, QUOTA_IMPORT); if (rc < 0) { - CDEBUG(D_ERROR, "Can't pack qunit_data\n"); + CDEBUG(D_ERROR, "Can't pack qunit_data(rc: %d)\n", rc); class_import_put(imp); - RETURN(-EPROTO); + RETURN(rc); } ptlrpc_req_set_repsize(req, 2, size); req->rq_no_resend = req->rq_no_delay = 1; -- 1.8.3.1