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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
|
/*
Copyright (c) 2010 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 Affero 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
Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see
<http://www.gnu.org/licenses/>.
*/
#ifndef _NFS3_H_
#define _NFS3_H_
#ifndef _CONFIG_H
#define _CONFIG_H
#include "config.h"
#endif
#include "rpcsvc.h"
#include "dict.h"
#include "xlator.h"
#include "iobuf.h"
#include "nfs.h"
#include "nfs3-fh.h"
#include "nfs-common.h"
#include "xdr-nfs3.h"
#include "mem-pool.h"
#include <sys/statvfs.h>
#define GF_NFS3 GF_NFS"-nfsv3"
#define GF_NFS3_PORT 38467
#define GF_NFS3_DEFAULT_MEMFACTOR 15
#define GF_NFS3_IOBPOOL_MULT GF_NFS_CONCURRENT_OPS_MULT
#define GF_NFS3_CLTABLE_BUCKETS_MULT 2
#define GF_NFS3_FDTABLE_BUCKETS_MULT 2
/* Static values used for FSINFO
FIXME: This should be configurable */
#define GF_NFS3_RTMAX (64 * GF_UNIT_KB)
#define GF_NFS3_RTPREF (64 * GF_UNIT_KB)
#define GF_NFS3_RTMULT (4 * GF_UNIT_KB)
#define GF_NFS3_WTMAX (64 * GF_UNIT_KB)
#define GF_NFS3_WTPREF (64 * GF_UNIT_KB)
#define GF_NFS3_WTMULT (4 * GF_UNIT_KB)
#define GF_NFS3_DTMIN (4 * GF_UNIT_KB)
#define GF_NFS3_DTPREF (64 * GF_UNIT_KB)
#define GF_NFS3_MAXFILE (1 * GF_UNIT_PB)
/* FIXME: Handle time resolutions */
#define GF_NFS3_TIMEDELTA_SECS {1,0}
#define GF_NFS3_TIMEDELTA_NSECS {0,1}
#define GF_NFS3_TIMEDELTA_MSECS {0,1000000}
#define GF_NFS3_FS_PROP (FSF3_LINK | FSF3_SYMLINK | FSF3_HOMOGENEOUS | FSF3_CANSETTIME)
#define GF_NFS3_DIRFD_VALID 1
#define GF_NFS3_DIRFD_INVALID 0
#define GF_NFS3_VOLACCESS_RW 1
#define GF_NFS3_VOLACCESS_RO 2
#define GF_NFS3_FDCACHE_SIZE 512
/* This should probably be moved to a more generic layer so that if needed
* different versions of NFS protocol can use the same thing.
*/
struct nfs3_fd_entry {
fd_t *cachedfd;
struct list_head list;
};
/* Per subvolume nfs3 specific state */
struct nfs3_export {
struct list_head explist;
xlator_t *subvol;
uuid_t volumeid;
int access;
int trusted_sync;
int trusted_write;
};
#define GF_NFS3_DEFAULT_VOLACCESS (GF_NFS3_VOLACCESS_RW)
/* The NFSv3 protocol state */
struct nfs3_state {
/* The NFS xlator pointer. The NFS xlator can be running
* multiple versions of the NFS protocol.
*/
xlator_t *nfsx;
/* The iob pool from which memory allocations are made for receiving
* and sending network messages.
*/
struct iobuf_pool *iobpool;
/* List of child subvolumes for the NFSv3 protocol.
* Right now, is simply referring to the list of children in nfsx above.
*/
xlator_list_t *exportslist;
struct list_head exports;
/* Mempool for allocations of struct nfs3_local */
struct mem_pool *localpool;
/* Server start-up timestamp, currently used for write verifier. */
uint64_t serverstart;
/* NFSv3 Protocol configurables */
size_t readsize;
size_t writesize;
size_t readdirsize;
/* Size of the iobufs used, depends on the sizes of the three params
* above.
*/
size_t iobsize;
unsigned int memfactor;
struct list_head fdlru;
gf_lock_t fdlrulock;
int fdcount;
};
typedef enum nfs3_lookup_type {
GF_NFS3_REVALIDATE = 1,
GF_NFS3_FRESH,
} nfs3_lookup_type_t;
typedef int (*nfs3_resume_fn_t) (void *cs);
/* Structure used to communicate state between a fop and its callback.
* Not all members are used at all times. Usage is fop and NFS request
* dependent.
*
* I wish we could have a smaller structure for communicating state
* between callers and callbacks. It could be broken into smaller parts
* but I feel that will lead to a proliferation of types/structures and then
* we'll just be tracking down which structure is used by which fop, not
* to mention that having one type allows me to used a single mem-pool.
* Imagine the chaos if we need a mem-pool for each one of those sub-structures.
*/
struct nfs3_local {
rpcsvc_request_t *req;
xlator_t *vol;
nfs3_resume_fn_t resume_fn;
xlator_t *nfsx;
struct nfs3_state *nfs3state;
/* The list hook to attach this call state to the inode's queue till
* the opening of the fd on the inode completes.
*/
struct list_head openwait_q;
/* Per-NFSv3 Op state */
struct nfs3_fh parent;
struct nfs3_fh fh;
fd_t *fd;
uint32_t accessbits;
int operrno;
count3 dircount;
count3 maxcount;
struct statvfs fsstat;
gf_dirent_t entries;
struct iatt stbuf;
struct iatt preparent;
struct iatt postparent;
int32_t setattr_valid;
nfstime3 timestamp;
loc_t oploc;
int writetype;
count3 datacount;
offset3 dataoffset;
struct iobuf *iob;
createmode3 createmode;
uint64_t cookieverf;
int sattrguardcheck;
char *pathname;
ftype3 mknodtype;
specdata3 devnums;
cookie3 cookie;
struct iovec datavec;
mode_t mode;
/* NFSv3 FH resolver state */
struct nfs3_fh resolvefh;
loc_t resolvedloc;
int resolve_ret;
int resolve_errno;
int hashidx;
fd_t *resolve_dir_fd;
char *resolventry;
nfs3_lookup_type_t lookuptype;
};
#define nfs3_is_revalidate_lookup(cst) ((cst)->lookuptype == GF_NFS3_REVALIDATE)
typedef struct nfs3_local nfs3_call_state_t;
/* Queue of ops waiting for open fop to return. */
struct inode_op_queue {
struct list_head opq;
pthread_mutex_t qlock;
};
extern rpcsvc_program_t *
nfs3svc_init (xlator_t *nfsx);
#endif
|