vnop_lockctl 入口点

用途

设置,检查和查询记录锁定。

语法

int vnop_lockctl (vp, offset, lckdat, cmd, retry_fn, retry_id, crp)
struct vnode * vp;
offset_t  offset;
struct eflock * lckdat;
int  cmd;
int (* retry_fn)();
caddr_t  retry_id;
struct ucred * crp;

参数

描述
VP 指向该文件的虚拟节点 (v 节点)。
偏移量 指示与打开的文件结构的文件偏移量。 此参数用于确定锁定区域的起始位置。
勒克达特 点至 埃洛克 结构。 此结构描述要执行的锁定操作。
cmd 标识要执行 vnop_lockctl 入口点的锁定操作的类型。 它是一个采用以下锁定控制值的位掩码:
SETFLCK
如果已设置,那么执行锁定集或清除。 如果清除,将返回锁定信息。 该l_type埃夫洛克 结构中的字段指示是设置还是清除锁定。
SLPFLCK
如果该锁定立即不可用,请等待。 仅当设置了 SETFLCK 标志时,此标志才有效。
重试_fn 指向在重试锁定时被调用的子例程。 如果立即授予锁定,那么不使用此子例程。
注: 如果 retry_fn 参数不是空值,那么不管 SLPFLCK 标志如何, vnop_lockctl 入口点都将不会休眠。
重试标识 指向可以用于存储值的位置。 此值可用于将重试操作与特定锁定或一组锁定关联起来。 仅将重试值与 retry_fn 参数一起使用。
注: 此值是不透明值,调用者不应将其用于除锁定关联以外的任何其他用途。 (不应该将此值用作指针。)
茨尔普 点至 克雷德 结构。 此结构包含文件系统可用来验证访问许可权的数据。

描述

vnop_lockctl 入口点用于请求锁定记录。 此入口点使用 埃夫洛克 结构中的信息来实现记录锁定。

如果请求的锁定被现有锁定阻止,那么 vnop_lockctl 入口点应使用存储在该入口点中的重试子例程地址 (由 retry_fn 参数指定) 来建立休眠锁定。 然后, vnop_lockctl 入口点返回关联标识值给调用者 (在 重试标识 参数中) ,并返回出口值 EAGAIN。 稍后唤醒休眠锁定时,将以 重试标识 参数作为其参数来调用 retry 子例程。

Eflock 结构

eflock 结构在 /usr/include/sys/flock.h 文件中定义,并包含以下字段:

字段 描述
l_type 指定锁定类型。 此字段采用以下值:
F_REDLCK
指示读锁定。
F_WRLCK
指示写锁定。
F_UNLCK
指示解锁此记录。 如果 F_UNLCK 的值从 0 开始直到 0,长度为 0,则表示解锁该文件上的所有锁。 当文件关闭时,自动完成解锁。
l_whence 指定以下位置:l_start字段偏移量。
l_start 指定从以下位置的偏移量:l_whence
l_len 指定记录长度。 如果此字段为 0 ,那么指定文件的剩余部分。
l_vfs 包含该文件的 指定虚拟文件系统
l_sysid 指定唯一地标识给定虚拟文件系统的主机的值。 在调用 vnop_lockctl 入口点之前,必须填充此字段。
l_pid 指定锁定所有者的进程标识 (PID)。 在调用 vnop_lockctl 入口点之前,必须填充此字段。

执行环境

vnop_lockctl 入口点只能从 流程环境 中调用。

返回值

描述
重大安全事件数量 指示成功。

/usr/include/sys/errno.h 文件返回非零返回值以指示失败。 有效值包括:

描述
EAGAIN 指示存在阻塞锁,并且调用者未使用 SLPFLCK 标志来请求操作休眠。
ERRNO 返回失败时 /usr/include/sys/errno.h 文件中的错误号。