[Libguestfs] [libnbd PATCH v4 06/25] generator: Support Extent64 arg in Go code
Richard W.M. Jones
rjones at redhat.com
Fri Aug 4 09:17:57 UTC 2023
On Wed, Aug 02, 2023 at 08:50:26PM -0500, Eric Blake wrote:
> See the earlier commit "Add Extent64 arg type" for rationale in
> supporting a new generator arg type. This patch adds the Go bindings
> for use of Extent64, which required adding a counterpart Go type and
> introducing a helper function for copying from the C array to an
> actual Go object, very similar to the existing copy_uint32_array
> helper for 32-bit extents.
>
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>
> v4: split out of larger patch [Laszlo], avoid awkward slice since we
> can't use copy() anyway [Laszlo]
> ---
> generator/GoLang.ml | 23 +++++++++++++++++++++++
> golang/handle.go | 6 ++++++
> 2 files changed, 29 insertions(+)
>
> diff --git a/generator/GoLang.ml b/generator/GoLang.ml
> index cc7d78b6..7a516366 100644
> --- a/generator/GoLang.ml
> +++ b/generator/GoLang.ml
> @@ -528,6 +528,21 @@ let
> }
> return ret
> }
> +
> +func copy_extent_array(entries *C.nbd_extent, count C.size_t) []LibnbdExtent {
> + if (uint64(count) > 64*1024*1024) {
> + panic(\"violation of state machine guarantee\")
> + }
Same comment about the internal error as for previous commit.
> + ret := make([]LibnbdExtent, count)
> + addr := uintptr(unsafe.Pointer(entries))
> + for i := 0; i < int(count); i++ {
> + ptr := (*C.nbd_extent)(unsafe.Pointer(addr))
> + ret[i].Length = uint64((*ptr).length)
> + ret[i].Flags = uint64((*ptr).flags)
> + addr += unsafe.Sizeof(*ptr)
> + }
> + return ret
> +}
> ";
>
> List.iter (
> @@ -542,6 +557,8 @@ let
> match cbarg with
> | CBArrayAndLen (UInt32 n, _) ->
> pr "%s []uint32" n;
> + | CBArrayAndLen (Extent64 n, _) ->
> + pr "%s []LibnbdExtent" n;
> | CBBytesIn (n, len) ->
> pr "%s []byte" n;
> | CBInt n ->
> @@ -568,6 +585,8 @@ let
> match cbarg with
> | CBArrayAndLen (UInt32 n, count) ->
> pr "%s *C.uint32_t, %s C.size_t" n count
> + | CBArrayAndLen (Extent64 n, count) ->
> + pr "%s *C.nbd_extent, %s C.size_t" n count
> | CBBytesIn (n, len) ->
> pr "%s unsafe.Pointer, %s C.size_t" n len
> | CBInt n ->
> @@ -610,6 +629,8 @@ let
> match cbarg with
> | CBArrayAndLen (UInt32 n, count) ->
> pr "copy_uint32_array(%s, %s)" n count
> + | CBArrayAndLen (Extent64 n, count) ->
> + pr "copy_extent_array(%s, %s)" n count
> | CBBytesIn (n, len) ->
> pr "C.GoBytes(%s, C.int(%s))" n len
> | CBInt n ->
> @@ -760,6 +781,8 @@ let
> match cbarg with
> | CBArrayAndLen (UInt32 n, count) ->
> pr "uint32_t *%s, size_t %s" n count
> + | CBArrayAndLen (Extent64 n, count) ->
> + pr "nbd_extent *%s, size_t %s" n count
> | CBBytesIn (n, len) ->
> pr "void *%s, size_t %s" n len
> | CBInt n ->
> diff --git a/golang/handle.go b/golang/handle.go
> index 5fe4ed4f..2b0ee6d5 100644
> --- a/golang/handle.go
> +++ b/golang/handle.go
> @@ -58,6 +58,12 @@ func (h *Libnbd) String() string {
> return "&Libnbd{}"
> }
>
> +/* Used for block status callback. */
> +type LibnbdExtent struct {
> + Length uint64 // length of the extent
> + Flags uint64 // flags describing properties of the extent
> +}
> +
> /* All functions (except Close) return ([result,] LibnbdError). */
> type LibnbdError struct {
> Op string // operation which failed
> --
Reviewed-by: Richard W.M. Jones <rjones at redhat.com>
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages. http://libguestfs.org
More information about the Libguestfs
mailing list