diff --git a/rbd/features.go b/rbd/features.go new file mode 100644 index 0000000..ed9edda --- /dev/null +++ b/rbd/features.go @@ -0,0 +1,108 @@ +package rbd + +// #cgo LDFLAGS: -lrbd +// #include +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 = FeatureLayering + RbdFeatureStripingV2 = FeatureStripingV2 + RbdFeatureExclusiveLock = FeatureExclusiveLock + RbdFeatureObjectMap = FeatureObjectMap + RbdFeatureFastDiff = FeatureFastDiff + RbdFeatureDeepFlatten = FeatureDeepFlatten + RbdFeatureJournaling = FeatureJournaling + RbdFeatureDataPool = FeatureDataPool + + // 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) +) + +// 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 +} diff --git a/rbd/rbd.go b/rbd/rbd.go index ad6bf07..948f232 100644 --- a/rbd/rbd.go +++ b/rbd/rbd.go @@ -8,7 +8,6 @@ package rbd // #include // #include // #include -// #include import "C" import ( @@ -24,31 +23,6 @@ import ( ) const ( - // RBD features. - RbdFeatureLayering = uint64(C.RBD_FEATURE_LAYERING) - RbdFeatureStripingV2 = uint64(C.RBD_FEATURE_STRIPINGV2) - RbdFeatureExclusiveLock = uint64(C.RBD_FEATURE_EXCLUSIVE_LOCK) - RbdFeatureObjectMap = uint64(C.RBD_FEATURE_OBJECT_MAP) - RbdFeatureFastDiff = uint64(C.RBD_FEATURE_FAST_DIFF) - RbdFeatureDeepFlatten = uint64(C.RBD_FEATURE_DEEP_FLATTEN) - RbdFeatureJournaling = uint64(C.RBD_FEATURE_JOURNALING) - RbdFeatureDataPool = uint64(C.RBD_FEATURE_DATA_POOL) - - RbdFeaturesDefault = uint64(C.RBD_FEATURES_DEFAULT) - - // Features that make an image inaccessible for read or write by clients that don't understand - // them. - RbdFeaturesIncompatible = uint64(C.RBD_FEATURES_INCOMPATIBLE) - - // Features that make an image unwritable by clients that don't understand them. - RbdFeaturesRwIncompatible = uint64(C.RBD_FEATURES_RW_INCOMPATIBLE) - - // Features that may be dynamically enabled or disabled. - RbdFeaturesMutable = uint64(C.RBD_FEATURES_MUTABLE) - - // Features that only work when used with a single client using the image for writes. - RbdFeaturesSingleClient = uint64(C.RBD_FEATURES_SINGLE_CLIENT) - // Image.Seek() constants SeekSet = int(C.SEEK_SET) SeekCur = int(C.SEEK_CUR) @@ -523,22 +497,6 @@ func (image *Image) GetSize() (size uint64, err error) { return size, nil } -// 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 -} - // GetStripeUnit returns the stripe-unit value for the rbd image. // // Implements: diff --git a/rbd/rbd_test.go b/rbd/rbd_test.go index ddef39d..7a97814 100644 --- a/rbd/rbd_test.go +++ b/rbd/rbd_test.go @@ -82,14 +82,14 @@ func TestImageCreate(t *testing.T) { name = GetUUID() image, err = Create(ioctx, name, testImageSize, testImageOrder, - RbdFeatureLayering|RbdFeatureStripingV2) + FeatureLayering|FeatureStripingV2) assert.NoError(t, err) err = image.Remove() assert.NoError(t, err) name = GetUUID() image, err = Create(ioctx, name, testImageSize, testImageOrder, - RbdFeatureLayering|RbdFeatureStripingV2, 4096, 2) + FeatureLayering|FeatureStripingV2, 4096, 2) assert.NoError(t, err) err = image.Remove() assert.NoError(t, err) @@ -101,7 +101,7 @@ func TestImageCreate(t *testing.T) { // too many arguments _, err = Create(ioctx, name, testImageSize, testImageOrder, - RbdFeatureLayering|RbdFeatureStripingV2, 4096, 2, 123) + FeatureLayering|FeatureStripingV2, 4096, 2, 123) assert.Error(t, err) ioctx.Destroy() @@ -121,7 +121,7 @@ func TestImageCreate2(t *testing.T) { name := GetUUID() image, err := Create2(ioctx, name, testImageSize, - RbdFeatureLayering|RbdFeatureStripingV2, testImageOrder) + FeatureLayering|FeatureStripingV2, testImageOrder) assert.NoError(t, err) err = image.Remove() assert.NoError(t, err) @@ -143,7 +143,7 @@ func TestImageCreate3(t *testing.T) { name := GetUUID() image, err := Create3(ioctx, name, testImageSize, - RbdFeatureLayering|RbdFeatureStripingV2, testImageOrder, 4096, 2) + FeatureLayering|FeatureStripingV2, testImageOrder, 4096, 2) assert.NoError(t, err) err = image.Remove() assert.NoError(t, err) @@ -343,7 +343,7 @@ func TestImageProperties(t *testing.T) { name := GetUUID() reqSize := uint64(1024 * 1024 * 4) // 4MB _, err = Create3(ioctx, name, reqSize, - RbdFeatureLayering|RbdFeatureStripingV2, testImageOrder, 4096, 2) + FeatureLayering|FeatureStripingV2, testImageOrder, 4096, 2) require.NoError(t, err) img, err := OpenImage(ioctx, name, NoSnapshot) @@ -360,8 +360,8 @@ func TestImageProperties(t *testing.T) { features, err := img.GetFeatures() assert.NoError(t, err) // compare features with the two requested ones - assert.Equal(t, features&(RbdFeatureLayering|RbdFeatureStripingV2), - RbdFeatureLayering|RbdFeatureStripingV2) + assert.Equal(t, features&(FeatureLayering|FeatureStripingV2), + FeatureLayering|FeatureStripingV2) stripeUnit, err := img.GetStripeUnit() assert.NoError(t, err)