summaryrefslogtreecommitdiffstats
path: root/xlators/nfs/server/src/nfs.h
blob: 9bcc88f55486e9d518b16a4ea194c334b39bbe1b (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
/*
  Copyright (c) 2010-2011 Gluster, Inc. <http://www.gluster.com>
  This file is part of GlusterFS.

  This file is licensed to you under your choice of the GNU Lesser
  General Public License, version 3 or any later version (LGPLv3 or
  later), or the GNU General Public License, version 2 (GPLv2), in all
  cases as published by the Free Software Foundation.
*/

#ifndef __NFS_H__
#define __NFS_H__

#include "rpcsvc.h"
#include "dict.h"
#include "xlator.h"
#include "lkowner.h"
#include "gidcache.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                  0

/* Disable using the exports file by default */
#define GF_NFS_DEFAULT_EXPORT_AUTH      0

#define GF_NFS_DEFAULT_AUTH_REFRESH_INTERVAL_SEC       2
#define GF_NFS_DEFAULT_AUTH_CACHE_TTL_SEC              300 /* 5 min */

/* 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;
        gf_boolean_t            required;
};

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                     enable_acl;
        int                     mount_udp;

        /* Enable exports auth model */
        int                     exports_auth;
        /* Refresh auth params from disk periodically */
        int                     refresh_auth;

        unsigned int            auth_refresh_time_secs;
        unsigned int            auth_cache_ttl_sec;

        char                    *rmtab;
        struct rpc_clnt         *rpc_clnt;
        gf_boolean_t            server_aux_gids;
	uint32_t		server_aux_gids_max_age;
	gid_cache_t		gid_cache;
        uint32_t                generation;
        gf_boolean_t            register_portmap;
        char                    *rpc_statd;
        char                    *rpc_statd_pid_file;
        gf_boolean_t            rdirplus;
};

struct nfs_inode_ctx {
        struct list_head        shares;
        uint32_t                generation;
};

#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;
        char    identifier[UNIX_PATH_MAX];  /* ip of user */
} 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,
                 rpc_transport_t *trans, 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