我正在尝试为 LVM 实现自定义锁定库。将 lvm.conf 中的locking_type 设置为external (2) 并提供一个实现所需功能的共享库,理论上似乎已经足够且相对简单。
对此,我从 LVM2 的源代码开始研究,特别是外部锁定机制实现,可以在此处找到。
基本上,我发现我需要做的是使用如下描述的标头实现函数:
static void (*_reset_fn) (void) = NULL;
static void (*_end_fn) (void) = NULL;
static int (*_lock_fn) (struct cmd_context * cmd, const char *resource, uint32_t flags) = NULL;
static int (*_init_fn) (int type, struct dm_config_tree * cft, uint32_t *flags) = NULL;
static int (*_lock_query_fn) (const char *resource, int *mode) = NULL;
现在,到目前为止,一切都很顺利。但是,查看 _lock_fn 定义,它需要一个指向struct cmd_context
作为第一个参数的指针。可以在 LVM2 源代码中轻松找到该结构(它是一个相当复杂的源!),但它不在包作为 API 公开的标头中(例如 RHEL7 中的 lvm2-devel 包)。正如我想象的那样(我绝对不是最好的 C 程序员),因为该结构应该由外部库使用,所以它必须位于标头中。
我认为这是错误的还是只是一个“错误”,我应该与 LVM2 开发人员讨论?除了将该结构和它依赖的所有其他类型复制/粘贴到我的项目中的头文件之外,是否有任何解决方法?做这个“解决方法”,它是否以任何方式破坏了 GNU GPL 许可证?