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 | 定义内核服务执行的操作的类型。 此参数是由以下位组成的位掩码:
当 命令 参数设置为 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 | 指示错误。 请参阅 弗纳特尔 系统调用以获取可能的值的列表。 |