1dcb9dbe3SAneesh Kumar K.V 2dcb9dbe3SAneesh Kumar K.V /* 3dcb9dbe3SAneesh Kumar K.V * Virtio 9p backend 4dcb9dbe3SAneesh Kumar K.V * 5dcb9dbe3SAneesh Kumar K.V * Copyright IBM, Corp. 2011 6dcb9dbe3SAneesh Kumar K.V * 7dcb9dbe3SAneesh Kumar K.V * Authors: 8dcb9dbe3SAneesh Kumar K.V * Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> 9dcb9dbe3SAneesh Kumar K.V * 10dcb9dbe3SAneesh Kumar K.V * This work is licensed under the terms of the GNU GPL, version 2. See 11dcb9dbe3SAneesh Kumar K.V * the COPYING file in the top-level directory. 12dcb9dbe3SAneesh Kumar K.V * 13dcb9dbe3SAneesh Kumar K.V */ 14dcb9dbe3SAneesh Kumar K.V 15dcb9dbe3SAneesh Kumar K.V #include "fsdev/qemu-fsdev.h" 16dcb9dbe3SAneesh Kumar K.V #include "qemu-thread.h" 17dcb9dbe3SAneesh Kumar K.V #include "qemu-coroutine.h" 18dcb9dbe3SAneesh Kumar K.V #include "virtio-9p-coth.h" 19dcb9dbe3SAneesh Kumar K.V 20*5f524c1eSHarsh Prateek Bora int v9fs_co_readdir_r(V9fsState *s, V9fsFidState *fidp, struct dirent *dent, 21*5f524c1eSHarsh Prateek Bora struct dirent **result) 22dcb9dbe3SAneesh Kumar K.V { 23dcb9dbe3SAneesh Kumar K.V int err; 24dcb9dbe3SAneesh Kumar K.V 25dcb9dbe3SAneesh Kumar K.V v9fs_co_run_in_worker( 26dcb9dbe3SAneesh Kumar K.V { 27dcb9dbe3SAneesh Kumar K.V errno = 0; 28*5f524c1eSHarsh Prateek Bora err = s->ops->readdir_r(&s->ctx, fidp->fs.dir, dent, result); 29*5f524c1eSHarsh Prateek Bora if (!*result && errno) { 30dcb9dbe3SAneesh Kumar K.V err = -errno; 31dcb9dbe3SAneesh Kumar K.V } else { 32dcb9dbe3SAneesh Kumar K.V err = 0; 33dcb9dbe3SAneesh Kumar K.V } 34dcb9dbe3SAneesh Kumar K.V }); 35dcb9dbe3SAneesh Kumar K.V return err; 36dcb9dbe3SAneesh Kumar K.V } 37dcb9dbe3SAneesh Kumar K.V 38dcb9dbe3SAneesh Kumar K.V off_t v9fs_co_telldir(V9fsState *s, V9fsFidState *fidp) 39dcb9dbe3SAneesh Kumar K.V { 40dcb9dbe3SAneesh Kumar K.V off_t err; 41dcb9dbe3SAneesh Kumar K.V 42dcb9dbe3SAneesh Kumar K.V v9fs_co_run_in_worker( 43dcb9dbe3SAneesh Kumar K.V { 44dcb9dbe3SAneesh Kumar K.V err = s->ops->telldir(&s->ctx, fidp->fs.dir); 45dcb9dbe3SAneesh Kumar K.V if (err < 0) { 46dcb9dbe3SAneesh Kumar K.V err = -errno; 47dcb9dbe3SAneesh Kumar K.V } 48dcb9dbe3SAneesh Kumar K.V }); 49dcb9dbe3SAneesh Kumar K.V return err; 50dcb9dbe3SAneesh Kumar K.V } 51dcb9dbe3SAneesh Kumar K.V 52dcb9dbe3SAneesh Kumar K.V void v9fs_co_seekdir(V9fsState *s, V9fsFidState *fidp, off_t offset) 53dcb9dbe3SAneesh Kumar K.V { 54dcb9dbe3SAneesh Kumar K.V v9fs_co_run_in_worker( 55dcb9dbe3SAneesh Kumar K.V { 56dcb9dbe3SAneesh Kumar K.V s->ops->seekdir(&s->ctx, fidp->fs.dir, offset); 57dcb9dbe3SAneesh Kumar K.V }); 58dcb9dbe3SAneesh Kumar K.V } 59dcb9dbe3SAneesh Kumar K.V 60dcb9dbe3SAneesh Kumar K.V void v9fs_co_rewinddir(V9fsState *s, V9fsFidState *fidp) 61dcb9dbe3SAneesh Kumar K.V { 62dcb9dbe3SAneesh Kumar K.V v9fs_co_run_in_worker( 63dcb9dbe3SAneesh Kumar K.V { 64dcb9dbe3SAneesh Kumar K.V s->ops->rewinddir(&s->ctx, fidp->fs.dir); 65dcb9dbe3SAneesh Kumar K.V }); 66dcb9dbe3SAneesh Kumar K.V } 67d0884642SVenkateswararao Jujjuri 68d0884642SVenkateswararao Jujjuri int v9fs_co_mkdir(V9fsState *s, char *name, mode_t mode, uid_t uid, gid_t gid) 69d0884642SVenkateswararao Jujjuri { 70d0884642SVenkateswararao Jujjuri int err; 71d0884642SVenkateswararao Jujjuri FsCred cred; 72d0884642SVenkateswararao Jujjuri 73d0884642SVenkateswararao Jujjuri cred_init(&cred); 74d0884642SVenkateswararao Jujjuri cred.fc_mode = mode; 75d0884642SVenkateswararao Jujjuri cred.fc_uid = uid; 76d0884642SVenkateswararao Jujjuri cred.fc_gid = gid; 77d0884642SVenkateswararao Jujjuri v9fs_co_run_in_worker( 78d0884642SVenkateswararao Jujjuri { 79d0884642SVenkateswararao Jujjuri err = s->ops->mkdir(&s->ctx, name, &cred); 80d0884642SVenkateswararao Jujjuri if (err < 0) { 81d0884642SVenkateswararao Jujjuri err = -errno; 82d0884642SVenkateswararao Jujjuri } 83d0884642SVenkateswararao Jujjuri }); 84d0884642SVenkateswararao Jujjuri return err; 85d0884642SVenkateswararao Jujjuri } 86f6b7f0abSAneesh Kumar K.V 87f6b7f0abSAneesh Kumar K.V int v9fs_co_opendir(V9fsState *s, V9fsFidState *fidp) 88f6b7f0abSAneesh Kumar K.V { 89f6b7f0abSAneesh Kumar K.V int err; 90f6b7f0abSAneesh Kumar K.V 91f6b7f0abSAneesh Kumar K.V v9fs_co_run_in_worker( 92f6b7f0abSAneesh Kumar K.V { 93f6b7f0abSAneesh Kumar K.V fidp->fs.dir = s->ops->opendir(&s->ctx, fidp->path.data); 94f6b7f0abSAneesh Kumar K.V if (!fidp->fs.dir) { 95f6b7f0abSAneesh Kumar K.V err = -errno; 96f6b7f0abSAneesh Kumar K.V } else { 97f6b7f0abSAneesh Kumar K.V err = 0; 98f6b7f0abSAneesh Kumar K.V } 99f6b7f0abSAneesh Kumar K.V }); 100f6b7f0abSAneesh Kumar K.V return err; 101f6b7f0abSAneesh Kumar K.V } 102bed4352cSAneesh Kumar K.V 103bed4352cSAneesh Kumar K.V int v9fs_co_closedir(V9fsState *s, V9fsFidState *fidp) 104bed4352cSAneesh Kumar K.V { 105bed4352cSAneesh Kumar K.V int err; 106bed4352cSAneesh Kumar K.V DIR *dir; 107bed4352cSAneesh Kumar K.V 108bed4352cSAneesh Kumar K.V dir = fidp->fs.dir; 109bed4352cSAneesh Kumar K.V v9fs_co_run_in_worker( 110bed4352cSAneesh Kumar K.V { 111bed4352cSAneesh Kumar K.V err = s->ops->closedir(&s->ctx, dir); 112bed4352cSAneesh Kumar K.V if (err < 0) { 113bed4352cSAneesh Kumar K.V err = -errno; 114bed4352cSAneesh Kumar K.V } 115bed4352cSAneesh Kumar K.V }); 116bed4352cSAneesh Kumar K.V return err; 117bed4352cSAneesh Kumar K.V } 118