|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 3/4] xenguest: Allows writev_exact to change iov array
From: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>
Avoid having to allocate and copy the array if a partial write
happens.
The implementation in tools/libs/store/xs.c already use this
signature and method.
Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>
---
tools/libs/ctrl/xc_private.c | 26 +++++---------------------
tools/libs/ctrl/xc_private.h | 2 +-
2 files changed, 6 insertions(+), 22 deletions(-)
diff --git a/tools/libs/ctrl/xc_private.c b/tools/libs/ctrl/xc_private.c
index bb0f81d6f3..946fc307aa 100644
--- a/tools/libs/ctrl/xc_private.c
+++ b/tools/libs/ctrl/xc_private.c
@@ -635,7 +635,7 @@ int write_exact(int fd, const void *data, size_t size)
/*
* MiniOS's libc doesn't know about writev(). Implement it as multiple
write()s.
*/
-int writev_exact(int fd, const struct iovec *iov, int iovcnt)
+int writev_exact(int fd, struct iovec *iov, int iovcnt)
{
int rc, i;
@@ -649,9 +649,8 @@ int writev_exact(int fd, const struct iovec *iov, int
iovcnt)
return 0;
}
#else
-int writev_exact(int fd, const struct iovec *iov, int iovcnt)
+int writev_exact(int fd, struct iovec *iov, int iovcnt)
{
- struct iovec *local_iov = NULL;
int rc = 0, iov_idx = 0, saved_errno = 0;
ssize_t len;
@@ -686,23 +685,9 @@ int writev_exact(int fd, const struct iovec *iov, int
iovcnt)
len -= iov[iov_idx++].iov_len;
else
{
- /* Partial write of iov[iov_idx]. Copy iov so we can adjust
- * element iov_idx and resubmit the rest. */
- if ( !local_iov )
- {
- local_iov = malloc(iovcnt * sizeof(*iov));
- if ( !local_iov )
- {
- saved_errno = ENOMEM;
- rc = -1;
- goto out;
- }
-
- iov = memcpy(local_iov, iov, iovcnt * sizeof(*iov));
- }
-
- local_iov[iov_idx].iov_base += len;
- local_iov[iov_idx].iov_len -= len;
+ /* Partial write of iov[iov_idx]. */
+ iov[iov_idx].iov_base += len;
+ iov[iov_idx].iov_len -= len;
break;
}
}
@@ -711,7 +696,6 @@ int writev_exact(int fd, const struct iovec *iov, int
iovcnt)
saved_errno = 0;
out:
- free(local_iov);
errno = saved_errno;
return rc;
}
diff --git a/tools/libs/ctrl/xc_private.h b/tools/libs/ctrl/xc_private.h
index b5892ae8dc..3af996e900 100644
--- a/tools/libs/ctrl/xc_private.h
+++ b/tools/libs/ctrl/xc_private.h
@@ -383,7 +383,7 @@ int xc_flush_mmu_updates(xc_interface *xch, struct xc_mmu
*mmu);
/* Return 0 on success; -1 on error setting errno. */
int read_exact(int fd, void *data, size_t size); /* EOF => -1, errno=0 */
int write_exact(int fd, const void *data, size_t size);
-int writev_exact(int fd, const struct iovec *iov, int iovcnt);
+int writev_exact(int fd, struct iovec *iov, int iovcnt);
int xc_ffs8(uint8_t x);
int xc_ffs16(uint16_t x);
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |