doc/ja_JP.eucJP/man/man9/VOP_LOCK.9
Kazuo Horikawa e6b6091ef3 Catch up with 5.1-CURRENT-20030711-JPSNAP
Submitted by:	Akira Ikeuchi <a_ikeuchi@mic.mitsumi.co.jp>
2003-07-17 06:02:30 +00:00

177 lines
4.7 KiB
Groff

.\" -*- nroff -*-
.\"
.\" Copyright (c) 1996 Doug Rabson
.\"
.\" All rights reserved.
.\"
.\" This program is free software.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
.\" %FreeBSD: src/share/man/man9/VOP_LOCK.9,v 1.14 2003/05/31 14:07:25 hmp Exp %
.\"
.\" $FreeBSD$
.Dd July 24, 1996
.Os
.Dt VOP_LOCK 9
.Sh 名称
.Nm VOP_LOCK ,
.Nm VOP_UNLOCK ,
.Nm VOP_ISLOCKED ,
.Nm vn_lock
.Nd vnode アクセスの直列化
.Sh 書式
.In sys/param.h
.In sys/lock.h
.In sys/vnode.h
.Ft int
.Fn VOP_LOCK "struct vnode *vp" "int flags" "struct thread *td"
.Ft int
.Fn VOP_UNLOCK "struct vnode *vp" "int flags" "struct thread *td"
.Ft int
.Fn VOP_ISLOCKED "struct vnode *vp" "struct thread *td"
.Ft int
.Fn vn_lock "struct vnode *vp" "int flags" "struct thread *td"
.Sh 解説
これらの呼び出しは、
ファイルシステムへのアクセスを直列化するために使用されます。
例えば、同一ファイルに対する 2 つの書き込みが同時に発生することを
避けるために使用します。
.Pp
引数は以下の通りです。
.Bl -tag -width flags
.It Fa vp
ロックまたはロック解除される vnode。
.It Fa flags
以下のロック要求タイプのひとつ。
.Bl -column LK_EXCLUPGRADE -offset indent
.It Dv LK_SHARED Ta 共有ロック
.It Dv LK_EXCLUSIVE Ta 排他的ロック
.It Dv LK_UPGRADE Ta 共有から排他的へのアップグレード
.It Dv LK_EXCLUPGRADE Ta 最初の共有から排他的へのアップグレード
.It Dv LK_DOWNGRADE Ta 排他的から共有へのダウングレード
.It Dv LK_RELEASE Ta 全てのロックタイプの解除
.It Dv LK_DRAIN Ta ロック状態終了までの待機
.El
.Pp
ロックタイプは、以下のロックフラグと
.Em OR
されているかもしれません。
.Bl -column LK_CANRECURSE -offset indent
.It Dv LK_NOWAIT Ta ロックを待つために sleep しない
.It Dv LK_SLEEPFAIL Ta sleep して、失敗を返す
.It Dv LK_CANRECURSE Ta 再帰的排他的ロックを認める
.It Dv LK_REENABLE Ta ロック消失後再有効化されるべき
.It Dv LK_NOPAUSE Ta 空回りしない
.El
.Pp
ロックタイプは、以下の制御フラグと
.Em OR
されているかもしれません。
.Bl -column LK_INTERLOCK -offset indent
.It Dv LK_INTERLOCK Ta 呼び出し側が既に簡易ロックを保持している時に指定
(VOP_LOCK はロックを取得した後で簡易ロックを解除します)
.It Dv LK_RETRY Ta ロックされるまでリトライ
.It Dv LK_NOOBJ Ta オブジェクトを作成しない
.El
.It Fa td
ロックを使用するためのスレッドコンテキスト。
.El
.Pp
カーネルコードは vnode をロックするために
.Fn VOP_LOCK
を直接呼び出さずに、
.Fn vn_lock
を使用するべきです。
.Sh 戻り値
成功時には 0 が返され、そうでない場合にはエラーが返されます。
.Sh 疑似コード
.Bd -literal
struct vopnode {
int von_flag;
/*
* 他のファイルシステム固有データ
*/
...;
};
#define VON_LOCKED 1
#define VON_WANTED 2
#define VTOVON(vp) ((struct vopnode *) (vp)->v_data)
int
vop_lock(struct vnode *vp)
{
struct vopnode* vop;
start:
while (vp->v_flag & VXLOCK) {
vp->v_flag |= VXWANT;
tsleep((caddr_t)vp, PINOD, "voplk1", 0);
}
if (vp->v_tag == VT_NON)
return ENOENT;
vop = VTOVON(vp);
if (vop->von_flag & VON_LOCKED) {
vop->von_flag |= VON_WANTED;
tsleep((caddr_t) vop, PINOD, "voplk2", 0);
goto start;
}
vop->von_flag |= VON_LOCKED;
return 0;
}
int
vop_unlock(struct vnode *vp)
{
struct vopnode *vop = VTOVON(vp);
if ((vop->von_flag & VON_LOCKED) == 0) {
panic("vop_unlock not locked");
}
vop->von_flag &= ~VON_LOCKED;
if (vop->von_flag & VON_WANTED) {
vop->von_flag &= ~VON_WANTED;
wakeup((caddr_t) vop);
}
return 0;
}
int
vop_islocked(struct vnode *vp)
{
struct vopnode *vop = VTOVON(vp);
if (vop->von_flag & VON_LOCKED)
return 1;
else
return 0;
}
.Ed
.Sh 関連項目
.Xr vnode 9
.Sh 作者
このマニュアルページは
.An Doug Rabson
が書きました。