]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
smb3: move defines for query info and query fsinfo to smbfs_common
authorSteve French <stfrench@microsoft.com>
Sat, 26 Mar 2022 21:17:03 +0000 (16:17 -0500)
committerSteve French <stfrench@microsoft.com>
Sun, 27 Mar 2022 04:09:51 +0000 (23:09 -0500)
Includes moving to common code (from cifs and ksmbd protocol related
headers)
- query and query directory info levels and structs
- set info structs
- SMB2 lock struct and flags
- SMB2 echo req

Also shorten a few flag names (e.g. SMB2_LOCKFLAG_EXCLUSIVE_LOCK
to SMB2_LOCKFLAG_EXCLUSIVE)

Reviewed-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/cifspdu.h
fs/cifs/smb2ops.c
fs/cifs/smb2pdu.h
fs/ksmbd/smb2pdu.h
fs/smbfs_common/smb2pdu.h

index f214cbeb2a364867548ebd10eaacd854f01b9de5..aeba371c4c707b5164ce1fdbf7657eee3c8444e9 100644 (file)
@@ -1646,7 +1646,7 @@ struct smb_t2_rsp {
 #define SMB_FIND_FILE_ID_FULL_DIR_INFO    0x105
 #define SMB_FIND_FILE_ID_BOTH_DIR_INFO    0x106
 #define SMB_FIND_FILE_UNIX                0x202
-#define SMB_FIND_FILE_POSIX_INFO          0x064
+/* #define SMB_FIND_FILE_POSIX_INFO          0x064 */
 
 typedef struct smb_com_transaction2_qpi_req {
        struct smb_hdr hdr;     /* wct = 14+ */
index fb1d74791f4c3ca6275deab1aedcc316bc6c14da..b4b99eb413b9b431ffa4afdb5636fb879775caa2 100644 (file)
@@ -5840,8 +5840,8 @@ struct smb_version_values smb20_values = {
        .protocol_id = SMB20_PROT_ID,
        .req_capabilities = 0, /* MBZ */
        .large_lock_type = 0,
-       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
-       .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
+       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
+       .shared_lock_type = SMB2_LOCKFLAG_SHARED,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
        .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
@@ -5861,8 +5861,8 @@ struct smb_version_values smb21_values = {
        .protocol_id = SMB21_PROT_ID,
        .req_capabilities = 0, /* MBZ on negotiate req until SMB3 dialect */
        .large_lock_type = 0,
-       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
-       .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
+       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
+       .shared_lock_type = SMB2_LOCKFLAG_SHARED,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
        .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
@@ -5882,8 +5882,8 @@ struct smb_version_values smb3any_values = {
        .protocol_id = SMB302_PROT_ID, /* doesn't matter, send protocol array */
        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
        .large_lock_type = 0,
-       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
-       .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
+       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
+       .shared_lock_type = SMB2_LOCKFLAG_SHARED,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
        .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
@@ -5903,8 +5903,8 @@ struct smb_version_values smbdefault_values = {
        .protocol_id = SMB302_PROT_ID, /* doesn't matter, send protocol array */
        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
        .large_lock_type = 0,
-       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
-       .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
+       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
+       .shared_lock_type = SMB2_LOCKFLAG_SHARED,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
        .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
@@ -5924,8 +5924,8 @@ struct smb_version_values smb30_values = {
        .protocol_id = SMB30_PROT_ID,
        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
        .large_lock_type = 0,
-       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
-       .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
+       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
+       .shared_lock_type = SMB2_LOCKFLAG_SHARED,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
        .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
@@ -5945,8 +5945,8 @@ struct smb_version_values smb302_values = {
        .protocol_id = SMB302_PROT_ID,
        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
        .large_lock_type = 0,
-       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
-       .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
+       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
+       .shared_lock_type = SMB2_LOCKFLAG_SHARED,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
        .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
@@ -5966,8 +5966,8 @@ struct smb_version_values smb311_values = {
        .protocol_id = SMB311_PROT_ID,
        .req_capabilities = SMB2_GLOBAL_CAP_DFS | SMB2_GLOBAL_CAP_LEASING | SMB2_GLOBAL_CAP_LARGE_MTU | SMB2_GLOBAL_CAP_PERSISTENT_HANDLES | SMB2_GLOBAL_CAP_ENCRYPTION | SMB2_GLOBAL_CAP_DIRECTORY_LEASING,
        .large_lock_type = 0,
-       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
-       .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
+       .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
+       .shared_lock_type = SMB2_LOCKFLAG_SHARED,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
        .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
index 162f1be886fef6df6e8fa1558290d2639fb1d986..8692b58cbdb1a5d0c9df7940d6a7fbf7e13fc43e 100644 (file)
@@ -280,11 +280,6 @@ struct fsctl_get_integrity_information_rsp {
        __le32  ClusterSizeInBytes;
 } __packed;
 
-struct file_allocated_range_buffer {
-       __le64  file_offset;
-       __le64  length;
-} __packed;
-
 /* Integrity ChecksumAlgorithm choices for above */
 #define        CHECKSUM_TYPE_NONE      0x0000
 #define        CHECKSUM_TYPE_CRC64     0x0002
@@ -421,125 +416,6 @@ struct duplicate_extents_to_file {
  */
 #define SMB2_IOCTL_IOV_SIZE 2
 
-#define SMB2_LOCKFLAG_SHARED_LOCK      0x0001
-#define SMB2_LOCKFLAG_EXCLUSIVE_LOCK   0x0002
-#define SMB2_LOCKFLAG_UNLOCK           0x0004
-#define SMB2_LOCKFLAG_FAIL_IMMEDIATELY 0x0010
-
-struct smb2_lock_element {
-       __le64 Offset;
-       __le64 Length;
-       __le32 Flags;
-       __le32 Reserved;
-} __packed;
-
-struct smb2_lock_req {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 48 */
-       __le16 LockCount;
-       /*
-        * The least significant four bits are the index, the other 28 bits are
-        * the lock sequence number (0 to 64). See MS-SMB2 2.2.26
-        */
-       __le32 LockSequenceNumber;
-       __u64  PersistentFileId; /* opaque endianness */
-       __u64  VolatileFileId; /* opaque endianness */
-       /* Followed by at least one */
-       struct smb2_lock_element locks[1];
-} __packed;
-
-struct smb2_lock_rsp {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 4 */
-       __le16 Reserved;
-} __packed;
-
-struct smb2_echo_req {
-       struct smb2_hdr hdr;
-       __le16 StructureSize;   /* Must be 4 */
-       __u16  Reserved;
-} __packed;
-
-struct smb2_echo_rsp {
-       struct smb2_hdr hdr;
-       __le16 StructureSize;   /* Must be 4 */
-       __u16  Reserved;
-} __packed;
-
-/* search (query_directory) Flags field */
-#define SMB2_RESTART_SCANS             0x01
-#define SMB2_RETURN_SINGLE_ENTRY       0x02
-#define SMB2_INDEX_SPECIFIED           0x04
-#define SMB2_REOPEN                    0x10
-
-#define SMB2_QUERY_DIRECTORY_IOV_SIZE 2
-
-/*
- * Valid FileInformation classes.
- *
- * Note that these are a subset of the (file) QUERY_INFO levels defined
- * later in this file (but since QUERY_DIRECTORY uses equivalent numbers
- * we do not redefine them here)
- *
- * FileDirectoryInfomation             0x01
- * FileFullDirectoryInformation                0x02
- * FileIdFullDirectoryInformation      0x26
- * FileBothDirectoryInformation                0x03
- * FileIdBothDirectoryInformation      0x25
- * FileNamesInformation                        0x0C
- * FileIdExtdDirectoryInformation      0x3C
- */
-
-struct smb2_query_directory_req {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 33 */
-       __u8   FileInformationClass;
-       __u8   Flags;
-       __le32 FileIndex;
-       __u64  PersistentFileId; /* opaque endianness */
-       __u64  VolatileFileId; /* opaque endianness */
-       __le16 FileNameOffset;
-       __le16 FileNameLength;
-       __le32 OutputBufferLength;
-       __u8   Buffer[1];
-} __packed;
-
-struct smb2_query_directory_rsp {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 9 */
-       __le16 OutputBufferOffset;
-       __le32 OutputBufferLength;
-       __u8   Buffer[1];
-} __packed;
-
-/*
- * Maximum number of iovs we need for a set-info request.
- * The largest one is rename/hardlink
- * [0] : struct smb2_set_info_req + smb2_file_[rename|link]_info
- * [1] : path
- * [2] : compound padding
- */
-#define SMB2_SET_INFO_IOV_SIZE 3
-
-struct smb2_set_info_req {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 33 */
-       __u8   InfoType;
-       __u8   FileInfoClass;
-       __le32 BufferLength;
-       __le16 BufferOffset;
-       __u16  Reserved;
-       __le32 AdditionalInformation;
-       __u64  PersistentFileId; /* opaque endianness */
-       __u64  VolatileFileId; /* opaque endianness */
-       __u8   Buffer[1];
-} __packed;
-
-struct smb2_set_info_rsp {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 2 */
-} __packed;
-
 struct smb2_oplock_break {
        struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 24 */
@@ -576,132 +452,10 @@ struct smb2_lease_ack {
 } __packed;
 
 /*
- *     PDU infolevel structure definitions
+ *     PDU query infolevel structure definitions
  *     BB consider moving to a different header
  */
 
-/* File System Information Classes */
-#define FS_VOLUME_INFORMATION          1 /* Query */
-#define FS_LABEL_INFORMATION           2 /* Local only */
-#define FS_SIZE_INFORMATION            3 /* Query */
-#define FS_DEVICE_INFORMATION          4 /* Query */
-#define FS_ATTRIBUTE_INFORMATION       5 /* Query */
-#define FS_CONTROL_INFORMATION         6 /* Query, Set */
-#define FS_FULL_SIZE_INFORMATION       7 /* Query */
-#define FS_OBJECT_ID_INFORMATION       8 /* Query, Set */
-#define FS_DRIVER_PATH_INFORMATION     9 /* Local only */
-#define FS_VOLUME_FLAGS_INFORMATION    10 /* Local only */
-#define FS_SECTOR_SIZE_INFORMATION     11 /* SMB3 or later. Query */
-#define FS_POSIX_INFORMATION           100 /* SMB3.1.1 POSIX. Query */
-
-struct smb2_fs_full_size_info {
-       __le64 TotalAllocationUnits;
-       __le64 CallerAvailableAllocationUnits;
-       __le64 ActualAvailableAllocationUnits;
-       __le32 SectorsPerAllocationUnit;
-       __le32 BytesPerSector;
-} __packed;
-
-#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
-
-/* sector size info struct */
-struct smb3_fs_ss_info {
-       __le32 LogicalBytesPerSector;
-       __le32 PhysicalBytesPerSectorForAtomicity;
-       __le32 PhysicalBytesPerSectorForPerf;
-       __le32 FileSystemEffectivePhysicalBytesPerSectorForAtomicity;
-       __le32 Flags;
-       __le32 ByteOffsetForSectorAlignment;
-       __le32 ByteOffsetForPartitionAlignment;
-} __packed;
-
-/* volume info struct - see MS-FSCC 2.5.9 */
-#define MAX_VOL_LABEL_LEN      32
-struct smb3_fs_vol_info {
-       __le64  VolumeCreationTime;
-       __u32   VolumeSerialNumber;
-       __le32  VolumeLabelLength; /* includes trailing null */
-       __u8    SupportsObjects; /* True if eg like NTFS, supports objects */
-       __u8    Reserved;
-       __u8    VolumeLabel[]; /* variable len */
-} __packed;
-
-/* partial list of QUERY INFO levels */
-#define FILE_DIRECTORY_INFORMATION     1
-#define FILE_FULL_DIRECTORY_INFORMATION 2
-#define FILE_BOTH_DIRECTORY_INFORMATION 3
-#define FILE_BASIC_INFORMATION         4
-#define FILE_STANDARD_INFORMATION      5
-#define FILE_INTERNAL_INFORMATION      6
-#define FILE_EA_INFORMATION            7
-#define FILE_ACCESS_INFORMATION                8
-#define FILE_NAME_INFORMATION          9
-#define FILE_RENAME_INFORMATION                10
-#define FILE_LINK_INFORMATION          11
-#define FILE_NAMES_INFORMATION         12
-#define FILE_DISPOSITION_INFORMATION   13
-#define FILE_POSITION_INFORMATION      14
-#define FILE_FULL_EA_INFORMATION       15
-#define FILE_MODE_INFORMATION          16
-#define FILE_ALIGNMENT_INFORMATION     17
-#define FILE_ALL_INFORMATION           18
-#define FILE_ALLOCATION_INFORMATION    19
-#define FILE_END_OF_FILE_INFORMATION   20
-#define FILE_ALTERNATE_NAME_INFORMATION 21
-#define FILE_STREAM_INFORMATION                22
-#define FILE_PIPE_INFORMATION          23
-#define FILE_PIPE_LOCAL_INFORMATION    24
-#define FILE_PIPE_REMOTE_INFORMATION   25
-#define FILE_MAILSLOT_QUERY_INFORMATION 26
-#define FILE_MAILSLOT_SET_INFORMATION  27
-#define FILE_COMPRESSION_INFORMATION   28
-#define FILE_OBJECT_ID_INFORMATION     29
-/* Number 30 not defined in documents */
-#define FILE_MOVE_CLUSTER_INFORMATION  31
-#define FILE_QUOTA_INFORMATION         32
-#define FILE_REPARSE_POINT_INFORMATION 33
-#define FILE_NETWORK_OPEN_INFORMATION  34
-#define FILE_ATTRIBUTE_TAG_INFORMATION 35
-#define FILE_TRACKING_INFORMATION      36
-#define FILEID_BOTH_DIRECTORY_INFORMATION 37
-#define FILEID_FULL_DIRECTORY_INFORMATION 38
-#define FILE_VALID_DATA_LENGTH_INFORMATION 39
-#define FILE_SHORT_NAME_INFORMATION    40
-#define FILE_SFIO_RESERVE_INFORMATION  44
-#define FILE_SFIO_VOLUME_INFORMATION   45
-#define FILE_HARD_LINK_INFORMATION     46
-#define FILE_NORMALIZED_NAME_INFORMATION 48
-#define FILEID_GLOBAL_TX_DIRECTORY_INFORMATION 50
-#define FILE_STANDARD_LINK_INFORMATION 54
-#define FILE_ID_INFORMATION            59
-#define FILE_ID_EXTD_DIRECTORY_INFORMATION 60
-
-struct smb2_file_internal_info {
-       __le64 IndexNumber;
-} __packed; /* level 6 Query */
-
-struct smb2_file_rename_info { /* encoding of request for level 10 */
-       __u8   ReplaceIfExists; /* 1 = replace existing target with new */
-                               /* 0 = fail if target already exists */
-       __u8   Reserved[7];
-       __u64  RootDirectory;  /* MBZ for network operations (why says spec?) */
-       __le32 FileNameLength;
-       char   FileName[];     /* New name to be assigned */
-       /* padding - overall struct size must be >= 24 so filename + pad >= 6 */
-} __packed; /* level 10 Set */
-
-struct smb2_file_link_info { /* encoding of request for level 11 */
-       __u8   ReplaceIfExists; /* 1 = replace existing link with new */
-                               /* 0 = fail if link already exists */
-       __u8   Reserved[7];
-       __u64  RootDirectory;  /* MBZ for network operations (why says spec?) */
-       __le32 FileNameLength;
-       char   FileName[];     /* Name to be assigned to new link */
-} __packed; /* level 11 Set */
-
 struct smb2_file_full_ea_info { /* encoding of response for level 15 */
        __le32 next_entry_offset;
        __u8   flags;
@@ -710,38 +464,6 @@ struct smb2_file_full_ea_info { /* encoding of response for level 15 */
        char   ea_data[]; /* \0 terminated name plus value */
 } __packed; /* level 15 Set */
 
-/*
- * This level 18, although with struct with same name is different from cifs
- * level 0x107. Level 0x107 has an extra u64 between AccessFlags and
- * CurrentByteOffset.
- */
-struct smb2_file_all_info { /* data block encoding of response to level 18 */
-       __le64 CreationTime;    /* Beginning of FILE_BASIC_INFO equivalent */
-       __le64 LastAccessTime;
-       __le64 LastWriteTime;
-       __le64 ChangeTime;
-       __le32 Attributes;
-       __u32  Pad1;            /* End of FILE_BASIC_INFO_INFO equivalent */
-       __le64 AllocationSize;  /* Beginning of FILE_STANDARD_INFO equivalent */
-       __le64 EndOfFile;       /* size ie offset to first free byte in file */
-       __le32 NumberOfLinks;   /* hard links */
-       __u8   DeletePending;
-       __u8   Directory;
-       __u16  Pad2;            /* End of FILE_STANDARD_INFO equivalent */
-       __le64 IndexNumber;
-       __le32 EASize;
-       __le32 AccessFlags;
-       __le64 CurrentByteOffset;
-       __le32 Mode;
-       __le32 AlignmentRequirement;
-       __le32 FileNameLength;
-       char   FileName[1];
-} __packed; /* level 18 Query */
-
-struct smb2_file_eof_info { /* encoding of request for level 10 */
-       __le64 EndOfFile; /* new end of file value */
-} __packed; /* level 20 Set */
-
 struct smb2_file_reparse_point_info {
        __le64 IndexNumber;
        __le32 Tag;
@@ -794,6 +516,8 @@ struct create_posix_rsp {
        struct cifs_sid group; /* var-sized on the wire */
 } __packed;
 
+#define SMB2_QUERY_DIRECTORY_IOV_SIZE 2
+
 /*
  * SMB2-only POSIX info level for query dir
  *
@@ -825,31 +549,6 @@ struct smb2_posix_info {
         */
 } __packed;
 
-/* Level 100 query info */
-struct smb311_posix_qinfo {
-       __le64 CreationTime;
-       __le64 LastAccessTime;
-       __le64 LastWriteTime;
-       __le64 ChangeTime;
-       __le64 EndOfFile;
-       __le64 AllocationSize;
-       __le32 DosAttributes;
-       __le64 Inode;
-       __le32 DeviceId;
-       __le32 Zero;
-       /* beginning of POSIX Create Context Response */
-       __le32 HardLinks;
-       __le32 ReparseTag;
-       __le32 Mode;
-       u8     Sids[];
-       /*
-        * var sized owner SID
-        * var sized group SID
-        * le32 filenamelength
-        * u8  filename[]
-        */
-} __packed;
-
 /*
  * Parsed version of the above struct. Allows direct access to the
  * variable length fields
index fd05d3a1eda1f025aaf15e84ed26ae094d8ab0a3..4db2896b977b65272ecbdcb7736df0196b2b35df 100644 (file)
@@ -270,11 +270,6 @@ struct file_zero_data_information {
        __le64  BeyondFinalZero;
 } __packed;
 
-struct file_allocated_range_buffer {
-       __le64  file_offset;
-       __le64  length;
-} __packed;
-
 struct reparse_data_buffer {
        __le32  ReparseTag;
        __le16  ReparseDataLength;
@@ -282,106 +277,6 @@ struct reparse_data_buffer {
        __u8    DataBuffer[]; /* Variable Length */
 } __packed;
 
-/* SMB2 Notify Action Flags */
-#define FILE_ACTION_ADDED              0x00000001
-#define FILE_ACTION_REMOVED            0x00000002
-#define FILE_ACTION_MODIFIED           0x00000003
-#define FILE_ACTION_RENAMED_OLD_NAME   0x00000004
-#define FILE_ACTION_RENAMED_NEW_NAME   0x00000005
-#define FILE_ACTION_ADDED_STREAM       0x00000006
-#define FILE_ACTION_REMOVED_STREAM     0x00000007
-#define FILE_ACTION_MODIFIED_STREAM    0x00000008
-#define FILE_ACTION_REMOVED_BY_DELETE  0x00000009
-
-#define SMB2_LOCKFLAG_SHARED           0x0001
-#define SMB2_LOCKFLAG_EXCLUSIVE                0x0002
-#define SMB2_LOCKFLAG_UNLOCK           0x0004
-#define SMB2_LOCKFLAG_FAIL_IMMEDIATELY 0x0010
-#define SMB2_LOCKFLAG_MASK             0x0007
-
-struct smb2_lock_element {
-       __le64 Offset;
-       __le64 Length;
-       __le32 Flags;
-       __le32 Reserved;
-} __packed;
-
-struct smb2_lock_req {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 48 */
-       __le16 LockCount;
-       __le32 Reserved;
-       __u64  PersistentFileId;
-       __u64  VolatileFileId;
-       /* Followed by at least one */
-       struct smb2_lock_element locks[1];
-} __packed;
-
-struct smb2_lock_rsp {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 4 */
-       __le16 Reserved;
-} __packed;
-
-struct smb2_echo_req {
-       struct smb2_hdr hdr;
-       __le16 StructureSize;   /* Must be 4 */
-       __u16  Reserved;
-} __packed;
-
-struct smb2_echo_rsp {
-       struct smb2_hdr hdr;
-       __le16 StructureSize;   /* Must be 4 */
-       __u16  Reserved;
-} __packed;
-
-/* search (query_directory) Flags field */
-#define SMB2_RESTART_SCANS             0x01
-#define SMB2_RETURN_SINGLE_ENTRY       0x02
-#define SMB2_INDEX_SPECIFIED           0x04
-#define SMB2_REOPEN                    0x10
-
-struct smb2_query_directory_req {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 33 */
-       __u8   FileInformationClass;
-       __u8   Flags;
-       __le32 FileIndex;
-       __u64  PersistentFileId;
-       __u64  VolatileFileId;
-       __le16 FileNameOffset;
-       __le16 FileNameLength;
-       __le32 OutputBufferLength;
-       __u8   Buffer[1];
-} __packed;
-
-struct smb2_query_directory_rsp {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 9 */
-       __le16 OutputBufferOffset;
-       __le32 OutputBufferLength;
-       __u8   Buffer[1];
-} __packed;
-
-struct smb2_set_info_req {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 33 */
-       __u8   InfoType;
-       __u8   FileInfoClass;
-       __le32 BufferLength;
-       __le16 BufferOffset;
-       __u16  Reserved;
-       __le32 AdditionalInformation;
-       __u64  PersistentFileId;
-       __u64  VolatileFileId;
-       __u8   Buffer[1];
-} __packed;
-
-struct smb2_set_info_rsp {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 2 */
-} __packed;
-
 /* FILE Info response size */
 #define FILE_DIRECTORY_INFORMATION_SIZE       1
 #define FILE_FULL_DIRECTORY_INFORMATION_SIZE  2
@@ -473,106 +368,10 @@ struct smb2_lease_ack {
 } __packed;
 
 /*
- *     PDU infolevel structure definitions
+ *     PDU query infolevel structure definitions
  *     BB consider moving to a different header
  */
 
-/* File System Information Classes */
-#define FS_VOLUME_INFORMATION          1 /* Query */
-#define FS_LABEL_INFORMATION           2 /* Set */
-#define FS_SIZE_INFORMATION            3 /* Query */
-#define FS_DEVICE_INFORMATION          4 /* Query */
-#define FS_ATTRIBUTE_INFORMATION       5 /* Query */
-#define FS_CONTROL_INFORMATION         6 /* Query, Set */
-#define FS_FULL_SIZE_INFORMATION       7 /* Query */
-#define FS_OBJECT_ID_INFORMATION       8 /* Query, Set */
-#define FS_DRIVER_PATH_INFORMATION     9 /* Query */
-#define FS_SECTOR_SIZE_INFORMATION     11 /* SMB3 or later. Query */
-#define FS_POSIX_INFORMATION           100 /* SMB3.1.1 POSIX. Query */
-
-struct smb2_fs_full_size_info {
-       __le64 TotalAllocationUnits;
-       __le64 CallerAvailableAllocationUnits;
-       __le64 ActualAvailableAllocationUnits;
-       __le32 SectorsPerAllocationUnit;
-       __le32 BytesPerSector;
-} __packed;
-
-#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
-
-/* sector size info struct */
-struct smb3_fs_ss_info {
-       __le32 LogicalBytesPerSector;
-       __le32 PhysicalBytesPerSectorForAtomicity;
-       __le32 PhysicalBytesPerSectorForPerf;
-       __le32 FSEffPhysicalBytesPerSectorForAtomicity;
-       __le32 Flags;
-       __le32 ByteOffsetForSectorAlignment;
-       __le32 ByteOffsetForPartitionAlignment;
-} __packed;
-
-/* File System Control Information */
-struct smb2_fs_control_info {
-       __le64 FreeSpaceStartFiltering;
-       __le64 FreeSpaceThreshold;
-       __le64 FreeSpaceStopFiltering;
-       __le64 DefaultQuotaThreshold;
-       __le64 DefaultQuotaLimit;
-       __le32 FileSystemControlFlags;
-       __le32 Padding;
-} __packed;
-
-/* partial list of QUERY INFO levels */
-#define FILE_DIRECTORY_INFORMATION     1
-#define FILE_FULL_DIRECTORY_INFORMATION 2
-#define FILE_BOTH_DIRECTORY_INFORMATION 3
-#define FILE_BASIC_INFORMATION         4
-#define FILE_STANDARD_INFORMATION      5
-#define FILE_INTERNAL_INFORMATION      6
-#define FILE_EA_INFORMATION            7
-#define FILE_ACCESS_INFORMATION                8
-#define FILE_NAME_INFORMATION          9
-#define FILE_RENAME_INFORMATION                10
-#define FILE_LINK_INFORMATION          11
-#define FILE_NAMES_INFORMATION         12
-#define FILE_DISPOSITION_INFORMATION   13
-#define FILE_POSITION_INFORMATION      14
-#define FILE_FULL_EA_INFORMATION       15
-#define FILE_MODE_INFORMATION          16
-#define FILE_ALIGNMENT_INFORMATION     17
-#define FILE_ALL_INFORMATION           18
-#define FILE_ALLOCATION_INFORMATION    19
-#define FILE_END_OF_FILE_INFORMATION   20
-#define FILE_ALTERNATE_NAME_INFORMATION 21
-#define FILE_STREAM_INFORMATION                22
-#define FILE_PIPE_INFORMATION          23
-#define FILE_PIPE_LOCAL_INFORMATION    24
-#define FILE_PIPE_REMOTE_INFORMATION   25
-#define FILE_MAILSLOT_QUERY_INFORMATION 26
-#define FILE_MAILSLOT_SET_INFORMATION  27
-#define FILE_COMPRESSION_INFORMATION   28
-#define FILE_OBJECT_ID_INFORMATION     29
-/* Number 30 not defined in documents */
-#define FILE_MOVE_CLUSTER_INFORMATION  31
-#define FILE_QUOTA_INFORMATION         32
-#define FILE_REPARSE_POINT_INFORMATION 33
-#define FILE_NETWORK_OPEN_INFORMATION  34
-#define FILE_ATTRIBUTE_TAG_INFORMATION 35
-#define FILE_TRACKING_INFORMATION      36
-#define FILEID_BOTH_DIRECTORY_INFORMATION 37
-#define FILEID_FULL_DIRECTORY_INFORMATION 38
-#define FILE_VALID_DATA_LENGTH_INFORMATION 39
-#define FILE_SHORT_NAME_INFORMATION    40
-#define FILE_SFIO_RESERVE_INFORMATION  44
-#define FILE_SFIO_VOLUME_INFORMATION   45
-#define FILE_HARD_LINK_INFORMATION     46
-#define FILE_NORMALIZED_NAME_INFORMATION 48
-#define FILEID_GLOBAL_TX_DIRECTORY_INFORMATION 50
-#define FILE_STANDARD_LINK_INFORMATION 54
-
 #define OP_BREAK_STRUCT_SIZE_20                24
 #define OP_BREAK_STRUCT_SIZE_21                36
 
@@ -584,56 +383,6 @@ struct smb2_file_alignment_info {
        __le32 AlignmentRequirement;
 } __packed;
 
-struct smb2_file_internal_info {
-       __le64 IndexNumber;
-} __packed; /* level 6 Query */
-
-struct smb2_file_rename_info { /* encoding of request for level 10 */
-       __u8   ReplaceIfExists; /* 1 = replace existing target with new */
-                               /* 0 = fail if target already exists */
-       __u8   Reserved[7];
-       __u64  RootDirectory;  /* MBZ for network operations (why says spec?) */
-       __le32 FileNameLength;
-       char   FileName[0];     /* New name to be assigned */
-} __packed; /* level 10 Set */
-
-struct smb2_file_link_info { /* encoding of request for level 11 */
-       __u8   ReplaceIfExists; /* 1 = replace existing link with new */
-                               /* 0 = fail if link already exists */
-       __u8   Reserved[7];
-       __u64  RootDirectory;  /* MBZ for network operations (why says spec?) */
-       __le32 FileNameLength;
-       char   FileName[0];     /* Name to be assigned to new link */
-} __packed; /* level 11 Set */
-
-/*
- * This level 18, although with struct with same name is different from cifs
- * level 0x107. Level 0x107 has an extra u64 between AccessFlags and
- * CurrentByteOffset.
- */
-struct smb2_file_all_info { /* data block encoding of response to level 18 */
-       __le64 CreationTime;    /* Beginning of FILE_BASIC_INFO equivalent */
-       __le64 LastAccessTime;
-       __le64 LastWriteTime;
-       __le64 ChangeTime;
-       __le32 Attributes;
-       __u32  Pad1;            /* End of FILE_BASIC_INFO_INFO equivalent */
-       __le64 AllocationSize;  /* Beginning of FILE_STANDARD_INFO equivalent */
-       __le64 EndOfFile;       /* size ie offset to first free byte in file */
-       __le32 NumberOfLinks;   /* hard links */
-       __u8   DeletePending;
-       __u8   Directory;
-       __u16  Pad2;            /* End of FILE_STANDARD_INFO equivalent */
-       __le64 IndexNumber;
-       __le32 EASize;
-       __le32 AccessFlags;
-       __le64 CurrentByteOffset;
-       __le32 Mode;
-       __le32 AlignmentRequirement;
-       __le32 FileNameLength;
-       char   FileName[1];
-} __packed; /* level 18 Query */
-
 struct smb2_file_basic_info { /* data block encoding of response to level 18 */
        __le64 CreationTime;    /* Beginning of FILE_BASIC_INFO equivalent */
        __le64 LastAccessTime;
@@ -656,10 +405,6 @@ struct smb2_file_stream_info {
        char   StreamName[0];
 } __packed;
 
-struct smb2_file_eof_info { /* encoding of request for level 10 */
-       __le64 EndOfFile; /* new end of file value */
-} __packed; /* level 20 Set */
-
 struct smb2_file_ntwrk_info {
        __le64 CreationTime;
        __le64 LastAccessTime;
@@ -750,34 +495,6 @@ struct create_sd_buf_req {
        struct smb_ntsd ntsd;
 } __packed;
 
-/* Find File infolevels */
-#define SMB_FIND_FILE_POSIX_INFO       0x064
-
-/* Level 100 query info */
-struct smb311_posix_qinfo {
-       __le64 CreationTime;
-       __le64 LastAccessTime;
-       __le64 LastWriteTime;
-       __le64 ChangeTime;
-       __le64 EndOfFile;
-       __le64 AllocationSize;
-       __le32 DosAttributes;
-       __le64 Inode;
-       __le32 DeviceId;
-       __le32 Zero;
-       /* beginning of POSIX Create Context Response */
-       __le32 HardLinks;
-       __le32 ReparseTag;
-       __le32 Mode;
-       u8     Sids[];
-       /*
-        * var sized owner SID
-        * var sized group SID
-        * le32 filenamelength
-        * u8  filename[]
-        */
-} __packed;
-
 struct smb2_posix_info {
        __le32 NextEntryOffset;
        __u32 Ignored;
index 67b41f0830252f6128eb848c4a5b7daf26f6ebbd..1defcc8d6c2c445d2f1379c5effd2e2bc43a5ea6 100644 (file)
@@ -787,6 +787,123 @@ struct smb2_flush_rsp {
        __le16 Reserved;
 } __packed;
 
+#define SMB2_LOCKFLAG_SHARED           0x0001
+#define SMB2_LOCKFLAG_EXCLUSIVE                0x0002
+#define SMB2_LOCKFLAG_UNLOCK           0x0004
+#define SMB2_LOCKFLAG_FAIL_IMMEDIATELY 0x0010
+#define SMB2_LOCKFLAG_MASK             0x0007
+
+struct smb2_lock_element {
+       __le64 Offset;
+       __le64 Length;
+       __le32 Flags;
+       __le32 Reserved;
+} __packed;
+
+struct smb2_lock_req {
+       struct smb2_hdr hdr;
+       __le16 StructureSize; /* Must be 48 */
+       __le16 LockCount;
+       /*
+        * The least significant four bits are the index, the other 28 bits are
+        * the lock sequence number (0 to 64). See MS-SMB2 2.2.26
+        */
+       __le32 LockSequenceNumber;
+       __u64  PersistentFileId;
+       __u64  VolatileFileId;
+       /* Followed by at least one */
+       struct smb2_lock_element locks[1];
+} __packed;
+
+struct smb2_lock_rsp {
+       struct smb2_hdr hdr;
+       __le16 StructureSize; /* Must be 4 */
+       __le16 Reserved;
+} __packed;
+
+struct smb2_echo_req {
+       struct smb2_hdr hdr;
+       __le16 StructureSize;   /* Must be 4 */
+       __u16  Reserved;
+} __packed;
+
+struct smb2_echo_rsp {
+       struct smb2_hdr hdr;
+       __le16 StructureSize;   /* Must be 4 */
+       __u16  Reserved;
+} __packed;
+
+/*
+ * Valid FileInformation classes for query directory
+ *
+ * Note that these are a subset of the (file) QUERY_INFO levels defined
+ * later in this file (but since QUERY_DIRECTORY uses equivalent numbers
+ * we do not redefine them here)
+ *
+ * FileDirectoryInfomation             0x01
+ * FileFullDirectoryInformation                0x02
+ * FileIdFullDirectoryInformation      0x26
+ * FileBothDirectoryInformation                0x03
+ * FileIdBothDirectoryInformation      0x25
+ * FileNamesInformation                        0x0C
+ * FileIdExtdDirectoryInformation      0x3C
+ */
+
+/* search (query_directory) Flags field */
+#define SMB2_RESTART_SCANS             0x01
+#define SMB2_RETURN_SINGLE_ENTRY       0x02
+#define SMB2_INDEX_SPECIFIED           0x04
+#define SMB2_REOPEN                    0x10
+
+struct smb2_query_directory_req {
+       struct smb2_hdr hdr;
+       __le16 StructureSize; /* Must be 33 */
+       __u8   FileInformationClass;
+       __u8   Flags;
+       __le32 FileIndex;
+       __u64  PersistentFileId;
+       __u64  VolatileFileId;
+       __le16 FileNameOffset;
+       __le16 FileNameLength;
+       __le32 OutputBufferLength;
+       __u8   Buffer[1];
+} __packed;
+
+struct smb2_query_directory_rsp {
+       struct smb2_hdr hdr;
+       __le16 StructureSize; /* Must be 9 */
+       __le16 OutputBufferOffset;
+       __le32 OutputBufferLength;
+       __u8   Buffer[1];
+} __packed;
+
+/*
+ * Maximum number of iovs we need for a set-info request.
+ * The largest one is rename/hardlink
+ * [0] : struct smb2_set_info_req + smb2_file_[rename|link]_info
+ * [1] : path
+ * [2] : compound padding
+ */
+#define SMB2_SET_INFO_IOV_SIZE 3
+
+struct smb2_set_info_req {
+       struct smb2_hdr hdr;
+       __le16 StructureSize; /* Must be 33 */
+       __u8   InfoType;
+       __u8   FileInfoClass;
+       __le32 BufferLength;
+       __le16 BufferOffset;
+       __u16  Reserved;
+       __le32 AdditionalInformation;
+       __u64  PersistentFileId;
+       __u64  VolatileFileId;
+       __u8   Buffer[1];
+} __packed;
+
+struct smb2_set_info_rsp {
+       struct smb2_hdr hdr;
+       __le16 StructureSize; /* Must be 2 */
+} __packed;
 
 /*
  * SMB2_NOTIFY  See MS-SMB2 section 2.2.35
@@ -1129,6 +1246,58 @@ struct smb2_ioctl_rsp {
 
 /* SMB2 Query Info see MS-SMB2 (2.2.37) or MS-DTYP */
 
+/* List of QUERY INFO levels (those also valid for QUERY_DIR are noted below */
+#define FILE_DIRECTORY_INFORMATION     1       /* also for QUERY_DIR */
+#define FILE_FULL_DIRECTORY_INFORMATION 2      /* also for QUERY_DIR */
+#define FILE_BOTH_DIRECTORY_INFORMATION 3      /* also for QUERY_DIR */
+#define FILE_BASIC_INFORMATION         4
+#define FILE_STANDARD_INFORMATION      5
+#define FILE_INTERNAL_INFORMATION      6
+#define FILE_EA_INFORMATION            7
+#define FILE_ACCESS_INFORMATION                8
+#define FILE_NAME_INFORMATION          9
+#define FILE_RENAME_INFORMATION                10
+#define FILE_LINK_INFORMATION          11
+#define FILE_NAMES_INFORMATION         12      /* also for QUERY_DIR */
+#define FILE_DISPOSITION_INFORMATION   13
+#define FILE_POSITION_INFORMATION      14
+#define FILE_FULL_EA_INFORMATION       15
+#define FILE_MODE_INFORMATION          16
+#define FILE_ALIGNMENT_INFORMATION     17
+#define FILE_ALL_INFORMATION           18
+#define FILE_ALLOCATION_INFORMATION    19
+#define FILE_END_OF_FILE_INFORMATION   20
+#define FILE_ALTERNATE_NAME_INFORMATION 21
+#define FILE_STREAM_INFORMATION                22
+#define FILE_PIPE_INFORMATION          23
+#define FILE_PIPE_LOCAL_INFORMATION    24
+#define FILE_PIPE_REMOTE_INFORMATION   25
+#define FILE_MAILSLOT_QUERY_INFORMATION 26
+#define FILE_MAILSLOT_SET_INFORMATION  27
+#define FILE_COMPRESSION_INFORMATION   28
+#define FILE_OBJECT_ID_INFORMATION     29
+/* Number 30 not defined in documents */
+#define FILE_MOVE_CLUSTER_INFORMATION  31
+#define FILE_QUOTA_INFORMATION         32
+#define FILE_REPARSE_POINT_INFORMATION 33
+#define FILE_NETWORK_OPEN_INFORMATION  34
+#define FILE_ATTRIBUTE_TAG_INFORMATION 35
+#define FILE_TRACKING_INFORMATION      36
+#define FILEID_BOTH_DIRECTORY_INFORMATION 37   /* also for QUERY_DIR */
+#define FILEID_FULL_DIRECTORY_INFORMATION 38   /* also for QUERY_DIR */
+#define FILE_VALID_DATA_LENGTH_INFORMATION 39
+#define FILE_SHORT_NAME_INFORMATION    40
+#define FILE_SFIO_RESERVE_INFORMATION  44
+#define FILE_SFIO_VOLUME_INFORMATION   45
+#define FILE_HARD_LINK_INFORMATION     46
+#define FILE_NORMALIZED_NAME_INFORMATION 48
+#define FILEID_GLOBAL_TX_DIRECTORY_INFORMATION 50
+#define FILE_STANDARD_LINK_INFORMATION 54
+#define FILE_ID_INFORMATION            59
+#define FILE_ID_EXTD_DIRECTORY_INFORMATION 60  /* also for QUERY_DIR */
+/* Used for Query Info and Find File POSIX Info for SMB3.1.1 and SMB1 */
+#define SMB_FIND_FILE_POSIX_INFO       0x064
+
 /* Security info type additionalinfo flags. */
 #define OWNER_SECINFO   0x00000001
 #define GROUP_SECINFO   0x00000002
@@ -1172,4 +1341,151 @@ struct smb2_query_info_rsp {
        __u8   Buffer[1];
 } __packed;
 
+/*
+ *     PDU query infolevel structure definitions
+ */
+
+struct file_allocated_range_buffer {
+       __le64  file_offset;
+       __le64  length;
+} __packed;
+
+struct smb2_file_internal_info {
+       __le64 IndexNumber;
+} __packed; /* level 6 Query */
+
+struct smb2_file_rename_info { /* encoding of request for level 10 */
+       __u8   ReplaceIfExists; /* 1 = replace existing target with new */
+                               /* 0 = fail if target already exists */
+       __u8   Reserved[7];
+       __u64  RootDirectory;  /* MBZ for network operations (why says spec?) */
+       __le32 FileNameLength;
+       char   FileName[];     /* New name to be assigned */
+       /* padding - overall struct size must be >= 24 so filename + pad >= 6 */
+} __packed; /* level 10 Set */
+
+struct smb2_file_link_info { /* encoding of request for level 11 */
+       __u8   ReplaceIfExists; /* 1 = replace existing link with new */
+                               /* 0 = fail if link already exists */
+       __u8   Reserved[7];
+       __u64  RootDirectory;  /* MBZ for network operations (why says spec?) */
+       __le32 FileNameLength;
+       char   FileName[];     /* Name to be assigned to new link */
+} __packed; /* level 11 Set */
+
+/*
+ * This level 18, although with struct with same name is different from cifs
+ * level 0x107. Level 0x107 has an extra u64 between AccessFlags and
+ * CurrentByteOffset.
+ */
+struct smb2_file_all_info { /* data block encoding of response to level 18 */
+       __le64 CreationTime;    /* Beginning of FILE_BASIC_INFO equivalent */
+       __le64 LastAccessTime;
+       __le64 LastWriteTime;
+       __le64 ChangeTime;
+       __le32 Attributes;
+       __u32  Pad1;            /* End of FILE_BASIC_INFO_INFO equivalent */
+       __le64 AllocationSize;  /* Beginning of FILE_STANDARD_INFO equivalent */
+       __le64 EndOfFile;       /* size ie offset to first free byte in file */
+       __le32 NumberOfLinks;   /* hard links */
+       __u8   DeletePending;
+       __u8   Directory;
+       __u16  Pad2;            /* End of FILE_STANDARD_INFO equivalent */
+       __le64 IndexNumber;
+       __le32 EASize;
+       __le32 AccessFlags;
+       __le64 CurrentByteOffset;
+       __le32 Mode;
+       __le32 AlignmentRequirement;
+       __le32 FileNameLength;
+       char   FileName[1];
+} __packed; /* level 18 Query */
+
+struct smb2_file_eof_info { /* encoding of request for level 10 */
+       __le64 EndOfFile; /* new end of file value */
+} __packed; /* level 20 Set */
+
+/* Level 100 query info */
+struct smb311_posix_qinfo {
+       __le64 CreationTime;
+       __le64 LastAccessTime;
+       __le64 LastWriteTime;
+       __le64 ChangeTime;
+       __le64 EndOfFile;
+       __le64 AllocationSize;
+       __le32 DosAttributes;
+       __le64 Inode;
+       __le32 DeviceId;
+       __le32 Zero;
+       /* beginning of POSIX Create Context Response */
+       __le32 HardLinks;
+       __le32 ReparseTag;
+       __le32 Mode;
+       u8     Sids[];
+       /*
+        * var sized owner SID
+        * var sized group SID
+        * le32 filenamelength
+        * u8  filename[]
+        */
+} __packed;
+
+/* File System Information Classes */
+#define FS_VOLUME_INFORMATION          1 /* Query */
+#define FS_LABEL_INFORMATION           2 /* Set */
+#define FS_SIZE_INFORMATION            3 /* Query */
+#define FS_DEVICE_INFORMATION          4 /* Query */
+#define FS_ATTRIBUTE_INFORMATION       5 /* Query */
+#define FS_CONTROL_INFORMATION         6 /* Query, Set */
+#define FS_FULL_SIZE_INFORMATION       7 /* Query */
+#define FS_OBJECT_ID_INFORMATION       8 /* Query, Set */
+#define FS_DRIVER_PATH_INFORMATION     9 /* Query */
+#define FS_SECTOR_SIZE_INFORMATION     11 /* SMB3 or later. Query */
+#define FS_POSIX_INFORMATION           100 /* SMB3.1.1 POSIX. Query */
+
+struct smb2_fs_full_size_info {
+       __le64 TotalAllocationUnits;
+       __le64 CallerAvailableAllocationUnits;
+       __le64 ActualAvailableAllocationUnits;
+       __le32 SectorsPerAllocationUnit;
+       __le32 BytesPerSector;
+} __packed;
+
+#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
+
+/* sector size info struct */
+struct smb3_fs_ss_info {
+       __le32 LogicalBytesPerSector;
+       __le32 PhysicalBytesPerSectorForAtomicity;
+       __le32 PhysicalBytesPerSectorForPerf;
+       __le32 FSEffPhysicalBytesPerSectorForAtomicity;
+       __le32 Flags;
+       __le32 ByteOffsetForSectorAlignment;
+       __le32 ByteOffsetForPartitionAlignment;
+} __packed;
+
+/* File System Control Information */
+struct smb2_fs_control_info {
+       __le64 FreeSpaceStartFiltering;
+       __le64 FreeSpaceThreshold;
+       __le64 FreeSpaceStopFiltering;
+       __le64 DefaultQuotaThreshold;
+       __le64 DefaultQuotaLimit;
+       __le32 FileSystemControlFlags;
+       __le32 Padding;
+} __packed;
+
+/* volume info struct - see MS-FSCC 2.5.9 */
+#define MAX_VOL_LABEL_LEN      32
+struct smb3_fs_vol_info {
+       __le64  VolumeCreationTime;
+       __u32   VolumeSerialNumber;
+       __le32  VolumeLabelLength; /* includes trailing null */
+       __u8    SupportsObjects; /* True if eg like NTFS, supports objects */
+       __u8    Reserved;
+       __u8    VolumeLabel[]; /* variable len */
+} __packed;
 #endif                         /* _COMMON_SMB2PDU_H */