diff options
author | Anthony Liguori <aliguori@us.ibm.com> | 2010-04-29 17:44:50 +0530 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2010-05-03 12:17:38 -0500 |
commit | 1f5a89bf68193012df13dd3eb188783367e489d5 (patch) | |
tree | 4a28541d67772720a71b18d074c4ab3d465d0362 /hw/virtio-9p.c | |
parent | bb9e3216bf32032a08a6f48799991f05203fa54b (diff) |
virtio-9p: Add sg helper functions
Add scatter-gather helper functions.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw/virtio-9p.c')
-rw-r--r-- | hw/virtio-9p.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c index b37cdf2605..c31f48c36e 100644 --- a/hw/virtio-9p.c +++ b/hw/virtio-9p.c @@ -762,6 +762,56 @@ static int stat_to_v9stat(V9fsState *s, V9fsString *name, return 0; } +static struct iovec *adjust_sg(struct iovec *sg, int len, int *iovcnt) +{ + while (len && *iovcnt) { + if (len < sg->iov_len) { + sg->iov_len -= len; + sg->iov_base += len; + len = 0; + } else { + len -= sg->iov_len; + sg++; + *iovcnt -= 1; + } + } + + return sg; +} + +static struct iovec *cap_sg(struct iovec *sg, int cap, int *cnt) +{ + int i; + int total = 0; + + for (i = 0; i < *cnt; i++) { + if ((total + sg[i].iov_len) > cap) { + sg[i].iov_len -= ((total + sg[i].iov_len) - cap); + i++; + break; + } + total += sg[i].iov_len; + } + + *cnt = i; + + return sg; +} + +static void print_sg(struct iovec *sg, int cnt) +{ + int i; + + printf("sg[%d]: {", cnt); + for (i = 0; i < cnt; i++) { + if (i) { + printf(", "); + } + printf("(%p, %zd)", sg[i].iov_base, sg[i].iov_len); + } + printf("}\n"); +} + static void v9fs_dummy(V9fsState *s, V9fsPDU *pdu) { /* Note: The following have been added to prevent GCC from complaining @@ -786,6 +836,9 @@ static void v9fs_dummy(V9fsState *s, V9fsPDU *pdu) (void) donttouch_stat; (void) v9fs_stat_free; (void) stat_to_v9stat; + (void) adjust_sg; + (void) cap_sg; + (void) print_sg; } static void v9fs_version(V9fsState *s, V9fsPDU *pdu) |