Revision 56d15a53 hw/virtio-9p.c
b/hw/virtio-9p.c | ||
---|---|---|
135 | 135 |
return s->ops->seekdir(&s->ctx, dir, off); |
136 | 136 |
} |
137 | 137 |
|
138 |
static int v9fs_do_readv(V9fsState *s, int fd, const struct iovec *iov, |
|
139 |
int iovcnt) |
|
138 |
static int v9fs_do_preadv(V9fsState *s, int fd, const struct iovec *iov,
|
|
139 |
int iovcnt, int64_t offset)
|
|
140 | 140 |
{ |
141 |
return s->ops->readv(&s->ctx, fd, iov, iovcnt);
|
|
141 |
return s->ops->preadv(&s->ctx, fd, iov, iovcnt, offset);
|
|
142 | 142 |
} |
143 | 143 |
|
144 |
static off_t v9fs_do_lseek(V9fsState *s, int fd, off_t offset, int whence) |
|
144 |
static int v9fs_do_pwritev(V9fsState *s, int fd, const struct iovec *iov, |
|
145 |
int iovcnt, int64_t offset) |
|
145 | 146 |
{ |
146 |
return s->ops->lseek(&s->ctx, fd, offset, whence); |
|
147 |
} |
|
148 |
|
|
149 |
static int v9fs_do_writev(V9fsState *s, int fd, const struct iovec *iov, |
|
150 |
int iovcnt) |
|
151 |
{ |
|
152 |
return s->ops->writev(&s->ctx, fd, iov, iovcnt); |
|
147 |
return s->ops->pwritev(&s->ctx, fd, iov, iovcnt, offset); |
|
153 | 148 |
} |
154 | 149 |
|
155 | 150 |
static int v9fs_do_chmod(V9fsState *s, V9fsString *path, mode_t mode) |
... | ... | |
1975 | 1970 |
return; |
1976 | 1971 |
} |
1977 | 1972 |
|
1978 |
static void v9fs_read_post_readv(V9fsState *s, V9fsReadState *vs, ssize_t err) |
|
1973 |
static void v9fs_read_post_preadv(V9fsState *s, V9fsReadState *vs, ssize_t err)
|
|
1979 | 1974 |
{ |
1980 | 1975 |
if (err < 0) { |
1981 | 1976 |
/* IO error return the error */ |
... | ... | |
1989 | 1984 |
if (0) { |
1990 | 1985 |
print_sg(vs->sg, vs->cnt); |
1991 | 1986 |
} |
1992 |
vs->len = v9fs_do_readv(s, vs->fidp->fs.fd, vs->sg, vs->cnt); |
|
1987 |
vs->len = v9fs_do_preadv(s, vs->fidp->fs.fd, vs->sg, vs->cnt, |
|
1988 |
vs->off); |
|
1989 |
if (vs->len > 0) { |
|
1990 |
vs->off += vs->len; |
|
1991 |
} |
|
1993 | 1992 |
} while (vs->len == -1 && errno == EINTR); |
1994 | 1993 |
if (vs->len == -1) { |
1995 | 1994 |
err = -errno; |
1996 | 1995 |
} |
1997 |
v9fs_read_post_readv(s, vs, err); |
|
1996 |
v9fs_read_post_preadv(s, vs, err);
|
|
1998 | 1997 |
return; |
1999 | 1998 |
} |
2000 | 1999 |
vs->offset += pdu_marshal(vs->pdu, vs->offset, "d", vs->total); |
... | ... | |
2006 | 2005 |
qemu_free(vs); |
2007 | 2006 |
} |
2008 | 2007 |
|
2009 |
static void v9fs_read_post_lseek(V9fsState *s, V9fsReadState *vs, ssize_t err) |
|
2010 |
{ |
|
2011 |
if (err == -1) { |
|
2012 |
err = -errno; |
|
2013 |
goto out; |
|
2014 |
} |
|
2015 |
vs->sg = cap_sg(vs->sg, vs->count, &vs->cnt); |
|
2016 |
|
|
2017 |
if (vs->total < vs->count) { |
|
2018 |
do { |
|
2019 |
if (0) { |
|
2020 |
print_sg(vs->sg, vs->cnt); |
|
2021 |
} |
|
2022 |
vs->len = v9fs_do_readv(s, vs->fidp->fs.fd, vs->sg, vs->cnt); |
|
2023 |
} while (vs->len == -1 && errno == EINTR); |
|
2024 |
if (vs->len == -1) { |
|
2025 |
err = -errno; |
|
2026 |
} |
|
2027 |
v9fs_read_post_readv(s, vs, err); |
|
2028 |
return; |
|
2029 |
} |
|
2030 |
out: |
|
2031 |
complete_pdu(s, vs->pdu, err); |
|
2032 |
qemu_free(vs); |
|
2033 |
} |
|
2034 |
|
|
2035 | 2008 |
static void v9fs_xattr_read(V9fsState *s, V9fsReadState *vs) |
2036 | 2009 |
{ |
2037 | 2010 |
ssize_t err = 0; |
... | ... | |
2089 | 2062 |
} else if (vs->fidp->fid_type == P9_FID_FILE) { |
2090 | 2063 |
vs->sg = vs->iov; |
2091 | 2064 |
pdu_marshal(vs->pdu, vs->offset + 4, "v", vs->sg, &vs->cnt); |
2092 |
err = v9fs_do_lseek(s, vs->fidp->fs.fd, vs->off, SEEK_SET); |
|
2093 |
v9fs_read_post_lseek(s, vs, err); |
|
2065 |
vs->sg = cap_sg(vs->sg, vs->count, &vs->cnt); |
|
2066 |
if (vs->total <= vs->count) { |
|
2067 |
vs->len = v9fs_do_preadv(s, vs->fidp->fs.fd, vs->sg, vs->cnt, |
|
2068 |
vs->off); |
|
2069 |
if (vs->len > 0) { |
|
2070 |
vs->off += vs->len; |
|
2071 |
} |
|
2072 |
err = vs->len; |
|
2073 |
v9fs_read_post_preadv(s, vs, err); |
|
2074 |
} |
|
2094 | 2075 |
return; |
2095 | 2076 |
} else if (vs->fidp->fid_type == P9_FID_XATTR) { |
2096 | 2077 |
v9fs_xattr_read(s, vs); |
... | ... | |
2224 | 2205 |
return; |
2225 | 2206 |
} |
2226 | 2207 |
|
2227 |
static void v9fs_write_post_writev(V9fsState *s, V9fsWriteState *vs, |
|
2208 |
static void v9fs_write_post_pwritev(V9fsState *s, V9fsWriteState *vs,
|
|
2228 | 2209 |
ssize_t err) |
2229 | 2210 |
{ |
2230 | 2211 |
if (err < 0) { |
... | ... | |
2239 | 2220 |
if (0) { |
2240 | 2221 |
print_sg(vs->sg, vs->cnt); |
2241 | 2222 |
} |
2242 |
vs->len = v9fs_do_writev(s, vs->fidp->fs.fd, vs->sg, vs->cnt); |
|
2223 |
vs->len = v9fs_do_pwritev(s, vs->fidp->fs.fd, vs->sg, vs->cnt, |
|
2224 |
vs->off); |
|
2225 |
if (vs->len > 0) { |
|
2226 |
vs->off += vs->len; |
|
2227 |
} |
|
2243 | 2228 |
} while (vs->len == -1 && errno == EINTR); |
2244 | 2229 |
if (vs->len == -1) { |
2245 | 2230 |
err = -errno; |
2246 | 2231 |
} |
2247 |
v9fs_write_post_writev(s, vs, err); |
|
2232 |
v9fs_write_post_pwritev(s, vs, err);
|
|
2248 | 2233 |
return; |
2249 | 2234 |
} |
2250 | 2235 |
vs->offset += pdu_marshal(vs->pdu, vs->offset, "d", vs->total); |
2251 |
|
|
2252 | 2236 |
err = vs->offset; |
2253 | 2237 |
out: |
2254 | 2238 |
complete_pdu(s, vs->pdu, err); |
2255 | 2239 |
qemu_free(vs); |
2256 | 2240 |
} |
2257 | 2241 |
|
2258 |
static void v9fs_write_post_lseek(V9fsState *s, V9fsWriteState *vs, ssize_t err) |
|
2259 |
{ |
|
2260 |
if (err == -1) { |
|
2261 |
err = -errno; |
|
2262 |
goto out; |
|
2263 |
} |
|
2264 |
vs->sg = cap_sg(vs->sg, vs->count, &vs->cnt); |
|
2265 |
|
|
2266 |
if (vs->total < vs->count) { |
|
2267 |
do { |
|
2268 |
if (0) { |
|
2269 |
print_sg(vs->sg, vs->cnt); |
|
2270 |
} |
|
2271 |
vs->len = v9fs_do_writev(s, vs->fidp->fs.fd, vs->sg, vs->cnt); |
|
2272 |
} while (vs->len == -1 && errno == EINTR); |
|
2273 |
if (vs->len == -1) { |
|
2274 |
err = -errno; |
|
2275 |
} |
|
2276 |
v9fs_write_post_writev(s, vs, err); |
|
2277 |
return; |
|
2278 |
} |
|
2279 |
|
|
2280 |
out: |
|
2281 |
complete_pdu(s, vs->pdu, err); |
|
2282 |
qemu_free(vs); |
|
2283 |
} |
|
2284 |
|
|
2285 | 2242 |
static void v9fs_xattr_write(V9fsState *s, V9fsWriteState *vs) |
2286 | 2243 |
{ |
2287 | 2244 |
int i, to_copy; |
... | ... | |
2362 | 2319 |
err = -EINVAL; |
2363 | 2320 |
goto out; |
2364 | 2321 |
} |
2365 |
err = v9fs_do_lseek(s, vs->fidp->fs.fd, vs->off, SEEK_SET); |
|
2366 |
|
|
2367 |
v9fs_write_post_lseek(s, vs, err); |
|
2322 |
vs->sg = cap_sg(vs->sg, vs->count, &vs->cnt); |
|
2323 |
if (vs->total <= vs->count) { |
|
2324 |
vs->len = v9fs_do_pwritev(s, vs->fidp->fs.fd, vs->sg, vs->cnt, vs->off); |
|
2325 |
if (vs->len > 0) { |
|
2326 |
vs->off += vs->len; |
|
2327 |
} |
|
2328 |
err = vs->len; |
|
2329 |
v9fs_write_post_pwritev(s, vs, err); |
|
2330 |
} |
|
2368 | 2331 |
return; |
2369 |
|
|
2370 | 2332 |
out: |
2371 | 2333 |
complete_pdu(s, vs->pdu, err); |
2372 | 2334 |
qemu_free(vs); |
Also available in: Unified diff