summaryrefslogtreecommitdiff
path: root/source4/ntvfs/posix/vfs_posix.h
blob: cf39bcf0ac0db318f0246dec8a65638b71f105db (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
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
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
/* 
   Unix SMB/CIFS implementation.

   POSIX NTVFS backend - structure definitions

   Copyright (C) Andrew Tridgell 2004

   This program 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.
   
   This program 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 _VFS_POSIX_H_
#define _VFS_POSIX_H_

#include "librpc/gen_ndr/xattr.h"
#include "system/filesys.h"
#include "ntvfs/ntvfs.h"
#include "ntvfs/common/ntvfs_common.h"
#include "libcli/wbclient/wbclient.h"
#include "dsdb/samdb/samdb.h"

struct pvfs_wait;
struct pvfs_oplock;

/* this is the private structure for the posix vfs backend. It is used
   to hold per-connection (per tree connect) state information */
struct pvfs_state {
	struct ntvfs_module_context *ntvfs;
	const char *base_directory;
	struct GUID *base_fs_uuid;

	const char *share_name;
	uint_t flags;

	struct pvfs_mangle_context *mangle_ctx;

	struct brl_context *brl_context;
	struct odb_context *odb_context;
	struct notify_context *notify_context;
	struct wbc_context *wbc_ctx;

	/* a list of pending async requests. Needed to support
	   ntcancel */
	struct pvfs_wait *wait_list;

	/* the sharing violation timeout (nsecs) */
	uint_t sharing_violation_delay;

	/* the oplock break timeout (secs) */
	uint_t oplock_break_timeout;

	/* the write time update delay (nsecs) */
	uint_t writetime_delay;

	/* filesystem attributes (see FS_ATTR_*) */
	uint32_t fs_attribs;

	/* if posix:eadb is set, then this gets setup */
	struct tdb_wrap *ea_db;

	/* the allocation size rounding */
	uint32_t alloc_size_rounding;

	struct {
		/* the open files as DLINKLIST */
		struct pvfs_file *list;
	} files;

	struct {
		/* an id tree mapping open search ID to a pvfs_search_state structure */
		struct idr_context *idtree;

		/* the open searches as DLINKLIST */
		struct pvfs_search_state *list;

		/* how long to keep inactive searches around for */
		uint_t inactivity_time;
	} search;

	/* used to accelerate acl mapping */
	struct {
		const struct dom_sid *creator_owner;
		const struct dom_sid *creator_group;		
	} sid_cache;

	/* the acl backend */
	const struct pvfs_acl_ops *acl_ops;

	/* non-flag share options */
	struct {
		mode_t dir_mask;
		mode_t force_dir_mode;
		mode_t create_mask;
		mode_t force_create_mode;
	} options;
};

/* this is the basic information needed about a file from the filesystem */
struct pvfs_dos_fileinfo {
	NTTIME create_time;
	NTTIME access_time;
	NTTIME write_time;
	NTTIME change_time;
	uint32_t attrib;
	uint64_t alloc_size;
	uint32_t nlink;
	uint32_t ea_size;
	uint64_t file_id;
	uint32_t flags;
};

/*
  this is the structure returned by pvfs_resolve_name(). It holds the posix details of
  a filename passed by the client to any function
*/
struct pvfs_filename {
	const char *original_name;
	char *full_name;
	const char *stream_name; /* does not include :$DATA suffix */
	uint32_t stream_id;      /* this uses a hash, so is probabilistic */
	bool has_wildcard;
	bool exists;          /* true if the base filename exists */
	bool stream_exists;   /* true if the stream exists */
	struct stat st;
	struct pvfs_dos_fileinfo dos;
};


/* open file handle state - encapsulates the posix fd

   Note that this is separated from the pvfs_file structure in order
   to cope with the openx DENY_DOS semantics where a 2nd DENY_DOS open
   on the same connection gets the same low level filesystem handle,
   rather than a new handle
*/
struct pvfs_file_handle {
	int fd;

	struct pvfs_filename *name;

	/* a unique file key to be used for open file locking */
	DATA_BLOB odb_locking_key;

	uint32_t create_options;

	/* this is set by the mode_information level. What does it do? */
	uint32_t mode;

	/* yes, we need 2 independent positions ... */
	uint64_t seek_offset;
	uint64_t position;

	bool have_opendb_entry;

	/*
	 * we need to wait for oplock break requests from other processes,
	 * and we need to remember the pvfs_file so we can correctly
	 * forward the oplock break to the client
	 */
	struct pvfs_oplock *oplock;

	/* we need this hook back to our parent for lock destruction */
	struct pvfs_state *pvfs;

	struct {
		bool update_triggered;
		struct timed_event *update_event;
		bool update_on_close;
		NTTIME close_time;
		bool update_forced;
	} write_time;

	/* the open went through to completion */
	bool open_completed;
};

/* open file state */
struct pvfs_file {
	struct pvfs_file *next, *prev;
	struct pvfs_file_handle *handle;
	struct ntvfs_handle *ntvfs;

	struct pvfs_state *pvfs;

	uint32_t impersonation;
	uint32_t share_access;
	uint32_t access_mask;

	/* a list of pending locks - used for locking cancel operations */
	struct pvfs_pending_lock *pending_list;

	/* a file handle to be used for byte range locking */
	struct brl_handle *brl_handle;

	/* a count of active locks - used to avoid calling brl_close on
	   file close */
	uint64_t lock_count;

	/* for directories, a buffer of pending notify events */
	struct pvfs_notify_buffer *notify_buffer;

	/* for directories, the state of an incomplete SMB2 Find */
	struct pvfs_search_state *search;
};

/* the state of a search started with pvfs_search_first() */
struct pvfs_search_state {
	struct pvfs_search_state *prev, *next;
	struct pvfs_state *pvfs;
	uint16_t handle;
	off_t current_index;
	uint16_t search_attrib;
	uint16_t must_attrib;
	struct pvfs_dir *dir;
	time_t last_used;
	uint_t num_ea_names;
	struct ea_name *ea_names;
	struct timed_event *te;
};

/* flags to pvfs_resolve_name() */
#define PVFS_RESOLVE_WILDCARD    (1<<0)
#define PVFS_RESOLVE_STREAMS     (1<<1)
#define PVFS_RESOLVE_NO_OPENDB   (1<<2)

/* flags in pvfs->flags */
#define PVFS_FLAG_CI_FILESYSTEM  (1<<0) /* the filesystem is case insensitive */
#define PVFS_FLAG_MAP_ARCHIVE    (1<<1)
#define PVFS_FLAG_MAP_SYSTEM     (1<<2)
#define PVFS_FLAG_MAP_HIDDEN     (1<<3)
#define PVFS_FLAG_READONLY       (1<<4)
#define PVFS_FLAG_STRICT_SYNC    (1<<5)
#define PVFS_FLAG_STRICT_LOCKING (1<<6)
#define PVFS_FLAG_XATTR_ENABLE   (1<<7)
#define PVFS_FLAG_FAKE_OPLOCKS   (1<<8)
#define PVFS_FLAG_LINUX_AIO      (1<<9)

/* forward declare some anonymous structures */
struct pvfs_dir;

/* types of notification for pvfs wait events */
enum pvfs_wait_notice {PVFS_WAIT_EVENT, PVFS_WAIT_TIMEOUT, PVFS_WAIT_CANCEL};

/*
  state of a pending retry
*/
struct pvfs_odb_retry;

#define PVFS_EADB			"posix:eadb"
#define PVFS_XATTR			"posix:xattr"
#define PVFS_FAKE_OPLOCKS		"posix:fakeoplocks"
#define PVFS_SHARE_DELAY		"posix:sharedelay"
#define PVFS_OPLOCK_TIMEOUT		"posix:oplocktimeout"
#define PVFS_WRITETIME_DELAY		"posix:writetimeupdatedelay"
#define PVFS_ALLOCATION_ROUNDING	"posix:allocationrounding"
#define PVFS_SEARCH_INACTIVITY		"posix:searchinactivity"
#define PVFS_ACL			"posix:acl"
#define PVFS_AIO			"posix:aio"

#define PVFS_XATTR_DEFAULT			true
#define PVFS_FAKE_OPLOCKS_DEFAULT		false
#define PVFS_SHARE_DELAY_DEFAULT		1000000 /* nsecs */
#define PVFS_OPLOCK_TIMEOUT_DEFAULT		30 /* secs */
#define PVFS_WRITETIME_DELAY_DEFAULT		2000000 /* nsecs */
#define PVFS_ALLOCATION_ROUNDING_DEFAULT	512
#define PVFS_SEARCH_INACTIVITY_DEFAULT		300

struct pvfs_acl_ops {
	const char *name;
	NTSTATUS (*acl_load)(struct pvfs_state *, struct pvfs_filename *, int , TALLOC_CTX *, 
			     struct security_descriptor **);
	NTSTATUS (*acl_save)(struct pvfs_state *, struct pvfs_filename *, int , struct security_descriptor *);
};

#include "ntvfs/posix/vfs_posix_proto.h"

NTSTATUS pvfs_aio_pread(struct ntvfs_request *req, union smb_read *rd,
			struct pvfs_file *f, uint32_t maxcnt);
NTSTATUS pvfs_aio_pwrite(struct ntvfs_request *req, union smb_write *wr,
			 struct pvfs_file *f);

#endif /* _VFS_POSIX_H_ */