summaryrefslogtreecommitdiffstats
path: root/xlators/nfs/server/src/nfs.h
blob: e3daaed17a6fa6c4f240004ce282cc53ea5435f3 (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
/*
  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 <glusterfs/dict.h>
#include <glusterfs/xlator.h>
#include <glusterfs/lkowner.h>
#include <glusterfs/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;
    uint32_t event_threads;
};

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