diff options
author | David Howells <dhowells@redhat.com> | 2019-04-25 15:26:52 +0200 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2019-04-25 15:26:52 +0200 |
commit | 6c6c1d63c243025956f061e67fff3a615aa0f6be (patch) | |
tree | 2dc16f2dfa389efcc4b53197a33a9654cf02f794 /fs/afs/internal.h | |
parent | afs: Add more tracepoints (diff) | |
download | linux-6c6c1d63c243025956f061e67fff3a615aa0f6be.tar.xz linux-6c6c1d63c243025956f061e67fff3a615aa0f6be.zip |
afs: Provide mount-time configurable byte-range file locking emulation
Provide byte-range file locking emulation that can be configured at mount
time to one of four modes:
(1) flock=local. Locking is done locally only and no reference is made to
the server.
(2) flock=openafs. Byte-range locking is done locally only; whole-file
locking is done with reference to the server. Whole-file locks cannot
be upgraded unless the client holds an exclusive lock.
(3) flock=strict. Byte-range and whole-file locking both require a
sufficient whole-file lock on the server.
(4) flock=write. As strict, but the client always gets an exclusive
whole-file lock on the server.
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs/internal.h')
-rw-r--r-- | fs/afs/internal.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 20fd44de26ac..91204e1428f2 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -36,11 +36,24 @@ struct pagevec; struct afs_call; +/* + * Partial file-locking emulation mode. (The problem being that AFS3 only + * allows whole-file locks and no upgrading/downgrading). + */ +enum afs_flock_mode { + afs_flock_mode_unset, + afs_flock_mode_local, /* Local locking only */ + afs_flock_mode_openafs, /* Don't get server lock for a partial lock */ + afs_flock_mode_strict, /* Always get a server lock for a partial lock */ + afs_flock_mode_write, /* Get an exclusive server lock for a partial lock */ +}; + struct afs_fs_context { bool force; /* T to force cell type */ bool autocell; /* T if set auto mount operation */ bool dyn_root; /* T if dynamic root */ bool no_cell; /* T if the source is "none" (for dynroot) */ + enum afs_flock_mode flock_mode; /* Partial file-locking emulation mode */ afs_voltype_t type; /* type of volume requested */ unsigned int volnamesz; /* size of volume name */ const char *volname; /* name of volume to mount */ @@ -221,6 +234,7 @@ struct afs_super_info { struct net *net_ns; /* Network namespace */ struct afs_cell *cell; /* The cell in which the volume resides */ struct afs_volume *volume; /* volume record */ + enum afs_flock_mode flock_mode:8; /* File locking emulation mode */ bool dyn_root; /* True if dynamic root */ }; |