@@ -583,6 +583,23 @@ static void do_version(QVirtio9P *v9p)
g_free(server_version);
}
+/* utility function: walk to requested dir and return fid for that dir */
+static uint32_t do_walk(QVirtio9P *v9p, const char *path)
+{
+ char **wnames;
+ P9Req *req;
+ const uint32_t fid = genfid();
+
+ int nwnames = split(path, "/", &wnames);
+
+ req = v9fs_twalk(v9p, 0, fid, nwnames, wnames, 0);
+ v9fs_req_wait_for_reply(req, NULL);
+ v9fs_rwalk(req, NULL, NULL);
+
+ split_free(&wnames);
+ return fid;
+}
+
static void fs_version(void *obj, void *data, QGuestAllocator *t_alloc)
{
alloc = t_alloc;
@@ -974,23 +991,17 @@ static void fs_flush_ignored(void *obj, void *data, QGuestAllocator *t_alloc)
static void do_mkdir(QVirtio9P *v9p, const char *path, const char *cname)
{
- char **wnames;
char *const name = g_strdup(cname);
+ uint32_t fid;
P9Req *req;
- const uint32_t fid = genfid();
- int nwnames = split(path, "/", &wnames);
-
- req = v9fs_twalk(v9p, 0, fid, nwnames, wnames, 0);
- v9fs_req_wait_for_reply(req, NULL);
- v9fs_rwalk(req, NULL, NULL);
+ fid = do_walk(v9p, path);
req = v9fs_tmkdir(v9p, fid, name, 0750, 0, 0);
v9fs_req_wait_for_reply(req, NULL);
v9fs_rmkdir(req, NULL);
g_free(name);
- split_free(&wnames);
}
static void fs_readdir_split_128(void *obj, void *data,