Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 18 Nov 1995 14:26:30 -0700 (MST)
From:      Terry Lambert <terry@lambert.org>
To:        grog@lemis.de
Cc:        terry@lambert.org, hackers@freebsd.org
Subject:   Re: elm problem - "solved"
Message-ID:  <199511182126.OAA09612@phaeton.artisoft.com>
In-Reply-To: <199511180800.JAA16684@allegro.lemis.de> from "Greg Lehey" at Nov 18, 95 09:00:08 am

next in thread | previous in thread | raw e-mail | index | archive | help
> > > /*
> > >  * Advisory file segment locking data type -
> > >  * information passed to system by user
> > >  */
> > > struct flock {
> > > 	short	l_type;		/* lock type: read/write, etc. */
> > > 	short	l_whence;	/* type of l_start */
> > > 	off_t	l_start;	/* starting offset */
> > > 	off_t	l_len;		/* len = 0 means until end of file */
> > > 	pid_t	l_pid;		/* lock owner */
> > > };
> > 
> > BZZZT.  SunOS4 has the syspid as well.  It's necessary for NFS locking,
> > which is why my NFS locking kernel support patches had it as well.
> 
> OK, here's the extract from my SunOS 4.1.3_U1B man page:
> 
> The record to be locked or unlocked is  described  by  the
> flock structure defined in <fcntl.h> as follows:
> 
> struct flock {
>        short l_type;   /* F_RDLCK, F_WRLCK, or F_UNLCK */
>        short l_whence; /* flag to choose starting offset */
>        long  l_start;  /* relative offset, in bytes */
>        long  l_len;    /* length, in bytes;  0 means lock to EOF */
>        pid_t l_pid;    /* returned with F_GETLK */
> };
> 
> In <sys/fcntlcom.h>, the definition is:
> 
> /* file segment locking set data type - information passed to system by user */
> struct flock {
> 	short	l_type;		/* F_RDLCK, F_WRLCK, or F_UNLCK */
> 	short	l_whence;	/* flag to choose starting offset */
> 	long	l_start;	/* relative offset, in bytes */
> 	long	l_len;		/* length, in bytes; 0 means lock to EOF */
> 	short	l_pid;		/* returned with F_GETLK */
> 	short	l_xxx;		/* reserved for future use */
> };

#ifndef _POSIX_SOURCE
/* extended file segment locking set data type */
struct eflock {
        short   l_type;         /* F_RDLCK, F_WRLCK, or F_UNLCK */
        short   l_whence;       /* flag to choose starting offset */
        long    l_start;        /* relative offset, in bytes */
        long    l_len;          /* length, in bytes; 0 means lock to EOF */
        short   l_pid;          /* returned with F_GETLK */
        short   l_xxx;          /* reserved for future use */
        long    l_rpid;         /* Remote process id wanting this lock */
        long    l_rsys;         /* Remote system id wanting this lock */
};
#endif  /* !_POSIX_SOURCE */

I have access to a SunOS 4.1.3 box as well.  8-).

> So yes, maybe l_xxx is used as a syspid.  But I don't think so, and
> it's certainly not documented.

Yeah.  NFS locking isn't documented.  So?  Here's some "close" doc:

% man fcntl
[ ... ]
     F_RSETLK
     F_RSETLKW
     F_RGETLK       Are  used  by  the   network   lock   daemon,
                    lockd(8C), to communicate with the NFS server
                    kernel to handle locks on the NFS files.
[ ... ]

Also not documented:

	F_CNVT		Convert an NFS file handle to an fd for the
			rpc.lockd process.

	F_UNLKSYS	Remove all locks by remote system id (l_rsys).


The kernel code for NFS locking is actually pretty damn obvious, with
the exception of function callback registration in the NFS init code
to let F_CNVT work when NFS is an LKM.  8-).


> > > I really have great difficulty understanding why this change was made.
> > > It means that old FreeBSD and BSD/386 binaries won't work correctly
> > > under FreeBSD or BSD/OS Versions 2.  I can't see any advantage at all
> > > in this change.  Grrrr.
> > 
> > Think packing on RISC systems.  You put the largest followed by the
> > smallest to reduce the copyin overhead.
> 
> Think reality.  short=2 bytes. long=4 bytes for all the systems we're
> talking about.  The only 8-byte constraint in most RISC systems is for
> doubles on the Sparc architecture--I don't know for sure for other
> RISCs.  Can you point to more restrictive constraints?

>From stdio.h:
==========================================================================
/*
 * This is fairly grotesque, but pure ANSI code must not inspect the
 * innards of an fpos_t anyway.  The library internally uses off_t,
 * which we assume is exactly as big as eight chars.  (When we switch
 * to gcc 2.4 we will use __attribute__ here.)
 *
 * WARNING: the alignment constraints on an off_t and the struct below
 * differ on (e.g.) the SPARC.  Hence, the placement of an fpos_t object
 * in a structure will change if fpos_t's are not aligned on 8-byte
 * boundaries.  THIS IS A CROCK, but for now there is no way around it.
 */
==========================================================================

(BTW: we're after gcc 2.4: where is __attribute__?  8-)).

off_t is 8 bytes.  It's a quad.  Check the GCC configuration file for
"quad" and/or "long long".


					Terry Lambert
					terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.



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