summaryrefslogtreecommitdiffstats
path: root/xlators/nfs/server/src/nfs.h
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/nfs/server/src/nfs.h')
-rw-r--r--xlators/nfs/server/src/nfs.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/xlators/nfs/server/src/nfs.h b/xlators/nfs/server/src/nfs.h
index 4c6d039f8d2..d2a0c134318 100644
--- a/xlators/nfs/server/src/nfs.h
+++ b/xlators/nfs/server/src/nfs.h
@@ -65,6 +65,27 @@ struct nfs_initer_list {
rpcsvc_program_t *program;
};
+/*
+ * TBD: make the cache size tunable
+ *
+ * The current size represents a pretty trivial amount of memory, and should
+ * provide good hit rates even for quite busy systems. If we ever want to
+ * support really large cache sizes, we'll need to do dynamic allocation
+ * instead of just defining an array within nfs_state. It doesn't make a
+ * whole lot of sense to change the associativity, because it won't improve
+ * hit rates all that much and will increase the maintenance cost as we have
+ * to scan more entries with every lookup/update.
+ */
+#define AUX_GID_CACHE_ASSOC 4
+#define AUX_GID_CACHE_BUCKETS 256
+#define AUX_GID_CACHE_SIZE (AUX_GID_CACHE_ASSOC * AUX_GID_CACHE_BUCKETS)
+
+typedef struct {
+ uid_t uid;
+ int gid_count;
+ gid_t *gid_list;
+ time_t deadline;
+} aux_gid_list_t;
struct nfs_state {
rpcsvc_t *rpcsvc;
@@ -88,6 +109,11 @@ struct nfs_state {
int enable_nlm;
int mount_udp;
struct rpc_clnt *rpc_clnt;
+ gf_boolean_t server_aux_gids;
+ gf_lock_t aux_gid_lock;
+ uint32_t aux_gid_max_age;
+ unsigned int aux_gid_nbuckets;
+ aux_gid_list_t aux_gid_cache[AUX_GID_CACHE_SIZE];
};
#define gf_nfs_dvm_on(nfsstt) (((struct nfs_state *)nfsstt)->dynamicvolumes == GF_NFS_DVM_ON)
@@ -126,4 +152,7 @@ nfs_request_primary_user_init (nfs_user_t *nfu, rpcsvc_request_t *req,
uid_t uid, gid_t gid);
extern int
nfs_subvolume_started (struct nfs_state *nfs, xlator_t *xl);
+
+extern void
+nfs_fix_groups (xlator_t *this, call_stack_t *root);
#endif