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);
|