[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Aug 9 14:04:02 MDT 2013


The branch, master has been updated
       via  d944841 torture: add smb2 FSCTL_[GET/SET]_COMPRESSION test
       via  8fde65e lib: add FSCTL_[GET/SET]_COMPRESSION constants
       via  86c79f1 torture: split out ioctl test file creation helper
       via  a973b1c VFS plugin was sending the actual size of the volume instead of the total number of block units because of which windows was getting the wrong volume capacity.
      from  44eb680 doc: Fix prefix parameter name in vfs_full_audit man page

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit d944841211a407c3587ccabd3615df55fba72aaf
Author: David Disseldorp <ddiss at samba.org>
Date:   Wed Aug 7 17:16:12 2013 +0200

    torture: add smb2 FSCTL_[GET/SET]_COMPRESSION test
    
    This test simply creates a file and checks the compression state before
    and after FSCTL_SET_COMPRESSION(COMPRESSION_FORMAT_DEFAULT).
    
    The test expects the compression state to be COMPRESSION_FORMAT_LZNT1
    after set, conforming to Windows Server behaviour.
    
    If the server responds to the first FSCTL_GET_COMPRESSION request with
    NT_STATUS_NOT_SUPPORTED or NT_STATUS_INVALID_DEVICE_REQUEST, then the
    test is skipped. This allows it to run during selftest.
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Fri Aug  9 22:03:39 CEST 2013 on sn-devel-104

commit 8fde65e1998e8dfa5210b74c04a5ee6e6c837202
Author: David Disseldorp <ddiss at samba.org>
Date:   Wed Aug 7 17:16:11 2013 +0200

    lib: add FSCTL_[GET/SET]_COMPRESSION constants
    
    Values taken from MS-FSCC.
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 86c79f1ab3146ac83a3ac1fb43808997bcfe0d83
Author: David Disseldorp <ddiss at samba.org>
Date:   Wed Aug 7 17:16:10 2013 +0200

    torture: split out ioctl test file creation helper
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit a973b1ce7a94bd3f11432a6f32b9d9b13b868dfb
Author: Susant Kumar Palai <spalai at redhat.com>
Date:   Tue Aug 6 14:45:06 2013 -0700

    VFS plugin was sending the actual size of the volume instead of the total number of block units because of which windows was getting the wrong volume capacity.
    
    Signed-off-by: Susant Kumar Palai <spalai at redhat.com>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Christopher R. Hertel <crh at samba.org>

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

Summary of changes:
 libcli/smb/smb_constants.h      |    3 +
 librpc/idl/ioctl.idl            |   11 +++
 source3/modules/vfs_glusterfs.c |   11 +--
 source4/torture/smb2/ioctl.c    |  183 +++++++++++++++++++++++++++------------
 4 files changed, 145 insertions(+), 63 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libcli/smb/smb_constants.h b/libcli/smb/smb_constants.h
index 6dd7b28..7144413 100644
--- a/libcli/smb/smb_constants.h
+++ b/libcli/smb/smb_constants.h
@@ -390,6 +390,9 @@ enum csc_policy {
 #define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE  (FSCTL_FILESYSTEM | FSCTL_ACCESS_ANY | 0x000C | FSCTL_METHOD_BUFFERED)
 #define FSCTL_OPBATCH_ACK_CLOSE_PENDING (FSCTL_FILESYSTEM | FSCTL_ACCESS_ANY | 0x0010 | FSCTL_METHOD_BUFFERED)
 #define FSCTL_OPLOCK_BREAK_NOTIFY       (FSCTL_FILESYSTEM | FSCTL_ACCESS_ANY | 0x0014 | FSCTL_METHOD_BUFFERED)
+#define FSCTL_GET_COMPRESSION		(FSCTL_FILESYSTEM | FSCTL_ACCESS_ANY | 0x003C | FSCTL_METHOD_BUFFERED)
+#define FSCTL_SET_COMPRESSION		(FSCTL_FILESYSTEM | FSCTL_ACCESS_READ \
+							  | FSCTL_ACCESS_WRITE | 0x0040 | FSCTL_METHOD_BUFFERED)
 #define FSCTL_FILESYS_GET_STATISTICS	(FSCTL_FILESYSTEM | FSCTL_ACCESS_ANY | 0x0060 | FSCTL_METHOD_BUFFERED)
 #define FSCTL_GET_NTFS_VOLUME_DATA	(FSCTL_FILESYSTEM | FSCTL_ACCESS_ANY | 0x0064 | FSCTL_METHOD_BUFFERED)
 #define FSCTL_IS_VOLUME_DIRTY		(FSCTL_FILESYSTEM | FSCTL_ACCESS_ANY | 0x0078 | FSCTL_METHOD_BUFFERED)
diff --git a/librpc/idl/ioctl.idl b/librpc/idl/ioctl.idl
index 4672777..b4485e0 100644
--- a/librpc/idl/ioctl.idl
+++ b/librpc/idl/ioctl.idl
@@ -88,3 +88,14 @@ interface copychunk
 		hyper length_written;
 	} fsctl_offload_write_output;
 }
+
+interface compression
+{
+	const uint16 COMPRESSION_FORMAT_NONE = 0x0000;
+	const uint16 COMPRESSION_FORMAT_DEFAULT = 0x0001;
+	const uint16 COMPRESSION_FORMAT_LZNT1 = 0x0002;
+
+	typedef [public] struct {
+		uint16 format;
+	} compression_state;
+}
diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c
index 1323e0e..af8d5b7 100644
--- a/source3/modules/vfs_glusterfs.c
+++ b/source3/modules/vfs_glusterfs.c
@@ -301,7 +301,6 @@ static uint64_t vfs_gluster_disk_free(struct vfs_handle_struct *handle,
 				      uint64_t *dsize_p)
 {
 	struct statvfs statvfs = { 0, };
-	uint64_t dfree = 0;
 	int ret;
 
 	ret = glfs_statvfs(handle->data, path, &statvfs);
@@ -309,19 +308,17 @@ static uint64_t vfs_gluster_disk_free(struct vfs_handle_struct *handle,
 		return -1;
 	}
 
-	dfree = statvfs.f_bsize * statvfs.f_bavail;
-
 	if (bsize_p != NULL) {
-		*bsize_p = statvfs.f_bsize;
+		*bsize_p = (uint64_t)statvfs.f_bsize; /* Block size */
 	}
 	if (dfree_p != NULL) {
-		*dfree_p = dfree;
+		*dfree_p = (uint64_t)statvfs.f_bavail; /* Available Block units */
 	}
 	if (dsize_p != NULL) {
-		*dsize_p = statvfs.f_bsize * statvfs.f_blocks;
+		*dsize_p = (uint64_t)statvfs.f_blocks; /* Total Block units */
 	}
 
-	return dfree;
+	return (uint64_t)statvfs.f_bavail;
 }
 
 static int vfs_gluster_get_quota(struct vfs_handle_struct *handle,
diff --git a/source4/torture/smb2/ioctl.c b/source4/torture/smb2/ioctl.c
index 501b233..6b5895b 100644
--- a/source4/torture/smb2/ioctl.c
+++ b/source4/torture/smb2/ioctl.c
@@ -148,90 +148,78 @@ static bool check_pattern(struct torture_context *torture,
 	return true;
 }
 
-static bool test_setup_copy_chunk(struct torture_context *torture,
-				  struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
-				  uint32_t nchunks,
-				  struct smb2_handle *src_h,
-				  uint64_t src_size,
-				  uint32_t src_desired_access,
-				  struct smb2_handle *dest_h,
-				  uint64_t dest_size,
-				  uint32_t dest_desired_access,
-				  struct srv_copychunk_copy *cc_copy,
-				  union smb_ioctl *ioctl)
+static bool test_setup_create_fill(struct torture_context *torture,
+				   struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
+				   const char *fname,
+				   struct smb2_handle *fh,
+				   uint64_t size,
+				   uint32_t desired_access)
 {
-	struct req_resume_key_rsp res_key;
 	struct smb2_create io;
 	NTSTATUS status;
-	enum ndr_err_code ndr_ret;
 	uint64_t i;
-	uint8_t *buf = talloc_zero_size(mem_ctx, MAX(src_size, dest_size));
+	uint8_t *buf = talloc_zero_size(mem_ctx, size);
 	torture_assert(torture, (buf != NULL), "no memory for file data buf");
 
-	smb2_util_unlink(tree, FNAME);
-	smb2_util_unlink(tree, FNAME2);
+	smb2_util_unlink(tree, fname);
 
 	ZERO_STRUCT(io);
-	io.in.desired_access = src_desired_access;
+	io.in.desired_access = desired_access;
 	io.in.file_attributes   = FILE_ATTRIBUTE_NORMAL;
 	io.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
 	io.in.share_access =
 		NTCREATEX_SHARE_ACCESS_DELETE|
 		NTCREATEX_SHARE_ACCESS_READ|
 		NTCREATEX_SHARE_ACCESS_WRITE;
-	io.in.fname = FNAME;
+	io.in.fname = fname;
 
 	status = smb2_create(tree, mem_ctx, &io);
-	torture_assert_ntstatus_ok(torture, status, "src create");
+	torture_assert_ntstatus_ok(torture, status, "file create");
 
-	*src_h = io.out.file.handle;
+	*fh = io.out.file.handle;
 
-	if (src_size > 0) {
+	if (size > 0) {
 		uint64_t cur_off = 0;
-		for (i = 0; i <= src_size - 8; i += 8) {
+		for (i = 0; i <= size - 8; i += 8) {
 			SBVAL(buf, i, patt_hash(i));
 		}
-		while (src_size > 0) {
-			uint64_t io_sz = MIN(1024 * 1024, src_size);
-			status = smb2_util_write(tree, *src_h,
+		while (size > 0) {
+			uint64_t io_sz = MIN(1024 * 1024, size);
+			status = smb2_util_write(tree, *fh,
 						 buf + cur_off, cur_off, io_sz);
-			torture_assert_ntstatus_ok(torture, status, "src write");
+			torture_assert_ntstatus_ok(torture, status, "file write");
 
-			src_size -= io_sz;
+			size -= io_sz;
 			cur_off += io_sz;
 		}
 	}
+	return true;
+}
 
-	ZERO_STRUCT(io);
-	io.in.desired_access = dest_desired_access;
-	io.in.file_attributes   = FILE_ATTRIBUTE_NORMAL;
-	io.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
-	io.in.share_access =
-		NTCREATEX_SHARE_ACCESS_DELETE|
-		NTCREATEX_SHARE_ACCESS_READ|
-		NTCREATEX_SHARE_ACCESS_WRITE;
-	io.in.fname = FNAME2;
-
-	status = smb2_create(tree, mem_ctx, &io);
-	torture_assert_ntstatus_ok(torture, status, "dest create");
-
-	*dest_h = io.out.file.handle;
+static bool test_setup_copy_chunk(struct torture_context *torture,
+				  struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
+				  uint32_t nchunks,
+				  struct smb2_handle *src_h,
+				  uint64_t src_size,
+				  uint32_t src_desired_access,
+				  struct smb2_handle *dest_h,
+				  uint64_t dest_size,
+				  uint32_t dest_desired_access,
+				  struct srv_copychunk_copy *cc_copy,
+				  union smb_ioctl *ioctl)
+{
+	struct req_resume_key_rsp res_key;
+	bool ok;
+	NTSTATUS status;
+	enum ndr_err_code ndr_ret;
 
-	if (dest_size > 0) {
-		uint64_t cur_off = 0;
-		for (i = 0; i <= dest_size - 8; i += 8) {
-			SBVAL(buf, i, patt_hash(i));
-		}
-		while (dest_size > 0) {
-			uint64_t io_sz = MIN(1024 * 1024, dest_size);
-			status = smb2_util_write(tree, *dest_h,
-						 buf + cur_off, cur_off, io_sz);
-			torture_assert_ntstatus_ok(torture, status, "dest write");
+	ok = test_setup_create_fill(torture, tree, mem_ctx, FNAME,
+				    src_h, src_size, src_desired_access);
+	torture_assert(torture, ok, "src file create fill");
 
-			dest_size -= io_sz;
-			cur_off += io_sz;
-		}
-	}
+	ok = test_setup_create_fill(torture, tree, mem_ctx, FNAME2,
+				    dest_h, dest_size, dest_desired_access);
+	torture_assert(torture, ok, "dest file create fill");
 
 	ZERO_STRUCTPN(ioctl);
 	ioctl->smb2.level = RAW_IOCTL_SMB2;
@@ -245,7 +233,6 @@ static bool test_setup_copy_chunk(struct torture_context *torture,
 	torture_assert_ntstatus_ok(torture, status,
 				   "FSCTL_SRV_REQUEST_RESUME_KEY");
 
-
 	ndr_ret = ndr_pull_struct_blob(&ioctl->smb2.out.out, mem_ctx, &res_key,
 			(ndr_pull_flags_fn_t)ndr_pull_req_resume_key_rsp);
 
@@ -1543,6 +1530,88 @@ static bool test_ioctl_copy_chunk_max_output_sz(struct torture_context *torture,
 	return true;
 }
 
+static bool test_ioctl_compress_file_flag(struct torture_context *torture,
+					    struct smb2_tree *tree)
+{
+	struct smb2_handle fh;
+	NTSTATUS status;
+	union smb_ioctl ioctl;
+	TALLOC_CTX *tmp_ctx = talloc_new(tree);
+	struct compression_state cmpr_state;
+	enum ndr_err_code ndr_ret;
+	bool ok;
+
+	ok = test_setup_create_fill(torture, tree, tmp_ctx,
+				    FNAME, &fh, 0, SEC_RIGHTS_FILE_ALL);
+	torture_assert(torture, ok, "setup compression file");
+
+	ZERO_STRUCT(ioctl);
+	ioctl.smb2.level = RAW_IOCTL_SMB2;
+	ioctl.smb2.in.file.handle = fh;
+	ioctl.smb2.in.function = FSCTL_GET_COMPRESSION;
+	ioctl.smb2.in.max_response_size = sizeof(struct compression_state);
+	ioctl.smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
+
+	status = smb2_ioctl(tree, tmp_ctx, &ioctl.smb2);
+	if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)
+	 || NT_STATUS_EQUAL(status, NT_STATUS_INVALID_DEVICE_REQUEST)) {
+		smb2_util_close(tree, fh);
+		torture_skip(torture, "FSCTL_GET_COMPRESSION not supported\n");
+	}
+	torture_assert_ntstatus_ok(torture, status, "FSCTL_GET_COMPRESSION");
+
+	ndr_ret = ndr_pull_struct_blob(&ioctl.smb2.out.out, tmp_ctx,
+				       &cmpr_state,
+			(ndr_pull_flags_fn_t)ndr_pull_compression_state);
+
+	torture_assert_ndr_success(torture, ndr_ret,
+				   "ndr_pull_compression_state");
+
+	torture_assert(torture, (cmpr_state.format == COMPRESSION_FORMAT_NONE),
+		       "initial compression state not NONE");
+
+	ZERO_STRUCT(ioctl);
+	ioctl.smb2.level = RAW_IOCTL_SMB2;
+	ioctl.smb2.in.file.handle = fh;
+	ioctl.smb2.in.function = FSCTL_SET_COMPRESSION;
+	ioctl.smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
+
+	cmpr_state.format = COMPRESSION_FORMAT_DEFAULT;
+	ndr_ret = ndr_push_struct_blob(&ioctl.smb2.in.out, tmp_ctx,
+				       &cmpr_state,
+			(ndr_push_flags_fn_t)ndr_push_compression_state);
+	torture_assert_ndr_success(torture, ndr_ret,
+				   "ndr_push_compression_state");
+
+	status = smb2_ioctl(tree, tmp_ctx, &ioctl.smb2);
+	torture_assert_ntstatus_ok(torture, status, "FSCTL_SET_COMPRESSION");
+
+	ZERO_STRUCT(ioctl);
+	ioctl.smb2.level = RAW_IOCTL_SMB2;
+	ioctl.smb2.in.file.handle = fh;
+	ioctl.smb2.in.function = FSCTL_GET_COMPRESSION;
+	ioctl.smb2.in.max_response_size = sizeof(struct compression_state);
+	ioctl.smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
+
+	status = smb2_ioctl(tree, tmp_ctx, &ioctl.smb2);
+	torture_assert_ntstatus_ok(torture, status,
+				   "FSCTL_GET_COMPRESSION");
+
+	ndr_ret = ndr_pull_struct_blob(&ioctl.smb2.out.out, tmp_ctx,
+				       &cmpr_state,
+			(ndr_pull_flags_fn_t)ndr_pull_compression_state);
+
+	torture_assert_ndr_success(torture, ndr_ret,
+				   "ndr_pull_compression_state");
+
+	torture_assert(torture, (cmpr_state.format == COMPRESSION_FORMAT_LZNT1),
+		       "invalid compression state after set");
+
+	smb2_util_close(tree, fh);
+	talloc_free(tmp_ctx);
+	return true;
+}
+
 /*
    basic testing of SMB2 ioctls
 */
@@ -1586,6 +1655,8 @@ struct torture_suite *torture_smb2_ioctl_init(void)
 				     test_ioctl_copy_chunk_sparse_dest);
 	torture_suite_add_1smb2_test(suite, "copy_chunk_max_output_sz",
 				     test_ioctl_copy_chunk_max_output_sz);
+	torture_suite_add_1smb2_test(suite, "compress_file_flag",
+				     test_ioctl_compress_file_flag);
 
 	suite->description = talloc_strdup(suite, "SMB2-IOCTL tests");
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list