mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-12-23 21:40:20 +00:00
772d1dfa77
v0.3.0 adds support for rbd.FeatureSet that can be used to parse the features of an RBD image. This will be used in the followup commit that adds rbdVolume.getImageInfo(). Signed-off-by: Niels de Vos <ndevos@redhat.com>
177 lines
5.7 KiB
Go
177 lines
5.7 KiB
Go
package rbd
|
|
|
|
// #cgo LDFLAGS: -lrbd
|
|
// #include <rbd/librbd.h>
|
|
import "C"
|
|
|
|
const (
|
|
// RBD features, bit values
|
|
|
|
// FeatureLayering is the representation of RBD_FEATURE_LAYERING from
|
|
// librbd
|
|
FeatureLayering = uint64(C.RBD_FEATURE_LAYERING)
|
|
|
|
// FeatureStripingV2 is the representation of RBD_FEATURE_STRIPINGV2
|
|
// from librbd
|
|
FeatureStripingV2 = uint64(C.RBD_FEATURE_STRIPINGV2)
|
|
|
|
// FeatureExclusiveLock is the representation of
|
|
// RBD_FEATURE_EXCLUSIVE_LOCK from librbd
|
|
FeatureExclusiveLock = uint64(C.RBD_FEATURE_EXCLUSIVE_LOCK)
|
|
|
|
// FeatureObjectMap is the representation of RBD_FEATURE_OBJECT_MAP
|
|
// from librbd
|
|
FeatureObjectMap = uint64(C.RBD_FEATURE_OBJECT_MAP)
|
|
|
|
// FeatureFastDiff is the representation of RBD_FEATURE_FAST_DIFF from
|
|
// librbd
|
|
FeatureFastDiff = uint64(C.RBD_FEATURE_FAST_DIFF)
|
|
|
|
// FeatureDeepFlatten is the representation of RBD_FEATURE_DEEP_FLATTEN
|
|
// from librbd
|
|
FeatureDeepFlatten = uint64(C.RBD_FEATURE_DEEP_FLATTEN)
|
|
|
|
// FeatureJournaling is the representation of RBD_FEATURE_JOURNALING
|
|
// from librbd
|
|
FeatureJournaling = uint64(C.RBD_FEATURE_JOURNALING)
|
|
|
|
// FeatureDataPool is the representation of RBD_FEATURE_DATA_POOL from
|
|
// librbd
|
|
FeatureDataPool = uint64(C.RBD_FEATURE_DATA_POOL)
|
|
|
|
// RBD features, strings
|
|
|
|
// FeatureNameLayering is the representation of
|
|
// RBD_FEATURE_NAME_LAYERING from librbd
|
|
FeatureNameLayering = C.RBD_FEATURE_NAME_LAYERING
|
|
|
|
// FeatureNameStripingV2 is the representation of
|
|
// RBD_FEATURE_NAME_STRIPINGV2 from librbd
|
|
FeatureNameStripingV2 = C.RBD_FEATURE_NAME_STRIPINGV2
|
|
|
|
// FeatureNameExclusiveLock is the representation of
|
|
// RBD_FEATURE_NAME_EXCLUSIVE_LOCK from librbd
|
|
FeatureNameExclusiveLock = C.RBD_FEATURE_NAME_EXCLUSIVE_LOCK
|
|
|
|
// FeatureNameObjectMap is the representation of
|
|
// RBD_FEATURE_NAME_OBJECT_MAP from librbd
|
|
FeatureNameObjectMap = C.RBD_FEATURE_NAME_OBJECT_MAP
|
|
|
|
// FeatureNameFastDiff is the representation of
|
|
// RBD_FEATURE_NAME_FAST_DIFF from librbd
|
|
FeatureNameFastDiff = C.RBD_FEATURE_NAME_FAST_DIFF
|
|
|
|
// FeatureNameDeepFlatten is the representation of
|
|
// RBD_FEATURE_NAME_DEEP_FLATTEN from librbd
|
|
FeatureNameDeepFlatten = C.RBD_FEATURE_NAME_DEEP_FLATTEN
|
|
|
|
// FeatureNameJournaling is the representation of
|
|
// RBD_FEATURE_NAME_JOURNALING from librbd
|
|
FeatureNameJournaling = C.RBD_FEATURE_NAME_JOURNALING
|
|
|
|
// FeatureNameDataPool is the representation of
|
|
// RBD_FEATURE_NAME_DATA_POOL from librbd
|
|
FeatureNameDataPool = C.RBD_FEATURE_NAME_DATA_POOL
|
|
|
|
// old names for backwards compatibility (unused?)
|
|
|
|
// RbdFeatureLayering deprecated alias for FeatureLayering
|
|
RbdFeatureLayering = FeatureLayering
|
|
// RbdFeatureStripingV2 deprecated alias for FeatureStripingV2
|
|
RbdFeatureStripingV2 = FeatureStripingV2
|
|
// RbdFeatureExclusiveLock deprecated alias for FeatureExclusiveLock
|
|
RbdFeatureExclusiveLock = FeatureExclusiveLock
|
|
// RbdFeatureObjectMap deprecated alias for FeatureObjectMap
|
|
RbdFeatureObjectMap = FeatureObjectMap
|
|
// RbdFeatureFastDiff deprecated alias for FeatureFastDiff
|
|
RbdFeatureFastDiff = FeatureFastDiff
|
|
// RbdFeatureDeepFlatten deprecated alias for FeatureDeepFlatten
|
|
RbdFeatureDeepFlatten = FeatureDeepFlatten
|
|
// RbdFeatureJournaling deprecated alias for FeatureJournaling
|
|
RbdFeatureJournaling = FeatureJournaling
|
|
// RbdFeatureDataPool deprecated alias for FeatureDataPool
|
|
RbdFeatureDataPool = FeatureDataPool
|
|
|
|
// revive:disable:exported Maybe unused
|
|
// the following are probably really unused?
|
|
RbdFeaturesDefault = uint64(C.RBD_FEATURES_DEFAULT)
|
|
RbdFeaturesIncompatible = uint64(C.RBD_FEATURES_INCOMPATIBLE)
|
|
RbdFeaturesRwIncompatible = uint64(C.RBD_FEATURES_RW_INCOMPATIBLE)
|
|
RbdFeaturesMutable = uint64(C.RBD_FEATURES_MUTABLE)
|
|
RbdFeaturesSingleClient = uint64(C.RBD_FEATURES_SINGLE_CLIENT)
|
|
// revive:enable:exported
|
|
)
|
|
|
|
// FeatureSet is a combination of the bit value for multiple featurs.
|
|
type FeatureSet uint64
|
|
|
|
var (
|
|
featureNameToBit = map[string]uint64{
|
|
FeatureNameLayering: FeatureLayering,
|
|
FeatureNameStripingV2: FeatureStripingV2,
|
|
FeatureNameExclusiveLock: FeatureExclusiveLock,
|
|
FeatureNameObjectMap: FeatureObjectMap,
|
|
FeatureNameFastDiff: FeatureFastDiff,
|
|
FeatureNameDeepFlatten: FeatureDeepFlatten,
|
|
FeatureNameJournaling: FeatureJournaling,
|
|
FeatureNameDataPool: FeatureDataPool,
|
|
}
|
|
)
|
|
|
|
// FeatureSetFromNames returns a FeatureSet built from flag bits corresponding
|
|
// to the provided feature names.
|
|
func FeatureSetFromNames(names []string) FeatureSet {
|
|
var fs uint64
|
|
for _, name := range names {
|
|
fs |= featureNameToBit[name]
|
|
}
|
|
return FeatureSet(fs)
|
|
}
|
|
|
|
// Names converts all of the enabled feature bits in the FeatureSet to
|
|
// a slice of strings corresponding to the names for each feature.
|
|
func (fs *FeatureSet) Names() []string {
|
|
names := []string{}
|
|
|
|
for name, bit := range featureNameToBit {
|
|
if (uint64(*fs) & bit) == bit {
|
|
names = append(names, name)
|
|
}
|
|
}
|
|
|
|
return names
|
|
}
|
|
|
|
// GetFeatures returns the features bitmask for the rbd image.
|
|
//
|
|
// Implements:
|
|
// int rbd_get_features(rbd_image_t image, uint64_t *features);
|
|
func (image *Image) GetFeatures() (features uint64, err error) {
|
|
if err := image.validate(imageIsOpen); err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
if ret := C.rbd_get_features(image.image, (*C.uint64_t)(&features)); ret < 0 {
|
|
return 0, RBDError(ret)
|
|
}
|
|
|
|
return features, nil
|
|
}
|
|
|
|
// UpdateFeatures updates the features on the Image.
|
|
//
|
|
// Implements:
|
|
// int rbd_update_features(rbd_image_t image, uint64_t features,
|
|
// uint8_t enabled);
|
|
func (image *Image) UpdateFeatures(features uint64, enabled bool) error {
|
|
if image.image == nil {
|
|
return RbdErrorImageNotOpen
|
|
}
|
|
|
|
cEnabled := C.uint8_t(0)
|
|
if enabled {
|
|
cEnabled = 1
|
|
}
|
|
return getError(C.rbd_update_features(image.image, C.uint64_t(features), cEnabled))
|
|
}
|