[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Wed Mar 18 14:33:04 MDT 2015


The branch, master has been updated
       via  74ff89a torture/ioctl: add simple FSCTL_FILE_LEVEL_TRIM test
       via  5776904 idl: FSCTL_FILE_LEVEL_TRIM request & response structs
       via  97a2d83 torture: test FS_SECTOR_SIZE_INFORMATION queries
       via  d1e664f s4/ntvfs: support FS_SECTOR_SIZE_INFORMATION query-info
       via  664dca2 s4/client: add FS_SECTOR_SIZE_INFORMATION query support
       via  ba9fd54 s3/smbd: support FS_SECTOR_SIZE_INFORMATION query-info
       via  8fb488c smbd/trans2: function scope qfsinfo bytes_per_sector
      from  8421c40 s4:kdc: fix realm for outgoing trusts in samba_kdc_trust_message2entry()

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


- Log -----------------------------------------------------------------
commit 74ff89a7e32ad46275fb9fe54d3e23c69d925ca7
Author: David Disseldorp <ddiss at samba.org>
Date:   Thu Mar 12 11:01:17 2015 +0100

    torture/ioctl: add simple FSCTL_FILE_LEVEL_TRIM test
    
    This test writes out a 128K file and then attempts to trim the first
    half of the file. Trim support is first detected using an
    FS_SECTOR_SIZE_INFORMATION query-info request. If the server doesn't
    support trim, then the test is skipped.
    
    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): Wed Mar 18 21:32:47 CET 2015 on sn-devel-104

commit 5776904defab1148027232bcc826c811e1a889f9
Author: David Disseldorp <ddiss at samba.org>
Date:   Wed Mar 11 14:50:16 2015 +0100

    idl: FSCTL_FILE_LEVEL_TRIM request & response structs
    
    As defined in MS-FSCC 2.3.73 - 2.3.74.
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 97a2d83662550d2b754c2b0f0e4775054aa16bcd
Author: David Disseldorp <ddiss at samba.org>
Date:   Fri Mar 13 01:06:26 2015 +0100

    torture: test FS_SECTOR_SIZE_INFORMATION queries
    
    The smb2.fsinfo test is run against ntvfs and s3fs. With both now
    offering support for the FS_SECTOR_SIZE_INFORMATION query-info level,
    it can be added to the existing level enumeration.
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit d1e664f154553e4e2a7a64ff18fcbe979359ab73
Author: David Disseldorp <ddiss at samba.org>
Date:   Fri Mar 13 01:00:51 2015 +0100

    s4/ntvfs: support FS_SECTOR_SIZE_INFORMATION query-info
    
    Return the same values as used by s3fs.
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 664dca2b44c96a6ef1fd5fb920adbf274a3a6c01
Author: David Disseldorp <ddiss at samba.org>
Date:   Fri Mar 13 00:46:21 2015 +0100

    s4/client: add FS_SECTOR_SIZE_INFORMATION query support
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit ba9fd54bdf32009f725006660bb81965885501b9
Author: David Disseldorp <ddiss at samba.org>
Date:   Fri Mar 13 00:34:58 2015 +0100

    s3/smbd: support FS_SECTOR_SIZE_INFORMATION query-info
    
    The FS_SECTOR_SIZE_INFORMATION query-info level reports sector alignment
    information for an underlying share volume, as well as NO_SEEK_PENALTY
    and TRIM_ENABLED flags useful for SSD / thin-provisioned storage
    detection.
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 8fb488cbcd25ab8d8552fc13e450cc54974303bc
Author: David Disseldorp <ddiss at samba.org>
Date:   Thu Mar 12 17:02:56 2015 +0100

    smbd/trans2: function scope qfsinfo bytes_per_sector
    
    It's needed for multiple info levels.
    
    Signed-off-by: David Disseldorp <ddiss at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 librpc/idl/ioctl.idl              |  21 ++++++
 source3/include/trans2.h          |   9 +++
 source3/smbd/trans2.c             |  38 +++++++++--
 source4/client/client.c           |  17 +++++
 source4/libcli/raw/interfaces.h   |  20 +++++-
 source4/libcli/raw/rawfsinfo.c    |  21 ++++++
 source4/libcli/raw/trans2.h       |   8 +++
 source4/ntvfs/ntvfs_generic.c     |  16 +++++
 source4/ntvfs/posix/pvfs_fsinfo.c |  15 ++++
 source4/smb_server/blob.c         |  20 ++++++
 source4/torture/smb2/getinfo.c    |   3 +-
 source4/torture/smb2/ioctl.c      | 140 ++++++++++++++++++++++++++++++++++++++
 12 files changed, 320 insertions(+), 8 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/ioctl.idl b/librpc/idl/ioctl.idl
index 5efb9d8..5c3ee6d 100644
--- a/librpc/idl/ioctl.idl
+++ b/librpc/idl/ioctl.idl
@@ -200,3 +200,24 @@ interface resiliency
 		uint32 reserved;
 	} network_resiliency_request;
 }
+
+interface trim
+{
+	/* MS-FSCC 2.3.73.1 FILE_LEVEL_TRIM_RANGE */
+	typedef [public] struct {
+		hyper off;
+		hyper len;
+	} file_level_trim_range;
+
+	/* MS-FSCC 2.3.73 FSCTL_FILE_LEVEL_TRIM Request */
+	typedef [public] struct {
+		uint32 key;
+		uint32 num_ranges;
+		file_level_trim_range ranges[num_ranges];
+	} fsctl_file_level_trim_req;
+
+	/* MS-FSCC 2.3.74 FSCTL_FILE_LEVEL_TRIM Reply */
+	typedef [public] struct {
+		uint32 num_ranges_processed;
+	} fsctl_file_level_trim_rsp;
+}
diff --git a/source3/include/trans2.h b/source3/include/trans2.h
index 7a8c411..3085344 100644
--- a/source3/include/trans2.h
+++ b/source3/include/trans2.h
@@ -282,6 +282,14 @@ Byte offset   Type     name                description
 #define TYPE_MOUNTED			0x20
 #define TYPE_VIRTUAL			0x40
 
+/* SMB_FS_SECTOR_SIZE_INFORMATION values */
+#define SSINFO_FLAGS_ALIGNED_DEVICE			0x00000001
+#define SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE	0x00000002
+#define SSINFO_FLAGS_NO_SEEK_PENALTY			0x00000004
+#define SSINFO_FLAGS_TRIM_ENABLED			0x00000008
+
+#define SSINFO_OFFSET_UNKNOWN				0xffffffff
+
 /* NT passthrough levels... */
 
 #define SMB_FILE_DIRECTORY_INFORMATION			1001
@@ -333,6 +341,7 @@ Byte offset   Type     name                description
 #define SMB_FS_QUOTA_INFORMATION			1006
 #define SMB_FS_FULL_SIZE_INFORMATION			1007
 #define SMB_FS_OBJECTID_INFORMATION			1008
+#define SMB_FS_SECTOR_SIZE_INFORMATION			1011
 
 /* SMB_FS_DEVICE_INFORMATION device types. */
 #define FILE_DEVICE_CD_ROM		0x2
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index a732bac..551643f 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -3208,6 +3208,7 @@ NTSTATUS smbd_do_qfsinfo(struct smbXsrv_connection *xconn,
 	int snum = SNUM(conn);
 	const char *fstype = lp_fstype(SNUM(conn));
 	const char *filename = NULL;
+	const uint64_t bytes_per_sector = 512;
 	uint32 additional_flags = 0;
 	struct smb_filename smb_fname;
 	SMB_STRUCT_STAT st;
@@ -3260,7 +3261,7 @@ NTSTATUS smbd_do_qfsinfo(struct smbXsrv_connection *xconn,
 	switch (info_level) {
 		case SMB_INFO_ALLOCATION:
 		{
-			uint64_t dfree,dsize,bsize,block_size,sectors_per_unit,bytes_per_sector;
+			uint64_t dfree,dsize,bsize,block_size,sectors_per_unit;
 			data_len = 18;
 			df_ret = get_dfree_info(conn, filename, &bsize, &dfree,
 						&dsize);
@@ -3281,7 +3282,6 @@ NTSTATUS smbd_do_qfsinfo(struct smbXsrv_connection *xconn,
 				dsize *= factor;
 				dfree *= factor;
 			}
-			bytes_per_sector = 512;
 			sectors_per_unit = bsize/bytes_per_sector;
 
 			DEBUG(5,("smbd_do_qfsinfo : SMB_INFO_ALLOCATION id=%x, bsize=%u, cSectorUnit=%u, \
@@ -3412,7 +3412,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_ex_dev, (u
 		case SMB_QUERY_FS_SIZE_INFO:
 		case SMB_FS_SIZE_INFORMATION:
 		{
-			uint64_t dfree,dsize,bsize,block_size,sectors_per_unit,bytes_per_sector;
+			uint64_t dfree,dsize,bsize,block_size,sectors_per_unit;
 			data_len = 24;
 			df_ret = get_dfree_info(conn, filename, &bsize, &dfree,
 						&dsize);
@@ -3432,7 +3432,6 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_ex_dev, (u
 				dsize *= factor;
 				dfree *= factor;
 			}
-			bytes_per_sector = 512;
 			sectors_per_unit = bsize/bytes_per_sector;
 			DEBUG(5,("smbd_do_qfsinfo : SMB_QUERY_FS_SIZE_INFO bsize=%u, cSectorUnit=%u, \
 cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned int)sectors_per_unit,
@@ -3447,7 +3446,7 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
 
 		case SMB_FS_FULL_SIZE_INFORMATION:
 		{
-			uint64_t dfree,dsize,bsize,block_size,sectors_per_unit,bytes_per_sector;
+			uint64_t dfree,dsize,bsize,block_size,sectors_per_unit;
 			data_len = 32;
 			df_ret = get_dfree_info(conn, filename, &bsize, &dfree,
 						&dsize);
@@ -3467,7 +3466,6 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
 				dsize *= factor;
 				dfree *= factor;
 			}
-			bytes_per_sector = 512;
 			sectors_per_unit = bsize/bytes_per_sector;
 			DEBUG(5,("smbd_do_qfsinfo : SMB_QUERY_FS_FULL_SIZE_INFO bsize=%u, cSectorUnit=%u, \
 cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned int)sectors_per_unit,
@@ -3585,6 +3583,34 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
 			break;
 		}
 
+		case SMB_FS_SECTOR_SIZE_INFORMATION:
+		{
+			data_len = 28;
+			/*
+			 * These values match a physical Windows Server 2012
+			 * share backed by NTFS atop spinning rust.
+			 */
+			DEBUG(5, ("SMB_FS_SECTOR_SIZE_INFORMATION:"));
+			/* logical_bytes_per_sector */
+			SIVAL(pdata, 0, bytes_per_sector);
+			/* phys_bytes_per_sector_atomic */
+			SIVAL(pdata, 4, bytes_per_sector);
+			/* phys_bytes_per_sector_perf */
+			SIVAL(pdata, 8, bytes_per_sector);
+			/* fs_effective_phys_bytes_per_sector_atomic */
+			SIVAL(pdata, 12, bytes_per_sector);
+			/* flags */
+			SIVAL(pdata, 16, SSINFO_FLAGS_ALIGNED_DEVICE
+				| SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE);
+			/* byte_off_sector_align */
+			SIVAL(pdata, 20, 0);
+			/* byte_off_partition_align */
+			SIVAL(pdata, 24, 0);
+			*fixed_portion = 28;
+			break;
+		}
+
+
 		/*
 		 * Query the version and capabilities of the CIFS UNIX extensions
 		 * in use.
diff --git a/source4/client/client.c b/source4/client/client.c
index 2779824..a069443 100644
--- a/source4/client/client.c
+++ b/source4/client/client.c
@@ -1620,6 +1620,7 @@ fsinfo_level_t fsinfo_levels[] = {
 	{"quota-information", RAW_QFS_QUOTA_INFORMATION},
 	{"fullsize-information", RAW_QFS_FULL_SIZE_INFORMATION},
 	{"objectid", RAW_QFS_OBJECTID_INFORMATION},
+	{"sector-size-info", RAW_QFS_SECTOR_SIZE_INFORMATION},
 	{NULL, RAW_QFS_GENERIC}
 };
 
@@ -1763,6 +1764,22 @@ static int cmd_fsinfo(struct smbclient_context *ctx, const char **args)
 			 (unsigned long long) fsinfo.objectid_information.out.unknown[4],
 			 (unsigned long long) fsinfo.objectid_information.out.unknown[5] );
 		break;
+	case RAW_QFS_SECTOR_SIZE_INFORMATION:
+		d_printf("\tlogical_bytes_per_sector:			%u\n",
+			 (unsigned)fsinfo.sector_size_info.out.logical_bytes_per_sector);
+		d_printf("\tphys_bytes_per_sector_atomic:		%u\n",
+			 (unsigned)fsinfo.sector_size_info.out.phys_bytes_per_sector_atomic);
+		d_printf("\tphys_bytes_per_sector_perf:			%u\n",
+			 (unsigned)fsinfo.sector_size_info.out.phys_bytes_per_sector_perf);
+		d_printf("\tfs_effective_phys_bytes_per_sector_atomic:	%u\n",
+			 (unsigned)fsinfo.sector_size_info.out.fs_effective_phys_bytes_per_sector_atomic);
+		d_printf("\tflags:					0x%x\n",
+			 (unsigned)fsinfo.sector_size_info.out.flags);
+		d_printf("\tbyte_off_sector_align:			%u\n",
+			 (unsigned)fsinfo.sector_size_info.out.byte_off_sector_align);
+		d_printf("\tbyte_off_partition_align:			%u\n",
+			 (unsigned)fsinfo.sector_size_info.out.byte_off_partition_align);
+		break;
 	case RAW_QFS_GENERIC:
 		d_printf("\twrong level returned\n");
 		break;
diff --git a/source4/libcli/raw/interfaces.h b/source4/libcli/raw/interfaces.h
index 5804a6b..7e8258e 100644
--- a/source4/libcli/raw/interfaces.h
+++ b/source4/libcli/raw/interfaces.h
@@ -1167,7 +1167,9 @@ enum smb_fsinfo_level {
 		   RAW_QFS_ATTRIBUTE_INFORMATION          = SMB_QFS_ATTRIBUTE_INFORMATION,
 		   RAW_QFS_QUOTA_INFORMATION              = SMB_QFS_QUOTA_INFORMATION,
 		   RAW_QFS_FULL_SIZE_INFORMATION          = SMB_QFS_FULL_SIZE_INFORMATION,
-		   RAW_QFS_OBJECTID_INFORMATION           = SMB_QFS_OBJECTID_INFORMATION};
+		   RAW_QFS_OBJECTID_INFORMATION           = SMB_QFS_OBJECTID_INFORMATION,
+		   RAW_QFS_SECTOR_SIZE_INFORMATION        = SMB_QFS_SECTOR_SIZE_INFORMATION,
+};
 
 
 /* union for fsinfo() backend call. Note that there are no in
@@ -1331,6 +1333,22 @@ union smb_fsinfo {
 			uint64_t unknown[6];
 		} out;
 	} objectid_information;	
+
+	/* trans2 RAW_QFS_SECTOR_SIZE_INFORMATION interface */
+	struct {
+		enum smb_fsinfo_level level;
+		struct smb2_handle handle; /* only for smb2 */
+
+		struct {
+			uint32_t logical_bytes_per_sector;
+			uint32_t phys_bytes_per_sector_atomic;
+			uint32_t phys_bytes_per_sector_perf;
+			uint32_t fs_effective_phys_bytes_per_sector_atomic;
+			uint32_t flags;
+			uint32_t byte_off_sector_align;
+			uint32_t byte_off_partition_align;
+		} out;
+	} sector_size_info;
 };
 
 
diff --git a/source4/libcli/raw/rawfsinfo.c b/source4/libcli/raw/rawfsinfo.c
index 9c03e14..bf149ee 100644
--- a/source4/libcli/raw/rawfsinfo.c
+++ b/source4/libcli/raw/rawfsinfo.c
@@ -226,6 +226,23 @@ NTSTATUS smb_raw_fsinfo_passthru_parse(DATA_BLOB blob, TALLOC_CTX *mem_ctx,
 			fsinfo->objectid_information.out.unknown[i] = BVAL(blob.data, 16 + i*8);
 		}
 		break;
+
+	case RAW_QFS_SECTOR_SIZE_INFORMATION:
+		QFS_CHECK_SIZE(28);
+		fsinfo->sector_size_info.out.logical_bytes_per_sector
+							= IVAL(blob.data,  0);
+		fsinfo->sector_size_info.out.phys_bytes_per_sector_atomic
+							= IVAL(blob.data,  4);
+		fsinfo->sector_size_info.out.phys_bytes_per_sector_perf
+							= IVAL(blob.data,  8);
+		fsinfo->sector_size_info.out.fs_effective_phys_bytes_per_sector_atomic
+							= IVAL(blob.data, 12);
+		fsinfo->sector_size_info.out.flags	= IVAL(blob.data, 16);
+		fsinfo->sector_size_info.out.byte_off_sector_align
+							= IVAL(blob.data, 20);
+		fsinfo->sector_size_info.out.byte_off_partition_align
+							= IVAL(blob.data, 24);
+		break;
 	}
 		
 	default:
@@ -319,6 +336,10 @@ NTSTATUS smb_raw_fsinfo_recv(struct smbcli_request *req,
 	case RAW_QFS_OBJECTID_INFORMATION:
 		return smb_raw_fsinfo_passthru_parse(blob, mem_ctx, 
 						     RAW_QFS_OBJECTID_INFORMATION, fsinfo);
+
+	case RAW_QFS_SECTOR_SIZE_INFORMATION:
+		return smb_raw_fsinfo_passthru_parse(blob, mem_ctx,
+				RAW_QFS_SECTOR_SIZE_INFORMATION, fsinfo);
 	}
 
 failed:
diff --git a/source4/libcli/raw/trans2.h b/source4/libcli/raw/trans2.h
index c1ec3ae..b7cfc6d 100644
--- a/source4/libcli/raw/trans2.h
+++ b/source4/libcli/raw/trans2.h
@@ -63,6 +63,7 @@ Found 4 aliased levels
 #define SMB_QFS_QUOTA_INFORMATION			1006
 #define SMB_QFS_FULL_SIZE_INFORMATION			1007
 #define SMB_QFS_OBJECTID_INFORMATION			1008
+#define SMB_QFS_SECTOR_SIZE_INFORMATION			1011
 
 
 /* trans2 qfileinfo/qpathinfo */
@@ -283,6 +284,13 @@ Found 0 aliased levels
 #define QFS_TYPE_MOUNTED			0x20
 #define QFS_TYPE_VIRTUAL			0x40
 
+/* SMB_QFS_SECTOR_SIZE_INFORMATION values */
+#define QFS_SSINFO_FLAGS_ALIGNED_DEVICE			0x00000001
+#define QFS_SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE	0x00000002
+#define QFS_SSINFO_FLAGS_NO_SEEK_PENALTY		0x00000004
+#define QFS_SSINFO_FLAGS_TRIM_ENABLED			0x00000008
+
+#define QFS_SSINFO_OFFSET_UNKNOWN			0xffffffff
 
 /*
  * Thursby MAC extensions....
diff --git a/source4/ntvfs/ntvfs_generic.c b/source4/ntvfs/ntvfs_generic.c
index d3f7919..4edc31c 100644
--- a/source4/ntvfs/ntvfs_generic.c
+++ b/source4/ntvfs/ntvfs_generic.c
@@ -664,6 +664,22 @@ static NTSTATUS ntvfs_map_fsinfo_finish(struct ntvfs_module_context *ntvfs,
 		ZERO_STRUCT(fs->objectid_information.out.unknown);
 		return NT_STATUS_OK;
 
+	case RAW_QFS_SECTOR_SIZE_INFORMATION:
+		fs->sector_size_info.out.logical_bytes_per_sector
+						= fs2->generic.out.block_size;
+		fs->sector_size_info.out.phys_bytes_per_sector_atomic
+						= fs2->generic.out.block_size;
+		fs->sector_size_info.out.phys_bytes_per_sector_perf
+						= fs2->generic.out.block_size;
+		fs->sector_size_info.out.fs_effective_phys_bytes_per_sector_atomic
+						= fs2->generic.out.block_size;
+		fs->sector_size_info.out.flags
+					= QFS_SSINFO_FLAGS_ALIGNED_DEVICE
+				| QFS_SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE;
+		fs->sector_size_info.out.byte_off_sector_align = 0;
+		fs->sector_size_info.out.byte_off_partition_align = 0;
+		return NT_STATUS_OK;
+
 	case RAW_QFS_GENERIC:
 	case RAW_QFS_UNIX_INFO:
 		return NT_STATUS_INVALID_LEVEL;
diff --git a/source4/ntvfs/posix/pvfs_fsinfo.c b/source4/ntvfs/posix/pvfs_fsinfo.c
index 210433b..35256fe 100644
--- a/source4/ntvfs/posix/pvfs_fsinfo.c
+++ b/source4/ntvfs/posix/pvfs_fsinfo.c
@@ -201,6 +201,21 @@ NTSTATUS pvfs_fsinfo(struct ntvfs_module_context *ntvfs,
 		fs->objectid_information.out.guid = *pvfs->base_fs_uuid;
 		return NT_STATUS_OK;
 
+	case RAW_QFS_SECTOR_SIZE_INFORMATION:
+		fs->sector_size_info.out.logical_bytes_per_sector = block_size;
+		fs->sector_size_info.out.phys_bytes_per_sector_atomic
+								= block_size;
+		fs->sector_size_info.out.phys_bytes_per_sector_perf
+								= block_size;
+		fs->sector_size_info.out.fs_effective_phys_bytes_per_sector_atomic
+								= block_size;
+		fs->sector_size_info.out.flags
+					= QFS_SSINFO_FLAGS_ALIGNED_DEVICE
+				| QFS_SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE;
+		fs->sector_size_info.out.byte_off_sector_align = 0;
+		fs->sector_size_info.out.byte_off_partition_align = 0;
+		return NT_STATUS_OK;
+
 	default:
 		break;
 	}
diff --git a/source4/smb_server/blob.c b/source4/smb_server/blob.c
index a3e1123..2489329 100644
--- a/source4/smb_server/blob.c
+++ b/source4/smb_server/blob.c
@@ -292,6 +292,26 @@ NTSTATUS smbsrv_push_passthru_fsinfo(TALLOC_CTX *mem_ctx,
 
 		return NT_STATUS_OK;
 	}
+
+	case RAW_QFS_SECTOR_SIZE_INFORMATION:
+		BLOB_CHECK(smbsrv_blob_grow_data(mem_ctx, blob, 28));
+		SIVAL(blob->data,  0,
+		      fsinfo->sector_size_info.out.logical_bytes_per_sector);
+		SIVAL(blob->data,  4,
+		     fsinfo->sector_size_info.out.phys_bytes_per_sector_atomic);
+		SIVAL(blob->data,  8,
+		      fsinfo->sector_size_info.out.phys_bytes_per_sector_perf);
+		SIVAL(blob->data, 12,
+		      fsinfo->sector_size_info.out.fs_effective_phys_bytes_per_sector_atomic);
+		SIVAL(blob->data, 16,
+		      fsinfo->sector_size_info.out.flags);
+		SIVAL(blob->data, 20,
+		      fsinfo->sector_size_info.out.byte_off_sector_align);
+		SIVAL(blob->data, 24,
+		      fsinfo->sector_size_info.out.byte_off_partition_align);
+
+		return NT_STATUS_OK;
+
 	default:
 		return NT_STATUS_INVALID_LEVEL;
 	}
diff --git a/source4/torture/smb2/getinfo.c b/source4/torture/smb2/getinfo.c
index 427fdd9..4bf4100 100644
--- a/source4/torture/smb2/getinfo.c
+++ b/source4/torture/smb2/getinfo.c
@@ -70,7 +70,8 @@ static struct {
  { LEVEL(RAW_QFS_ATTRIBUTE_INFORMATION) },
  { LEVEL(RAW_QFS_QUOTA_INFORMATION) },
  { LEVEL(RAW_QFS_FULL_SIZE_INFORMATION) },
- { LEVEL(RAW_QFS_OBJECTID_INFORMATION) }
+ { LEVEL(RAW_QFS_OBJECTID_INFORMATION) },
+ { LEVEL(RAW_QFS_SECTOR_SIZE_INFORMATION) },
 };
 
 #define FNAME "testsmb2_file.dat"
diff --git a/source4/torture/smb2/ioctl.c b/source4/torture/smb2/ioctl.c
index 78bbdd9..8e7f69a 100644
--- a/source4/torture/smb2/ioctl.c
+++ b/source4/torture/smb2/ioctl.c
@@ -4645,6 +4645,144 @@ static bool test_ioctl_sparse_qar_overflow(struct torture_context *torture,
 	return true;
 }
 
+static NTSTATUS test_ioctl_trim_supported(struct torture_context *torture,
+					  struct smb2_tree *tree,
+					  TALLOC_CTX *mem_ctx,
+					  struct smb2_handle *fh,
+					  bool *trim_support)
+{
+	NTSTATUS status;
+	union smb_fsinfo info;
+
+	ZERO_STRUCT(info);
+	info.generic.level = RAW_QFS_SECTOR_SIZE_INFORMATION;
+	info.generic.handle = *fh;
+	status = smb2_getinfo_fs(tree, tree, &info);
+	if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS)) {
+		/*
+		 * Windows < Server 2012, 8 etc. don't support this info level
+		 * or the trim ioctl. Ignore the error and let the caller skip.
+		 */
+		*trim_support = false;
+		return NT_STATUS_OK;
+	} else if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+
+	torture_comment(torture, "sector size info: lb/s=%u, pb/sA=%u, "
+			"pb/sP=%u, fse/sA=%u, flags=0x%x, bosa=%u, bopa=%u\n",
+	    (unsigned)info.sector_size_info.out.logical_bytes_per_sector,
+	    (unsigned)info.sector_size_info.out.phys_bytes_per_sector_atomic,
+	    (unsigned)info.sector_size_info.out.phys_bytes_per_sector_perf,
+  (unsigned)info.sector_size_info.out.fs_effective_phys_bytes_per_sector_atomic,
+	    (unsigned)info.sector_size_info.out.flags,
+	    (unsigned)info.sector_size_info.out.byte_off_sector_align,
+	    (unsigned)info.sector_size_info.out.byte_off_partition_align);
+
+	if (info.sector_size_info.out.flags & QFS_SSINFO_FLAGS_TRIM_ENABLED) {
+		*trim_support = true;
+	} else {
+		*trim_support = false;
+	}
+	return NT_STATUS_OK;
+}
+
+static bool test_setup_trim(struct torture_context *torture,
+			    struct smb2_tree *tree,
+			    TALLOC_CTX *mem_ctx,
+			    uint32_t num_ranges,
+			    struct smb2_handle *fh,
+			    uint64_t file_size,
+			    uint32_t desired_access,
+			    struct fsctl_file_level_trim_req *trim_req,
+			    union smb_ioctl *ioctl)
+{
+	bool ok;
+
+	ok = test_setup_create_fill(torture, tree, mem_ctx, FNAME,
+				    fh, file_size, desired_access,
+				    FILE_ATTRIBUTE_NORMAL);
+	torture_assert(torture, ok, "src file create fill");
+
+	ZERO_STRUCTPN(ioctl);
+	ioctl->smb2.level = RAW_IOCTL_SMB2;
+	ioctl->smb2.in.file.handle = *fh;
+	ioctl->smb2.in.function = FSCTL_FILE_LEVEL_TRIM;
+	ioctl->smb2.in.max_response_size
+				= sizeof(struct fsctl_file_level_trim_rsp);
+	ioctl->smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
+
+	ZERO_STRUCTPN(trim_req);
+	/* leave key as zero for now. TODO test locking with differing keys */
+	trim_req->num_ranges = num_ranges;
+	trim_req->ranges = talloc_zero_array(mem_ctx,
+					     struct file_level_trim_range,
+					     num_ranges);
+	torture_assert(torture, (trim_req->ranges != NULL), "no memory for ranges");
+
+	return true;
+}
+
+static bool test_ioctl_trim_simple(struct torture_context *torture,
+				   struct smb2_tree *tree)
+{
+	struct smb2_handle fh;
+	NTSTATUS status;
+	union smb_ioctl ioctl;
+	bool trim_supported;
+	TALLOC_CTX *tmp_ctx = talloc_new(tree);
+	struct fsctl_file_level_trim_req trim_req;
+	struct fsctl_file_level_trim_rsp trim_rsp;
+	uint64_t trim_chunk_len = 64 * 1024;	/* trim 64K chunks */
+	enum ndr_err_code ndr_ret;
+	bool ok;
+
+	ok = test_setup_trim(torture, tree, tmp_ctx,
+			     1, /* 1 range */
+			     &fh, 2 * trim_chunk_len, /* fill 128K file */
+			     SEC_RIGHTS_FILE_ALL,
+			     &trim_req,
+			     &ioctl);
+	if (!ok) {
+		torture_fail(torture, "setup trim error");
+	}
+


-- 
Samba Shared Repository


More information about the samba-cvs mailing list