kern/50827: [PATCH] no sane record locking on *nix. (Moretypes
needed)
Stephen Hurd
shurd at sasktel.net
Wed Jun 30 18:40:39 PDT 2004
The following reply was made to PR kern/50827; it has been noted by GNATS.
From: Stephen Hurd <shurd at sasktel.net>
To: freebsd-gnats-submit at FreeBSD.org, shurd at sasktel.net
Cc:
Subject: Re: kern/50827: [PATCH] no sane record locking on *nix. (More types
needed)
Date: Wed, 30 Jun 2004 19:37:17 -0600
Actually, I meant that the following patch works on 5.2.1 :-)
--- sanelock.patch begins here ---
diff -c /sys/kern.old/kern_descrip.c /sys/kern/kern_descrip.c
*** /sys/kern.old/kern_descrip.c Thu Jun 24 17:25:47 2004
--- /sys/kern/kern_descrip.c Thu Jun 24 18:22:09 2004
***************
*** 380,385 ****
--- 380,411 ----
error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader,
F_UNLCK, flp, F_POSIX);
break;
+ case F_SANEWRLCKNO:
+ flg |= F_NOOVRLP;
+ case F_SANEWRLCK:
+ flp->l_type=F_WRLCK;
+ flg &= ~F_POSIX;
+ flg |= F_FLOCK;
+ fp->f_flag |= FHASLOCK;
+ error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK,
+ flp, flg);
+ break;
+ case F_SANERDLCKNO:
+ flg |= F_NOOVRLP;
+ case F_SANERDLCK:
+ flp->l_type=F_RDLCK;
+ flg &= ~F_POSIX;
+ flg |= F_FLOCK;
+ fp->f_flag |= FHASLOCK;
+ error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK,
+ flp, flg);
+ break;
+ case F_SANEUNLCK:
+ flg &= ~F_POSIX;
+ flg |= F_FLOCK;
+ error = VOP_ADVLOCK(vp, (caddr_t)fp, F_UNLCK,
+ flp, F_FLOCK);
+ break;
default:
error = EINVAL;
break;
Only in /sys/kern: kern_descrip.c.orig
diff -c /sys/kern.old/kern_lockf.c /sys/kern/kern_lockf.c
*** /sys/kern.old/kern_lockf.c Thu Jun 24 17:25:48 2004
--- /sys/kern/kern_lockf.c Thu Jun 24 17:28:52 2004
***************
*** 605,612 ****
start = lock->lf_start;
end = lock->lf_end;
while (lf != NOLOCKF) {
! if (((type & SELF) && lf->lf_id != lock->lf_id) ||
! ((type & OTHERS) && lf->lf_id == lock->lf_id)) {
*prev = &lf->lf_next;
*overlap = lf = lf->lf_next;
continue;
--- 605,613 ----
start = lock->lf_start;
end = lock->lf_end;
while (lf != NOLOCKF) {
! if ((!(lock->lf_flags & F_NOOVRLP)) &&
! (((type & SELF) && lf->lf_id != lock->lf_id) ||
! ((type & OTHERS) && lf->lf_id == lock->lf_id))) {
*prev = &lf->lf_next;
*overlap = lf = lf->lf_next;
continue;
diff -c /sys/sys.old/fcntl.h /sys/sys/fcntl.h
*** /sys/sys.old/fcntl.h Fri Apr 11 01:48:32 2003
--- /sys/sys/fcntl.h Fri Apr 11 01:48:11 2003
***************
*** 167,176 ****
--- 167,196 ----
#define F_RDLCK 1 /* shared or read lock */
#define F_UNLCK 2 /* unlock */
#define F_WRLCK 3 /* exclusive or write lock */
+ #ifndef _POSIX_SOURCE
+ /*
+ * The following lock types do NOT follow the completely stupid POSIX
+ * fcntl() semantics. Locks are per file descriptor not per file, and
+ * you can request an exclusive lock on a file opened for read as well
as+ * a read lock on a file opened for write.
+ */
+ #define F_SANERDLCK 4 /* sane shared or read lock */
+ #define F_SANEUNLCK 5 /* unlock sane locks */
+ #define F_SANEWRLCK 6 /* sane exclusive or write lock */
+
+ /*
+ * These lock types are sane locks that fail if there is ANY lock in the
region + * they are locking that would conflict (ie: process conflicts
with itself as+ * well as other processes.
+ */
+ #define F_SANERDLCKNO 7 /* don't up/downgrade or merge locks */
+ #define F_SANEWRLCKNO 8
+ #endif
#ifdef _KERNEL
#define F_WAIT 0x010 /* Wait until lock is granted */
#define F_FLOCK 0x020 /* Use flock(2) semantics for lock */
#define F_POSIX 0x040 /* Use POSIX semantics for lock */
+ #define F_NOOVRLP 0x080 /* Don't allow overlapping locks */
#endif
/*
--- sanelock.patch ends here ---
More information about the freebsd-bugs
mailing list