svn commit: samba r16055 - in trunk/source: include smbd

jpeach at samba.org jpeach at samba.org
Tue Jun 6 03:19:16 GMT 2006


Author: jpeach
Date: 2006-06-06 03:19:15 +0000 (Tue, 06 Jun 2006)
New Revision: 16055

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=16055

Log:
Provide an API for modules to add their own private info to
files_struct.

This patch is a candidate for the SAMBA_3_0 branch post-3.0.23.

Modified:
   trunk/source/include/smb.h
   trunk/source/include/vfs.h
   trunk/source/smbd/vfs.c


Changeset:
Modified: trunk/source/include/smb.h
===================================================================
--- trunk/source/include/smb.h	2006-06-06 00:34:26 UTC (rev 16054)
+++ trunk/source/include/smb.h	2006-06-06 03:19:15 UTC (rev 16055)
@@ -408,6 +408,14 @@
 struct idle_event;
 struct share_mode_entry;
 
+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
+     * that the end of the structure is always both 4-byte and 8-byte aligned.
+     */
+};
+
 typedef struct files_struct {
 	struct files_struct *next, *prev;
 	int fnum;
@@ -446,6 +454,8 @@
 	BOOL aio_write_behind;
 	BOOL lockdb_clean;
 	char *fsp_name;
+
+	struct vfs_fsp_data *vfs_extension;
  	FAKE_FILE_HANDLE *fake_file_handle;
 } files_struct;
 

Modified: trunk/source/include/vfs.h
===================================================================
--- trunk/source/include/vfs.h	2006-06-06 00:34:26 UTC (rev 16054)
+++ trunk/source/include/vfs.h	2006-06-06 03:19:15 UTC (rev 16055)
@@ -531,7 +531,15 @@
 	/* NB flags can come from FILE_SYSTEM_DEVICE_INFO call   */
 } vfs_statvfs_struct;
 
+#define VFS_ADD_FSP_EXTENSION(handle, fsp, type) \
+    vfs_add_fsp_extension_notype(handle, (fsp), sizeof(type))
 
+#define VFS_FETCH_FSP_EXTENSION(handle, fsp) \
+    vfs_fetch_fsp_extension(handle, (fsp))
+
+#define VFS_REMOVE_FSP_EXTENSION(handle, fsp) \
+    vfs_remove_fsp_extension((handle), (fsp))
+
 #define SMB_VFS_HANDLE_GET_DATA(handle, datap, type, ret) { \
 	if (!(handle)||((datap=(type *)(handle)->data)==NULL)) { \
 		DEBUG(0,("%s() failed to get vfs_handle->data!\n",FUNCTION_MACRO)); \

Modified: trunk/source/smbd/vfs.c
===================================================================
--- trunk/source/smbd/vfs.c	2006-06-06 00:34:26 UTC (rev 16054)
+++ trunk/source/smbd/vfs.c	2006-06-06 03:19:15 UTC (rev 16055)
@@ -4,6 +4,7 @@
    VFS initialisation and support functions
    Copyright (C) Tim Potter 1999
    Copyright (C) Alexander Bokovoy 2002
+   Copyright (C) James Peach 2006
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -188,6 +189,71 @@
 }
 
 /*****************************************************************
+ Allow VFS modules to extend files_struct with VFS-specific state.
+ This will be ok for small numbers of extensions, but might need to
+ be refactored if it becomes more widely used.
+******************************************************************/
+
+#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)
+{
+	struct vfs_fsp_data *ext;
+	void * ext_data;
+
+	/* Prevent VFS modules adding multiple extensions. */
+	if ((ext_data = vfs_fetch_fsp_extension(handle, fsp))) {
+		return ext_data;
+	}
+
+	ext = TALLOC_ZERO(handle->conn->mem_ctx,
+			    sizeof(struct vfs_fsp_data) + ext_size);
+	if (ext == NULL) {
+		return NULL;
+	}
+
+	ext->owner = handle;
+	ext->next = fsp->vfs_extension;
+	fsp->vfs_extension = ext;
+	return EXT_DATA_AREA(ext);
+}
+
+void vfs_remove_fsp_extension(vfs_handle_struct *handle, files_struct *fsp)
+{
+	struct vfs_fsp_data *curr;
+	struct vfs_fsp_data *prev;
+
+	for (curr = fsp->vfs_extension, prev = NULL;
+	     curr;
+	     prev = curr, curr = curr->next) {
+		if (curr->owner == handle) {
+		    if (prev) {
+			    prev->next = curr->next;
+		    } else {
+			    fsp->vfs_extension = curr->next;
+		    }
+		    TALLOC_FREE(curr);
+		    return;
+		}
+	}
+}
+
+void *vfs_fetch_fsp_extension(vfs_handle_struct *handle, files_struct *fsp)
+{
+	struct vfs_fsp_data *head;
+
+	for (head = fsp->vfs_extension; head; head = head->next) {
+		if (head->owner == handle) {
+			return EXT_DATA_AREA(head);
+		}
+	}
+
+	return NULL;
+}
+
+#undef EXT_DATA_AREA
+
+/*****************************************************************
  Generic VFS init.
 ******************************************************************/
 



More information about the samba-cvs mailing list