diff options
| -rw-r--r-- | source3/include/vfs.h | 35 | ||||
| -rw-r--r-- | source3/include/vfs_macros.h | 25 | ||||
| -rw-r--r-- | source3/modules/vfs_default.c | 35 | ||||
| -rw-r--r-- | source3/smbd/vfs.c | 34 | 
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); +}  | 
