summaryrefslogtreecommitdiffstats
path: root/xlators/nfs/server/src/nfs.h
blob: d2a0c134318f903c95c0e078754d1ca86cc0589c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*
  Copyright (c) 2010-2011 Gluster, Inc. <http://www.gluster.com>
  This file is part of GlusterFS.

  GlusterFS is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published
  by the Free Software Foundation; either version 3 of the License,
  or (at your option) any later version.

  GlusterFS is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see
  <http://www.gnu.org/licenses/>.
*/

#ifndef __NFS_H__
#define __NFS_H__

#ifndef _CONFIG_H
#define _CONFIG_H
#include "config.h"
#endif

#include "rpcsvc.h"
#include "dict.h"
#include "xlator.h"
#include "lkowner.h"

#define GF_NFS                  "nfs"

#define GF_NFS_CONCURRENT_OPS_MULT     15

#define GF_NFS_INODE_LRU_MULT           6000

#define GF_RPC_MIN_THREADS      1
#define GF_RPC_MAX_THREADS      16

#define GF_NFS_DEFAULT_MEMFACTOR        15
#define GF_NFS_MIN_MEMFACTOR            1
#define GF_NFS_MAX_MEMFACTOR            30

#define GF_NFS_DVM_ON                   1
#define GF_NFS_DVM_OFF                  2

/* This corresponds to the max 16 number of group IDs that are sent through an
 * RPC request. Since NFS is the only one going to set this, we can be safe
 * in keeping this size hardcoded.
 */
#define GF_REQUEST_MAXGROUPS    16

/* Callback into a version-specific NFS protocol.
 * The return type is used by the nfs.c code to register the protocol.
 * with the RPC service.
 */
typedef rpcsvc_program_t *(*nfs_version_initer_t) (xlator_t *nfsx);

/* List of version-specific protocol initiators */
struct nfs_initer_list {
        struct list_head list;
        nfs_version_initer_t    init;
        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;
        struct list_head        versions;
        struct mount3_state     *mstate;
        struct nfs3_state       *nfs3state;
        struct nlm4_state       *nlm4state;
        struct mem_pool         *foppool;
        unsigned int            memfactor;
        xlator_list_t           *subvols;

        gf_lock_t               svinitlock;
        int                     allsubvols;
        int                     upsubvols;
        xlator_t                **initedxl;
        int                     subvols_started;
        int                     dynamicvolumes;
        int                     enable_ino32;
        unsigned int            override_portnum;
        int                     allow_insecure;
        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)
#define gf_nfs_dvm_off(nfsstt)  (((struct nfs_state *)nfsstt)->dynamicvolumes == GF_NFS_DVM_OFF)
#define __gf_nfs_enable_ino32(nfsstt)     (((struct nfs_state *)nfsstt)->enable_ino32)
#define gf_nfs_this_private     ((struct nfs_state *)((xlator_t *)THIS)->private)
#define gf_nfs_enable_ino32()     (__gf_nfs_enable_ino32(gf_nfs_this_private))

/* We have one gid more than the glusterfs maximum since we pass the primary
 * gid as the first element of the array.
 */
#define NFS_NGROUPS         (GF_REQUEST_MAXGROUPS + 1)

/* Index of the primary gid */
#define NFS_PRIMGID_IDX     0

typedef struct nfs_user_info {
        uid_t   uid;
        gid_t   gids[NFS_NGROUPS];
        int     ngrps;
        gf_lkowner_t lk_owner;
} nfs_user_t;

extern int
nfs_user_root_create (nfs_user_t *newnfu);

extern int
nfs_user_create (nfs_user_t *newnfu, uid_t uid, gid_t gid, gid_t *auxgids,
                 int auxcount);

extern void
nfs_request_user_init (nfs_user_t *nfu, rpcsvc_request_t *req);

extern void
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