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 205f524c1eSHarsh Prateek Bora int v9fs_co_readdir_r(V9fsState *s, V9fsFidState *fidp, struct dirent *dent, 215f524c1eSHarsh 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; 285f524c1eSHarsh Prateek Bora err = s->ops->readdir_r(&s->ctx, fidp->fs.dir, dent, result); 295f524c1eSHarsh 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 6802cb7f3aSAneesh Kumar K.V int v9fs_co_mkdir(V9fsState *s, V9fsFidState *fidp, V9fsString *name, 6902cb7f3aSAneesh Kumar K.V mode_t mode, uid_t uid, gid_t gid, struct stat *stbuf) 70d0884642SVenkateswararao Jujjuri { 71d0884642SVenkateswararao Jujjuri int err; 72d0884642SVenkateswararao Jujjuri FsCred cred; 732289be19SAneesh Kumar K.V V9fsPath path; 74d0884642SVenkateswararao Jujjuri 75d0884642SVenkateswararao Jujjuri cred_init(&cred); 76d0884642SVenkateswararao Jujjuri cred.fc_mode = mode; 77d0884642SVenkateswararao Jujjuri cred.fc_uid = uid; 78d0884642SVenkateswararao Jujjuri cred.fc_gid = gid; 79*532decb7SAneesh Kumar K.V v9fs_path_read_lock(s); 80d0884642SVenkateswararao Jujjuri v9fs_co_run_in_worker( 81d0884642SVenkateswararao Jujjuri { 822289be19SAneesh Kumar K.V err = s->ops->mkdir(&s->ctx, &fidp->path, name->data, &cred); 8302cb7f3aSAneesh Kumar K.V if (err < 0) { 8402cb7f3aSAneesh Kumar K.V err = -errno; 8502cb7f3aSAneesh Kumar K.V } else { 862289be19SAneesh Kumar K.V v9fs_path_init(&path); 872289be19SAneesh Kumar K.V err = v9fs_name_to_path(s, &fidp->path, name->data, &path); 882289be19SAneesh Kumar K.V if (!err) { 892289be19SAneesh Kumar K.V err = s->ops->lstat(&s->ctx, &path, stbuf); 90d0884642SVenkateswararao Jujjuri if (err < 0) { 91d0884642SVenkateswararao Jujjuri err = -errno; 92d0884642SVenkateswararao Jujjuri } 9302cb7f3aSAneesh Kumar K.V } 942289be19SAneesh Kumar K.V v9fs_path_free(&path); 952289be19SAneesh Kumar K.V } 96d0884642SVenkateswararao Jujjuri }); 97*532decb7SAneesh Kumar K.V v9fs_path_unlock(s); 98d0884642SVenkateswararao Jujjuri return err; 99d0884642SVenkateswararao Jujjuri } 100f6b7f0abSAneesh Kumar K.V 101f6b7f0abSAneesh Kumar K.V int v9fs_co_opendir(V9fsState *s, V9fsFidState *fidp) 102f6b7f0abSAneesh Kumar K.V { 103f6b7f0abSAneesh Kumar K.V int err; 104f6b7f0abSAneesh Kumar K.V 105*532decb7SAneesh Kumar K.V v9fs_path_read_lock(s); 106f6b7f0abSAneesh Kumar K.V v9fs_co_run_in_worker( 107f6b7f0abSAneesh Kumar K.V { 1082289be19SAneesh Kumar K.V fidp->fs.dir = s->ops->opendir(&s->ctx, &fidp->path); 109f6b7f0abSAneesh Kumar K.V if (!fidp->fs.dir) { 110f6b7f0abSAneesh Kumar K.V err = -errno; 111f6b7f0abSAneesh Kumar K.V } else { 112f6b7f0abSAneesh Kumar K.V err = 0; 113f6b7f0abSAneesh Kumar K.V } 114f6b7f0abSAneesh Kumar K.V }); 115*532decb7SAneesh Kumar K.V v9fs_path_unlock(s); 11695f65511SAneesh Kumar K.V if (!err) { 11795f65511SAneesh Kumar K.V total_open_fd++; 11895f65511SAneesh Kumar K.V if (total_open_fd > open_fd_hw) { 11995f65511SAneesh Kumar K.V v9fs_reclaim_fd(s); 12095f65511SAneesh Kumar K.V } 12195f65511SAneesh Kumar K.V } 122f6b7f0abSAneesh Kumar K.V return err; 123f6b7f0abSAneesh Kumar K.V } 124bed4352cSAneesh Kumar K.V 1257a462745SAneesh Kumar K.V int v9fs_co_closedir(V9fsState *s, DIR *dir) 126bed4352cSAneesh Kumar K.V { 127bed4352cSAneesh Kumar K.V int err; 128bed4352cSAneesh Kumar K.V 129bed4352cSAneesh Kumar K.V v9fs_co_run_in_worker( 130bed4352cSAneesh Kumar K.V { 131bed4352cSAneesh Kumar K.V err = s->ops->closedir(&s->ctx, dir); 132bed4352cSAneesh Kumar K.V if (err < 0) { 133bed4352cSAneesh Kumar K.V err = -errno; 134bed4352cSAneesh Kumar K.V } 135bed4352cSAneesh Kumar K.V }); 13695f65511SAneesh Kumar K.V if (!err) { 13795f65511SAneesh Kumar K.V total_open_fd--; 13895f65511SAneesh Kumar K.V } 139bed4352cSAneesh Kumar K.V return err; 140bed4352cSAneesh Kumar K.V } 141