Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Nov 2001 03:20:02 -0800 (PST)
From:      Maxim Konovalov <maxim@macomnet.ru>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/23353: fcntl(F_GETLK) return l_pid equal to -1 for the file loked with flock()
Message-ID:  <200111191120.fAJBK2X48167@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/23353; it has been noted by GNATS.

From: Maxim Konovalov <maxim@macomnet.ru>
To: Andrey Simonenko <simon@simon.org.ua>
Cc: iedowse@freebsd.org, <freebsd-bugs@freebsd.org>
Subject: Re: kern/23353: fcntl(F_GETLK) return l_pid equal to -1 for the file
 loked with flock()
Date: Mon, 19 Nov 2001 12:21:56 +0300 (MSK)

 Hello,
 
 On Sun, 18 Nov 2001, Andrey Simonenko wrote:
 
 > On Sun, 18 Nov 2001 iedowse@FreeBSD.org wrote:
 >
 [...]
 > > Can this be closed? In the audit-trail it is suggested that this is
 > > expected behaviour.
 > >
 >
 > May be my bug report isn't really a bug, but a message from Maxim didn't
 > make me think so. I know that in one case locks are inhereted by childs,
 > and in other case they aren't. The original my bug report was about
 > another thing. In the fcntl(2) manual page we can read that: "Note that
 > flock(2) and fcntl(2) locks can be safely used concurrently". And this
 > works. And if I locked some file with flock(2), then fcntl(F_GETLK) call
 > in some another process can tell me that that file is locked. But l_pid
 > field in the flock structure always is equal to -1 if file is locked with
 
 OK, just imagine a process got a lock by flock(2) and then fork(2)ed
 nine children, so we have ten processes with the same lock. What do
 you expect to find in flock.l_pid now? Imho l_pid is about clueless
 here because of the lock inheritance.
 
 Historically, flock(2) is a BSD interface and fcntl(F_???LK) is a
 POSIX one. They can be used concurrently for locking but there is a
 feature which I described above. Take a look at the line 517
 kern_lockf.c (1.25):
 
 if (block->lf_flags & F_POSIX)
 	fl->l_pid = ((struct proc *)(block->lf_id))->p_pid;
 else
 	fl->l_pid = -1;
 
 > flock(2) call (at least in my experiments). Also I haven't find any
 > information about this in manual pages.
 
 Agree.
 
 What about this patch for fcntl.2:
 
 Index: fcntl.2
 ===================================================================
 RCS file: /vol0/cvs/ncvs/src/lib/libc/sys/fcntl.2,v
 retrieving revision 1.35
 diff -u -r1.35 fcntl.2
 --- fcntl.2     2001/10/26 17:38:20     1.35
 +++ fcntl.2     2001/11/19 09:18:09
 @@ -535,6 +535,12 @@
  .Xr sigvec 2 ,
  .Xr tcgetpgrp 3 ,
  .Xr tcsetpgrp 3
 +.Sh BUGS
 +fcntl(F_GETLK) returns -1 in
 +.Fa l_pid
 +if the process holding a blocking lock previously locked the
 +file desriptor by
 +.Xr flock 2 .
  .Sh HISTORY
  The
  .Fn fcntl
 
 - -maxim
 
 -- 
 Maxim Konovalov, MAcomnet, Internet-Intranet Dept., system engineer
 phone: +7 (095) 796-9079, mailto: maxim@macomnet.ru
 
 
 
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200111191120.fAJBK2X48167>