|
|
1.1 root 1:
2: /*
3: * Virtio 9p backend
4: *
5: * Copyright IBM, Corp. 2011
6: *
7: * Authors:
8: * Aneesh Kumar K.V <[email protected]>
9: *
10: * This work is licensed under the terms of the GNU GPL, version 2. See
11: * the COPYING file in the top-level directory.
12: *
13: */
14:
15: #include "fsdev/qemu-fsdev.h"
16: #include "qemu-thread.h"
17: #include "qemu-coroutine.h"
18: #include "virtio-9p-coth.h"
19:
20: int v9fs_co_readdir_r(V9fsPDU *pdu, V9fsFidState *fidp, struct dirent *dent,
21: struct dirent **result)
22: {
23: int err;
24: V9fsState *s = pdu->s;
25:
26: if (v9fs_request_cancelled(pdu)) {
27: return -EINTR;
28: }
29: v9fs_co_run_in_worker(
30: {
31: errno = 0;
32: err = s->ops->readdir_r(&s->ctx, &fidp->fs, dent, result);
33: if (!*result && errno) {
34: err = -errno;
35: } else {
36: err = 0;
37: }
38: });
39: return err;
40: }
41:
42: off_t v9fs_co_telldir(V9fsPDU *pdu, V9fsFidState *fidp)
43: {
44: off_t err;
45: V9fsState *s = pdu->s;
46:
47: if (v9fs_request_cancelled(pdu)) {
48: return -EINTR;
49: }
50: v9fs_co_run_in_worker(
51: {
52: err = s->ops->telldir(&s->ctx, &fidp->fs);
53: if (err < 0) {
54: err = -errno;
55: }
56: });
57: return err;
58: }
59:
60: void v9fs_co_seekdir(V9fsPDU *pdu, V9fsFidState *fidp, off_t offset)
61: {
62: V9fsState *s = pdu->s;
63: if (v9fs_request_cancelled(pdu)) {
64: return;
65: }
66: v9fs_co_run_in_worker(
67: {
68: s->ops->seekdir(&s->ctx, &fidp->fs, offset);
69: });
70: }
71:
72: void v9fs_co_rewinddir(V9fsPDU *pdu, V9fsFidState *fidp)
73: {
74: V9fsState *s = pdu->s;
75: if (v9fs_request_cancelled(pdu)) {
76: return;
77: }
78: v9fs_co_run_in_worker(
79: {
80: s->ops->rewinddir(&s->ctx, &fidp->fs);
81: });
82: }
83:
84: int v9fs_co_mkdir(V9fsPDU *pdu, V9fsFidState *fidp, V9fsString *name,
85: mode_t mode, uid_t uid, gid_t gid, struct stat *stbuf)
86: {
87: int err;
88: FsCred cred;
89: V9fsPath path;
90: V9fsState *s = pdu->s;
91:
92: if (v9fs_request_cancelled(pdu)) {
1.1.1.2 ! root 93: return -EINTR;
1.1 root 94: }
95: cred_init(&cred);
96: cred.fc_mode = mode;
97: cred.fc_uid = uid;
98: cred.fc_gid = gid;
99: v9fs_path_read_lock(s);
100: v9fs_co_run_in_worker(
101: {
102: err = s->ops->mkdir(&s->ctx, &fidp->path, name->data, &cred);
103: if (err < 0) {
104: err = -errno;
105: } else {
106: v9fs_path_init(&path);
107: err = v9fs_name_to_path(s, &fidp->path, name->data, &path);
108: if (!err) {
109: err = s->ops->lstat(&s->ctx, &path, stbuf);
110: if (err < 0) {
111: err = -errno;
112: }
113: }
114: v9fs_path_free(&path);
115: }
116: });
117: v9fs_path_unlock(s);
118: return err;
119: }
120:
121: int v9fs_co_opendir(V9fsPDU *pdu, V9fsFidState *fidp)
122: {
123: int err;
124: V9fsState *s = pdu->s;
125:
126: if (v9fs_request_cancelled(pdu)) {
1.1.1.2 ! root 127: return -EINTR;
1.1 root 128: }
129: v9fs_path_read_lock(s);
130: v9fs_co_run_in_worker(
131: {
132: err = s->ops->opendir(&s->ctx, &fidp->path, &fidp->fs);
133: if (err < 0) {
134: err = -errno;
135: } else {
136: err = 0;
137: }
138: });
139: v9fs_path_unlock(s);
140: if (!err) {
141: total_open_fd++;
142: if (total_open_fd > open_fd_hw) {
143: v9fs_reclaim_fd(pdu);
144: }
145: }
146: return err;
147: }
148:
149: int v9fs_co_closedir(V9fsPDU *pdu, V9fsFidOpenState *fs)
150: {
151: int err;
152: V9fsState *s = pdu->s;
153:
154: if (v9fs_request_cancelled(pdu)) {
1.1.1.2 ! root 155: return -EINTR;
1.1 root 156: }
157: v9fs_co_run_in_worker(
158: {
159: err = s->ops->closedir(&s->ctx, fs);
160: if (err < 0) {
161: err = -errno;
162: }
163: });
164: if (!err) {
165: total_open_fd--;
166: }
167: return err;
168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.