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