1cc077137cc150710eaaf43a62eadf580a4ccdba
[jelmer/samba4-debian.git] / source / ntvfs / common / opendb.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    Copyright (C) Andrew Tridgell 2004
5    
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 /*
21   this is the open files database. It implements shared storage of
22   what files are open between server instances, and implements the rules
23   of shared access to files.
24
25   The caller needs to provide a file_key, which specifies what file
26   they are talking about. This needs to be a unique key across all
27   filesystems, and is usually implemented in terms of a device/inode
28   pair.
29
30   Before any operations can be performed the caller needs to establish
31   a lock on the record associated with file_key. That is done by
32   calling odb_lock(). The caller releases this lock by calling
33   talloc_free() on the returned handle.
34
35   All other operations on a record are done by passing the odb_lock()
36   handle back to this module. The handle contains internal
37   information about what file_key is being operated on.
38 */
39
40 #include "includes.h"
41 #include "ntvfs/ntvfs.h"
42 #include "ntvfs/common/ntvfs_common.h"
43 #include "cluster/cluster.h"
44 #include "param/param.h"
45
46 static const struct opendb_ops *ops;
47
48 /*
49   set the odb backend ops
50 */
51 void odb_set_ops(const struct opendb_ops *new_ops)
52 {
53         ops = new_ops;
54 }
55
56 /*
57   Open up the openfiles.tdb database. Close it down using
58   talloc_free(). We need the messaging_ctx to allow for pending open
59   notifications.
60 */
61 _PUBLIC_ struct odb_context *odb_init(TALLOC_CTX *mem_ctx, 
62                                       struct ntvfs_context *ntvfs_ctx)
63 {
64         if (ops == NULL) {
65                 if (lp_parm_bool(ntvfs_ctx->lp_ctx, NULL, "ctdb", "opendb", false)) {
66                         odb_ctdb_init_ops();
67                 } else {
68                         odb_tdb_init_ops();
69                 }
70         }
71         return ops->odb_init(mem_ctx, ntvfs_ctx);
72 }
73
74 /*
75   get a lock on a entry in the odb. This call returns a lock handle,
76   which the caller should unlock using talloc_free().
77 */
78 _PUBLIC_ struct odb_lock *odb_lock(TALLOC_CTX *mem_ctx,
79                                    struct odb_context *odb, DATA_BLOB *file_key)
80 {
81         return ops->odb_lock(mem_ctx, odb, file_key);
82 }
83
84 _PUBLIC_ DATA_BLOB odb_get_key(TALLOC_CTX *mem_ctx, struct odb_lock *lck)
85 {
86         return ops->odb_get_key(mem_ctx, lck);
87 }
88
89 /*
90   register an open file in the open files database.
91   The share_access rules are implemented by odb_can_open()
92   and it's needed to call odb_can_open() before
93   odb_open_file() otherwise NT_STATUS_INTERNAL_ERROR is returned
94
95   Note that the path is only used by the delete on close logic, not
96   for comparing with other filenames
97 */
98 _PUBLIC_ NTSTATUS odb_open_file(struct odb_lock *lck,
99                                 void *file_handle, const char *path,
100                                 bool allow_level_II_oplock,
101                                 uint32_t oplock_level, uint32_t *oplock_granted)
102 {
103         return ops->odb_open_file(lck, file_handle, path,
104                                   allow_level_II_oplock,
105                                   oplock_level, oplock_granted);
106 }
107
108
109 /*
110   register a pending open file in the open files database
111 */
112 _PUBLIC_ NTSTATUS odb_open_file_pending(struct odb_lock *lck, void *private)
113 {
114         return ops->odb_open_file_pending(lck, private);
115 }
116
117
118 /*
119   remove a opendb entry
120 */
121 _PUBLIC_ NTSTATUS odb_close_file(struct odb_lock *lck, void *file_handle,
122                                  const char **delete_path)
123 {
124         return ops->odb_close_file(lck, file_handle, delete_path);
125 }
126
127
128 /*
129   remove a pending opendb entry
130 */
131 _PUBLIC_ NTSTATUS odb_remove_pending(struct odb_lock *lck, void *private)
132 {
133         return ops->odb_remove_pending(lck, private);
134 }
135
136
137 /*
138   rename the path in a open file
139 */
140 _PUBLIC_ NTSTATUS odb_rename(struct odb_lock *lck, const char *path)
141 {
142         return ops->odb_rename(lck, path);
143 }
144
145 /*
146   get back the path of an open file
147 */
148 _PUBLIC_ NTSTATUS odb_get_path(struct odb_lock *lck, const char **path)
149 {
150         return ops->odb_get_path(lck, path);
151 }
152
153 /*
154   update delete on close flag on an open file
155 */
156 _PUBLIC_ NTSTATUS odb_set_delete_on_close(struct odb_lock *lck, bool del_on_close)
157 {
158         return ops->odb_set_delete_on_close(lck, del_on_close);
159 }
160
161 /*
162   return the current value of the delete_on_close bit, and how many
163   people still have the file open
164 */
165 _PUBLIC_ NTSTATUS odb_get_delete_on_close(struct odb_context *odb, 
166                                           DATA_BLOB *key, bool *del_on_close)
167 {
168         return ops->odb_get_delete_on_close(odb, key, del_on_close);
169 }
170
171
172 /*
173   determine if a file can be opened with the given share_access,
174   create_options and access_mask
175 */
176 _PUBLIC_ NTSTATUS odb_can_open(struct odb_lock *lck,
177                                uint32_t stream_id, uint32_t share_access,
178                                uint32_t access_mask, bool delete_on_close,
179                                uint32_t open_disposition, bool break_to_none)
180 {
181         return ops->odb_can_open(lck, stream_id, share_access, access_mask,
182                                  delete_on_close, open_disposition, break_to_none);
183 }
184
185 _PUBLIC_ NTSTATUS odb_update_oplock(struct odb_lock *lck, void *file_handle,
186                                     uint32_t oplock_level)
187 {
188         return ops->odb_update_oplock(lck, file_handle, oplock_level);
189 }
190
191 _PUBLIC_ NTSTATUS odb_break_oplocks(struct odb_lock *lck)
192 {
193         return ops->odb_break_oplocks(lck);
194 }