From 122dbbf00acc1768f98e5b57e94aab2b61671f40 Mon Sep 17 00:00:00 2001 From: Tim Prouty Date: Sat, 31 Jan 2009 20:51:04 -0800 Subject: s3 vfs: Add a destructor to the fsp extension data API I'm not certain if the dummy pointer is needed in struct vfs_fsp_data, but I added it to be consistent with the comment below. --- source3/include/proto.h | 4 +++- source3/include/smb.h | 4 +++- source3/include/vfs.h | 4 ++-- source3/modules/vfs_cacheprime.c | 2 +- source3/modules/vfs_commit.c | 2 +- source3/modules/vfs_prealloc.c | 2 +- source3/modules/vfs_streams_xattr.c | 3 ++- source3/smbd/vfs.c | 8 +++++++- 8 files changed, 20 insertions(+), 9 deletions(-) diff --git a/source3/include/proto.h b/source3/include/proto.h index e5dbe60e11..1a1f8bef69 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -7317,7 +7317,9 @@ void sys_utmp_claim(const char *username, const char *hostname, NTSTATUS smb_register_vfs(int version, const char *name, const vfs_op_tuple *vfs_op_tuples); bool vfs_init_custom(connection_struct *conn, const char *vfs_object); -void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle, files_struct *fsp, size_t ext_size); +void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle, + files_struct *fsp, size_t ext_size, + void (*destroy_fn)(void *p_data)); void vfs_remove_fsp_extension(vfs_handle_struct *handle, files_struct *fsp); void *vfs_memctx_fsp_extension(vfs_handle_struct *handle, files_struct *fsp); void *vfs_fetch_fsp_extension(vfs_handle_struct *handle, files_struct *fsp); diff --git a/source3/include/smb.h b/source3/include/smb.h index 3da63cfc2b..100ec21031 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -373,7 +373,9 @@ struct rpc_cli_smbd_conn; struct vfs_fsp_data { struct vfs_fsp_data *next; struct vfs_handle_struct *owner; - /* NOTE: This structure contains two pointers so that we can guarantee + void (*destroy)(void *p_data); + void *_dummy_; + /* NOTE: This structure contains four pointers so that we can guarantee * that the end of the structure is always both 4-byte and 8-byte aligned. */ }; diff --git a/source3/include/vfs.h b/source3/include/vfs.h index e9115ab807..228f090600 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -679,8 +679,8 @@ typedef struct vfs_statvfs_struct { /* Add a new FSP extension of the given type. Returns a pointer to the * extenstion data. */ -#define VFS_ADD_FSP_EXTENSION(handle, fsp, type) \ - vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type)) +#define VFS_ADD_FSP_EXTENSION(handle, fsp, type, destroy_fn) \ + vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type), (destroy_fn)) /* Return a pointer to the existing FSP extension data. */ #define VFS_FETCH_FSP_EXTENSION(handle, fsp) \ diff --git a/source3/modules/vfs_cacheprime.c b/source3/modules/vfs_cacheprime.c index fed051ca8d..71b850505a 100644 --- a/source3/modules/vfs_cacheprime.c +++ b/source3/modules/vfs_cacheprime.c @@ -54,7 +54,7 @@ static bool prime_cache( SMB_OFF_T * last; ssize_t nread; - last = (SMB_OFF_T *)VFS_ADD_FSP_EXTENSION(handle, fsp, SMB_OFF_T); + last = (SMB_OFF_T *)VFS_ADD_FSP_EXTENSION(handle, fsp, SMB_OFF_T, NULL); if (!last) { return False; } diff --git a/source3/modules/vfs_commit.c b/source3/modules/vfs_commit.c index 1cef6d0243..a8105e021e 100644 --- a/source3/modules/vfs_commit.c +++ b/source3/modules/vfs_commit.c @@ -190,7 +190,7 @@ static int commit_open( MODULE, "eof mode", "none"); if (dthresh > 0 || !strequal(eof_mode, "none")) { - c = VFS_ADD_FSP_EXTENSION(handle, fsp, struct commit_info); + c = VFS_ADD_FSP_EXTENSION(handle, fsp, struct commit_info, NULL); /* Process main tunables */ if (c) { c->dthresh = dthresh; diff --git a/source3/modules/vfs_prealloc.c b/source3/modules/vfs_prealloc.c index 5a339dbf8d..299f6548a1 100644 --- a/source3/modules/vfs_prealloc.c +++ b/source3/modules/vfs_prealloc.c @@ -164,7 +164,7 @@ static int prealloc_open(vfs_handle_struct* handle, if ((flags & O_CREAT) || (flags & O_TRUNC)) { SMB_OFF_T * psize; - psize = VFS_ADD_FSP_EXTENSION(handle, fsp, SMB_OFF_T); + psize = VFS_ADD_FSP_EXTENSION(handle, fsp, SMB_OFF_T, NULL); if (psize == NULL || *psize == -1) { return fd; } diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c index 37473439dd..77ffff5fb5 100644 --- a/source3/modules/vfs_streams_xattr.c +++ b/source3/modules/vfs_streams_xattr.c @@ -405,7 +405,8 @@ static int streams_xattr_open(vfs_handle_struct *handle, const char *fname, } sio = (struct stream_io *)VFS_ADD_FSP_EXTENSION(handle, fsp, - struct stream_io); + struct stream_io, + NULL); if (sio == NULL) { errno = ENOMEM; goto fail; diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index df5a39eea2..515e557f67 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -220,7 +220,9 @@ bool vfs_init_custom(connection_struct *conn, const char *vfs_object) #define EXT_DATA_AREA(e) ((uint8 *)(e) + sizeof(struct vfs_fsp_data)) -void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle, files_struct *fsp, size_t ext_size) +void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle, + files_struct *fsp, size_t ext_size, + void (*destroy_fn)(void *p_data)) { struct vfs_fsp_data *ext; void * ext_data; @@ -238,6 +240,7 @@ void *vfs_add_fsp_extension_notype(vfs_handle_struct *handle, files_struct *fsp, ext->owner = handle; ext->next = fsp->vfs_extension; + ext->destroy = destroy_fn; fsp->vfs_extension = ext; return EXT_DATA_AREA(ext); } @@ -256,6 +259,9 @@ void vfs_remove_fsp_extension(vfs_handle_struct *handle, files_struct *fsp) } else { fsp->vfs_extension = curr->next; } + if (curr->destroy) { + curr->destroy(EXT_DATA_AREA(curr)); + } TALLOC_FREE(curr); return; } -- cgit