[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-test-1454-ge342ca0

Alexander Bokovoy ab at samba.org
Thu Jan 17 14:10:03 GMT 2008


The branch, v3-2-test has been updated
       via  e342ca0d931f9a5c8ec9e472dc9c63f1fe012b3a (commit)
       via  75cc08661473cce62756fa062071bb2bc1fb39ec (commit)
      from  e1f5a8f10795831d3c7902d9803c9571c8ac811a (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit e342ca0d931f9a5c8ec9e472dc9c63f1fe012b3a
Author: Alexander Bokovoy <ab at samba.org>
Date:   Thu Jan 17 16:51:14 2008 +0300

    Remove is_remotestorage() call from VFS. We already have statvfs() there to handle FS capabilities.
    
    As discussed with Volker, it is better to calculate FS capabilities at
    connection time. We already do this with help of VFS statvfs() call
    which allows to fill-in system-specific attributes including FS
    capabilities. So just re-use it if you want to represent additional
    capabilities in your modules. The only caution is that you need to
    call underlying statvfs() call to actually get system-specific
    capabilities (and other fields) added. Then add module-specific ones.

commit 75cc08661473cce62756fa062071bb2bc1fb39ec
Author: Alexander Bokovoy <ab at samba.org>
Date:   Thu Jan 17 14:57:35 2008 +0300

    Rework of VFS is_offline() function to only return boolean offline/online result for a file.
    
    This makes sense as upper levels are only taking returned result of 0
    (no error) into consideration when deciding whether to mark file
    offline/online as returned from is_offline.
    
    That means that we simply can move the decision down to VFS module and
    clean up upper levels so that they always see only file status. If there
    is an error when trying to identify file status, then VFS module could
    decide what to return (offline or online) by itself -- after all, it
    ought to have system-specific knowledge anyway.

-----------------------------------------------------------------------

Summary of changes:
 examples/VFS/skel_opaque.c      |   10 ++--------
 examples/VFS/skel_transparent.c |    5 ++---
 source/include/vfs.h            |    6 +-----
 source/include/vfs_macros.h     |    9 +++------
 source/modules/vfs_default.c    |   19 ++++---------------
 source/modules/vfs_tsmsm.c      |   34 +++++++++++++++++++---------------
 source/smbd/dosmode.c           |    5 ++---
 source/smbd/trans2.c            |   10 ++++------
 8 files changed, 37 insertions(+), 61 deletions(-)


Changeset truncated at 500 lines:

diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c
index 1c2fc45..4a6e6be 100644
--- a/examples/VFS/skel_opaque.c
+++ b/examples/VFS/skel_opaque.c
@@ -585,9 +585,9 @@ static bool skel_aio_force(struct vfs_handle_struct *handle, struct files_struct
 	return vfswrap_aio_force(NULL, fsp);
 }
 
-static int skel_is_offline(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf, bool *offline)
+static bool skel_is_offline(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf)
 {
-	return vfswrap_set_offline(NULL, path, sbuf, offline);
+	return vfswrap_is_offline(NULL, path, sbuf);
 }
 
 static int skel_set_offline(struct vfs_handle_struct *handle, const char *path)
@@ -595,11 +595,6 @@ static int skel_set_offline(struct vfs_handle_struct *handle, const char *path)
 	return vfswrap_set_offline(NULL, path);
 }
 
-static bool skel_is_remotestorage(struct vfs_handle_struct *handle, const char *path)
-{
-	return vfswrap_is_remotestorage(NULL, path);
-}
-
 /* VFS operations structure */
 
 static vfs_op_tuple skel_op_tuples[] = {
@@ -724,7 +719,6 @@ static vfs_op_tuple skel_op_tuples[] = {
         /* offline operations */
 	{SMB_VFS_OP(skel_is_offline),		        SMB_VFS_OP_IS_OFFLINE,			SMB_VFS_LAYER_OPAQUE},
 	{SMB_VFS_OP(skel_set_offline),			SMB_VFS_OP_SET_OFFLINE,			SMB_VFS_LAYER_OPAQUE},
-	{SMB_VFS_OP(skel_is_remotestorage),		SMB_VFS_OP_IS_REMOTESTORAGE,		SMB_VFS_LAYER_OPAQUE},
 
 	{NULL,						SMB_VFS_OP_NOOP,			SMB_VFS_LAYER_NOOP}
 };
diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c
index 0a93497..f4cb9b1 100644
--- a/examples/VFS/skel_transparent.c
+++ b/examples/VFS/skel_transparent.c
@@ -544,9 +544,9 @@ static bool skel_aio_force(struct vfs_handle_struct *handle, struct files_struct
         return SMB_VFS_NEXT_AIO_FORCE(handle, fsp);
 }
 
-static int skel_is_offline(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf, bool *offline)
+static bool skel_is_offline(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf)
 {
-	return SMB_VFS_NEXT_IS_OFFLINE(handle, path, sbuf, offline);
+	return SMB_VFS_NEXT_IS_OFFLINE(handle, path, sbuf);
 }
 
 static int skel_set_offline(struct vfs_handle_struct *handle, const char *path)
@@ -681,7 +681,6 @@ static vfs_op_tuple skel_op_tuples[] = {
 	/* offline operations */
 	{SMB_VFS_OP(skel_is_offline),			SMB_VFS_OP_IS_OFFLINE,			SMB_VFS_LAYER_TRANSPARENT},
 	{SMB_VFS_OP(skel_set_offline),			SMB_VFS_OP_SET_OFFLINE,			SMB_VFS_LAYER_TRANSPARENT},
-	{SMB_VFS_OP(skel_is_remotestorage),		SMB_VFS_OP_IS_REMOTESTORAGE,		SMB_VFS_LAYER_TRANSPARENT},
 
 	{NULL,						SMB_VFS_OP_NOOP,			SMB_VFS_LAYER_NOOP}
 };
diff --git a/source/include/vfs.h b/source/include/vfs.h
index b0da7e8..d03cf34 100644
--- a/source/include/vfs.h
+++ b/source/include/vfs.h
@@ -261,7 +261,6 @@ typedef enum _vfs_op_type {
 	/* offline operations */
 	SMB_VFS_OP_IS_OFFLINE,
 	SMB_VFS_OP_SET_OFFLINE,
-	SMB_VFS_OP_IS_REMOTESTORAGE,
 
 	/* This should always be last enum value */
 
@@ -413,10 +412,8 @@ struct vfs_ops {
 		bool (*aio_force)(struct vfs_handle_struct *handle, struct files_struct *fsp);
 
 		/* offline operations */
-		int (*is_offline)(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf, bool *offline);
+		bool (*is_offline)(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf);
 		int (*set_offline)(struct vfs_handle_struct *handle, const char *path);
-		bool (*is_remotestorage)(struct vfs_handle_struct *handle, const char *path);
-
 	} ops;
 
 	struct vfs_handles_pointers {
@@ -542,7 +539,6 @@ struct vfs_ops {
 		/* offline operations */
 		struct vfs_handle_struct *is_offline;
 		struct vfs_handle_struct *set_offline;
-		struct vfs_handle_struct *is_remotestorage;
 	} handles;
 };
 
diff --git a/source/include/vfs_macros.h b/source/include/vfs_macros.h
index 39f245f..dd30f97 100644
--- a/source/include/vfs_macros.h
+++ b/source/include/vfs_macros.h
@@ -141,9 +141,8 @@
 #define SMB_VFS_AIO_FORCE(fsp) ((fsp)->conn->vfs.ops.aio_force((fsp)->conn->vfs.handles.aio_force,(fsp)))
 
 /* Offline operations */
-#define SMB_VFS_IS_OFFLINE(conn,path,sbuf,offline) ((conn)->vfs.ops.is_offline((conn)->vfs.handles.is_offline,(path),(sbuf),(offline)))
+#define SMB_VFS_IS_OFFLINE(conn,path,sbuf) ((conn)->vfs.ops.is_offline((conn)->vfs.handles.is_offline,(path),(sbuf)))
 #define SMB_VFS_SET_OFFLINE(conn,path) ((conn)->vfs.ops.set_offline((conn)->vfs.handles.set_offline,(path)))
-#define SMB_VFS_IS_REMOTESTORAGE(conn,path) ((conn)->vfs.ops.is_remotestorage((conn)->vfs.handles.is_remotestorage,(path)))
 
 /*******************************************************************
  Don't access conn->vfs_opaque.ops directly!!!
@@ -266,9 +265,8 @@
 #define SMB_VFS_OPAQUE_AIO_FORCE(fsp) ((fsp)->conn->vfs_opaque.ops.aio_force((fsp)->conn->vfs_opaque.handles.aio_force,(fsp)))
 
 /* Offline operations */
-#define SMB_VFS_OPAQUE_IS_OFFLINE(conn,path,sbuf,offline) ((conn)->vfs_opaque.ops.is_offline((conn)->vfs_opaque.handles.is_offline,(path),(sbuf),(offline)))
+#define SMB_VFS_OPAQUE_IS_OFFLINE(conn,path,sbuf) ((conn)->vfs_opaque.ops.is_offline((conn)->vfs_opaque.handles.is_offline,(path),(sbuf)))
 #define SMB_VFS_OPAQUE_SET_OFFLINE(conn,path) ((conn)->vfs_opaque.ops.set_offline((conn)->vfs_opaque.handles.set_offline,(path)))
-#define SMB_VFS_OPAQUE_IS_REMOTESTORAGE(conn,path) ((conn)->vfs_opaque.ops.is_remotestorage((conn)->vfs_opaque.handles.is_remotestorage,(path)))
 
 /*******************************************************************
  Don't access handle->vfs_next.ops.* directly!!!
@@ -392,8 +390,7 @@
 #define SMB_VFS_NEXT_AIO_FORCE(handle,fsp) ((handle)->vfs_next.ops.aio_force((handle)->vfs_next.handles.aio_force,(fsp)))
 
 /* Offline operations */
-#define SMB_VFS_NEXT_IS_OFFLINE(handle,path,sbuf,offline) ((handle)->vfs_next.ops.is_offline((handle)->vfs_next.handles.is_offline,(path),(sbuf),(offline)))
+#define SMB_VFS_NEXT_IS_OFFLINE(handle,path,sbuf) ((handle)->vfs_next.ops.is_offline((handle)->vfs_next.handles.is_offline,(path),(sbuf)))
 #define SMB_VFS_NEXT_SET_OFFLINE(handle,path) ((handle)->vfs_next.ops.set_offline((handle)->vfs_next.handles.set_offline,(path)))
-#define SMB_VFS_NEXT_IS_REMOTESTORAGE(handle,path) ((handle)->vfs_next.ops.is_remotestorage((handle)->vfs_next.handles.is_remotestorage,(path)))
 
 #endif /* _VFS_MACROS_H */
diff --git a/source/modules/vfs_default.c b/source/modules/vfs_default.c
index d4ba4dc..31234f2 100644
--- a/source/modules/vfs_default.c
+++ b/source/modules/vfs_default.c
@@ -1230,22 +1230,20 @@ static bool vfswrap_aio_force(struct vfs_handle_struct *handle, struct files_str
 	return false;
 }
 
-static int vfswrap_is_offline(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf, bool *offline)
+static bool vfswrap_is_offline(struct vfs_handle_struct *handle, const char *path, SMB_STRUCT_STAT *sbuf)
 {
 	if (ISDOT(path) || ISDOTDOT(path)) {
-		*offline = false;
-		return 0;
+		return false;
 	}
 
 	if (!lp_dmapi_support(SNUM(handle->conn)) || !dmapi_have_session()) {
 #if defined(ENOTSUP)
 		errno = ENOTSUP;
 #endif
-		return -1;
+		return false;
 	}
 
-	*offline = (dmapi_file_flags(path) & FILE_ATTRIBUTE_OFFLINE) != 0;
-	return 0;
+	return (dmapi_file_flags(path) & FILE_ATTRIBUTE_OFFLINE) != 0;
 }
 
 static int vfswrap_set_offline(struct vfs_handle_struct *handle, const char *path)
@@ -1257,13 +1255,6 @@ static int vfswrap_set_offline(struct vfs_handle_struct *handle, const char *pat
 	return -1;
 }
 
-static bool vfswrap_is_remotestorage(struct vfs_handle_struct *handle, const char *path)
-{
-	/* We don't know how to detect that volume is remote storage. VFS modules should redefine it. */
-	return false;
-}
-
-
 static vfs_op_tuple vfs_default_ops[] = {
 
 	/* Disk operations */
@@ -1488,8 +1479,6 @@ static vfs_op_tuple vfs_default_ops[] = {
 	 SMB_VFS_LAYER_OPAQUE},
 	{SMB_VFS_OP(vfswrap_set_offline),SMB_VFS_OP_SET_OFFLINE,
 	 SMB_VFS_LAYER_OPAQUE},
-	{SMB_VFS_OP(vfswrap_is_remotestorage),SMB_VFS_OP_IS_REMOTESTORAGE,
-	 SMB_VFS_LAYER_OPAQUE},
 
 	/* Finish VFS operations definition */
 
diff --git a/source/modules/vfs_tsmsm.c b/source/modules/vfs_tsmsm.c
index c2d826f..2805488 100644
--- a/source/modules/vfs_tsmsm.c
+++ b/source/modules/vfs_tsmsm.c
@@ -136,24 +136,23 @@ static int tsmsm_connect(struct vfs_handle_struct *handle,
         return SMB_VFS_NEXT_CONNECT(handle, service, user); 
 }
 
-static int tsmsm_is_offline(struct vfs_handle_struct *handle, 
+static bool tsmsm_is_offline(struct vfs_handle_struct *handle, 
 			    const char *path,
-			    SMB_STRUCT_STAT *stbuf,
-			    bool *offline) {
+			    SMB_STRUCT_STAT *stbuf) {
 	struct tsmsm_struct *tsmd = (struct tsmsm_struct *) handle->data;
 	void *dmhandle = NULL;
 	size_t dmhandle_len = 0;
 	size_t rlen;
 	dm_attrname_t dmname;
 	int ret;
+	bool offline;
 
         /* if the file has more than FILE_IS_ONLINE_RATIO of blocks available,
 	   then assume it is not offline (it may not be 100%, as it could be sparse) */
 	if (512 * (off_t)stbuf->st_blocks >= stbuf->st_size * tsmd->online_ratio) {
-		*offline = false;
 		DEBUG(10,("%s not offline: st_blocks=%ld st_size=%ld online_ratio=%.2f\n", 
 			  path, stbuf->st_blocks, stbuf->st_size, tsmd->online_ratio));
-		return 0;
+		return false;
 	}
 	
         /* using POSIX capabilities does not work here. It's a slow path, so 
@@ -167,10 +166,9 @@ static int tsmsm_is_offline(struct vfs_handle_struct *handle,
 
 	/* go the slow DMAPI route */
 	if (dm_path_to_handle((char*)path, &dmhandle, &dmhandle_len) != 0) {
-		ret = -1;
 		DEBUG(2,("dm_path_to_handle failed - assuming offline (%s) - %s\n", 
 			 path, strerror(errno)));
-		*offline = true;
+		offline = true;
 		goto done;
 	}
 
@@ -181,7 +179,7 @@ static int tsmsm_is_offline(struct vfs_handle_struct *handle,
 			    DM_NO_TOKEN, &dmname, 0, NULL, &rlen);
 
 	/* its offline if the IBMObj attribute exists */
-	*offline = (ret == 0 || (ret == -1 && errno == E2BIG));
+	offline = (ret == 0 || (ret == -1 && errno == E2BIG));
 
 	DEBUG(10,("dm_get_dmattr %s ret=%d (%s)\n", path, ret, strerror(errno)));
 
@@ -191,7 +189,7 @@ static int tsmsm_is_offline(struct vfs_handle_struct *handle,
 
 done:
 	unbecome_root();
-	return ret;
+	return offline;
 }
 
 
@@ -296,8 +294,14 @@ static int tsmsm_set_offline(struct vfs_handle_struct *handle,
 	return result;
 }
 
-static bool tsmsm_is_remotestorage(struct vfs_handle_struct *handle, const char *path) {
-	return True;
+static bool tsmsm_statvfs(struct vfs_handle_struct *handle,  const char *path, vfs_statvfs_struct *statbuf)
+{
+	bool result;
+
+	result = SMB_VFS_NEXT_STATVFS(handle, path, statbuf);
+	statbuf->FsCapabilities | = FILE_SUPPORTS_REMOTE_STORAGE | FILE_SUPPORTS_REPARSE_POINTS;
+
+	return result;
 }
 
 static vfs_op_tuple vfs_tsmsm_ops[] = {
@@ -306,6 +310,8 @@ static vfs_op_tuple vfs_tsmsm_ops[] = {
 
 	{SMB_VFS_OP(tsmsm_connect),	SMB_VFS_OP_CONNECT,
 	 SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(tsmsm_statvfs),	SMB_VFS_OP_STATVFS,
+	 SMB_VFS_LAYER_TRANSPARENT},
 	{SMB_VFS_OP(tsmsm_aio_force),	SMB_VFS_OP_AIO_FORCE,
 	 SMB_VFS_LAYER_TRANSPARENT},
 	{SMB_VFS_OP(tsmsm_aio_return),	SMB_VFS_OP_AIO_RETURN,
@@ -316,11 +322,9 @@ static vfs_op_tuple vfs_tsmsm_ops[] = {
 	 SMB_VFS_LAYER_TRANSPARENT},
 	{SMB_VFS_OP(tsmsm_sendfile),	SMB_VFS_OP_SENDFILE,
 	 SMB_VFS_LAYER_TRANSPARENT},
-	{SMB_VFS_OP(tsmsm_is_offline),SMB_VFS_OP_IS_OFFLINE,
-	 SMB_VFS_LAYER_OPAQUE},
-	{SMB_VFS_OP(tsmsm_set_offline),SMB_VFS_OP_SET_OFFLINE,
+	{SMB_VFS_OP(tsmsm_is_offline),	SMB_VFS_OP_IS_OFFLINE,
 	 SMB_VFS_LAYER_OPAQUE},
-	{SMB_VFS_OP(tsmsm_is_remotestorage),SMB_VFS_OP_IS_REMOTESTORAGE,
+	{SMB_VFS_OP(tsmsm_set_offline),	SMB_VFS_OP_SET_OFFLINE,
 	 SMB_VFS_LAYER_OPAQUE},
 
 	/* Finish VFS operations definition */
diff --git a/source/smbd/dosmode.c b/source/smbd/dosmode.c
index 2021621..eb18f65 100644
--- a/source/smbd/dosmode.c
+++ b/source/smbd/dosmode.c
@@ -350,7 +350,6 @@ uint32 dos_mode(connection_struct *conn, const char *path,SMB_STRUCT_STAT *sbuf)
 {
 	uint32 result = 0;
 	bool offline;
-	int ret;
 
 	DEBUG(8,("dos_mode: %s\n", path));
 
@@ -381,8 +380,8 @@ uint32 dos_mode(connection_struct *conn, const char *path,SMB_STRUCT_STAT *sbuf)
 	}
 
 	
-	ret = SMB_VFS_IS_OFFLINE(conn, path, sbuf, &offline);
-	if (S_ISREG(sbuf->st_mode) && (ret == 0) && offline) {
+	offline = SMB_VFS_IS_OFFLINE(conn, path, sbuf);
+	if (S_ISREG(sbuf->st_mode) && offline) {
 		result |= FILE_ATTRIBUTE_OFFLINE;
 	}
 
diff --git a/source/smbd/trans2.c b/source/smbd/trans2.c
index 5729ab5..23d6f12 100644
--- a/source/smbd/trans2.c
+++ b/source/smbd/trans2.c
@@ -2495,12 +2495,10 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_dev, (unsi
 			if(lp_nt_acl_support(SNUM(conn))) {
 				additional_flags |= FILE_PERSISTENT_ACLS;
 			}
-			
-			if(SMB_VFS_IS_REMOTESTORAGE(conn, lp_pathname(SNUM(conn)))) {
-				additional_flags |= FILE_SUPPORTS_REMOTE_STORAGE;
-				additional_flags |= FILE_SUPPORTS_REPARSE_POINTS;
-			}
-			
+
+			/* Capabilities are filled in at connection time through STATVFS call */
+			additional_flags |= conn->fs_capabilities;
+
 			SIVAL(pdata,0,FILE_CASE_PRESERVED_NAMES|FILE_CASE_SENSITIVE_SEARCH|
 				FILE_SUPPORTS_OBJECT_IDS|FILE_UNICODE_ON_DISK|
 				additional_flags); /* FS ATTRIBUTES */


-- 
Samba Shared Repository


More information about the samba-cvs mailing list