s3:vfs: add durable VFS operations
authorMichael Adam <obnox@samba.org>
Tue, 4 Sep 2012 16:04:11 +0000 (18:04 +0200)
committerStefan Metzmacher <metze@samba.org>
Sat, 8 Sep 2012 01:39:06 +0000 (03:39 +0200)
This allows a VFS module to implement durable handles in different ways.

Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>

source3/include/vfs.h
source3/include/vfs_macros.h
source3/modules/vfs_default.c
source3/smbd/vfs.c

index 45895e7d84c250b85928c44e9803db9905a59a6b..3e4eefef775bae11907192913cd1993647694d27 100644 (file)
 /* 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);
index e577e9950ffcbb1a05769b40ad8cd6da3d32ee04..f077a6f1af29dc5cf2cc5ce257de9f2c7dcff737 100644 (file)
 #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 */
index 42671a1dbe9cc201ba87a1d4185a076bbee41f19..427e3af9ca3a9dee250738306dc92fbca8588596 100644 (file)
@@ -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);
index 0a259cc9155ac960429e1002382f80f21ecce4b0..bb9549c887015e917efaae63b4a378cbcb9ce852 100644 (file)
@@ -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);
+}