Lines Matching refs:pdu

58 static ssize_t pdu_marshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...)  in pdu_marshal()  argument
64 ret = pdu->s->transport->pdu_vmarshal(pdu, offset, fmt, ap); in pdu_marshal()
70 static ssize_t pdu_unmarshal(V9fsPDU *pdu, size_t offset, const char *fmt, ...) in pdu_unmarshal() argument
76 ret = pdu->s->transport->pdu_vunmarshal(pdu, offset, fmt, ap); in pdu_unmarshal()
259 static int coroutine_fn v9fs_reopen_fid(V9fsPDU *pdu, V9fsFidState *f) in v9fs_reopen_fid() argument
265 err = v9fs_co_open(pdu, f, f->open_flags); in v9fs_reopen_fid()
266 } while (err == -EINTR && !pdu->cancelled); in v9fs_reopen_fid()
271 err = v9fs_co_opendir(pdu, f); in v9fs_reopen_fid()
272 } while (err == -EINTR && !pdu->cancelled); in v9fs_reopen_fid()
278 static V9fsFidState *coroutine_fn get_fid(V9fsPDU *pdu, int32_t fid) in get_fid() argument
282 V9fsState *s = pdu->s; in get_fid()
299 err = v9fs_reopen_fid(pdu, f); in get_fid()
341 static int coroutine_fn v9fs_xattr_fid_clunk(V9fsPDU *pdu, V9fsFidState *fidp) in v9fs_xattr_fid_clunk() argument
359 retval = v9fs_co_lsetxattr(pdu, &fidp->path, &fidp->fs.xattr.name, in v9fs_xattr_fid_clunk()
364 retval = v9fs_co_lremovexattr(pdu, &fidp->path, &fidp->fs.xattr.name); in v9fs_xattr_fid_clunk()
373 static int coroutine_fn free_fid(V9fsPDU *pdu, V9fsFidState *fidp) in free_fid() argument
380 retval = v9fs_co_close(pdu, &fidp->fs); in free_fid()
384 retval = v9fs_co_closedir(pdu, &fidp->fs); in free_fid()
387 retval = v9fs_xattr_fid_clunk(pdu, fidp); in free_fid()
394 static int coroutine_fn put_fid(V9fsPDU *pdu, V9fsFidState *fidp) in put_fid() argument
402 if (fidp->fid == pdu->s->root_fid) { in put_fid()
409 migrate_del_blocker(&pdu->s->migration_blocker); in put_fid()
411 return free_fid(pdu, fidp); in put_fid()
430 void coroutine_fn v9fs_reclaim_fd(V9fsPDU *pdu) in v9fs_reclaim_fd() argument
433 V9fsState *s = pdu->s; in v9fs_reclaim_fd()
503 v9fs_co_close(pdu, &f->fs_reclaim); in v9fs_reclaim_fd()
505 v9fs_co_closedir(pdu, &f->fs_reclaim); in v9fs_reclaim_fd()
511 put_fid(pdu, f); in v9fs_reclaim_fd()
520 static int coroutine_fn v9fs_mark_fids_unreclaim(V9fsPDU *pdu, V9fsPath *path) in v9fs_mark_fids_unreclaim() argument
523 V9fsState *s = pdu->s; in v9fs_mark_fids_unreclaim()
559 err = v9fs_reopen_fid(pdu, fidp); in v9fs_mark_fids_unreclaim()
566 put_fid(pdu, g_array_index(to_reopen, V9fsFidState*, i)); in v9fs_mark_fids_unreclaim()
571 static void coroutine_fn virtfs_reset(V9fsPDU *pdu) in virtfs_reset() argument
573 V9fsState *s = pdu->s; in virtfs_reset()
594 put_fid(pdu, fidp); in virtfs_reset()
807 static int qid_inode_prefix_hash_bits(V9fsPDU *pdu, dev_t dev) in qid_inode_prefix_hash_bits() argument
815 val = qht_lookup(&pdu->s->qpd_table, &lookup, hash); in qid_inode_prefix_hash_bits()
819 affix = affixForIndex(pdu->s->qp_affix_next); in qid_inode_prefix_hash_bits()
821 qht_insert(&pdu->s->qpd_table, val, hash, NULL); in qid_inode_prefix_hash_bits()
822 pdu->s->qp_ndevices++; in qid_inode_prefix_hash_bits()
843 static int qid_path_fullmap(V9fsPDU *pdu, const struct stat *stbuf, in qid_path_fullmap() argument
853 val = qht_lookup(&pdu->s->qpf_table, &lookup, hash); in qid_path_fullmap()
856 if (pdu->s->qp_fullpath_next == 0) { in qid_path_fullmap()
870 1ULL << (sizeof(pdu->s->qp_affix_next) * 8) in qid_path_fullmap()
872 val->path = (pdu->s->qp_fullpath_next++ << affix.bits) | affix.value; in qid_path_fullmap()
873 pdu->s->qp_fullpath_next &= ((1ULL << (64 - affix.bits)) - 1); in qid_path_fullmap()
874 qht_insert(&pdu->s->qpf_table, val, hash, NULL); in qid_path_fullmap()
920 static int qid_path_suffixmap(V9fsPDU *pdu, const struct stat *stbuf, in qid_path_suffixmap() argument
923 const int ino_hash_bits = qid_inode_prefix_hash_bits(pdu, stbuf->st_dev); in qid_path_suffixmap()
930 val = qht_lookup(&pdu->s->qpp_table, &lookup, hash); in qid_path_suffixmap()
933 if (pdu->s->qp_affix_next == 0) { in qid_path_suffixmap()
945 val->qp_affix_index = pdu->s->qp_affix_next++; in qid_path_suffixmap()
947 qht_insert(&pdu->s->qpp_table, val, hash, NULL); in qid_path_suffixmap()
954 static int stat_to_qid(V9fsPDU *pdu, const struct stat *stbuf, V9fsQID *qidp) in stat_to_qid() argument
959 if (pdu->s->ctx.export_flags & V9FS_REMAP_INODES) { in stat_to_qid()
961 err = qid_path_suffixmap(pdu, stbuf, &qidp->path); in stat_to_qid()
964 err = qid_path_fullmap(pdu, stbuf, &qidp->path); in stat_to_qid()
970 if (pdu->s->dev_id != stbuf->st_dev) { in stat_to_qid()
971 if (pdu->s->ctx.export_flags & V9FS_FORBID_MULTIDEVS) { in stat_to_qid()
1008 V9fsPDU *pdu = NULL; in pdu_alloc() local
1011 pdu = QLIST_FIRST(&s->free_list); in pdu_alloc()
1012 QLIST_REMOVE(pdu, next); in pdu_alloc()
1013 QLIST_INSERT_HEAD(&s->active_list, pdu, next); in pdu_alloc()
1015 return pdu; in pdu_alloc()
1018 void pdu_free(V9fsPDU *pdu) in pdu_free() argument
1020 V9fsState *s = pdu->s; in pdu_free()
1022 g_assert(!pdu->cancelled); in pdu_free()
1023 QLIST_REMOVE(pdu, next); in pdu_free()
1024 QLIST_INSERT_HEAD(&s->free_list, pdu, next); in pdu_free()
1027 static void coroutine_fn pdu_complete(V9fsPDU *pdu, ssize_t len) in pdu_complete() argument
1029 int8_t id = pdu->id + 1; /* Response */ in pdu_complete()
1030 V9fsState *s = pdu->s; in pdu_complete()
1044 bool discard = pdu->cancelled && len == -EINTR; in pdu_complete()
1046 trace_v9fs_rcancel(pdu->tag, pdu->id); in pdu_complete()
1047 pdu->size = 0; in pdu_complete()
1061 ret = pdu_marshal(pdu, len, "s", &str); in pdu_complete()
1071 ret = pdu_marshal(pdu, len, "d", err); in pdu_complete()
1080 trace_v9fs_rerror(pdu->tag, pdu->id, err); /* Trace ERROR */ in pdu_complete()
1084 if (pdu_marshal(pdu, 0, "dbw", (int32_t)len, id, pdu->tag) < 0) { in pdu_complete()
1089 pdu->size = len; in pdu_complete()
1090 pdu->id = id; in pdu_complete()
1093 pdu->s->transport->push_and_notify(pdu); in pdu_complete()
1096 if (!qemu_co_queue_next(&pdu->complete)) { in pdu_complete()
1097 pdu_free(pdu); in pdu_complete()
1226 static int coroutine_fn stat_to_v9stat(V9fsPDU *pdu, V9fsPath *path, in stat_to_v9stat() argument
1235 err = stat_to_qid(pdu, stbuf, &v9stat->qid); in stat_to_v9stat()
1255 err = v9fs_co_readlink(pdu, path, &v9stat->extension); in stat_to_v9stat()
1310 static int32_t blksize_to_iounit(const V9fsPDU *pdu, int32_t blksize) in blksize_to_iounit() argument
1313 V9fsState *s = pdu->s; in blksize_to_iounit()
1328 static int32_t stat_to_iounit(const V9fsPDU *pdu, const struct stat *stbuf) in stat_to_iounit() argument
1330 return blksize_to_iounit(pdu, stbuf->st_blksize); in stat_to_iounit()
1333 static int stat_to_v9stat_dotl(V9fsPDU *pdu, const struct stat *stbuf, in stat_to_v9stat_dotl() argument
1344 v9lstat->st_blksize = stat_to_iounit(pdu, stbuf); in stat_to_v9stat_dotl()
1361 return stat_to_qid(pdu, stbuf, &v9lstat->qid); in stat_to_v9stat_dotl()
1396 V9fsPDU *pdu = opaque; in v9fs_version() local
1397 V9fsState *s = pdu->s; in v9fs_version()
1402 err = pdu_unmarshal(pdu, offset, "ds", &s->msize, &version); in v9fs_version()
1406 trace_v9fs_version(pdu->tag, pdu->id, s->msize, version.data); in v9fs_version()
1408 virtfs_reset(pdu); in v9fs_version()
1439 err = pdu_marshal(pdu, offset, "ds", s->msize, &version); in v9fs_version()
1444 trace_v9fs_version_return(pdu->tag, pdu->id, s->msize, version.data); in v9fs_version()
1446 pdu_complete(pdu, err); in v9fs_version()
1452 V9fsPDU *pdu = opaque; in v9fs_attach() local
1453 V9fsState *s = pdu->s; in v9fs_attach()
1464 err = pdu_unmarshal(pdu, offset, "ddssd", &fid, in v9fs_attach()
1469 trace_v9fs_attach(pdu->tag, pdu->id, fid, afid, uname.data, aname.data); in v9fs_attach()
1477 err = v9fs_co_name_to_path(pdu, NULL, "/", &fidp->path); in v9fs_attach()
1483 err = v9fs_co_lstat(pdu, &fidp->path, &stbuf); in v9fs_attach()
1489 err = stat_to_qid(pdu, &stbuf, &qid); in v9fs_attach()
1512 err = pdu_marshal(pdu, offset, "Q", &qid); in v9fs_attach()
1520 trace_v9fs_attach_return(pdu->tag, pdu->id, in v9fs_attach()
1523 put_fid(pdu, fidp); in v9fs_attach()
1525 pdu_complete(pdu, err); in v9fs_attach()
1538 V9fsPDU *pdu = opaque; in v9fs_stat() local
1541 err = pdu_unmarshal(pdu, offset, "d", &fid); in v9fs_stat()
1545 trace_v9fs_stat(pdu->tag, pdu->id, fid); in v9fs_stat()
1547 fidp = get_fid(pdu, fid); in v9fs_stat()
1552 err = v9fs_co_lstat(pdu, &fidp->path, &stbuf); in v9fs_stat()
1557 err = stat_to_v9stat(pdu, &fidp->path, basename, &stbuf, &v9stat); in v9fs_stat()
1562 err = pdu_marshal(pdu, offset, "wS", 0, &v9stat); in v9fs_stat()
1567 trace_v9fs_stat_return(pdu->tag, pdu->id, v9stat.mode, in v9fs_stat()
1572 put_fid(pdu, fidp); in v9fs_stat()
1574 pdu_complete(pdu, err); in v9fs_stat()
1586 V9fsPDU *pdu = opaque; in v9fs_getattr() local
1588 retval = pdu_unmarshal(pdu, offset, "dq", &fid, &request_mask); in v9fs_getattr()
1592 trace_v9fs_getattr(pdu->tag, pdu->id, fid, request_mask); in v9fs_getattr()
1594 fidp = get_fid(pdu, fid); in v9fs_getattr()
1603 retval = v9fs_co_lstat(pdu, &fidp->path, &stbuf); in v9fs_getattr()
1607 retval = stat_to_v9stat_dotl(pdu, &stbuf, &v9stat_dotl); in v9fs_getattr()
1614 retval = v9fs_co_st_gen(pdu, &fidp->path, stbuf.st_mode, &v9stat_dotl); in v9fs_getattr()
1628 retval = pdu_marshal(pdu, offset, "A", &v9stat_dotl); in v9fs_getattr()
1633 trace_v9fs_getattr_return(pdu->tag, pdu->id, v9stat_dotl.st_result_mask, in v9fs_getattr()
1637 put_fid(pdu, fidp); in v9fs_getattr()
1639 pdu_complete(pdu, retval); in v9fs_getattr()
1662 V9fsPDU *pdu = opaque; in v9fs_setattr() local
1664 err = pdu_unmarshal(pdu, offset, "dI", &fid, &v9iattr); in v9fs_setattr()
1669 trace_v9fs_setattr(pdu->tag, pdu->id, fid, in v9fs_setattr()
1673 fidp = get_fid(pdu, fid); in v9fs_setattr()
1679 err = v9fs_co_chmod(pdu, &fidp->path, v9iattr.mode); in v9fs_setattr()
1706 err = v9fs_co_utimensat(pdu, &fidp->path, times); in v9fs_setattr()
1724 err = v9fs_co_chown(pdu, &fidp->path, v9iattr.uid, in v9fs_setattr()
1731 err = v9fs_co_truncate(pdu, &fidp->path, v9iattr.size); in v9fs_setattr()
1737 trace_v9fs_setattr_return(pdu->tag, pdu->id); in v9fs_setattr()
1739 put_fid(pdu, fidp); in v9fs_setattr()
1741 pdu_complete(pdu, err); in v9fs_setattr()
1744 static int v9fs_walk_marshal(V9fsPDU *pdu, uint16_t nwnames, V9fsQID *qids) in v9fs_walk_marshal() argument
1750 err = pdu_marshal(pdu, offset, "w", nwnames); in v9fs_walk_marshal()
1756 err = pdu_marshal(pdu, offset, "Q", &qids[i]); in v9fs_walk_marshal()
1790 V9fsPDU *pdu = opaque; in v9fs_walk() local
1791 V9fsState *s = pdu->s; in v9fs_walk()
1794 err = pdu_unmarshal(pdu, offset, "ddw", &fid, &newfid, &nwnames); in v9fs_walk()
1796 pdu_complete(pdu, err); in v9fs_walk()
1801 trace_v9fs_walk(pdu->tag, pdu->id, fid, newfid, nwnames); in v9fs_walk()
1813 err = pdu_unmarshal(pdu, offset, "s", &wnames[i]); in v9fs_walk()
1824 fidp = get_fid(pdu, fid); in v9fs_walk()
1846 if (v9fs_request_cancelled(pdu)) { in v9fs_walk()
1857 if (v9fs_request_cancelled(pdu)) { in v9fs_walk()
1861 if (!same_stat_id(&pdu->s->root_st, &stbuf) || in v9fs_walk()
1871 if (v9fs_request_cancelled(pdu)) { in v9fs_walk()
1898 any_err |= err = stat_to_qid(pdu, &fidst, &qid); in v9fs_walk()
1909 if (!same_stat_id(&pdu->s->root_st, &stbuf) || in v9fs_walk()
1913 any_err |= err = stat_to_qid(pdu, &stbuf, &qid); in v9fs_walk()
1949 err = v9fs_walk_marshal(pdu, name_idx, qids); in v9fs_walk()
1950 trace_v9fs_walk_return(pdu->tag, pdu->id, name_idx, qids); in v9fs_walk()
1952 put_fid(pdu, fidp); in v9fs_walk()
1954 put_fid(pdu, newfidp); in v9fs_walk()
1959 pdu_complete(pdu, err); in v9fs_walk()
1962 static int32_t coroutine_fn get_iounit(V9fsPDU *pdu, V9fsPath *path) in get_iounit() argument
1965 int err = v9fs_co_statfs(pdu, path, &stbuf); in get_iounit()
1967 return blksize_to_iounit(pdu, (err >= 0) ? stbuf.f_bsize : 0); in get_iounit()
1981 V9fsPDU *pdu = opaque; in v9fs_open() local
1982 V9fsState *s = pdu->s; in v9fs_open()
1985 err = pdu_unmarshal(pdu, offset, "dd", &fid, &mode); in v9fs_open()
1988 err = pdu_unmarshal(pdu, offset, "db", &fid, &modebyte); in v9fs_open()
1994 trace_v9fs_open(pdu->tag, pdu->id, fid, mode); in v9fs_open()
1996 fidp = get_fid(pdu, fid); in v9fs_open()
2006 err = v9fs_co_lstat(pdu, &fidp->path, &stbuf); in v9fs_open()
2010 err = stat_to_qid(pdu, &stbuf, &qid); in v9fs_open()
2015 err = v9fs_co_opendir(pdu, fidp); in v9fs_open()
2020 err = pdu_marshal(pdu, offset, "Qd", &qid, 0); in v9fs_open()
2038 err = v9fs_co_open(pdu, fidp, flags); in v9fs_open()
2051 iounit = get_iounit(pdu, &fidp->path); in v9fs_open()
2052 err = pdu_marshal(pdu, offset, "Qd", &qid, iounit); in v9fs_open()
2058 trace_v9fs_open_return(pdu->tag, pdu->id, in v9fs_open()
2061 put_fid(pdu, fidp); in v9fs_open()
2063 pdu_complete(pdu, err); in v9fs_open()
2077 V9fsPDU *pdu = opaque; in v9fs_lcreate() local
2080 err = pdu_unmarshal(pdu, offset, "dsddd", &dfid, in v9fs_lcreate()
2085 trace_v9fs_lcreate(pdu->tag, pdu->id, dfid, flags, mode, gid); in v9fs_lcreate()
2097 fidp = get_fid(pdu, dfid); in v9fs_lcreate()
2107 flags = get_dotl_openflags(pdu->s, flags); in v9fs_lcreate()
2108 err = v9fs_co_open2(pdu, fidp, &name, gid, in v9fs_lcreate()
2122 iounit = get_iounit(pdu, &fidp->path); in v9fs_lcreate()
2123 err = stat_to_qid(pdu, &stbuf, &qid); in v9fs_lcreate()
2127 err = pdu_marshal(pdu, offset, "Qd", &qid, iounit); in v9fs_lcreate()
2132 trace_v9fs_lcreate_return(pdu->tag, pdu->id, in v9fs_lcreate()
2135 put_fid(pdu, fidp); in v9fs_lcreate()
2137 pdu_complete(pdu, err); in v9fs_lcreate()
2148 V9fsPDU *pdu = opaque; in v9fs_fsync() local
2150 err = pdu_unmarshal(pdu, offset, "dd", &fid, &datasync); in v9fs_fsync()
2154 trace_v9fs_fsync(pdu->tag, pdu->id, fid, datasync); in v9fs_fsync()
2156 fidp = get_fid(pdu, fid); in v9fs_fsync()
2161 err = v9fs_co_fsync(pdu, fidp, datasync); in v9fs_fsync()
2165 put_fid(pdu, fidp); in v9fs_fsync()
2167 pdu_complete(pdu, err); in v9fs_fsync()
2176 V9fsPDU *pdu = opaque; in v9fs_clunk() local
2177 V9fsState *s = pdu->s; in v9fs_clunk()
2179 err = pdu_unmarshal(pdu, offset, "d", &fid); in v9fs_clunk()
2183 trace_v9fs_clunk(pdu->tag, pdu->id, fid); in v9fs_clunk()
2195 err = put_fid(pdu, fidp); in v9fs_clunk()
2200 pdu_complete(pdu, err); in v9fs_clunk()
2214 static void v9fs_init_qiov_from_pdu(QEMUIOVector *qiov, V9fsPDU *pdu, in v9fs_init_qiov_from_pdu() argument
2223 pdu->s->transport->init_out_iov_from_pdu(pdu, &iov, &niov, size + skip); in v9fs_init_qiov_from_pdu()
2225 pdu->s->transport->init_in_iov_from_pdu(pdu, &iov, &niov, size + skip); in v9fs_init_qiov_from_pdu()
2233 static int v9fs_xattr_read(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp, in v9fs_xattr_read() argument
2249 err = pdu_marshal(pdu, offset, "d", read_count); in v9fs_xattr_read()
2255 v9fs_init_qiov_from_pdu(&qiov_full, pdu, offset, read_count, false); in v9fs_xattr_read()
2267 static int coroutine_fn v9fs_do_readdir_with_stat(V9fsPDU *pdu, in v9fs_do_readdir_with_stat() argument
2280 saved_dir_pos = v9fs_co_telldir(pdu, fidp); in v9fs_do_readdir_with_stat()
2290 err = v9fs_co_readdir(pdu, fidp, &dent); in v9fs_do_readdir_with_stat()
2294 err = v9fs_co_name_to_path(pdu, &fidp->path, dent->d_name, &path); in v9fs_do_readdir_with_stat()
2298 err = v9fs_co_lstat(pdu, &path, &stbuf); in v9fs_do_readdir_with_stat()
2302 err = stat_to_v9stat(pdu, &path, dent->d_name, &stbuf, &v9stat); in v9fs_do_readdir_with_stat()
2310 v9fs_co_seekdir(pdu, fidp, saved_dir_pos); in v9fs_do_readdir_with_stat()
2317 len = pdu_marshal(pdu, 11 + count, "S", &v9stat); in v9fs_do_readdir_with_stat()
2322 v9fs_co_seekdir(pdu, fidp, saved_dir_pos); in v9fs_do_readdir_with_stat()
2351 V9fsPDU *pdu = opaque; in v9fs_read() local
2352 V9fsState *s = pdu->s; in v9fs_read()
2354 err = pdu_unmarshal(pdu, offset, "dqd", &fid, &off, &max_count); in v9fs_read()
2358 trace_v9fs_read(pdu->tag, pdu->id, fid, off, max_count); in v9fs_read()
2360 fidp = get_fid(pdu, fid); in v9fs_read()
2375 v9fs_co_rewinddir(pdu, fidp); in v9fs_read()
2377 count = v9fs_do_readdir_with_stat(pdu, fidp, max_count); in v9fs_read()
2382 err = pdu_marshal(pdu, offset, "d", count); in v9fs_read()
2392 v9fs_init_qiov_from_pdu(&qiov_full, pdu, offset + 4, max_count, false); in v9fs_read()
2402 len = v9fs_co_preadv(pdu, fidp, qiov.iov, qiov.niov, off); in v9fs_read()
2407 } while (len == -EINTR && !pdu->cancelled); in v9fs_read()
2414 err = pdu_marshal(pdu, offset, "d", count); in v9fs_read()
2423 err = v9fs_xattr_read(s, pdu, fidp, off, max_count); in v9fs_read()
2427 trace_v9fs_read_return(pdu->tag, pdu->id, count, err); in v9fs_read()
2429 put_fid(pdu, fidp); in v9fs_read()
2431 pdu_complete(pdu, err); in v9fs_read()
2462 static int coroutine_fn v9fs_do_readdir(V9fsPDU *pdu, V9fsFidState *fidp, in v9fs_do_readdir() argument
2480 const bool dostat = pdu->s->ctx.export_flags & V9FS_REMAP_INODES; in v9fs_do_readdir()
2488 count = v9fs_co_readdir_many(pdu, fidp, &entries, offset, max_count, in v9fs_do_readdir()
2500 if (pdu->s->ctx.export_flags & V9FS_REMAP_INODES) { in v9fs_do_readdir()
2509 err = stat_to_qid(pdu, st, &qid); in v9fs_do_readdir()
2536 len = pdu_marshal(pdu, 11 + count, "Qqbs", in v9fs_do_readdir()
2567 V9fsPDU *pdu = opaque; in v9fs_readdir() local
2568 V9fsState *s = pdu->s; in v9fs_readdir()
2570 retval = pdu_unmarshal(pdu, offset, "dqd", &fid, in v9fs_readdir()
2575 trace_v9fs_readdir(pdu->tag, pdu->id, fid, initial_offset, max_count); in v9fs_readdir()
2585 fidp = get_fid(pdu, fid); in v9fs_readdir()
2602 count = v9fs_do_readdir(pdu, fidp, (off_t) initial_offset, max_count); in v9fs_readdir()
2607 retval = pdu_marshal(pdu, offset, "d", count); in v9fs_readdir()
2612 trace_v9fs_readdir_return(pdu->tag, pdu->id, count, retval); in v9fs_readdir()
2614 put_fid(pdu, fidp); in v9fs_readdir()
2616 pdu_complete(pdu, retval); in v9fs_readdir()
2619 static int v9fs_xattr_write(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp, in v9fs_xattr_write() argument
2636 err = pdu_marshal(pdu, offset, "d", write_count); in v9fs_xattr_write()
2670 V9fsPDU *pdu = opaque; in v9fs_write() local
2671 V9fsState *s = pdu->s; in v9fs_write()
2675 err = pdu_unmarshal(pdu, offset, "dqd", &fid, &off, &count); in v9fs_write()
2677 pdu_complete(pdu, err); in v9fs_write()
2681 v9fs_init_qiov_from_pdu(&qiov_full, pdu, offset, count, true); in v9fs_write()
2682 trace_v9fs_write(pdu->tag, pdu->id, fid, off, count, qiov_full.niov); in v9fs_write()
2684 fidp = get_fid(pdu, fid); in v9fs_write()
2698 err = v9fs_xattr_write(s, pdu, fidp, off, count, in v9fs_write()
2714 len = v9fs_co_pwritev(pdu, fidp, qiov.iov, qiov.niov, off); in v9fs_write()
2719 } while (len == -EINTR && !pdu->cancelled); in v9fs_write()
2728 err = pdu_marshal(pdu, offset, "d", total); in v9fs_write()
2733 trace_v9fs_write_return(pdu->tag, pdu->id, total, err); in v9fs_write()
2737 put_fid(pdu, fidp); in v9fs_write()
2740 pdu_complete(pdu, err); in v9fs_write()
2757 V9fsPDU *pdu = opaque; in v9fs_create() local
2758 V9fsState *s = pdu->s; in v9fs_create()
2763 err = pdu_unmarshal(pdu, offset, "dsdbs", &fid, &name, in v9fs_create()
2768 trace_v9fs_create(pdu->tag, pdu->id, fid, name.data, perm, mode); in v9fs_create()
2780 fidp = get_fid(pdu, fid); in v9fs_create()
2790 err = v9fs_co_mkdir(pdu, fidp, &name, perm & 0777, in v9fs_create()
2795 err = v9fs_co_name_to_path(pdu, &fidp->path, name.data, &path); in v9fs_create()
2802 err = v9fs_co_opendir(pdu, fidp); in v9fs_create()
2808 err = v9fs_co_symlink(pdu, fidp, &name, in v9fs_create()
2813 err = v9fs_co_name_to_path(pdu, &fidp->path, name.data, &path); in v9fs_create()
2822 V9fsFidState *ofidp = get_fid(pdu, ofid); in v9fs_create()
2827 err = v9fs_co_link(pdu, ofidp, fidp, &name); in v9fs_create()
2828 put_fid(pdu, ofidp); in v9fs_create()
2832 err = v9fs_co_name_to_path(pdu, &fidp->path, name.data, &path); in v9fs_create()
2840 err = v9fs_co_lstat(pdu, &fidp->path, &stbuf); in v9fs_create()
2868 err = v9fs_co_mknod(pdu, fidp, &name, fidp->uid, -1, in v9fs_create()
2873 err = v9fs_co_name_to_path(pdu, &fidp->path, name.data, &path); in v9fs_create()
2881 err = v9fs_co_mknod(pdu, fidp, &name, fidp->uid, -1, in v9fs_create()
2886 err = v9fs_co_name_to_path(pdu, &fidp->path, name.data, &path); in v9fs_create()
2894 err = v9fs_co_mknod(pdu, fidp, &name, fidp->uid, -1, in v9fs_create()
2899 err = v9fs_co_name_to_path(pdu, &fidp->path, name.data, &path); in v9fs_create()
2907 err = v9fs_co_open2(pdu, fidp, &name, -1, in v9fs_create()
2922 iounit = get_iounit(pdu, &fidp->path); in v9fs_create()
2923 err = stat_to_qid(pdu, &stbuf, &qid); in v9fs_create()
2927 err = pdu_marshal(pdu, offset, "Qd", &qid, iounit); in v9fs_create()
2932 trace_v9fs_create_return(pdu->tag, pdu->id, in v9fs_create()
2935 put_fid(pdu, fidp); in v9fs_create()
2937 pdu_complete(pdu, err); in v9fs_create()
2945 V9fsPDU *pdu = opaque; in v9fs_symlink() local
2958 err = pdu_unmarshal(pdu, offset, "dssd", &dfid, &name, &symname, &gid); in v9fs_symlink()
2962 trace_v9fs_symlink(pdu->tag, pdu->id, dfid, name.data, symname.data, gid); in v9fs_symlink()
2974 dfidp = get_fid(pdu, dfid); in v9fs_symlink()
2979 err = v9fs_co_symlink(pdu, dfidp, &name, symname.data, gid, &stbuf); in v9fs_symlink()
2983 err = stat_to_qid(pdu, &stbuf, &qid); in v9fs_symlink()
2987 err = pdu_marshal(pdu, offset, "Q", &qid); in v9fs_symlink()
2992 trace_v9fs_symlink_return(pdu->tag, pdu->id, in v9fs_symlink()
2995 put_fid(pdu, dfidp); in v9fs_symlink()
2997 pdu_complete(pdu, err); in v9fs_symlink()
3008 V9fsPDU *pdu = opaque; in v9fs_flush() local
3009 V9fsState *s = pdu->s; in v9fs_flush()
3011 err = pdu_unmarshal(pdu, offset, "w", &tag); in v9fs_flush()
3013 pdu_complete(pdu, err); in v9fs_flush()
3016 trace_v9fs_flush(pdu->tag, pdu->id, tag); in v9fs_flush()
3018 if (pdu->tag == tag) { in v9fs_flush()
3038 pdu_complete(pdu, 7); in v9fs_flush()
3043 V9fsPDU *pdu = opaque; in v9fs_link() local
3051 err = pdu_unmarshal(pdu, offset, "dds", &dfid, &oldfid, &name); in v9fs_link()
3055 trace_v9fs_link(pdu->tag, pdu->id, dfid, oldfid, name.data); in v9fs_link()
3067 dfidp = get_fid(pdu, dfid); in v9fs_link()
3073 oldfidp = get_fid(pdu, oldfid); in v9fs_link()
3078 err = v9fs_co_link(pdu, oldfidp, dfidp, &name); in v9fs_link()
3082 put_fid(pdu, oldfidp); in v9fs_link()
3084 put_fid(pdu, dfidp); in v9fs_link()
3087 pdu_complete(pdu, err); in v9fs_link()
3097 V9fsPDU *pdu = opaque; in v9fs_remove() local
3099 err = pdu_unmarshal(pdu, offset, "d", &fid); in v9fs_remove()
3103 trace_v9fs_remove(pdu->tag, pdu->id, fid); in v9fs_remove()
3105 fidp = get_fid(pdu, fid); in v9fs_remove()
3111 if (!(pdu->s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT)) { in v9fs_remove()
3119 err = v9fs_mark_fids_unreclaim(pdu, &fidp->path); in v9fs_remove()
3123 err = v9fs_co_remove(pdu, &fidp->path); in v9fs_remove()
3129 clunk_fid(pdu->s, fidp->fid); in v9fs_remove()
3130 put_fid(pdu, fidp); in v9fs_remove()
3132 pdu_complete(pdu, err); in v9fs_remove()
3143 V9fsPDU *pdu = opaque; in v9fs_unlinkat() local
3146 err = pdu_unmarshal(pdu, offset, "dsd", &dfid, &name, &flags); in v9fs_unlinkat()
3175 dfidp = get_fid(pdu, dfid); in v9fs_unlinkat()
3185 err = v9fs_co_name_to_path(pdu, &dfidp->path, name.data, &path); in v9fs_unlinkat()
3189 err = v9fs_mark_fids_unreclaim(pdu, &path); in v9fs_unlinkat()
3193 err = v9fs_co_unlinkat(pdu, &dfidp->path, &name, rflags); in v9fs_unlinkat()
3198 put_fid(pdu, dfidp); in v9fs_unlinkat()
3201 pdu_complete(pdu, err); in v9fs_unlinkat()
3207 static int coroutine_fn v9fs_complete_rename(V9fsPDU *pdu, V9fsFidState *fidp, in v9fs_complete_rename() argument
3214 V9fsState *s = pdu->s; in v9fs_complete_rename()
3221 dirfidp = get_fid(pdu, newdirfid); in v9fs_complete_rename()
3229 err = v9fs_co_name_to_path(pdu, &dirfidp->path, name->data, &new_path); in v9fs_complete_rename()
3241 err = v9fs_co_name_to_path(pdu, &dir_path, name->data, &new_path); in v9fs_complete_rename()
3247 err = v9fs_co_rename(pdu, &fidp->path, &new_path); in v9fs_complete_rename()
3265 put_fid(pdu, dirfidp); in v9fs_complete_rename()
3280 V9fsPDU *pdu = opaque; in v9fs_rename() local
3281 V9fsState *s = pdu->s; in v9fs_rename()
3284 err = pdu_unmarshal(pdu, offset, "dds", &fid, &newdirfid, &name); in v9fs_rename()
3299 fidp = get_fid(pdu, fid); in v9fs_rename()
3309 if (!(pdu->s->ctx.export_flags & V9FS_PATHNAME_FSCONTEXT)) { in v9fs_rename()
3314 err = v9fs_complete_rename(pdu, fidp, newdirfid, &name); in v9fs_rename()
3320 put_fid(pdu, fidp); in v9fs_rename()
3322 pdu_complete(pdu, err); in v9fs_rename()
3326 static int coroutine_fn v9fs_fix_fid_paths(V9fsPDU *pdu, V9fsPath *olddir, in v9fs_fix_fid_paths() argument
3333 V9fsState *s = pdu->s; in v9fs_fix_fid_paths()
3340 err = v9fs_co_name_to_path(pdu, olddir, old_name->data, &oldpath); in v9fs_fix_fid_paths()
3344 err = v9fs_co_name_to_path(pdu, newdir, new_name->data, &newpath); in v9fs_fix_fid_paths()
3366 static int coroutine_fn v9fs_complete_renameat(V9fsPDU *pdu, int32_t olddirfid, in v9fs_complete_renameat() argument
3372 V9fsState *s = pdu->s; in v9fs_complete_renameat()
3375 olddirfidp = get_fid(pdu, olddirfid); in v9fs_complete_renameat()
3381 newdirfidp = get_fid(pdu, newdirfid); in v9fs_complete_renameat()
3387 newdirfidp = get_fid(pdu, olddirfid); in v9fs_complete_renameat()
3390 err = v9fs_co_renameat(pdu, &olddirfidp->path, old_name, in v9fs_complete_renameat()
3397 err = v9fs_fix_fid_paths(pdu, &olddirfidp->path, old_name, in v9fs_complete_renameat()
3402 put_fid(pdu, olddirfidp); in v9fs_complete_renameat()
3405 put_fid(pdu, newdirfidp); in v9fs_complete_renameat()
3414 V9fsPDU *pdu = opaque; in v9fs_renameat() local
3415 V9fsState *s = pdu->s; in v9fs_renameat()
3421 err = pdu_unmarshal(pdu, offset, "dsds", &olddirfid, in v9fs_renameat()
3439 err = v9fs_complete_renameat(pdu, olddirfid, in v9fs_renameat()
3447 pdu_complete(pdu, err); in v9fs_renameat()
3461 V9fsPDU *pdu = opaque; in v9fs_wstat() local
3462 V9fsState *s = pdu->s; in v9fs_wstat()
3465 err = pdu_unmarshal(pdu, offset, "dwS", &fid, &unused, &v9stat); in v9fs_wstat()
3469 trace_v9fs_wstat(pdu->tag, pdu->id, fid, in v9fs_wstat()
3472 fidp = get_fid(pdu, fid); in v9fs_wstat()
3479 err = v9fs_co_fsync(pdu, fidp, 0); in v9fs_wstat()
3484 err = v9fs_co_lstat(pdu, &fidp->path, &stbuf); in v9fs_wstat()
3495 err = v9fs_co_chmod(pdu, &fidp->path, in v9fs_wstat()
3516 err = v9fs_co_utimensat(pdu, &fidp->path, times); in v9fs_wstat()
3522 err = v9fs_co_chown(pdu, &fidp->path, v9stat.n_uid, v9stat.n_gid); in v9fs_wstat()
3529 err = v9fs_complete_rename(pdu, fidp, -1, &v9stat.name); in v9fs_wstat()
3536 err = v9fs_co_truncate(pdu, &fidp->path, v9stat.length); in v9fs_wstat()
3543 put_fid(pdu, fidp); in v9fs_wstat()
3546 pdu_complete(pdu, err); in v9fs_wstat()
3549 static int v9fs_fill_statfs(V9fsState *s, V9fsPDU *pdu, struct statfs *stbuf) in v9fs_fill_statfs() argument
3594 return pdu_marshal(pdu, offset, "ddqqqqqqd", in v9fs_fill_statfs()
3607 V9fsPDU *pdu = opaque; in v9fs_statfs() local
3608 V9fsState *s = pdu->s; in v9fs_statfs()
3610 retval = pdu_unmarshal(pdu, offset, "d", &fid); in v9fs_statfs()
3614 fidp = get_fid(pdu, fid); in v9fs_statfs()
3619 retval = v9fs_co_statfs(pdu, &fidp->path, &stbuf); in v9fs_statfs()
3623 retval = v9fs_fill_statfs(s, pdu, &stbuf); in v9fs_statfs()
3629 put_fid(pdu, fidp); in v9fs_statfs()
3631 pdu_complete(pdu, retval); in v9fs_statfs()
3647 V9fsPDU *pdu = opaque; in v9fs_mknod() local
3650 err = pdu_unmarshal(pdu, offset, "dsdddd", &fid, &name, &mode, in v9fs_mknod()
3655 trace_v9fs_mknod(pdu->tag, pdu->id, fid, mode, major, minor); in v9fs_mknod()
3667 fidp = get_fid(pdu, fid); in v9fs_mknod()
3672 err = v9fs_co_mknod(pdu, fidp, &name, fidp->uid, gid, in v9fs_mknod()
3677 err = stat_to_qid(pdu, &stbuf, &qid); in v9fs_mknod()
3681 err = pdu_marshal(pdu, offset, "Q", &qid); in v9fs_mknod()
3686 trace_v9fs_mknod_return(pdu->tag, pdu->id, in v9fs_mknod()
3689 put_fid(pdu, fidp); in v9fs_mknod()
3691 pdu_complete(pdu, err); in v9fs_mknod()
3710 V9fsPDU *pdu = opaque; in v9fs_lock() local
3713 err = pdu_unmarshal(pdu, offset, "dbdqqds", &fid, &flock.type, in v9fs_lock()
3719 trace_v9fs_lock(pdu->tag, pdu->id, fid, in v9fs_lock()
3728 fidp = get_fid(pdu, fid); in v9fs_lock()
3733 err = v9fs_co_fstat(pdu, fidp, &stbuf); in v9fs_lock()
3737 err = pdu_marshal(pdu, offset, "b", P9_LOCK_SUCCESS); in v9fs_lock()
3742 trace_v9fs_lock_return(pdu->tag, pdu->id, P9_LOCK_SUCCESS); in v9fs_lock()
3744 put_fid(pdu, fidp); in v9fs_lock()
3746 pdu_complete(pdu, err); in v9fs_lock()
3761 V9fsPDU *pdu = opaque; in v9fs_getlock() local
3764 err = pdu_unmarshal(pdu, offset, "dbqqds", &fid, &glock.type, in v9fs_getlock()
3770 trace_v9fs_getlock(pdu->tag, pdu->id, fid, in v9fs_getlock()
3773 fidp = get_fid(pdu, fid); in v9fs_getlock()
3778 err = v9fs_co_fstat(pdu, fidp, &stbuf); in v9fs_getlock()
3783 err = pdu_marshal(pdu, offset, "bqqds", glock.type, in v9fs_getlock()
3790 trace_v9fs_getlock_return(pdu->tag, pdu->id, glock.type, glock.start, in v9fs_getlock()
3793 put_fid(pdu, fidp); in v9fs_getlock()
3795 pdu_complete(pdu, err); in v9fs_getlock()
3801 V9fsPDU *pdu = opaque; in v9fs_mkdir() local
3813 err = pdu_unmarshal(pdu, offset, "dsdd", &fid, &name, &mode, &gid); in v9fs_mkdir()
3817 trace_v9fs_mkdir(pdu->tag, pdu->id, fid, name.data, mode, gid); in v9fs_mkdir()
3829 fidp = get_fid(pdu, fid); in v9fs_mkdir()
3834 err = v9fs_co_mkdir(pdu, fidp, &name, mode, fidp->uid, gid, &stbuf); in v9fs_mkdir()
3838 err = stat_to_qid(pdu, &stbuf, &qid); in v9fs_mkdir()
3842 err = pdu_marshal(pdu, offset, "Q", &qid); in v9fs_mkdir()
3847 trace_v9fs_mkdir_return(pdu->tag, pdu->id, in v9fs_mkdir()
3850 put_fid(pdu, fidp); in v9fs_mkdir()
3852 pdu_complete(pdu, err); in v9fs_mkdir()
3865 V9fsPDU *pdu = opaque; in v9fs_xattrwalk() local
3866 V9fsState *s = pdu->s; in v9fs_xattrwalk()
3869 err = pdu_unmarshal(pdu, offset, "dds", &fid, &newfid, &name); in v9fs_xattrwalk()
3873 trace_v9fs_xattrwalk(pdu->tag, pdu->id, fid, newfid, name.data); in v9fs_xattrwalk()
3875 file_fidp = get_fid(pdu, fid); in v9fs_xattrwalk()
3890 size = v9fs_co_llistxattr(pdu, &xattr_fidp->path, NULL, 0); in v9fs_xattrwalk()
3904 err = v9fs_co_llistxattr(pdu, &xattr_fidp->path, in v9fs_xattrwalk()
3912 err = pdu_marshal(pdu, offset, "q", size); in v9fs_xattrwalk()
3922 size = v9fs_co_lgetxattr(pdu, &xattr_fidp->path, in v9fs_xattrwalk()
3937 err = v9fs_co_lgetxattr(pdu, &xattr_fidp->path, in v9fs_xattrwalk()
3945 err = pdu_marshal(pdu, offset, "q", size); in v9fs_xattrwalk()
3951 trace_v9fs_xattrwalk_return(pdu->tag, pdu->id, size); in v9fs_xattrwalk()
3953 put_fid(pdu, file_fidp); in v9fs_xattrwalk()
3955 put_fid(pdu, xattr_fidp); in v9fs_xattrwalk()
3958 pdu_complete(pdu, err); in v9fs_xattrwalk()
3990 V9fsPDU *pdu = opaque; in v9fs_xattrcreate() local
3993 err = pdu_unmarshal(pdu, offset, "dsqd", &fid, &name, &size, &flags); in v9fs_xattrcreate()
3997 trace_v9fs_xattrcreate(pdu->tag, pdu->id, fid, name.data, size, flags); in v9fs_xattrcreate()
4017 file_fidp = get_fid(pdu, fid); in v9fs_xattrcreate()
4039 put_fid(pdu, file_fidp); in v9fs_xattrcreate()
4041 pdu_complete(pdu, err); in v9fs_xattrcreate()
4047 V9fsPDU *pdu = opaque; in v9fs_readlink() local
4054 err = pdu_unmarshal(pdu, offset, "d", &fid); in v9fs_readlink()
4058 trace_v9fs_readlink(pdu->tag, pdu->id, fid); in v9fs_readlink()
4059 fidp = get_fid(pdu, fid); in v9fs_readlink()
4066 err = v9fs_co_readlink(pdu, &fidp->path, &target); in v9fs_readlink()
4070 err = pdu_marshal(pdu, offset, "s", &target); in v9fs_readlink()
4076 trace_v9fs_readlink_return(pdu->tag, pdu->id, target.data); in v9fs_readlink()
4079 put_fid(pdu, fidp); in v9fs_readlink()
4081 pdu_complete(pdu, err); in v9fs_readlink()
4123 V9fsPDU *pdu = opaque; in v9fs_op_not_supp() local
4124 pdu_complete(pdu, -EOPNOTSUPP); in v9fs_op_not_supp()
4129 V9fsPDU *pdu = opaque; in v9fs_fs_ro() local
4130 pdu_complete(pdu, -EROFS); in v9fs_fs_ro()
4133 static inline bool is_read_only_op(V9fsPDU *pdu) in is_read_only_op() argument
4135 switch (pdu->id) { in is_read_only_op()
4160 void pdu_submit(V9fsPDU *pdu, P9MsgHeader *hdr) in pdu_submit() argument
4164 V9fsState *s = pdu->s; in pdu_submit()
4166 pdu->size = le32_to_cpu(hdr->size_le); in pdu_submit()
4167 pdu->id = hdr->id; in pdu_submit()
4168 pdu->tag = le16_to_cpu(hdr->tag_le); in pdu_submit()
4170 if (pdu->id >= ARRAY_SIZE(pdu_co_handlers) || in pdu_submit()
4171 (pdu_co_handlers[pdu->id] == NULL)) { in pdu_submit()
4173 } else if (is_ro_export(&s->ctx) && !is_read_only_op(pdu)) { in pdu_submit()
4176 handler = pdu_co_handlers[pdu->id]; in pdu_submit()
4179 qemu_co_queue_init(&pdu->complete); in pdu_submit()
4180 co = qemu_coroutine_create(handler, pdu); in pdu_submit()
4316 V9fsPDU pdu; member
4324 virtfs_reset(&data->pdu); in virtfs_co_reset()
4330 VirtfsCoResetData data = { .pdu = { .s = s }, .done = false }; in v9fs_reset()