ceph-csi/vendor/github.com/ceph/go-ceph/rbd/encryption_load2.go
Rakshith R 796e6b6c44 rbd: use ListChildrenAttributes() instead of ListChildren()
This commit modifies listSnapAndChildren() to make use of
ListChildrenAttributes() instead of ListChildren() which
allows us to filter out images in trash.
This commit also order the alive images so that temp clone
images are followed by images backing volume snapshots so
that temp clone images are flattened first.

Signed-off-by: Rakshith R <rar@redhat.com>
2025-03-12 08:51:02 +00:00

103 lines
3.1 KiB
Go

//go:build !octopus && !pacific && !quincy && ceph_preview
package rbd
// #cgo LDFLAGS: -lrbd
// /* force XSI-complaint strerror_r() */
// #define _POSIX_C_SOURCE 200112L
// #undef _GNU_SOURCE
// #include <stdlib.h>
// #include <errno.h>
// #include <rbd/librbd.h>
import "C"
import (
"unsafe"
)
type encryptionOptions2 interface {
EncryptionOptions
writeEncryptionSpec(spec *C.rbd_encryption_spec_t) func()
}
func (opts EncryptionOptionsLUKS1) writeEncryptionSpec(spec *C.rbd_encryption_spec_t) func() {
/* only C memory should be attached to spec */
cPassphrase := (*C.char)(C.CBytes(opts.Passphrase))
cOptsSize := C.size_t(C.sizeof_rbd_encryption_luks1_format_options_t)
cOpts := (*C.rbd_encryption_luks1_format_options_t)(C.malloc(cOptsSize))
cOpts.alg = C.rbd_encryption_algorithm_t(opts.Alg)
cOpts.passphrase = cPassphrase
cOpts.passphrase_size = C.size_t(len(opts.Passphrase))
spec.format = C.RBD_ENCRYPTION_FORMAT_LUKS1
spec.opts = C.rbd_encryption_options_t(cOpts)
spec.opts_size = cOptsSize
return func() {
C.free(unsafe.Pointer(cOpts.passphrase))
C.free(unsafe.Pointer(cOpts))
}
}
func (opts EncryptionOptionsLUKS2) writeEncryptionSpec(spec *C.rbd_encryption_spec_t) func() {
/* only C memory should be attached to spec */
cPassphrase := (*C.char)(C.CBytes(opts.Passphrase))
cOptsSize := C.size_t(C.sizeof_rbd_encryption_luks2_format_options_t)
cOpts := (*C.rbd_encryption_luks2_format_options_t)(C.malloc(cOptsSize))
cOpts.alg = C.rbd_encryption_algorithm_t(opts.Alg)
cOpts.passphrase = cPassphrase
cOpts.passphrase_size = C.size_t(len(opts.Passphrase))
spec.format = C.RBD_ENCRYPTION_FORMAT_LUKS2
spec.opts = C.rbd_encryption_options_t(cOpts)
spec.opts_size = cOptsSize
return func() {
C.free(unsafe.Pointer(cOpts.passphrase))
C.free(unsafe.Pointer(cOpts))
}
}
// EncryptionLoad2 enables IO on an open encrypted image. Multiple encryption
// option values can be passed to this call in a slice. For more information
// about how items in the slice are applied to images, and possibly ancestor
// images refer to the documentation in the C api for rbd_encryption_load2.
//
// Implements:
//
// int rbd_encryption_load2(rbd_image_t image,
// const rbd_encryption_spec_t *specs,
// size_t spec_count);
func (image *Image) EncryptionLoad2(opts []EncryptionOptions) error {
if image.image == nil {
return ErrImageNotOpen
}
for _, o := range opts {
if _, ok := o.(encryptionOptions2); !ok {
// this should not happen unless someone adds a new type
// implementing EncryptionOptions but fails to add a
// writeEncryptionSpec such that the type is not also implementing
// encryptionOptions2.
return getError(C.EINVAL)
}
}
length := len(opts)
cspecs := make([]C.rbd_encryption_spec_t, length)
freeFuncs := make([]func(), length)
for idx, option := range opts {
f := option.(encryptionOptions2).writeEncryptionSpec(&cspecs[idx])
freeFuncs[idx] = f
}
defer func() {
for _, f := range freeFuncs {
f()
}
}()
ret := C.rbd_encryption_load2(
image.image,
(*C.rbd_encryption_spec_t)(unsafe.Pointer(&cspecs[0])),
C.size_t(length))
return getError(ret)
}