aboutsummaryrefslogtreecommitdiff
path: root/documentation/manual-pages/ja/man9/VOP_LOCK.9
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/manual-pages/ja/man9/VOP_LOCK.9')
-rw-r--r--documentation/manual-pages/ja/man9/VOP_LOCK.9177
1 files changed, 177 insertions, 0 deletions
diff --git a/documentation/manual-pages/ja/man9/VOP_LOCK.9 b/documentation/manual-pages/ja/man9/VOP_LOCK.9
new file mode 100644
index 0000000000..aea28c4736
--- /dev/null
+++ b/documentation/manual-pages/ja/man9/VOP_LOCK.9
@@ -0,0 +1,177 @@
+.\" -*- 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
+が書きました。