|  | dlmfs | 
|  | ================== | 
|  | A minimal DLM userspace interface implemented via a virtual file | 
|  | system. | 
|  |  | 
|  | dlmfs is built with OCFS2 as it requires most of its infrastructure. | 
|  |  | 
|  | Project web page:    http://ocfs2.wiki.kernel.org | 
|  | Tools web page:      https://github.com/markfasheh/ocfs2-tools | 
|  | OCFS2 mailing lists: http://oss.oracle.com/projects/ocfs2/mailman/ | 
|  |  | 
|  | All code copyright 2005 Oracle except when otherwise noted. | 
|  |  | 
|  | CREDITS | 
|  | ======= | 
|  |  | 
|  | Some code taken from ramfs which is Copyright (C) 2000 Linus Torvalds | 
|  | and Transmeta Corp. | 
|  |  | 
|  | Mark Fasheh <mark.fasheh@oracle.com> | 
|  |  | 
|  | Caveats | 
|  | ======= | 
|  | - Right now it only works with the OCFS2 DLM, though support for other | 
|  | DLM implementations should not be a major issue. | 
|  |  | 
|  | Mount options | 
|  | ============= | 
|  | None | 
|  |  | 
|  | Usage | 
|  | ===== | 
|  |  | 
|  | If you're just interested in OCFS2, then please see ocfs2.txt. The | 
|  | rest of this document will be geared towards those who want to use | 
|  | dlmfs for easy to setup and easy to use clustered locking in | 
|  | userspace. | 
|  |  | 
|  | Setup | 
|  | ===== | 
|  |  | 
|  | dlmfs requires that the OCFS2 cluster infrastructure be in | 
|  | place. Please download ocfs2-tools from the above url and configure a | 
|  | cluster. | 
|  |  | 
|  | You'll want to start heartbeating on a volume which all the nodes in | 
|  | your lockspace can access. The easiest way to do this is via | 
|  | ocfs2_hb_ctl (distributed with ocfs2-tools). Right now it requires | 
|  | that an OCFS2 file system be in place so that it can automatically | 
|  | find its heartbeat area, though it will eventually support heartbeat | 
|  | against raw disks. | 
|  |  | 
|  | Please see the ocfs2_hb_ctl and mkfs.ocfs2 manual pages distributed | 
|  | with ocfs2-tools. | 
|  |  | 
|  | Once you're heartbeating, DLM lock 'domains' can be easily created / | 
|  | destroyed and locks within them accessed. | 
|  |  | 
|  | Locking | 
|  | ======= | 
|  |  | 
|  | Users may access dlmfs via standard file system calls, or they can use | 
|  | 'libo2dlm' (distributed with ocfs2-tools) which abstracts the file | 
|  | system calls and presents a more traditional locking api. | 
|  |  | 
|  | dlmfs handles lock caching automatically for the user, so a lock | 
|  | request for an already acquired lock will not generate another DLM | 
|  | call. Userspace programs are assumed to handle their own local | 
|  | locking. | 
|  |  | 
|  | Two levels of locks are supported - Shared Read, and Exclusive. | 
|  | Also supported is a Trylock operation. | 
|  |  | 
|  | For information on the libo2dlm interface, please see o2dlm.h, | 
|  | distributed with ocfs2-tools. | 
|  |  | 
|  | Lock value blocks can be read and written to a resource via read(2) | 
|  | and write(2) against the fd obtained via your open(2) call. The | 
|  | maximum currently supported LVB length is 64 bytes (though that is an | 
|  | OCFS2 DLM limitation). Through this mechanism, users of dlmfs can share | 
|  | small amounts of data amongst their nodes. | 
|  |  | 
|  | mkdir(2) signals dlmfs to join a domain (which will have the same name | 
|  | as the resulting directory) | 
|  |  | 
|  | rmdir(2) signals dlmfs to leave the domain | 
|  |  | 
|  | Locks for a given domain are represented by regular inodes inside the | 
|  | domain directory.  Locking against them is done via the open(2) system | 
|  | call. | 
|  |  | 
|  | The open(2) call will not return until your lock has been granted or | 
|  | an error has occurred, unless it has been instructed to do a trylock | 
|  | operation. If the lock succeeds, you'll get an fd. | 
|  |  | 
|  | open(2) with O_CREAT to ensure the resource inode is created - dlmfs does | 
|  | not automatically create inodes for existing lock resources. | 
|  |  | 
|  | Open Flag     Lock Request Type | 
|  | ---------     ----------------- | 
|  | O_RDONLY      Shared Read | 
|  | O_RDWR        Exclusive | 
|  |  | 
|  | Open Flag     Resulting Locking Behavior | 
|  | ---------     -------------------------- | 
|  | O_NONBLOCK    Trylock operation | 
|  |  | 
|  | You must provide exactly one of O_RDONLY or O_RDWR. | 
|  |  | 
|  | If O_NONBLOCK is also provided and the trylock operation was valid but | 
|  | could not lock the resource then open(2) will return ETXTBUSY. | 
|  |  | 
|  | close(2) drops the lock associated with your fd. | 
|  |  | 
|  | Modes passed to mkdir(2) or open(2) are adhered to locally. Chown is | 
|  | supported locally as well. This means you can use them to restrict | 
|  | access to the resources via dlmfs on your local node only. | 
|  |  | 
|  | The resource LVB may be read from the fd in either Shared Read or | 
|  | Exclusive modes via the read(2) system call. It can be written via | 
|  | write(2) only when open in Exclusive mode. | 
|  |  | 
|  | Once written, an LVB will be visible to other nodes who obtain Read | 
|  | Only or higher level locks on the resource. | 
|  |  | 
|  | See Also | 
|  | ======== | 
|  | http://opendlm.sourceforge.net/cvsmirror/opendlm/docs/dlmbook_final.pdf | 
|  |  | 
|  | For more information on the VMS distributed locking API. |