Subject: NFS info...
To: None <current-users@NetBSD.ORG>
From: After 5 PM please slip brain through slot in door. <greywolf@defender.VAS.viewlogic.com>
List: current-users
Date: 11/03/1995 10:57:44
Disclaimer:  I realise anyone could have asked this fellow about infor-
mation regarding NFS, so this is nothing super-special in content, but I
thought along the rule which states:  "For any given circumstance X such
that the question 'Am I the only one who X?' can be asked, the answer is
in all probability 'No.'", so here's the info I got from David Robinson
at Sun.

Disclaimer #1:  I make no pretense on knowing which would be The Most
Appropriate[TM] list to send to, so I sent it here.

Happy hacking.

                                --*greywolf;
	(Black hat.  Grey band.  Not evil.  You figure it out.)

#define AUTHOR "David.Robinson@Eng.Sun.COM (David Robinson)"

/*
 * [greywolf wrote]:  
 * > Is there any information you could share with me (and the
 * > rest of the NetBSD community) regarding the implementation of said locking
 * > protocol without going into too much detail (i.e. short of an NDA and a 
 * > source license)?  Mostly I'm interested in the protocol as prescribed
 * > by Solaris 2.5, and how it differs from Solaris 2.4 and previous and,
 * > if applicable, how Solaris 2.x differs from SunOS 4.x.
 * 
 * The Solaris 2.5 implementation of the lock manager is 100% compatible with
 * all the previous implementations shipped, both 2.1-2.4 and 4.X.  Any
 * incompatibilites are considered bugs.  We have tested extensively against
 * older systems as well as other vendors.
 * 
 * The only noticeable difference is that a 2.5 client will prefer to use
 * a TCP transport instead of UDP.  It also will never issue any of
 * the *_MSG procedures, this is because we have a fully threaded client
 * so we can block and don't need to issue these psuedo-async procedures.
 * 
 * > We are interested in what does what, i.e. how to communicate with a lockd
 * > and what to expect when we send in said requests.  Can you refer us to an
 * > on-line document or send one our way?
 * I don't know of anything online other than the rpcgen ".x" files and
 * headers in /usr/include/rpcsvc of any Solaris or SunOS release.  ".x"
 * files are all considered Copyrighted but freely redistributable. (They
 * essentially define the wire protocol which Sun doesn't license or control).
 * The best source of a detailed description is the X/Open specification
 * called X/NFS.  Unfortunately it costs ~$150.  It is what we use to
 * answer any protocol questions.
 * 
 * > Does the kernel locking mechanism make use of flock()/lockf() type
 * > locks or are NFS locks something entirely different?
 * 
 * From an applications perspective all file locking is done via the fcntl()
 * system call.  Both flock and and lockf are simple subsets of the fcntl()
 * calls.  Neither applications or libraries know the difference between
 * an NFS filesystem or a local filesystem.  Within the kernel we implement
 * a virtual filesystem (VFS) function called VOP_FRLOCK which hides the
 * details of a particular filesystem implementation of locking from
 * the filesystem independant code.  The local UFS filesystem maintains
 * locks in a set of in core data structures while the NFS implementation
 * issues RPC's across the wire.  On the server side the locking server
 * simply calls VOP_FRLOCK with the request to the local filesystem
 * and responds accordingly.
 * 
 * In all the previous releases we split the functionality between the
 * kernel and a user level daemon.  Applications still talked to fcntl()
 * system calls but the kernel would call out to the daemon with private
 * RPC calls (the infamous KLM protocol) so the daemon would issue over the
 * wire RPC calls on the kernels behalf.  On the reverse side, the daemon
 * would act as an RPC server and then use a private overloaded argument
 * to the fcntl() system call to make lock requests on behalf of the client.
 * This is a maintainence nightmare in keeping the state between the kernel
 * and daemons in sync.
 * 
 * In really old days, all locking was done through the local daemon, including
 * local filesystem locks.  On simple method is to implement the
 * fcntl "system" call for lock requests as a local call to the lock
 * daemon bypassing the kernel.  Also having the daemon answer RPC requests.
 * This has the disadvantage that applications statically linked will
 * always want to talk directly to a deamon and will break if you change
 * the implementation.
 * 
 * Tips if you are going to write a lock manager.  Start with a multithreaded
 * design!  Locks block and if you are single threaded you have to store
 * largwe amounts of state to switch to another request, potentially the
 * one that unblocks the current request.  It is easier to maintain thread
 * state than the locking state.  If at all possible keep all lock information
 * in the same address space (either user or kernel).  90% of our problems
 * with the previous implementation were with maintaining two pieces of
 * state about the same lock in two different contexts.  A nightmare!
 * 
 * 	Good luck,
 * 	-David
 * 
 */

#undef AUTHOR	/* "David.Robinson@Eng.Sun.COM (David Robinson)" */