From nobody Tue Dec 16 06:03:14 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D61FCC4167D for ; Thu, 9 Nov 2023 15:42:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343976AbjKIPmn (ORCPT ); Thu, 9 Nov 2023 10:42:43 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51686 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344182AbjKIPmW (ORCPT ); Thu, 9 Nov 2023 10:42:22 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 507E835B4 for ; Thu, 9 Nov 2023 07:40:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1699544447; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LPkiL8/hAwJ3VdyDaCXHEu9+4Gz9SH6fncAOjEzNMKU=; b=JlreBVv81dBps4PGgjWs575UXIWY0GCSi5Vwn4J5Y6E+tJ4T8iMNAZm0owqPyD+kjC23ec k0IY15LdcKveLU6qXGVYLG99iY5ISA62iA/9sTwc1hDenJ5mqw8QfnixssL9AfJ7yJbyXA RULpw/3sMaNhL1whi5uFU7fM44oHZyM= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-696-jO7rVc9NMAezoqeCCmTnOw-1; Thu, 09 Nov 2023 10:40:45 -0500 X-MC-Unique: jO7rVc9NMAezoqeCCmTnOw-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AB382381BE94; Thu, 9 Nov 2023 15:40:41 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.13]) by smtp.corp.redhat.com (Postfix) with ESMTP id C75CF1C060AE; Thu, 9 Nov 2023 15:40:40 +0000 (UTC) From: David Howells To: Marc Dionne Cc: David Howells , linux-afs@lists.infradead.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 17/41] afs: Don't put afs_call in afs_wait_for_call_to_complete() Date: Thu, 9 Nov 2023 15:39:40 +0000 Message-ID: <20231109154004.3317227-18-dhowells@redhat.com> In-Reply-To: <20231109154004.3317227-1-dhowells@redhat.com> References: <20231109154004.3317227-1-dhowells@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.7 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Don't put the afs_call struct in afs_wait_for_call_to_complete() but rather have the caller do it. This will allow the caller to fish stuff out of the afs_call struct rather than the afs_addr_cursor struct, thereby allowing a subsequent patch to subsume it. Signed-off-by: David Howells cc: Marc Dionne cc: linux-afs@lists.infradead.org --- fs/afs/fs_operation.c | 7 +++-- fs/afs/fsclient.c | 5 ++- fs/afs/internal.h | 2 +- fs/afs/rxrpc.c | 73 ++++++++++++++++--------------------------- fs/afs/vlclient.c | 64 ++++++++++++++++++++++--------------- 5 files changed, 75 insertions(+), 76 deletions(-) diff --git a/fs/afs/fs_operation.c b/fs/afs/fs_operation.c index bfb9a7634bd9..1c22d6e77846 100644 --- a/fs/afs/fs_operation.c +++ b/fs/afs/fs_operation.c @@ -191,8 +191,11 @@ void afs_wait_for_operation(struct afs_operation *op) else op->ac.error =3D -ENOTSUPP; =20 - if (op->call) - op->error =3D afs_wait_for_call_to_complete(op->call, &op->ac); + if (op->call) { + afs_wait_for_call_to_complete(op->call, &op->ac); + op->error =3D op->ac.error; + afs_put_call(op->call); + } } =20 switch (op->error) { diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c index 6821ce0f9d63..020073387111 100644 --- a/fs/afs/fsclient.c +++ b/fs/afs/fsclient.c @@ -1612,6 +1612,7 @@ int afs_fs_give_up_all_callbacks(struct afs_net *net, { struct afs_call *call; __be32 *bp; + int ret; =20 _enter(""); =20 @@ -1627,7 +1628,9 @@ int afs_fs_give_up_all_callbacks(struct afs_net *net, =20 call->server =3D afs_use_server(server, afs_server_trace_give_up_cb); afs_make_call(ac, call, GFP_NOFS); - return afs_wait_for_call_to_complete(call, ac); + afs_wait_for_call_to_complete(call, ac); + afs_put_call(call); + return ret; } =20 /* diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 08026dfd4421..6ab353e145be 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -1290,7 +1290,7 @@ extern void __net_exit afs_close_socket(struct afs_ne= t *); extern void afs_charge_preallocation(struct work_struct *); extern void afs_put_call(struct afs_call *); extern void afs_make_call(struct afs_addr_cursor *, struct afs_call *, gfp= _t); -extern long afs_wait_for_call_to_complete(struct afs_call *, struct afs_ad= dr_cursor *); +void afs_wait_for_call_to_complete(struct afs_call *call, struct afs_addr_= cursor *ac); extern struct afs_call *afs_alloc_flat_call(struct afs_net *, const struct afs_call_type *, size_t, size_t); diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c index 1a18fcbdec80..31044fba1bdb 100644 --- a/fs/afs/rxrpc.c +++ b/fs/afs/rxrpc.c @@ -575,48 +575,44 @@ static void afs_deliver_to_call(struct afs_call *call) /* * Wait synchronously for a call to complete and clean up the call struct. */ -long afs_wait_for_call_to_complete(struct afs_call *call, - struct afs_addr_cursor *ac) +void afs_wait_for_call_to_complete(struct afs_call *call, struct afs_addr_= cursor *ac) { - long ret; bool rxrpc_complete =3D false; =20 - DECLARE_WAITQUEUE(myself, current); - _enter(""); =20 - ret =3D call->error; - if (ret < 0) - goto out; + if (!afs_check_call_state(call, AFS_CALL_COMPLETE)) { + DECLARE_WAITQUEUE(myself, current); + + add_wait_queue(&call->waitq, &myself); + for (;;) { + set_current_state(TASK_UNINTERRUPTIBLE); + + /* deliver any messages that are in the queue */ + if (!afs_check_call_state(call, AFS_CALL_COMPLETE) && + call->need_attention) { + call->need_attention =3D false; + __set_current_state(TASK_RUNNING); + afs_deliver_to_call(call); + continue; + } =20 - add_wait_queue(&call->waitq, &myself); - for (;;) { - set_current_state(TASK_UNINTERRUPTIBLE); - - /* deliver any messages that are in the queue */ - if (!afs_check_call_state(call, AFS_CALL_COMPLETE) && - call->need_attention) { - call->need_attention =3D false; - __set_current_state(TASK_RUNNING); - afs_deliver_to_call(call); - continue; - } + if (afs_check_call_state(call, AFS_CALL_COMPLETE)) + break; =20 - if (afs_check_call_state(call, AFS_CALL_COMPLETE)) - break; + if (!rxrpc_kernel_check_life(call->net->socket, call->rxcall)) { + /* rxrpc terminated the call. */ + rxrpc_complete =3D true; + break; + } =20 - if (!rxrpc_kernel_check_life(call->net->socket, call->rxcall)) { - /* rxrpc terminated the call. */ - rxrpc_complete =3D true; - break; + schedule(); } =20 - schedule(); + remove_wait_queue(&call->waitq, &myself); + __set_current_state(TASK_RUNNING); } =20 - remove_wait_queue(&call->waitq, &myself); - __set_current_state(TASK_RUNNING); - if (!afs_check_call_state(call, AFS_CALL_COMPLETE)) { if (rxrpc_complete) { afs_set_call_complete(call, call->error, call->abort_code); @@ -635,23 +631,8 @@ long afs_wait_for_call_to_complete(struct afs_call *ca= ll, ac->error =3D call->error; spin_unlock_bh(&call->state_lock); =20 - ret =3D ac->error; - switch (ret) { - case 0: - ret =3D call->ret0; - call->ret0 =3D 0; - - fallthrough; - case -ECONNABORTED: + if (call->error =3D=3D 0 || call->error =3D=3D -ECONNABORTED) ac->responded =3D true; - break; - } - -out: - _debug("call complete"); - afs_put_call(call); - _leave(" =3D %p", (void *)ret); - return ret; } =20 /* diff --git a/fs/afs/vlclient.c b/fs/afs/vlclient.c index 41e7932d75c6..650534892a20 100644 --- a/fs/afs/vlclient.c +++ b/fs/afs/vlclient.c @@ -106,12 +106,6 @@ static int afs_deliver_vl_get_entry_by_name_u(struct a= fs_call *call) return 0; } =20 -static void afs_destroy_vl_get_entry_by_name_u(struct afs_call *call) -{ - kfree(call->ret_vldb); - afs_flat_call_destructor(call); -} - /* * VL.GetEntryByNameU operation type. */ @@ -119,7 +113,7 @@ static const struct afs_call_type afs_RXVLGetEntryByNam= eU =3D { .name =3D "VL.GetEntryByNameU", .op =3D afs_VL_GetEntryByNameU, .deliver =3D afs_deliver_vl_get_entry_by_name_u, - .destructor =3D afs_destroy_vl_get_entry_by_name_u, + .destructor =3D afs_flat_call_destructor, }; =20 /* @@ -166,7 +160,13 @@ struct afs_vldb_entry *afs_vl_get_entry_by_name_u(stru= ct afs_vl_cursor *vc, =20 trace_afs_make_vl_call(call); afs_make_call(&vc->ac, call, GFP_KERNEL); - return (struct afs_vldb_entry *)afs_wait_for_call_to_complete(call, &vc->= ac); + afs_wait_for_call_to_complete(call, &vc->ac); + afs_put_call(call); + if (vc->ac.error) { + kfree(entry); + return ERR_PTR(vc->ac.error); + } + return entry; } =20 /* @@ -249,12 +249,6 @@ static int afs_deliver_vl_get_addrs_u(struct afs_call = *call) return 0; } =20 -static void afs_vl_get_addrs_u_destructor(struct afs_call *call) -{ - afs_put_addrlist(call->ret_alist); - return afs_flat_call_destructor(call); -} - /* * VL.GetAddrsU operation type. */ @@ -262,7 +256,7 @@ static const struct afs_call_type afs_RXVLGetAddrsU =3D= { .name =3D "VL.GetAddrsU", .op =3D afs_VL_GetAddrsU, .deliver =3D afs_deliver_vl_get_addrs_u, - .destructor =3D afs_vl_get_addrs_u_destructor, + .destructor =3D afs_flat_call_destructor, }; =20 /* @@ -273,6 +267,7 @@ struct afs_addr_list *afs_vl_get_addrs_u(struct afs_vl_= cursor *vc, const uuid_t *uuid) { struct afs_ListAddrByAttributes__xdr *r; + struct afs_addr_list *alist; const struct afs_uuid *u =3D (const struct afs_uuid *)uuid; struct afs_call *call; struct afs_net *net =3D vc->cell->net; @@ -309,7 +304,14 @@ struct afs_addr_list *afs_vl_get_addrs_u(struct afs_vl= _cursor *vc, =20 trace_afs_make_vl_call(call); afs_make_call(&vc->ac, call, GFP_KERNEL); - return (struct afs_addr_list *)afs_wait_for_call_to_complete(call, &vc->a= c); + afs_wait_for_call_to_complete(call, &vc->ac); + alist =3D call->ret_alist; + afs_put_call(call); + if (vc->ac.error) { + afs_put_addrlist(alist); + return ERR_PTR(vc->ac.error); + } + return alist; } =20 /* @@ -618,7 +620,7 @@ static const struct afs_call_type afs_YFSVLGetEndpoints= =3D { .name =3D "YFSVL.GetEndpoints", .op =3D afs_YFSVL_GetEndpoints, .deliver =3D afs_deliver_yfsvl_get_endpoints, - .destructor =3D afs_vl_get_addrs_u_destructor, + .destructor =3D afs_flat_call_destructor, }; =20 /* @@ -628,6 +630,7 @@ static const struct afs_call_type afs_YFSVLGetEndpoints= =3D { struct afs_addr_list *afs_yfsvl_get_endpoints(struct afs_vl_cursor *vc, const uuid_t *uuid) { + struct afs_addr_list *alist; struct afs_call *call; struct afs_net *net =3D vc->cell->net; __be32 *bp; @@ -652,7 +655,14 @@ struct afs_addr_list *afs_yfsvl_get_endpoints(struct a= fs_vl_cursor *vc, =20 trace_afs_make_vl_call(call); afs_make_call(&vc->ac, call, GFP_KERNEL); - return (struct afs_addr_list *)afs_wait_for_call_to_complete(call, &vc->a= c); + afs_wait_for_call_to_complete(call, &vc->ac); + alist =3D call->ret_alist; + afs_put_call(call); + if (vc->ac.error) { + afs_put_addrlist(alist); + return ERR_PTR(vc->ac.error); + } + return alist; } =20 /* @@ -717,12 +727,6 @@ static int afs_deliver_yfsvl_get_cell_name(struct afs_= call *call) return 0; } =20 -static void afs_destroy_yfsvl_get_cell_name(struct afs_call *call) -{ - kfree(call->ret_str); - afs_flat_call_destructor(call); -} - /* * VL.GetCapabilities operation type */ @@ -730,7 +734,7 @@ static const struct afs_call_type afs_YFSVLGetCellName = =3D { .name =3D "YFSVL.GetCellName", .op =3D afs_YFSVL_GetCellName, .deliver =3D afs_deliver_yfsvl_get_cell_name, - .destructor =3D afs_destroy_yfsvl_get_cell_name, + .destructor =3D afs_flat_call_destructor, }; =20 /* @@ -745,6 +749,7 @@ char *afs_yfsvl_get_cell_name(struct afs_vl_cursor *vc) struct afs_call *call; struct afs_net *net =3D vc->cell->net; __be32 *bp; + char *cellname; =20 _enter(""); =20 @@ -763,5 +768,12 @@ char *afs_yfsvl_get_cell_name(struct afs_vl_cursor *vc) /* Can't take a ref on server */ trace_afs_make_vl_call(call); afs_make_call(&vc->ac, call, GFP_KERNEL); - return (char *)afs_wait_for_call_to_complete(call, &vc->ac); + afs_wait_for_call_to_complete(call, &vc->ac); + cellname =3D call->ret_str; + afs_put_call(call); + if (vc->ac.error) { + kfree(cellname); + return ERR_PTR(vc->ac.error); + } + return cellname; }