diff options
Diffstat (limited to 'fs/afs/cmservice.c')
| -rw-r--r-- | fs/afs/cmservice.c | 19 | 
1 files changed, 19 insertions, 0 deletions
diff --git a/fs/afs/cmservice.c b/fs/afs/cmservice.c index 1c8c6cc6de3..4b0eff6da67 100644 --- a/fs/afs/cmservice.c +++ b/fs/afs/cmservice.c @@ -130,6 +130,15 @@ static void afs_cm_destructor(struct afs_call *call)  {  	_enter(""); +	/* Break the callbacks here so that we do it after the final ACK is +	 * received.  The step number here must match the final number in +	 * afs_deliver_cb_callback(). +	 */ +	if (call->unmarshall == 6) { +		ASSERT(call->server && call->count && call->request); +		afs_break_callbacks(call->server, call->count, call->request); +	} +  	afs_put_server(call->server);  	call->server = NULL;  	kfree(call->buffer); @@ -272,6 +281,16 @@ static int afs_deliver_cb_callback(struct afs_call *call, struct sk_buff *skb,  		_debug("trailer");  		if (skb->len != 0)  			return -EBADMSG; + +		/* Record that the message was unmarshalled successfully so +		 * that the call destructor can know do the callback breaking +		 * work, even if the final ACK isn't received. +		 * +		 * If the step number changes, then afs_cm_destructor() must be +		 * updated also. +		 */ +		call->unmarshall++; +	case 6:  		break;  	}  | 
