xref: /openbmc/qemu/hw/9pfs/cofs.c (revision 7267c094)
1 
2 /*
3  * Virtio 9p backend
4  *
5  * Copyright IBM, Corp. 2011
6  *
7  * Authors:
8  *  Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
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_readlink(V9fsState *s, V9fsString *path, V9fsString *buf)
21 {
22     int err;
23     ssize_t len;
24 
25     buf->data = g_malloc(PATH_MAX);
26     v9fs_co_run_in_worker(
27         {
28             len = s->ops->readlink(&s->ctx, path->data,
29                                    buf->data, PATH_MAX - 1);
30             if (len > -1) {
31                 buf->size = len;
32                 buf->data[len] = 0;
33                 err = 0;
34             } else {
35                 err = -errno;
36             }
37         });
38     if (err) {
39         g_free(buf->data);
40         buf->data = NULL;
41         buf->size = 0;
42     }
43     return err;
44 }
45 
46 int v9fs_co_statfs(V9fsState *s, V9fsString *path, struct statfs *stbuf)
47 {
48     int err;
49 
50     v9fs_co_run_in_worker(
51         {
52             err = s->ops->statfs(&s->ctx, path->data, stbuf);
53             if (err < 0) {
54                 err = -errno;
55             }
56         });
57     return err;
58 }
59 
60 int v9fs_co_chmod(V9fsState *s, V9fsString *path, mode_t mode)
61 {
62     int err;
63     FsCred cred;
64 
65     cred_init(&cred);
66     cred.fc_mode = mode;
67     v9fs_co_run_in_worker(
68         {
69             err = s->ops->chmod(&s->ctx, path->data, &cred);
70             if (err < 0) {
71                 err = -errno;
72             }
73         });
74     return err;
75 }
76 
77 int v9fs_co_utimensat(V9fsState *s, V9fsString *path,
78                       struct timespec times[2])
79 {
80     int err;
81 
82     v9fs_co_run_in_worker(
83         {
84             err = s->ops->utimensat(&s->ctx, path->data, times);
85             if (err < 0) {
86                 err = -errno;
87             }
88         });
89     return err;
90 }
91 
92 int v9fs_co_chown(V9fsState *s, V9fsString *path, uid_t uid, gid_t gid)
93 {
94     int err;
95     FsCred cred;
96 
97     cred_init(&cred);
98     cred.fc_uid = uid;
99     cred.fc_gid = gid;
100     v9fs_co_run_in_worker(
101         {
102             err = s->ops->chown(&s->ctx, path->data, &cred);
103             if (err < 0) {
104                 err = -errno;
105             }
106         });
107     return err;
108 }
109 
110 int v9fs_co_truncate(V9fsState *s, V9fsString *path, off_t size)
111 {
112     int err;
113 
114     v9fs_co_run_in_worker(
115         {
116             err = s->ops->truncate(&s->ctx, path->data, size);
117             if (err < 0) {
118                 err = -errno;
119             }
120         });
121     return err;
122 }
123 
124 int v9fs_co_mknod(V9fsState *s, V9fsString *path, uid_t uid,
125                   gid_t gid, dev_t dev, mode_t mode)
126 {
127     int err;
128     FsCred cred;
129 
130     cred_init(&cred);
131     cred.fc_uid  = uid;
132     cred.fc_gid  = gid;
133     cred.fc_mode = mode;
134     cred.fc_rdev = dev;
135     v9fs_co_run_in_worker(
136         {
137             err = s->ops->mknod(&s->ctx, path->data, &cred);
138             if (err < 0) {
139                 err = -errno;
140             }
141         });
142     return err;
143 }
144 
145 int v9fs_co_remove(V9fsState *s, V9fsString *path)
146 {
147     int err;
148 
149     v9fs_co_run_in_worker(
150         {
151             err = s->ops->remove(&s->ctx, path->data);
152             if (err < 0) {
153                 err = -errno;
154             }
155         });
156     return err;
157 }
158 
159 int v9fs_co_rename(V9fsState *s, V9fsString *oldpath, V9fsString *newpath)
160 {
161     int err;
162 
163     v9fs_co_run_in_worker(
164         {
165             err = s->ops->rename(&s->ctx, oldpath->data, newpath->data);
166             if (err < 0) {
167                 err = -errno;
168             }
169         });
170     return err;
171 }
172