summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/VFS/skel_opaque.c6
-rw-r--r--examples/VFS/skel_transparent.c1
-rw-r--r--source3/include/vfs.h4
-rw-r--r--source3/include/vfs_macros.h3
-rw-r--r--source3/modules/vfs_default.c9
-rw-r--r--source3/modules/vfs_tsmsm.c18
-rw-r--r--source3/smbd/trans2.c10
7 files changed, 16 insertions, 35 deletions
diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c
index 42154c47a6..4a6e6be42f 100644
--- a/examples/VFS/skel_opaque.c
+++ b/examples/VFS/skel_opaque.c
@@ -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 997783819c..f4cb9b15ba 100644
--- a/examples/VFS/skel_transparent.c
+++ b/examples/VFS/skel_transparent.c
@@ -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/source3/include/vfs.h b/source3/include/vfs.h
index da5494927e..d03cf3477d 100644
--- a/source3/include/vfs.h
+++ b/source3/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 */
@@ -415,8 +414,6 @@ struct vfs_ops {
/* offline operations */
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/source3/include/vfs_macros.h b/source3/include/vfs_macros.h
index f7c7e7d623..dd30f977dc 100644
--- a/source3/include/vfs_macros.h
+++ b/source3/include/vfs_macros.h
@@ -143,7 +143,6 @@
/* Offline operations */
#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!!!
@@ -268,7 +267,6 @@
/* Offline operations */
#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!!!
@@ -394,6 +392,5 @@
/* Offline operations */
#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/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 755bcdeefa..31234f23ec 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -1255,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 */
@@ -1486,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/source3/modules/vfs_tsmsm.c b/source3/modules/vfs_tsmsm.c
index c737032907..2805488e8b 100644
--- a/source3/modules/vfs_tsmsm.c
+++ b/source3/modules/vfs_tsmsm.c
@@ -294,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[] = {
@@ -304,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,
@@ -314,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/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 5729ab5349..23d6f12996 100644
--- a/source3/smbd/trans2.c
+++ b/source3/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 */