xref: /openbmc/qemu/hw/9pfs/cofs.c (revision 02ac7a34)
186e42d74SVenkateswararao Jujjuri (JV) 
286e42d74SVenkateswararao Jujjuri (JV) /*
386e42d74SVenkateswararao Jujjuri (JV)  * Virtio 9p backend
486e42d74SVenkateswararao Jujjuri (JV)  *
586e42d74SVenkateswararao Jujjuri (JV)  * Copyright IBM, Corp. 2011
686e42d74SVenkateswararao Jujjuri (JV)  *
786e42d74SVenkateswararao Jujjuri (JV)  * Authors:
886e42d74SVenkateswararao Jujjuri (JV)  *  Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
986e42d74SVenkateswararao Jujjuri (JV)  *
1086e42d74SVenkateswararao Jujjuri (JV)  * This work is licensed under the terms of the GNU GPL, version 2.  See
1186e42d74SVenkateswararao Jujjuri (JV)  * the COPYING file in the top-level directory.
1286e42d74SVenkateswararao Jujjuri (JV)  *
1386e42d74SVenkateswararao Jujjuri (JV)  */
1486e42d74SVenkateswararao Jujjuri (JV) 
1586e42d74SVenkateswararao Jujjuri (JV) #include "fsdev/qemu-fsdev.h"
1686e42d74SVenkateswararao Jujjuri (JV) #include "qemu-thread.h"
1786e42d74SVenkateswararao Jujjuri (JV) #include "qemu-coroutine.h"
1886e42d74SVenkateswararao Jujjuri (JV) #include "virtio-9p-coth.h"
1986e42d74SVenkateswararao Jujjuri (JV) 
2086e42d74SVenkateswararao Jujjuri (JV) int v9fs_co_readlink(V9fsState *s, V9fsString *path, V9fsString *buf)
2186e42d74SVenkateswararao Jujjuri (JV) {
2286e42d74SVenkateswararao Jujjuri (JV)     int err;
2386e42d74SVenkateswararao Jujjuri (JV)     ssize_t len;
2486e42d74SVenkateswararao Jujjuri (JV) 
257267c094SAnthony Liguori     buf->data = g_malloc(PATH_MAX);
2686e42d74SVenkateswararao Jujjuri (JV)     v9fs_co_run_in_worker(
2786e42d74SVenkateswararao Jujjuri (JV)         {
2886e42d74SVenkateswararao Jujjuri (JV)             len = s->ops->readlink(&s->ctx, path->data,
2986e42d74SVenkateswararao Jujjuri (JV)                                    buf->data, PATH_MAX - 1);
3086e42d74SVenkateswararao Jujjuri (JV)             if (len > -1) {
3186e42d74SVenkateswararao Jujjuri (JV)                 buf->size = len;
3286e42d74SVenkateswararao Jujjuri (JV)                 buf->data[len] = 0;
3386e42d74SVenkateswararao Jujjuri (JV)                 err = 0;
3486e42d74SVenkateswararao Jujjuri (JV)             } else {
3586e42d74SVenkateswararao Jujjuri (JV)                 err = -errno;
3686e42d74SVenkateswararao Jujjuri (JV)             }
3786e42d74SVenkateswararao Jujjuri (JV)         });
3886e42d74SVenkateswararao Jujjuri (JV)     if (err) {
397267c094SAnthony Liguori         g_free(buf->data);
4086e42d74SVenkateswararao Jujjuri (JV)         buf->data = NULL;
4186e42d74SVenkateswararao Jujjuri (JV)         buf->size = 0;
4286e42d74SVenkateswararao Jujjuri (JV)     }
4386e42d74SVenkateswararao Jujjuri (JV)     return err;
4486e42d74SVenkateswararao Jujjuri (JV) }
4594840ff9SAneesh Kumar K.V 
4694840ff9SAneesh Kumar K.V int v9fs_co_statfs(V9fsState *s, V9fsString *path, struct statfs *stbuf)
4794840ff9SAneesh Kumar K.V {
4894840ff9SAneesh Kumar K.V     int err;
4994840ff9SAneesh Kumar K.V 
5094840ff9SAneesh Kumar K.V     v9fs_co_run_in_worker(
5194840ff9SAneesh Kumar K.V         {
5294840ff9SAneesh Kumar K.V             err = s->ops->statfs(&s->ctx, path->data, stbuf);
5394840ff9SAneesh Kumar K.V             if (err < 0) {
5494840ff9SAneesh Kumar K.V                 err = -errno;
5594840ff9SAneesh Kumar K.V             }
5694840ff9SAneesh Kumar K.V         });
5794840ff9SAneesh Kumar K.V     return err;
5894840ff9SAneesh Kumar K.V }
594011ead2SAneesh Kumar K.V 
604011ead2SAneesh Kumar K.V int v9fs_co_chmod(V9fsState *s, V9fsString *path, mode_t mode)
614011ead2SAneesh Kumar K.V {
624011ead2SAneesh Kumar K.V     int err;
634011ead2SAneesh Kumar K.V     FsCred cred;
644011ead2SAneesh Kumar K.V 
654011ead2SAneesh Kumar K.V     cred_init(&cred);
664011ead2SAneesh Kumar K.V     cred.fc_mode = mode;
674011ead2SAneesh Kumar K.V     v9fs_co_run_in_worker(
684011ead2SAneesh Kumar K.V         {
694011ead2SAneesh Kumar K.V             err = s->ops->chmod(&s->ctx, path->data, &cred);
704011ead2SAneesh Kumar K.V             if (err < 0) {
714011ead2SAneesh Kumar K.V                 err = -errno;
724011ead2SAneesh Kumar K.V             }
734011ead2SAneesh Kumar K.V         });
744011ead2SAneesh Kumar K.V     return err;
754011ead2SAneesh Kumar K.V }
764011ead2SAneesh Kumar K.V 
774011ead2SAneesh Kumar K.V int v9fs_co_utimensat(V9fsState *s, V9fsString *path,
784011ead2SAneesh Kumar K.V                       struct timespec times[2])
794011ead2SAneesh Kumar K.V {
804011ead2SAneesh Kumar K.V     int err;
814011ead2SAneesh Kumar K.V 
824011ead2SAneesh Kumar K.V     v9fs_co_run_in_worker(
834011ead2SAneesh Kumar K.V         {
844011ead2SAneesh Kumar K.V             err = s->ops->utimensat(&s->ctx, path->data, times);
854011ead2SAneesh Kumar K.V             if (err < 0) {
864011ead2SAneesh Kumar K.V                 err = -errno;
874011ead2SAneesh Kumar K.V             }
884011ead2SAneesh Kumar K.V         });
894011ead2SAneesh Kumar K.V     return err;
904011ead2SAneesh Kumar K.V }
914011ead2SAneesh Kumar K.V 
924011ead2SAneesh Kumar K.V int v9fs_co_chown(V9fsState *s, V9fsString *path, uid_t uid, gid_t gid)
934011ead2SAneesh Kumar K.V {
944011ead2SAneesh Kumar K.V     int err;
954011ead2SAneesh Kumar K.V     FsCred cred;
964011ead2SAneesh Kumar K.V 
974011ead2SAneesh Kumar K.V     cred_init(&cred);
984011ead2SAneesh Kumar K.V     cred.fc_uid = uid;
994011ead2SAneesh Kumar K.V     cred.fc_gid = gid;
1004011ead2SAneesh Kumar K.V     v9fs_co_run_in_worker(
1014011ead2SAneesh Kumar K.V         {
1024011ead2SAneesh Kumar K.V             err = s->ops->chown(&s->ctx, path->data, &cred);
1034011ead2SAneesh Kumar K.V             if (err < 0) {
1044011ead2SAneesh Kumar K.V                 err = -errno;
1054011ead2SAneesh Kumar K.V             }
1064011ead2SAneesh Kumar K.V         });
1074011ead2SAneesh Kumar K.V     return err;
1084011ead2SAneesh Kumar K.V }
1094011ead2SAneesh Kumar K.V 
1104011ead2SAneesh Kumar K.V int v9fs_co_truncate(V9fsState *s, V9fsString *path, off_t size)
1114011ead2SAneesh Kumar K.V {
1124011ead2SAneesh Kumar K.V     int err;
1134011ead2SAneesh Kumar K.V 
1144011ead2SAneesh Kumar K.V     v9fs_co_run_in_worker(
1154011ead2SAneesh Kumar K.V         {
1164011ead2SAneesh Kumar K.V             err = s->ops->truncate(&s->ctx, path->data, size);
1174011ead2SAneesh Kumar K.V             if (err < 0) {
1184011ead2SAneesh Kumar K.V                 err = -errno;
1194011ead2SAneesh Kumar K.V             }
1204011ead2SAneesh Kumar K.V         });
1214011ead2SAneesh Kumar K.V     return err;
1224011ead2SAneesh Kumar K.V }
12300ace8c5SAneesh Kumar K.V 
12400ace8c5SAneesh Kumar K.V int v9fs_co_mknod(V9fsState *s, V9fsString *path, uid_t uid,
12500ace8c5SAneesh Kumar K.V                   gid_t gid, dev_t dev, mode_t mode)
12600ace8c5SAneesh Kumar K.V {
12700ace8c5SAneesh Kumar K.V     int err;
12800ace8c5SAneesh Kumar K.V     FsCred cred;
12900ace8c5SAneesh Kumar K.V 
13000ace8c5SAneesh Kumar K.V     cred_init(&cred);
13100ace8c5SAneesh Kumar K.V     cred.fc_uid  = uid;
13200ace8c5SAneesh Kumar K.V     cred.fc_gid  = gid;
13300ace8c5SAneesh Kumar K.V     cred.fc_mode = mode;
13400ace8c5SAneesh Kumar K.V     cred.fc_rdev = dev;
13500ace8c5SAneesh Kumar K.V     v9fs_co_run_in_worker(
13600ace8c5SAneesh Kumar K.V         {
13700ace8c5SAneesh Kumar K.V             err = s->ops->mknod(&s->ctx, path->data, &cred);
13800ace8c5SAneesh Kumar K.V             if (err < 0) {
13900ace8c5SAneesh Kumar K.V                 err = -errno;
14000ace8c5SAneesh Kumar K.V             }
14100ace8c5SAneesh Kumar K.V         });
14200ace8c5SAneesh Kumar K.V     return err;
14300ace8c5SAneesh Kumar K.V }
144b4b1537bSVenkateswararao Jujjuri 
145b4b1537bSVenkateswararao Jujjuri int v9fs_co_remove(V9fsState *s, V9fsString *path)
146b4b1537bSVenkateswararao Jujjuri {
147b4b1537bSVenkateswararao Jujjuri     int err;
148b4b1537bSVenkateswararao Jujjuri 
149b4b1537bSVenkateswararao Jujjuri     v9fs_co_run_in_worker(
150b4b1537bSVenkateswararao Jujjuri         {
151b4b1537bSVenkateswararao Jujjuri             err = s->ops->remove(&s->ctx, path->data);
152b4b1537bSVenkateswararao Jujjuri             if (err < 0) {
153b4b1537bSVenkateswararao Jujjuri                 err = -errno;
154b4b1537bSVenkateswararao Jujjuri             }
155b4b1537bSVenkateswararao Jujjuri         });
156b4b1537bSVenkateswararao Jujjuri     return err;
157b4b1537bSVenkateswararao Jujjuri }
1582a487e05SAneesh Kumar K.V 
1592a487e05SAneesh Kumar K.V int v9fs_co_rename(V9fsState *s, V9fsString *oldpath, V9fsString *newpath)
1602a487e05SAneesh Kumar K.V {
1612a487e05SAneesh Kumar K.V     int err;
1622a487e05SAneesh Kumar K.V 
1632a487e05SAneesh Kumar K.V     v9fs_co_run_in_worker(
1642a487e05SAneesh Kumar K.V         {
1652a487e05SAneesh Kumar K.V             err = s->ops->rename(&s->ctx, oldpath->data, newpath->data);
1662a487e05SAneesh Kumar K.V             if (err < 0) {
1672a487e05SAneesh Kumar K.V                 err = -errno;
1682a487e05SAneesh Kumar K.V             }
1692a487e05SAneesh Kumar K.V         });
1702a487e05SAneesh Kumar K.V     return err;
1712a487e05SAneesh Kumar K.V }
172*02ac7a34SVenkateswararao Jujjuri 
173*02ac7a34SVenkateswararao Jujjuri int v9fs_co_symlink(V9fsState *s, V9fsFidState *fidp,
174*02ac7a34SVenkateswararao Jujjuri                     const char *oldpath, const char *newpath, gid_t gid)
175*02ac7a34SVenkateswararao Jujjuri {
176*02ac7a34SVenkateswararao Jujjuri     int err;
177*02ac7a34SVenkateswararao Jujjuri     FsCred cred;
178*02ac7a34SVenkateswararao Jujjuri 
179*02ac7a34SVenkateswararao Jujjuri     cred_init(&cred);
180*02ac7a34SVenkateswararao Jujjuri     cred.fc_uid = fidp->uid;
181*02ac7a34SVenkateswararao Jujjuri     cred.fc_gid = gid;
182*02ac7a34SVenkateswararao Jujjuri     cred.fc_mode = 0777;
183*02ac7a34SVenkateswararao Jujjuri     v9fs_co_run_in_worker(
184*02ac7a34SVenkateswararao Jujjuri         {
185*02ac7a34SVenkateswararao Jujjuri             err = s->ops->symlink(&s->ctx, oldpath, newpath, &cred);
186*02ac7a34SVenkateswararao Jujjuri             if (err < 0) {
187*02ac7a34SVenkateswararao Jujjuri                 err = -errno;
188*02ac7a34SVenkateswararao Jujjuri             }
189*02ac7a34SVenkateswararao Jujjuri         });
190*02ac7a34SVenkateswararao Jujjuri     return err;
191*02ac7a34SVenkateswararao Jujjuri }
192