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

Commit e16ffa83 authored by Niu Yawei's avatar Niu Yawei Committed by Greg Kroah-Hartman
Browse files

staging: lustre: ptlrpc: no need to reassign mbits for replay



It's not necessary reassgin & re-adjust rq_mbits for replay
request in ptlrpc_set_bulk_mbits(), they all must have already
been correctly assigned before.

Such unecessary reassign could make the first matchbit not
PTLRPC_BULK_OPS_MASK aligned, that'll trigger LASSERT in
ptlrpc_register_bulk():

- ptlrpc_set_bulk_mbits() is called when first time sending
  request, rq_mbits is set as xid, which is BULK_OPS aligned;

- ptlrpc_set_bulk_mbits() continue to adjust the mbits for
  multi-bulk RPC, rq_mbits is not aligned anymore, then rq_xid
  is changed accordingly if client is connecting to an old
  server, so rq_xid became unaligned too;

- The request is replayed, ptlrpc_set_bulk_mbits() reassign
  the rq_mbits as rq_xid, which isn't aligned already, but
  ptlrpc_register_bulk() still assumes this value as the
  first matchbits and LASSERT it's BULK_OPS aligned.

Signed-off-by: default avatarNiu Yawei <yawei.niu@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6808
Reviewed-on: http://review.whamcloud.com/23048


Reviewed-by: default avatarFan Yong <fan.yong@intel.com>
Reviewed-by: default avatarAlex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarJames Simmons <jsimmons@infradead.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c4f62ea8
Loading
Loading
Loading
Loading
+22 −6
Original line number Diff line number Diff line
@@ -3116,13 +3116,20 @@ void ptlrpc_set_bulk_mbits(struct ptlrpc_request *req)

	LASSERT(bd);

	if (!req->rq_resend) {
		/* this request has a new xid, just use it as bulk matchbits */
		req->rq_mbits = req->rq_xid;

	} else { /* needs to generate a new matchbits for resend */
	/*
	 * Generate new matchbits for all resend requests, including
	 * resend replay.
	 */
	if (req->rq_resend) {
		u64 old_mbits = req->rq_mbits;

		/*
		 * First time resend on -EINPROGRESS will generate new xid,
		 * so we can actually use the rq_xid as rq_mbits in such case,
		 * however, it's bit hard to distinguish such resend with a
		 * 'resend for the -EINPROGRESS resend'. To make it simple,
		 * we opt to generate mbits for all resend cases.
		 */
		if ((bd->bd_import->imp_connect_data.ocd_connect_flags &
		     OBD_CONNECT_BULK_MBITS)) {
			req->rq_mbits = ptlrpc_next_xid();
@@ -3131,12 +3138,21 @@ void ptlrpc_set_bulk_mbits(struct ptlrpc_request *req)
			spin_lock(&req->rq_import->imp_lock);
			list_del_init(&req->rq_unreplied_list);
			ptlrpc_assign_next_xid_nolock(req);
			req->rq_mbits = req->rq_xid;
			spin_unlock(&req->rq_import->imp_lock);
			req->rq_mbits = req->rq_xid;
		}

		CDEBUG(D_HA, "resend bulk old x%llu new x%llu\n",
		       old_mbits, req->rq_mbits);
	} else if (!(lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY)) {
		/* Request being sent first time, use xid as matchbits. */
		req->rq_mbits = req->rq_xid;
	} else {
		/*
		 * Replay request, xid and matchbits have already been
		 * correctly assigned.
		 */
		return;
	}

	/*