common_reclock 内核服务

用途

实现到记录锁定功能的通用接口。

语法

#include <sys/types.h>
#include <sys/flock.h>
common_reclock( gp, size, offset, 
lckdat, cmd, retray_fcn, retry_id, lock_fcn, 
rele_fcn)
struct gnode *gp;
offset_t size;
offset_t offset;
struct eflock *lckdat;
int cmd;
int (*retry_fcn)();
ulong *retry_id;
int (*lock_fcn)();
int (*rele_fcn)();

参数

描述
Gp 指向用于表示要锁定的文件的 gnode。
大小 标识文件的当前大小 (以字节为单位)。
偏移量 指定当前文件偏移量。 系统使用 偏移 参数来确定要开始锁定区域的位置。
勒克达特 指向用于描述要执行的锁定操作的 埃夫洛克 结构。
cmd 定义内核服务执行的操作的类型。 此参数是由以下位组成的位掩码:
SETFLCK
如果已设置,那么系统将设置或清除锁定。 如果未设置,那么将返回锁定信息。
SLPFLCK
如果无法立即授予锁定,那么请等待。 仅当设置了 SETFLCK 标志时,此标志才有效。
INOFLCK
调用者正在对由 gnode 引用的对象持有锁定。 重时钟 内核服务在休眠前调用释放函数,并在休眠返回时调用锁定函数。

命令 参数设置为 SLPFLCK时,它指示如果无法立即授予锁定,那么服务应等待该锁定。 如果 retry_fcn 参数包含有效指针,那么无论 SLPFLCK 标志如何, 重时钟 内核服务都不会处于休眠状态。

重试 指向一个重试功能。 当重试锁定时,将调用此函数。 如果立即授予锁定,那么将不使用重试功能。 当请求的锁定被现有锁定阻止时,将建立休眠锁定,并将重试功能地址存储在其中。 然后, 重时钟 内核服务会返回与调用例程相关的标识 (请参阅 重试标识 参数) ,并返回退出值 EAGAIN。 当休眠锁定被唤醒时,将使用关联标识作为其标识参数来调用重试函数。

如果此参数不为 NULL ,那么无论 SLPFLCK 命令标志如何, 重时钟 内核服务都不会处于休眠状态。

重试标识 指向用于存储关联标识的位置。 此标识用于将重试操作与特定锁定或一组锁定关联起来。 此参数仅与 retry 函数配合使用。 此位置中存储的值是不透明值。 调用者不应将此值用于除锁定关联以外的任何用途。
锁定 指向一个锁定功能。 此函数由 重时钟 内核服务调用以锁定调用者所使用的数据结构。 通常,这是包含要锁定的 gnode 的数据结构。 要将对要锁定的对象的访问序列化,此功能是必需的。 当 重时钟 内核服务调用 lock 函数时,会将来自 gnode 的专用数据指针作为其唯一参数传递给它。
释放 指向发行版功能。 此功能将释放使用锁定功能获取的锁定。 在调用 release 函数时,会将 gnode 中的专用数据指针作为其唯一参数传递。

描述

重时钟 例程实现了记录锁定功能的通用接口。 此服务允许分布式文件系统使用字节范围锁定功能。 当请求的锁定被现有锁定阻止时,内核服务执行以下操作:

  • 使用 结构中的重试功能来建立休眠锁定。 重试功能的地址是由 retry_fcn 参数指定的。
  • 将相关标识值与出口值 EAGAIN一起返回给调用者。 该标识存储在 重试标识 参数中。
  • 在休眠锁定稍后唤醒时调用重试函数,然后使用 重试标识 参数作为其自变量来调用重试函数。
    注: 在调用 重时钟 子例程前, 埃夫洛克 结构必须完全填充。 勒克达特 参数将指向 埃夫洛克 结构。

调用者可以在 gnode 指向的数据对象上持有序列化锁定。 但是,如果调用者期望对阻塞文件锁定进行休眠,并且持有对象锁定,那么调用者必须使用 lock_fcn 参数指定锁定函数,并使用 rele_fcn 参数指定释放函数。

该锁由 埃夫洛克 结构描述。 此结构由 勒克达特 参数进行标识。 如果是读锁定 (F_REDLCK) 或写锁定 (F_WRLCK ) 被设置 0 长度为 0 ,整个文件被锁定。 同样,如果解锁 (F_UNLCK ) 设置为从 0 开始,长度为 0,则该文件上的所有锁都已解锁。 此方法是在关闭文件时除去锁定的方式。

要允许 重时钟 内核服务更新每个 gnode 锁定列表,该服务在处理期间将获取 GN_RECLK_LOCK 锁定。

执行环境

重时钟 内核服务只能从进程环境中进行调用。

返回值

描述
重大安全事件数量 指示成功完成。
EAGAIN 指示由于阻塞锁定而无法授予锁定,并且调用者未请求该操作休眠。
ERRNO 指示错误。 请参阅 弗纳特尔 系统调用以获取可能的值的列表。