vop_lock(9)

NAME

VOP_LOCK, VOP_UNLOCK, VOP_ISLOCKED, vn_lock - serialize ac
cess to a vnode

SYNOPSIS

#include <sys/param.h>
#include <sys/lock.h>
#include <sys/vnode.h>
int
VOP_LOCK(struct vnode *vp, int flags, struct thread *td);
int
VOP_UNLOCK(struct vnode *vp, int flags, struct thread *td);
int
VOP_ISLOCKED(struct vnode *vp, struct thread *td);
int
vn_lock(struct vnode *vp, int flags, struct thread *td);

DESCRIPTION

These calls are used to serialize access to the file system,
such as to
prevent two writes to the same file from happening at the
same time.
The arguments are:
vp The vnode being locked or unlocked.
flags One of the lock request types:

LK_SHARED Shared lock.
LK_EXCLUSIVE Exclusive lock.
LK_UPGRADE Shared-to-exclusive up
grade.
LK_EXCLUPGRADE First shared-to-exclusive
upgrade.
LK_DOWNGRADE Exclusive-to-shared down
grade.
LK_RELEASE Release any type of lock.
LK_DRAIN Wait for all lock activity
to end.
The lock type may be or'ed with these lock flags:

LK_NOWAIT Do not sleep to wait for
lock.
LK_SLEEPFAIL Sleep, then return failure.
LK_CANRECURSE Allow recursive exclusive
lock.
LK_REENABLE Lock is to be reenabled af
ter drain.
LK_NOPAUSE No spinloop.
The lock type may be or'ed with these control flags:

LK_INTERLOCK Specify when the caller al
ready has a
simple lock (VOP_LOCK()
will unlock the
simple lock after getting
the lock).
LK_RETRY Retry until locked.
LK_NOOBJ Do not create object.
td Thread context to use for the locks.
Kernel code should use vn_lock() to lock a vnode rather than
calling
VOP_LOCK() directly.

RETURN VALUES

Zero is returned on success, otherwise an error is returned.

PSEUDOCODE

struct vopnode {
int von_flag;
/*
* Other file system specific data.
*/
...;
};
#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;
}

SEE ALSO

vnode(9)

AUTHORS

This manual page was written by Doug Rabson.
BSD July 24, 1996
Copyright © 2010-2024 Platon Technologies, s.r.o.           Home | Man pages | tLDP | Documents | Utilities | About
Design by styleshout