Annotation of qemu/hw/9pfs/cofile.c, revision 1.1.1.1

1.1       root        1: 
                      2: /*
                      3:  * Virtio 9p backend
                      4:  *
                      5:  * Copyright IBM, Corp. 2011
                      6:  *
                      7:  * Authors:
                      8:  *  Aneesh Kumar K.V <[email protected]>
                      9:  *
                     10:  * This work is licensed under the terms of the GNU GPL, version 2.  See
                     11:  * the COPYING file in the top-level directory.
                     12:  *
                     13:  */
                     14: 
                     15: #include "fsdev/qemu-fsdev.h"
                     16: #include "qemu-thread.h"
                     17: #include "qemu-coroutine.h"
                     18: #include "virtio-9p-coth.h"
                     19: 
                     20: int v9fs_co_st_gen(V9fsPDU *pdu, V9fsPath *path, mode_t st_mode,
                     21:                    V9fsStatDotl *v9stat)
                     22: {
                     23:     int err = 0;
                     24:     V9fsState *s = pdu->s;
                     25: 
                     26:     if (v9fs_request_cancelled(pdu)) {
                     27:         return -EINTR;
                     28:     }
                     29:     if (s->ctx.exops.get_st_gen) {
                     30:         v9fs_path_read_lock(s);
                     31:         v9fs_co_run_in_worker(
                     32:             {
                     33:                 err = s->ctx.exops.get_st_gen(&s->ctx, path, st_mode,
                     34:                                               &v9stat->st_gen);
                     35:                 if (err < 0) {
                     36:                     err = -errno;
                     37:                 }
                     38:             });
                     39:         v9fs_path_unlock(s);
                     40:     }
                     41:     return err;
                     42: }
                     43: 
                     44: int v9fs_co_lstat(V9fsPDU *pdu, V9fsPath *path, struct stat *stbuf)
                     45: {
                     46:     int err;
                     47:     V9fsState *s = pdu->s;
                     48: 
                     49:     if (v9fs_request_cancelled(pdu)) {
                     50:         return -EINTR;
                     51:     }
                     52:     v9fs_path_read_lock(s);
                     53:     v9fs_co_run_in_worker(
                     54:         {
                     55:             err = s->ops->lstat(&s->ctx, path, stbuf);
                     56:             if (err < 0) {
                     57:                 err = -errno;
                     58:             }
                     59:         });
                     60:     v9fs_path_unlock(s);
                     61:     return err;
                     62: }
                     63: 
                     64: int v9fs_co_fstat(V9fsPDU *pdu, V9fsFidState *fidp, struct stat *stbuf)
                     65: {
                     66:     int err;
                     67:     V9fsState *s = pdu->s;
                     68: 
                     69:     if (v9fs_request_cancelled(pdu)) {
                     70:         return -EINTR;
                     71:     }
                     72:     v9fs_co_run_in_worker(
                     73:         {
                     74:             err = s->ops->fstat(&s->ctx, fidp->fid_type, &fidp->fs, stbuf);
                     75:             if (err < 0) {
                     76:                 err = -errno;
                     77:             }
                     78:         });
                     79:     return err;
                     80: }
                     81: 
                     82: int v9fs_co_open(V9fsPDU *pdu, V9fsFidState *fidp, int flags)
                     83: {
                     84:     int err;
                     85:     V9fsState *s = pdu->s;
                     86: 
                     87:     if (v9fs_request_cancelled(pdu)) {
                     88:         return -EINTR;
                     89:     }
                     90:     v9fs_path_read_lock(s);
                     91:     v9fs_co_run_in_worker(
                     92:         {
                     93:             err = s->ops->open(&s->ctx, &fidp->path, flags, &fidp->fs);
                     94:             if (err == -1) {
                     95:                 err = -errno;
                     96:             } else {
                     97:                 err = 0;
                     98:             }
                     99:         });
                    100:     v9fs_path_unlock(s);
                    101:     if (!err) {
                    102:         total_open_fd++;
                    103:         if (total_open_fd > open_fd_hw) {
                    104:             v9fs_reclaim_fd(pdu);
                    105:         }
                    106:     }
                    107:     return err;
                    108: }
                    109: 
                    110: int v9fs_co_open2(V9fsPDU *pdu, V9fsFidState *fidp, V9fsString *name, gid_t gid,
                    111:                   int flags, int mode, struct stat *stbuf)
                    112: {
                    113:     int err;
                    114:     FsCred cred;
                    115:     V9fsPath path;
                    116:     V9fsState *s = pdu->s;
                    117: 
                    118:     if (v9fs_request_cancelled(pdu)) {
                    119:         return -EINTR;
                    120:     }
                    121:     cred_init(&cred);
                    122:     cred.fc_mode = mode & 07777;
                    123:     cred.fc_uid = fidp->uid;
                    124:     cred.fc_gid = gid;
                    125:     /*
                    126:      * Hold the directory fid lock so that directory path name
                    127:      * don't change. Read lock is fine because this fid cannot
                    128:      * be used by any other operation.
                    129:      */
                    130:     v9fs_path_read_lock(s);
                    131:     v9fs_co_run_in_worker(
                    132:         {
                    133:             err = s->ops->open2(&s->ctx, &fidp->path,
                    134:                                 name->data, flags, &cred, &fidp->fs);
                    135:             if (err < 0) {
                    136:                 err = -errno;
                    137:             } else {
                    138:                 v9fs_path_init(&path);
                    139:                 err = v9fs_name_to_path(s, &fidp->path, name->data, &path);
                    140:                 if (!err) {
                    141:                     err = s->ops->lstat(&s->ctx, &path, stbuf);
                    142:                     if (err < 0) {
                    143:                         err = -errno;
                    144:                         s->ops->close(&s->ctx, &fidp->fs);
                    145:                     } else {
                    146:                         v9fs_path_copy(&fidp->path, &path);
                    147:                     }
                    148:                 } else {
                    149:                     s->ops->close(&s->ctx, &fidp->fs);
                    150:                 }
                    151:                 v9fs_path_free(&path);
                    152:             }
                    153:         });
                    154:     v9fs_path_unlock(s);
                    155:     if (!err) {
                    156:         total_open_fd++;
                    157:         if (total_open_fd > open_fd_hw) {
                    158:             v9fs_reclaim_fd(pdu);
                    159:         }
                    160:     }
                    161:     return err;
                    162: }
                    163: 
                    164: int v9fs_co_close(V9fsPDU *pdu, V9fsFidOpenState *fs)
                    165: {
                    166:     int err;
                    167:     V9fsState *s = pdu->s;
                    168: 
                    169:     if (v9fs_request_cancelled(pdu)) {
                    170:         return -EINTR;
                    171:     }
                    172:     v9fs_co_run_in_worker(
                    173:         {
                    174:             err = s->ops->close(&s->ctx, fs);
                    175:             if (err < 0) {
                    176:                 err = -errno;
                    177:             }
                    178:         });
                    179:     if (!err) {
                    180:         total_open_fd--;
                    181:     }
                    182:     return err;
                    183: }
                    184: 
                    185: int v9fs_co_fsync(V9fsPDU *pdu, V9fsFidState *fidp, int datasync)
                    186: {
                    187:     int err;
                    188:     V9fsState *s = pdu->s;
                    189: 
                    190:     if (v9fs_request_cancelled(pdu)) {
                    191:         return -EINTR;
                    192:     }
                    193:     v9fs_co_run_in_worker(
                    194:         {
                    195:             err = s->ops->fsync(&s->ctx, fidp->fid_type, &fidp->fs, datasync);
                    196:             if (err < 0) {
                    197:                 err = -errno;
                    198:             }
                    199:         });
                    200:     return err;
                    201: }
                    202: 
                    203: int v9fs_co_link(V9fsPDU *pdu, V9fsFidState *oldfid,
                    204:                  V9fsFidState *newdirfid, V9fsString *name)
                    205: {
                    206:     int err;
                    207:     V9fsState *s = pdu->s;
                    208: 
                    209:     if (v9fs_request_cancelled(pdu)) {
                    210:         return -EINTR;
                    211:     }
                    212:     v9fs_path_read_lock(s);
                    213:     v9fs_co_run_in_worker(
                    214:         {
                    215:             err = s->ops->link(&s->ctx, &oldfid->path,
                    216:                                &newdirfid->path, name->data);
                    217:             if (err < 0) {
                    218:                 err = -errno;
                    219:             }
                    220:         });
                    221:     v9fs_path_unlock(s);
                    222:     return err;
                    223: }
                    224: 
                    225: int v9fs_co_pwritev(V9fsPDU *pdu, V9fsFidState *fidp,
                    226:                     struct iovec *iov, int iovcnt, int64_t offset)
                    227: {
                    228:     int err;
                    229:     V9fsState *s = pdu->s;
                    230: 
                    231:     if (v9fs_request_cancelled(pdu)) {
                    232:         return -EINTR;
                    233:     }
                    234:     v9fs_co_run_in_worker(
                    235:         {
                    236:             err = s->ops->pwritev(&s->ctx, &fidp->fs, iov, iovcnt, offset);
                    237:             if (err < 0) {
                    238:                 err = -errno;
                    239:             }
                    240:         });
                    241:     return err;
                    242: }
                    243: 
                    244: int v9fs_co_preadv(V9fsPDU *pdu, V9fsFidState *fidp,
                    245:                    struct iovec *iov, int iovcnt, int64_t offset)
                    246: {
                    247:     int err;
                    248:     V9fsState *s = pdu->s;
                    249: 
                    250:     if (v9fs_request_cancelled(pdu)) {
                    251:         return -EINTR;
                    252:     }
                    253:     v9fs_co_run_in_worker(
                    254:         {
                    255:             err = s->ops->preadv(&s->ctx, &fidp->fs, iov, iovcnt, offset);
                    256:             if (err < 0) {
                    257:                 err = -errno;
                    258:             }
                    259:         });
                    260:     return err;
                    261: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.