diff options
author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2011-08-02 11:36:17 +0530 |
---|---|---|
committer | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2011-09-22 21:38:52 +0530 |
commit | bccacf6c7920ee46ec4063c4bd9469eb3ec4e253 (patch) | |
tree | 928b32819cdf3dcb69afab2ad602dfbbeaa186ea /hw/9pfs/codir.c | |
parent | ce421a19612aaf0d25dede4bad3ea205587c9dae (diff) | |
download | qemu-bccacf6c7920ee46ec4063c4bd9469eb3ec4e253.zip |
hw/9pfs: Implement TFLUSH operation
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Diffstat (limited to 'hw/9pfs/codir.c')
-rw-r--r-- | hw/9pfs/codir.c | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/hw/9pfs/codir.c b/hw/9pfs/codir.c index b379f931c0..72732e7c53 100644 --- a/hw/9pfs/codir.c +++ b/hw/9pfs/codir.c @@ -17,11 +17,15 @@ #include "qemu-coroutine.h" #include "virtio-9p-coth.h" -int v9fs_co_readdir_r(V9fsState *s, V9fsFidState *fidp, struct dirent *dent, +int v9fs_co_readdir_r(V9fsPDU *pdu, V9fsFidState *fidp, struct dirent *dent, struct dirent **result) { int err; + V9fsState *s = pdu->s; + if (v9fs_request_cancelled(pdu)) { + return -EINTR; + } v9fs_co_run_in_worker( { errno = 0; @@ -35,10 +39,14 @@ int v9fs_co_readdir_r(V9fsState *s, V9fsFidState *fidp, struct dirent *dent, return err; } -off_t v9fs_co_telldir(V9fsState *s, V9fsFidState *fidp) +off_t v9fs_co_telldir(V9fsPDU *pdu, V9fsFidState *fidp) { off_t err; + V9fsState *s = pdu->s; + if (v9fs_request_cancelled(pdu)) { + return -EINTR; + } v9fs_co_run_in_worker( { err = s->ops->telldir(&s->ctx, fidp->fs.dir); @@ -49,29 +57,41 @@ off_t v9fs_co_telldir(V9fsState *s, V9fsFidState *fidp) return err; } -void v9fs_co_seekdir(V9fsState *s, V9fsFidState *fidp, off_t offset) +void v9fs_co_seekdir(V9fsPDU *pdu, V9fsFidState *fidp, off_t offset) { + V9fsState *s = pdu->s; + if (v9fs_request_cancelled(pdu)) { + return; + } v9fs_co_run_in_worker( { s->ops->seekdir(&s->ctx, fidp->fs.dir, offset); }); } -void v9fs_co_rewinddir(V9fsState *s, V9fsFidState *fidp) +void v9fs_co_rewinddir(V9fsPDU *pdu, V9fsFidState *fidp) { + V9fsState *s = pdu->s; + if (v9fs_request_cancelled(pdu)) { + return; + } v9fs_co_run_in_worker( { s->ops->rewinddir(&s->ctx, fidp->fs.dir); }); } -int v9fs_co_mkdir(V9fsState *s, V9fsFidState *fidp, V9fsString *name, +int v9fs_co_mkdir(V9fsPDU *pdu, V9fsFidState *fidp, V9fsString *name, mode_t mode, uid_t uid, gid_t gid, struct stat *stbuf) { int err; FsCred cred; V9fsPath path; + V9fsState *s = pdu->s; + if (v9fs_request_cancelled(pdu)) { + return -EINTR;; + } cred_init(&cred); cred.fc_mode = mode; cred.fc_uid = uid; @@ -98,10 +118,14 @@ int v9fs_co_mkdir(V9fsState *s, V9fsFidState *fidp, V9fsString *name, return err; } -int v9fs_co_opendir(V9fsState *s, V9fsFidState *fidp) +int v9fs_co_opendir(V9fsPDU *pdu, V9fsFidState *fidp) { int err; + V9fsState *s = pdu->s; + if (v9fs_request_cancelled(pdu)) { + return -EINTR;; + } v9fs_path_read_lock(s); v9fs_co_run_in_worker( { @@ -116,16 +140,20 @@ int v9fs_co_opendir(V9fsState *s, V9fsFidState *fidp) if (!err) { total_open_fd++; if (total_open_fd > open_fd_hw) { - v9fs_reclaim_fd(s); + v9fs_reclaim_fd(pdu); } } return err; } -int v9fs_co_closedir(V9fsState *s, DIR *dir) +int v9fs_co_closedir(V9fsPDU *pdu, DIR *dir) { int err; + V9fsState *s = pdu->s; + if (v9fs_request_cancelled(pdu)) { + return -EINTR;; + } v9fs_co_run_in_worker( { err = s->ops->closedir(&s->ctx, dir); |