Date: Thu, 1 Jul 2004 01:40:27 GMT From: Stephen Hurd <shurd@sasktel.net> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/50827: [PATCH] no sane record locking on *nix. (Moretypes needed) Message-ID: <200407010140.i611eRPI027986@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/50827; it has been noted by GNATS. From: Stephen Hurd <shurd@sasktel.net> To: freebsd-gnats-submit@FreeBSD.org, shurd@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 ---
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200407010140.i611eRPI027986>