From nobody Fri May 10 06:56:46 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=crudebyte.com ARC-Seal: i=1; a=rsa-sha256; t=1658151280; cv=none; d=zohomail.com; s=zohoarc; b=PsYO6FvRTIHR085/uAgdlceITbfHIljwR8fAkEYceClpBAWUQ6qo3o1+8OGVnE9aIzJB5Ao1PIzFI6D2fOpikAS9KGo0RGIkuGjFlKTxIVC+I0H9jAFU/SsCZ3XYfkZHhl2N2nxrk5Dm5VH6q9i/ad0Oiym8Wnx7bJSirkwW25Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1658151280; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=6JGfAhhnNliHRD6XV63rzC0cp9nO7bdUd96+ZMDVPso=; b=Hff0mlkLbHSdlqdZQja+dgo6xXMhdKinaFZetZbpXngGkgDhn3KrA+hQ0H9QCHTOoaLYOBnakx4Bm9TleCK0L1wyDyqfdtiNOWveMCAjInv9uVcJ/LH5RdhBycHiOiprYu6xBKTVgHHyUdTmFSPNpdllv9VuWzM8OrSZq7LzZR4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1658151280555903.4341274255096; Mon, 18 Jul 2022 06:34:40 -0700 (PDT) Received: from localhost ([::1]:52546 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oDQtS-0008Ql-F2 for importer@patchew.org; Mon, 18 Jul 2022 09:34:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45434) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <8d933d09f8abee3f8aec06713b28d03e0af96c1a@lizzy.crudebyte.com>) id 1oDQs4-0006rA-Mx for qemu-devel@nongnu.org; Mon, 18 Jul 2022 09:33:13 -0400 Received: from lizzy.crudebyte.com ([91.194.90.13]:38413) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <8d933d09f8abee3f8aec06713b28d03e0af96c1a@lizzy.crudebyte.com>) id 1oDQrx-00077c-R8 for qemu-devel@nongnu.org; Mon, 18 Jul 2022 09:33:11 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=crudebyte.com; s=lizzy; h=Message-Id:Cc:To:Subject:Date:From:References: In-Reply-To:Content-Type:Content-Transfer-Encoding:MIME-Version:Content-ID: Content-Description; bh=6JGfAhhnNliHRD6XV63rzC0cp9nO7bdUd96+ZMDVPso=; b=o/AG2 mlZJAk/N2yE+t0WEIXSGYHc/vbCRSsB0C9cG5Cs99qYOIVJEbfyijdvqAbXYZfAa6YyCBwzBPa1oA eTevJIVD2YgQPzb08UMGVkxFkiqfz3+om3DTkbuEDVPPHYMzJgnP6xtmjqcS1C4LZ2zs/FtmVJdD+ u238vRKWdxM2xxF1pyLdAIvu6fpJjRZxu6SHtzCSEg1+ulCo8eIe7vU8lO8bmhhXpKDZ/EkUcCKyG 4DanXqgJE4ZaPkdH3kl0LdZ5DwVQJdf2oG+gcbsqYaZz7TYJ61MQWXZ+ylNd8wIjyCWfJjMTZ/Ryv E9rf+ctoEolZVzBFRRkbR+UoCX8UQ==; In-Reply-To: References: From: Christian Schoenebeck Date: Mon, 18 Jul 2022 15:10:55 +0200 Subject: [RFC PATCH v2] tests/9p: introduce declarative function calls To: qemu-devel@nongnu.org Cc: Greg Kurz Message-Id: Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: none client-ip=91.194.90.13; envelope-from=8d933d09f8abee3f8aec06713b28d03e0af96c1a@lizzy.crudebyte.com; helo=lizzy.crudebyte.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @crudebyte.com) X-ZM-MESSAGEID: 1658151283952100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" There are currently 4 different functions for sending a 9p 'Twalk' request. They are all doing the same thing, just in a slightly different way and with slightly different function arguments. Merge those 4 functions into a single function by using a struct for function call arguments and use designated initializers when calling this function to turn usage into a declarative apporach, which is better readable and easier to maintain. Signed-off-by: Christian Schoenebeck --- v1 -> v2: * Also merge low-level function v9fs_twalk(). * Lower case twalk() function name. * Lower case rwalk struct field. * Add result struct TWalkRes. NOTE: I have not separated rwalk struct, because it would have simplified code at one place, but complicated it at another one. tests/qtest/virtio-9p-test.c | 251 +++++++++++++++++++++-------------- 1 file changed, 154 insertions(+), 97 deletions(-) diff --git a/tests/qtest/virtio-9p-test.c b/tests/qtest/virtio-9p-test.c index 25305a4cf7..69b1c27268 100644 --- a/tests/qtest/virtio-9p-test.c +++ b/tests/qtest/virtio-9p-test.c @@ -72,6 +72,7 @@ static int split(const char *in, const char *delim, char = ***out) static void split_free(char ***out) { int i; + if (!*out) return; for (i =3D 0; (*out)[i]; ++i) { g_free((*out)[i]); } @@ -390,31 +391,6 @@ static void v9fs_rattach(P9Req *req, v9fs_qid *qid) v9fs_req_free(req); } =20 -/* size[4] Twalk tag[2] fid[4] newfid[4] nwname[2] nwname*(wname[s]) */ -static P9Req *v9fs_twalk(QVirtio9P *v9p, uint32_t fid, uint32_t newfid, - uint16_t nwname, char *const wnames[], uint16_t t= ag) -{ - P9Req *req; - int i; - uint32_t body_size =3D 4 + 4 + 2; - - for (i =3D 0; i < nwname; i++) { - uint16_t wname_size =3D v9fs_string_size(wnames[i]); - - g_assert_cmpint(body_size, <=3D, UINT32_MAX - wname_size); - body_size +=3D wname_size; - } - req =3D v9fs_req_init(v9p, body_size, P9_TWALK, tag); - v9fs_uint32_write(req, fid); - v9fs_uint32_write(req, newfid); - v9fs_uint16_write(req, nwname); - for (i =3D 0; i < nwname; i++) { - v9fs_string_write(req, wnames[i]); - } - v9fs_req_send(req); - return req; -} - /* size[4] Rwalk tag[2] nwqid[2] nwqid*(wqid[13]) */ static void v9fs_rwalk(P9Req *req, uint16_t *nwqid, v9fs_qid **wqid) { @@ -432,6 +408,98 @@ static void v9fs_rwalk(P9Req *req, uint16_t *nwqid, v9= fs_qid **wqid) v9fs_req_free(req); } =20 +/* options for 'Twalk' 9p request */ +typedef struct TWalkOpt { + /* 9P client being used (mandatory) */ + QVirtio9P *client; + /* user supplied tag number being returned with response (optional) */ + uint16_t tag; + /* file ID of directory from where walk should start (optional) */ + uint32_t fid; + /* file ID for target directory being walked to (optional) */ + uint32_t newfid; + /* low level variant of path to walk to (optional) */ + uint16_t nwname; + char **wnames; + /* high level variant of path to walk to (optional) */ + const char *path; + /* data being received from 9p server as 'Rwalk' response (optional) */ + struct { + uint16_t *nwqid; + v9fs_qid **wqid; + } rwalk; + /* only send Twalk request but not wait for a reply? (optional) */ + bool requestOnly; + /* do we expect an Rlerror response, if yes which error code? (optiona= l) */ + uint32_t expectErr; +} TWalkOpt; + +/* result of 'Twalk' 9p request */ +typedef struct TWalkRes { + /* file ID of target directory been walked to */ + uint32_t newfid; + /* if requestOnly was set: request object for further processing */ + P9Req *req; +} TWalkRes; + +/* size[4] Twalk tag[2] fid[4] newfid[4] nwname[2] nwname*(wname[s]) */ +static TWalkRes twalk(TWalkOpt opt) +{ + P9Req *req; + int i; + uint32_t body_size =3D 4 + 4 + 2; + uint32_t err; + char **wnames =3D NULL; + + g_assert(opt.client); + /* expecting either high- or low-level path, both not both */ + g_assert(!opt.path || !(opt.nwname || opt.wnames)); + /* expecting either Rwalk or Rlerror, but obviously not both */ + g_assert(!opt.expectErr || !(opt.rwalk.nwqid || opt.rwalk.wqid)); + + if (!opt.newfid) { + opt.newfid =3D genfid(); + } + + if (opt.path) { + opt.nwname =3D split(opt.path, "/", &wnames); + opt.wnames =3D wnames; + } + + for (i =3D 0; i < opt.nwname; i++) { + uint16_t wname_size =3D v9fs_string_size(opt.wnames[i]); + + g_assert_cmpint(body_size, <=3D, UINT32_MAX - wname_size); + body_size +=3D wname_size; + } + req =3D v9fs_req_init(opt.client, body_size, P9_TWALK, opt.tag); + v9fs_uint32_write(req, opt.fid); + v9fs_uint32_write(req, opt.newfid); + v9fs_uint16_write(req, opt.nwname); + for (i =3D 0; i < opt.nwname; i++) { + v9fs_string_write(req, opt.wnames[i]); + } + v9fs_req_send(req); + + if (!opt.requestOnly) { + v9fs_req_wait_for_reply(req, NULL); + if (opt.expectErr) { + v9fs_rlerror(req, &err); + g_assert_cmpint(err, =3D=3D, opt.expectErr); + } else { + v9fs_rwalk(req, opt.rwalk.nwqid, opt.rwalk.wqid); + } + req =3D NULL; /* request was freed */ + } + + split_free(&wnames); + + return (TWalkRes) { + .newfid =3D opt.newfid, + .req =3D req, + }; +} + /* size[4] Tgetattr tag[2] fid[4] request_mask[8] */ static P9Req *v9fs_tgetattr(QVirtio9P *v9p, uint32_t fid, uint64_t request= _mask, uint16_t tag) @@ -669,52 +737,6 @@ static void do_version(QVirtio9P *v9p) g_assert_cmpmem(server_version, server_len, version, strlen(version)); } =20 -/* - * utility function: walk to requested dir and return fid for that dir and - * the QIDs of server response - */ -static uint32_t do_walk_rqids(QVirtio9P *v9p, const char *path, uint16_t *= nwqid, - v9fs_qid **wqid) -{ - char **wnames; - P9Req *req; - const uint32_t fid =3D genfid(); - - int nwnames =3D split(path, "/", &wnames); - - req =3D v9fs_twalk(v9p, 0, fid, nwnames, wnames, 0); - v9fs_req_wait_for_reply(req, NULL); - v9fs_rwalk(req, nwqid, wqid); - - split_free(&wnames); - return fid; -} - -/* utility function: walk to requested dir and return fid for that dir */ -static uint32_t do_walk(QVirtio9P *v9p, const char *path) -{ - return do_walk_rqids(v9p, path, NULL, NULL); -} - -/* utility function: walk to requested dir and expect passed error respons= e */ -static void do_walk_expect_error(QVirtio9P *v9p, const char *path, uint32_= t err) -{ - char **wnames; - P9Req *req; - uint32_t _err; - const uint32_t fid =3D genfid(); - - int nwnames =3D split(path, "/", &wnames); - - req =3D v9fs_twalk(v9p, 0, fid, nwnames, wnames, 0); - v9fs_req_wait_for_reply(req, NULL); - v9fs_rlerror(req, &_err); - - g_assert_cmpint(_err, =3D=3D, err); - - split_free(&wnames); -} - static void fs_version(void *obj, void *data, QGuestAllocator *t_alloc) { alloc =3D t_alloc; @@ -757,7 +779,10 @@ static void fs_walk(void *obj, void *data, QGuestAlloc= ator *t_alloc) } =20 do_attach(v9p); - req =3D v9fs_twalk(v9p, 0, 1, P9_MAXWELEM, wnames, 0); + req =3D twalk((TWalkOpt) { + .client =3D v9p, .fid =3D 0, .newfid =3D 1, + .nwname =3D P9_MAXWELEM, .wnames =3D wnames, .requestOnly =3D true + }).req; v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, &nwqid, &wqid); =20 @@ -941,7 +966,7 @@ static void fs_readdir(void *obj, void *data, QGuestAll= ocator *t_alloc) { QVirtio9P *v9p =3D obj; alloc =3D t_alloc; - char *const wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_READDIR_DIR) }; + char *wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_READDIR_DIR) }; uint16_t nqid; v9fs_qid qid; uint32_t count, nentries; @@ -949,7 +974,10 @@ static void fs_readdir(void *obj, void *data, QGuestAl= locator *t_alloc) P9Req *req; =20 do_attach(v9p); - req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + req =3D twalk((TWalkOpt) { + .client =3D v9p, .fid =3D 0, .newfid =3D 1, + .nwname =3D 1, .wnames =3D wnames, .requestOnly =3D true + }).req; v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, &nqid, NULL); g_assert_cmpint(nqid, =3D=3D, 1); @@ -993,7 +1021,7 @@ static void fs_readdir(void *obj, void *data, QGuestAl= locator *t_alloc) /* readdir test where overall request is split over several messages */ static void do_readdir_split(QVirtio9P *v9p, uint32_t count) { - char *const wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_READDIR_DIR) }; + char *wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_READDIR_DIR) }; uint16_t nqid; v9fs_qid qid; uint32_t nentries, npartialentries; @@ -1010,7 +1038,10 @@ static void do_readdir_split(QVirtio9P *v9p, uint32_= t count) nentries =3D 0; tail =3D NULL; =20 - req =3D v9fs_twalk(v9p, 0, fid, 1, wnames, 0); + req =3D twalk((TWalkOpt) { + .client =3D v9p, .fid =3D 0, .newfid =3D fid, + .nwname =3D 1, .wnames =3D wnames, .requestOnly =3D true + }).req; v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, &nqid, NULL); g_assert_cmpint(nqid, =3D=3D, 1); @@ -1074,12 +1105,15 @@ static void fs_walk_no_slash(void *obj, void *data,= QGuestAllocator *t_alloc) { QVirtio9P *v9p =3D obj; alloc =3D t_alloc; - char *const wnames[] =3D { g_strdup(" /") }; + char *wnames[] =3D { g_strdup(" /") }; P9Req *req; uint32_t err; =20 do_attach(v9p); - req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + req =3D twalk((TWalkOpt) { + .client =3D v9p, .fid =3D 0, .newfid =3D 1, + .nwname =3D 1, .wnames =3D wnames, .requestOnly =3D true + }).req; v9fs_req_wait_for_reply(req, NULL); v9fs_rlerror(req, &err); =20 @@ -1098,7 +1132,9 @@ static void fs_walk_nonexistent(void *obj, void *data= , QGuestAllocator *t_alloc) * The 9p2000 protocol spec says: "If the first element cannot be walk= ed * for any reason, Rerror is returned." */ - do_walk_expect_error(v9p, "non-existent", ENOENT); + twalk((TWalkOpt) { + .client =3D v9p, .path =3D "non-existent", .expectErr =3D ENOENT + }); } =20 static void fs_walk_2nd_nonexistent(void *obj, void *data, @@ -1116,7 +1152,10 @@ static void fs_walk_2nd_nonexistent(void *obj, void = *data, ); =20 do_attach_rqid(v9p, &root_qid); - fid =3D do_walk_rqids(v9p, path, &nwqid, &wqid); + fid =3D twalk((TWalkOpt) { + .client =3D v9p, .path =3D path, + .rwalk.nwqid =3D &nwqid, .rwalk.wqid =3D &wqid + }).newfid; /* * The 9p2000 protocol spec says: "nwqid is therefore either nwname or= the * index of the first elementwise walk that failed." @@ -1148,7 +1187,10 @@ static void fs_walk_none(void *obj, void *data, QGue= stAllocator *t_alloc) v9fs_req_wait_for_reply(req, NULL); v9fs_rattach(req, &root_qid); =20 - req =3D v9fs_twalk(v9p, 0, 1, 0, NULL, 0); + req =3D twalk((TWalkOpt) { + .client =3D v9p, .fid =3D 0, .newfid =3D 1, + .nwname =3D 0, .wnames =3D NULL, .requestOnly =3D true + }).req; v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, NULL, &wqid); =20 @@ -1166,7 +1208,7 @@ static void fs_walk_dotdot(void *obj, void *data, QGu= estAllocator *t_alloc) { QVirtio9P *v9p =3D obj; alloc =3D t_alloc; - char *const wnames[] =3D { g_strdup("..") }; + char *wnames[] =3D { g_strdup("..") }; v9fs_qid root_qid; g_autofree v9fs_qid *wqid =3D NULL; P9Req *req; @@ -1176,7 +1218,10 @@ static void fs_walk_dotdot(void *obj, void *data, QG= uestAllocator *t_alloc) v9fs_req_wait_for_reply(req, NULL); v9fs_rattach(req, &root_qid); =20 - req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + req =3D twalk((TWalkOpt) { + .client =3D v9p, .fid =3D 0, .newfid =3D 1, + .nwname =3D 1, .wnames =3D wnames, .requestOnly =3D true + }).req; v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, NULL, &wqid); /* We now we'll get one qid */ =20 @@ -1189,11 +1234,14 @@ static void fs_lopen(void *obj, void *data, QGuestA= llocator *t_alloc) { QVirtio9P *v9p =3D obj; alloc =3D t_alloc; - char *const wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_LOPEN_FILE) }; + char *wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_LOPEN_FILE) }; P9Req *req; =20 do_attach(v9p); - req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + req =3D twalk((TWalkOpt) { + .client =3D v9p, .fid =3D 0, .newfid =3D 1, + .nwname =3D 1, .wnames =3D wnames, .requestOnly =3D true + }).req; v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, NULL, NULL); =20 @@ -1209,13 +1257,16 @@ static void fs_write(void *obj, void *data, QGuestA= llocator *t_alloc) QVirtio9P *v9p =3D obj; alloc =3D t_alloc; static const uint32_t write_count =3D P9_MAX_SIZE / 2; - char *const wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_WRITE_FILE) }; + char *wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_WRITE_FILE) }; g_autofree char *buf =3D g_malloc0(write_count); uint32_t count; P9Req *req; =20 do_attach(v9p); - req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + req =3D twalk((TWalkOpt) { + .client =3D v9p, .fid =3D 0, .newfid =3D 1, + .nwname =3D 1, .wnames =3D wnames, .requestOnly =3D true + }).req; v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, NULL, NULL); =20 @@ -1235,13 +1286,16 @@ static void fs_flush_success(void *obj, void *data,= QGuestAllocator *t_alloc) { QVirtio9P *v9p =3D obj; alloc =3D t_alloc; - char *const wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_FLUSH_FILE) }; + char *wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_FLUSH_FILE) }; P9Req *req, *flush_req; uint32_t reply_len; uint8_t should_block; =20 do_attach(v9p); - req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + req =3D twalk((TWalkOpt) { + .client =3D v9p, .fid =3D 0, .newfid =3D 1, + .nwname =3D 1, .wnames =3D wnames, .requestOnly =3D true + }).req; v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, NULL, NULL); =20 @@ -1272,13 +1326,16 @@ static void fs_flush_ignored(void *obj, void *data,= QGuestAllocator *t_alloc) { QVirtio9P *v9p =3D obj; alloc =3D t_alloc; - char *const wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_FLUSH_FILE) }; + char *wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_FLUSH_FILE) }; P9Req *req, *flush_req; uint32_t count; uint8_t should_block; =20 do_attach(v9p); - req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + req =3D twalk((TWalkOpt) { + .client =3D v9p, .fid =3D 0, .newfid =3D 1, + .nwname =3D 1, .wnames =3D wnames, .requestOnly =3D true + }).req; v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, NULL, NULL); =20 @@ -1311,7 +1368,7 @@ static void do_mkdir(QVirtio9P *v9p, const char *path= , const char *cname) uint32_t fid; P9Req *req; =20 - fid =3D do_walk(v9p, path); + fid =3D twalk((TWalkOpt) { .client =3D v9p, .path =3D path }).newfid; =20 req =3D v9fs_tmkdir(v9p, fid, name, 0750, 0, 0); v9fs_req_wait_for_reply(req, NULL); @@ -1326,7 +1383,7 @@ static uint32_t do_lcreate(QVirtio9P *v9p, const char= *path, uint32_t fid; P9Req *req; =20 - fid =3D do_walk(v9p, path); + fid =3D twalk((TWalkOpt) { .client =3D v9p, .path =3D path }).newfid; =20 req =3D v9fs_tlcreate(v9p, fid, name, 0, 0750, 0, 0); v9fs_req_wait_for_reply(req, NULL); @@ -1344,7 +1401,7 @@ static void do_symlink(QVirtio9P *v9p, const char *pa= th, const char *clink, uint32_t fid; P9Req *req; =20 - fid =3D do_walk(v9p, path); + fid =3D twalk((TWalkOpt) { .client =3D v9p, .path =3D path }).newfid; =20 req =3D v9fs_tsymlink(v9p, fid, name, dst, 0, 0); v9fs_req_wait_for_reply(req, NULL); @@ -1358,8 +1415,8 @@ static void do_hardlink(QVirtio9P *v9p, const char *p= ath, const char *clink, uint32_t dfid, fid; P9Req *req; =20 - dfid =3D do_walk(v9p, path); - fid =3D do_walk(v9p, to); + dfid =3D twalk((TWalkOpt) { .client =3D v9p, .path =3D path }).newfid; + fid =3D twalk((TWalkOpt) { .client =3D v9p, .path =3D to }).newfid; =20 req =3D v9fs_tlink(v9p, dfid, fid, clink, 0); v9fs_req_wait_for_reply(req, NULL); @@ -1373,7 +1430,7 @@ static void do_unlinkat(QVirtio9P *v9p, const char *a= tpath, const char *rpath, uint32_t fid; P9Req *req; =20 - fid =3D do_walk(v9p, atpath); + fid =3D twalk((TWalkOpt) { .client =3D v9p, .path =3D atpath }).newfid; =20 req =3D v9fs_tunlinkat(v9p, fid, name, flags, 0); v9fs_req_wait_for_reply(req, NULL); --=20 2.30.2