summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/vfs.h35
-rw-r--r--source3/include/vfs_macros.h25
-rw-r--r--source3/modules/vfs_default.c35
-rw-r--r--source3/smbd/vfs.c34
4 files changed, 128 insertions, 1 deletions
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 45895e7d84..3e4eefef77 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -142,6 +142,7 @@
/* Leave at 29 - not yet released. move to plain off_t - abartlet */
/* Leave at 29 - not yet released. Remove sys_acl functions other than set and get - abartlet */
/* Leave at 29 - not yet released. Added backup_intent bool to files_struct - JRA */
+/* Leave at 29 - not yet released. Add durable handle functions - metze/obnox */
#define SMB_VFS_INTERFACE_VERSION 29
/*
@@ -712,6 +713,24 @@ struct vfs_fn_pointers {
SMB_STRUCT_STAT *sbuf);
int (*set_offline_fn)(struct vfs_handle_struct *handle,
const struct smb_filename *fname);
+
+ /* durable handle operations */
+ NTSTATUS (*durable_cookie_fn)(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *cookie);
+ NTSTATUS (*durable_disconnect_fn)(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ const DATA_BLOB old_cookie,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *new_cookie);
+ NTSTATUS (*durable_reconnect_fn)(struct vfs_handle_struct *handle,
+ struct smb_request *smb1req,
+ struct smbXsrv_open *op,
+ const DATA_BLOB old_cookie,
+ TALLOC_CTX *mem_ctx,
+ struct files_struct **fsp,
+ DATA_BLOB *new_cookie);
};
/*
@@ -1108,6 +1127,22 @@ bool smb_vfs_call_is_offline(struct vfs_handle_struct *handle,
SMB_STRUCT_STAT *sbuf);
int smb_vfs_call_set_offline(struct vfs_handle_struct *handle,
const struct smb_filename *fname);
+NTSTATUS smb_vfs_call_durable_cookie(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *cookie);
+NTSTATUS smb_vfs_call_durable_disconnect(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ const DATA_BLOB old_cookie,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *new_cookie);
+NTSTATUS smb_vfs_call_durable_reconnect(struct vfs_handle_struct *handle,
+ struct smb_request *smb1req,
+ struct smbXsrv_open *op,
+ const DATA_BLOB old_cookie,
+ TALLOC_CTX *mem_ctx,
+ struct files_struct **fsp,
+ DATA_BLOB *new_cookie);
NTSTATUS smb_register_vfs(int version, const char *name,
const struct vfs_fn_pointers *fns);
diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h
index e577e9950f..f077a6f1af 100644
--- a/source3/include/vfs_macros.h
+++ b/source3/include/vfs_macros.h
@@ -509,4 +509,29 @@
#define SMB_VFS_NEXT_SET_OFFLINE(handle,fname) \
smb_vfs_call_set_offline((handle)->next, (fname))
+/* durable handle operations */
+
+#define SMB_VFS_DURABLE_COOKIE(fsp, mem_ctx, cookie) \
+ smb_vfs_call_durable_cookie((fsp)->conn->vfs_handles, \
+ (fsp), (mem_ctx), (cookie))
+#define SMB_VFS_NEXT_DURABLE_COOKIE(handle, fsp, mem_ctx, cookie) \
+ smb_vfs_call_durable_cookie(((handle)->next, \
+ (fsp), (mem_ctx), (cookie))
+
+#define SMB_VFS_DURABLE_DISCONNECT(fsp, old_cookie, mem_ctx, new_cookie) \
+ smb_vfs_call_durable_disconnect((fsp)->conn->vfs_handles, \
+ (fsp), (old_cookie), (mem_ctx), (new_cookie))
+#define SMB_VFS_NEXT_DURABLE_DISCONNECT(handle, fsp, old_cookie, mem_ctx, new_cookie) \
+ smb_vfs_call_durable_disconnect((handle)->next, \
+ (fsp), (old_cookie), (mem_ctx), (new_cookie))
+
+#define SMB_VFS_DURABLE_RECONNECT(conn, smb1req, op, old_cookie, mem_ctx, fsp, new_cookie) \
+ smb_vfs_call_durable_reconnect((conn)->vfs_handles, \
+ (smb1req), (op), (old_cookie), \
+ (mem_ctx), (fsp), (new_cookie))
+#define SMB_VFS_NEXT_DURABLE_RECONNECT(handle, smb1req, op, old_cookie, mem_ctx, fsp, new_cookie) \
+ smb_vfs_call_durable_reconnect((handle)->next, \
+ (smb1req), (op), (old_cookie), \
+ (mem_ctx), (fsp), (new_cookie))
+
#endif /* _VFS_MACROS_H */
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 42671a1dbe..427e3af9ca 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -2227,6 +2227,34 @@ static int vfswrap_set_offline(struct vfs_handle_struct *handle,
return -1;
}
+static NTSTATUS vfswrap_durable_cookie(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *cookie)
+{
+ return NT_STATUS_NOT_SUPPORTED;
+}
+
+static NTSTATUS vfswrap_durable_disconnect(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ const DATA_BLOB old_cookie,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *new_cookie)
+{
+ return NT_STATUS_NOT_SUPPORTED;
+}
+
+static NTSTATUS vfswrap_durable_reconnect(struct vfs_handle_struct *handle,
+ struct smb_request *smb1req,
+ struct smbXsrv_open *op,
+ const DATA_BLOB old_cookie,
+ TALLOC_CTX *mem_ctx,
+ struct files_struct **fsp,
+ DATA_BLOB *new_cookie)
+{
+ return NT_STATUS_NOT_SUPPORTED;
+}
+
static struct vfs_fn_pointers vfs_default_fns = {
/* Disk operations */
@@ -2344,7 +2372,12 @@ static struct vfs_fn_pointers vfs_default_fns = {
/* offline operations */
.is_offline_fn = vfswrap_is_offline,
- .set_offline_fn = vfswrap_set_offline
+ .set_offline_fn = vfswrap_set_offline,
+
+ /* durable handle operations */
+ .durable_cookie_fn = vfswrap_durable_cookie,
+ .durable_disconnect_fn = vfswrap_durable_disconnect,
+ .durable_reconnect_fn = vfswrap_durable_reconnect,
};
NTSTATUS vfs_default_init(void);
diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c
index 0a259cc915..bb9549c887 100644
--- a/source3/smbd/vfs.c
+++ b/source3/smbd/vfs.c
@@ -2330,3 +2330,37 @@ int smb_vfs_call_set_offline(struct vfs_handle_struct *handle,
VFS_FIND(set_offline);
return handle->fns->set_offline_fn(handle, fname);
}
+
+NTSTATUS smb_vfs_call_durable_cookie(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *cookie)
+{
+ VFS_FIND(durable_cookie);
+ return handle->fns->durable_cookie_fn(handle, fsp, mem_ctx, cookie);
+}
+
+NTSTATUS smb_vfs_call_durable_disconnect(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ const DATA_BLOB old_cookie,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *new_cookie)
+{
+ VFS_FIND(durable_disconnect);
+ return handle->fns->durable_disconnect_fn(handle, fsp, old_cookie,
+ mem_ctx, new_cookie);
+}
+
+NTSTATUS smb_vfs_call_durable_reconnect(struct vfs_handle_struct *handle,
+ struct smb_request *smb1req,
+ struct smbXsrv_open *op,
+ const DATA_BLOB old_cookie,
+ TALLOC_CTX *mem_ctx,
+ struct files_struct **fsp,
+ DATA_BLOB *new_cookie)
+{
+ VFS_FIND(durable_reconnect);
+ return handle->fns->durable_reconnect_fn(handle, smb1req, op,
+ old_cookie, mem_ctx, fsp,
+ new_cookie);
+}