summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/vfs.h5
-rw-r--r--source3/include/vfs_macros.h8
-rw-r--r--source3/modules/vfs_default.c3
-rw-r--r--source3/modules/vfs_full_audit.c12
-rw-r--r--source3/modules/vfs_onefs_shadow_copy.c3
-rw-r--r--source3/modules/vfs_tsmsm.c11
-rw-r--r--source3/smbd/dosmode.c2
-rw-r--r--source3/smbd/vfs.c4
8 files changed, 36 insertions, 12 deletions
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 304f04356c..64820afedf 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -404,7 +404,8 @@ struct vfs_fn_pointers {
bool (*is_offline)(struct vfs_handle_struct *handle,
const struct smb_filename *fname,
SMB_STRUCT_STAT *sbuf);
- int (*set_offline)(struct vfs_handle_struct *handle, const char *path);
+ int (*set_offline)(struct vfs_handle_struct *handle,
+ const struct smb_filename *fname);
};
/*
@@ -820,6 +821,6 @@ bool smb_vfs_call_is_offline(struct vfs_handle_struct *handle,
const struct smb_filename *fname,
SMB_STRUCT_STAT *sbuf);
int smb_vfs_call_set_offline(struct vfs_handle_struct *handle,
- const char *path);
+ const struct smb_filename *fname);
#endif /* _VFS_H */
diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h
index 029806d335..d04be9b5aa 100644
--- a/source3/include/vfs_macros.h
+++ b/source3/include/vfs_macros.h
@@ -607,9 +607,9 @@
#define SMB_VFS_NEXT_IS_OFFLINE(handle,fname,sbuf) \
smb_vfs_call_is_offline((handle)->next,(fname),(sbuf))
-#define SMB_VFS_SET_OFFLINE(conn,path) \
- smb_vfs_call_set_offline((conn)->vfs_handles,(path))
-#define SMB_VFS_NEXT_SET_OFFLINE(handle,path) \
- smb_vfs_call_set_offline((handle)->next, (path))
+#define SMB_VFS_SET_OFFLINE(conn,fname) \
+ smb_vfs_call_set_offline((conn)->vfs_handles,(fname))
+#define SMB_VFS_NEXT_SET_OFFLINE(handle,fname) \
+ smb_vfs_call_set_offline((handle)->next, (fname))
#endif /* _VFS_MACROS_H */
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 6ad538149a..b7e70a608b 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -1634,7 +1634,8 @@ static bool vfswrap_is_offline(struct vfs_handle_struct *handle,
return (dmapi_file_flags(path) & FILE_ATTRIBUTE_OFFLINE) != 0;
}
-static int vfswrap_set_offline(struct vfs_handle_struct *handle, const char *path)
+static int vfswrap_set_offline(struct vfs_handle_struct *handle,
+ const struct smb_filename *fname)
{
/* We don't know how to set offline bit by default, needs to be overriden in the vfs modules */
#if defined(ENOTSUP)
diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c
index e5c375ad95..303ffae660 100644
--- a/source3/modules/vfs_full_audit.c
+++ b/source3/modules/vfs_full_audit.c
@@ -2215,6 +2215,17 @@ static bool smb_full_audit_is_offline(struct vfs_handle_struct *handle,
return result;
}
+static int smb_full_audit_set_offline(struct vfs_handle_struct *handle,
+ const struct smb_filename *fname)
+{
+ int result;
+
+ result = SMB_VFS_NEXT_SET_OFFLINE(handle, fname);
+ do_log(SMB_VFS_OP_SET_OFFLINE, result >= 0, handle, "%s",
+ smb_fname_str_do_log(fname));
+ return result;
+}
+
static struct vfs_fn_pointers vfs_full_audit_fns = {
/* Disk operations */
@@ -2333,6 +2344,7 @@ static struct vfs_fn_pointers vfs_full_audit_fns = {
.aio_suspend = smb_full_audit_aio_suspend,
.aio_force = smb_full_audit_aio_force,
.is_offline = smb_full_audit_is_offline,
+ .set_offline = smb_full_audit_set_offline,
};
NTSTATUS vfs_full_audit_init(void)
diff --git a/source3/modules/vfs_onefs_shadow_copy.c b/source3/modules/vfs_onefs_shadow_copy.c
index a6681c0ab4..9011f6da77 100644
--- a/source3/modules/vfs_onefs_shadow_copy.c
+++ b/source3/modules/vfs_onefs_shadow_copy.c
@@ -645,8 +645,9 @@ onefs_shadow_copy_is_offline(struct vfs_handle_struct *handle,
static int
onefs_shadow_copy_set_offline(struct vfs_handle_struct *handle,
- const char *path)
+ const struct smb_filename *fname)
{
+#error Isilon, please convert "char *path" to "struct smb_fname *fname"
SHADOW_NEXT(SET_OFFLINE,
(handle, cpath ?: path),
int);
diff --git a/source3/modules/vfs_tsmsm.c b/source3/modules/vfs_tsmsm.c
index 533fde2003..6383891913 100644
--- a/source3/modules/vfs_tsmsm.c
+++ b/source3/modules/vfs_tsmsm.c
@@ -349,10 +349,13 @@ static ssize_t tsmsm_pwrite(struct vfs_handle_struct *handle, struct files_struc
}
static int tsmsm_set_offline(struct vfs_handle_struct *handle,
- const char *path) {
+ const struct smb_filename *fname)
+{
struct tsmsm_struct *tsmd = (struct tsmsm_struct *) handle->data;
int result = 0;
char *command;
+ NTSTATUS status;
+ char *path;
if (tsmd->hsmscript == NULL) {
/* no script enabled */
@@ -360,6 +363,12 @@ static int tsmsm_set_offline(struct vfs_handle_struct *handle,
return 0;
}
+ status = get_full_smb_filename(talloc_tos(), fname, &path);
+ if (!NT_STATUS_IS_OK(status)) {
+ errno = map_errno_from_nt_status(status);
+ return false;
+ }
+
/* Now, call the script */
command = talloc_asprintf(tsmd, "%s offline \"%s\"", tsmd->hsmscript, path);
if(!command) {
diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c
index 307da32bc3..325a3c6461 100644
--- a/source3/smbd/dosmode.c
+++ b/source3/smbd/dosmode.c
@@ -719,7 +719,7 @@ int file_set_dosmode(connection_struct *conn, struct smb_filename *smb_fname,
if (dosmode & FILE_ATTRIBUTE_OFFLINE) {
if (!(old_mode & FILE_ATTRIBUTE_OFFLINE)) {
- lret = SMB_VFS_SET_OFFLINE(conn, smb_fname->base_name);
+ lret = SMB_VFS_SET_OFFLINE(conn, smb_fname);
if (lret == -1) {
DEBUG(0, ("set_dos_mode: client has asked to "
"set FILE_ATTRIBUTE_OFFLINE to "
diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c
index 71de587d17..41d3650413 100644
--- a/source3/smbd/vfs.c
+++ b/source3/smbd/vfs.c
@@ -2014,8 +2014,8 @@ bool smb_vfs_call_is_offline(struct vfs_handle_struct *handle,
}
int smb_vfs_call_set_offline(struct vfs_handle_struct *handle,
- const char *path)
+ const struct smb_filename *fname)
{
VFS_FIND(set_offline);
- return handle->fns->set_offline(handle, path);
+ return handle->fns->set_offline(handle, fname);
}