Skip site navigation (1)Skip section navigation (2)
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>