[OpenAFS-win32-devel] New client-side locking implementation

Eric Williams ericjw@citi.umich.edu
Tue, 26 Jul 2005 15:21:13 -0400 (EDT)


On Tue, 26 Jul 2005, Jeffrey Altman wrote:

> Matt Benjamin wrote:
> > 1. Does something need to be said about the choice to enforce mandatory
> > locking?
>
> As opposed to the other choice which is to *NOT* enforce mandatory locks?

another choice is to enforce locking in an advisory manner (advisory
locking).

> Windows applications rely on the mandatory locking model of Windows file
> systems.   If we do not enforce the mandatory locking model, then there
> is no benefit to doing this work at all.  A cache manager that loses a
> lock and then continues to allow applications to access the file as if
> the lock is in place might as well overwrite the file with the output
> of /dev/random since those will be the resulting semantics.
>
> There was an interesting set of discussions on the subject of mandatory
> vs advisory locking on the nfsv4 wg mailing list.   The conclusion was
> that mandatory locking must be enforced for Windows applications and
> Posix implementations which require data integrity.
>
> > 2. This will allow byte-range locking to work within the traditional
> > cache manager.  In the IFS context, it is common to use kernel locking
> > implementation, and Eric had planned to do so.  Should this doc specify
> > how an IFS should interact with the CM wrt locks?
>
> In previous discussions, Eric has pointed out that his existing
> implementation enforces locks by calling cm_Lock()/cm_Unlock().   The
> use of this model will be necessary whenever afsd_service.exe is
> supporting both the CIFS/SMB and IFS interfaces simultaneously.   In the
> circumstance in which only the IFS is being used, kernel locking can be
> used.

the code in place currently does not call cm_Lock/cm_Unlock.  i simply
pointed out that the fns were available and could be called through the
existing upcall mechanism.  the current code does, however, use the
kernel-provided FsRtl locking library, which works well.

the FsRtl library has two hooks for lock operations.  when a lock is
placed, the hook is then called and has veto power.  when a lock is
removed, the second hook is called.  these are meant specifically for
network redirector use.  given the semantics discussed, calling
cm_Lock/cm_Unlock from these hooks seems to be a good solution.  in this
manner, the IFS interface does not have to be aware of CIFS-based
operations.

> The interface to cm_Lock()/cm_Unlock will change in order to support
> the notion of keyed locks.
>
> > 3. Sense need to ask questions about the key mapping, and relation to
> > keys known to IFS.  Eric would have to comment, though, I'm not
> > knowledeable enough on that.

IFS depends on locks being set on FileObjects (the kernel result of an
IRP_MJ_CREATE request), and being enforced on the entire file.  this only
matters because of unlock_all and unlock_by_key requests, which apply to
the specified FileObject, and not to all open instances of the file.

in fact, it would be possible to use a KeyA = Key(FileObject).  the
FileObject is unique -- across processes, users, files.  making KeyA
dependent on processID, as i had earlier proposed, is redundant.

> A key must consist of the SessionID, the ProcessID, and the FID in order
> to provide uniqueness both for the file and the user.   The SessionID is
>  irrelevant for the IFS because the ProcessID name space is unique.
> Therefore, for the IFS the SessionID can be set to a fixed arbitrary
> value that will not be used by the CIFS/SMB interface.

if the list of locks is stored in a queue attached to the cm_scache_t,
then i do not see why there exists a dependence on the FID.

>
> Jeffrey Altman
>

eric