smb3: fix ksmbd bigendian bug in oplock break, and move its struct to smbfs_common
authorSteve French <stfrench@microsoft.com>
Mon, 28 Mar 2022 22:45:55 +0000 (17:45 -0500)
committerSteve French <stfrench@microsoft.com>
Thu, 31 Mar 2022 14:38:53 +0000 (09:38 -0500)
Fix an endian bug in ksmbd for one remaining use of
Persistent/VolatileFid that unnecessarily converted it (it is an
opaque endian field that does not need to be and should not
be converted) in oplock_break for ksmbd, and move the definitions
for the oplock and lease break protocol requests and responses
to fs/smbfs_common/smb2pdu.h

Also move a few more definitions for various protocol requests
that were duplicated (in fs/cifs/smb2pdu.h and fs/ksmbd/smb2pdu.h)
into fs/smbfs_common/smb2pdu.h including:

- various ioctls and reparse structures
- validate negotiate request and response structs
- duplicate extents structs

Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Reviewed-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/smb2pdu.h
fs/ksmbd/oplock.c
fs/ksmbd/smb2pdu.c
fs/ksmbd/smb2pdu.h
fs/smbfs_common/smb2pdu.h

index 8692b58..d8c4388 100644 (file)
@@ -229,12 +229,6 @@ struct copychunk_ioctl {
        __u32 Reserved2;
 } __packed;
 
-/* this goes in the ioctl buffer when doing FSCTL_SET_ZERO_DATA */
-struct file_zero_data_information {
-       __le64  FileOffset;
-       __le64  BeyondFinalZero;
-} __packed;
-
 struct copychunk_ioctl_rsp {
        __le32 ChunksWritten;
        __le32 ChunkBytesWritten;
@@ -288,53 +282,6 @@ struct fsctl_get_integrity_information_rsp {
 /* Integrity flags for above */
 #define FSCTL_INTEGRITY_FLAG_CHECKSUM_ENFORCEMENT_OFF  0x00000001
 
-/* Reparse structures - see MS-FSCC 2.1.2 */
-
-/* struct fsctl_reparse_info_req is empty, only response structs (see below) */
-
-struct reparse_data_buffer {
-       __le32  ReparseTag;
-       __le16  ReparseDataLength;
-       __u16   Reserved;
-       __u8    DataBuffer[]; /* Variable Length */
-} __packed;
-
-struct reparse_guid_data_buffer {
-       __le32  ReparseTag;
-       __le16  ReparseDataLength;
-       __u16   Reserved;
-       __u8    ReparseGuid[16];
-       __u8    DataBuffer[]; /* Variable Length */
-} __packed;
-
-struct reparse_mount_point_data_buffer {
-       __le32  ReparseTag;
-       __le16  ReparseDataLength;
-       __u16   Reserved;
-       __le16  SubstituteNameOffset;
-       __le16  SubstituteNameLength;
-       __le16  PrintNameOffset;
-       __le16  PrintNameLength;
-       __u8    PathBuffer[]; /* Variable Length */
-} __packed;
-
-#define SYMLINK_FLAG_RELATIVE 0x00000001
-
-struct reparse_symlink_data_buffer {
-       __le32  ReparseTag;
-       __le16  ReparseDataLength;
-       __u16   Reserved;
-       __le16  SubstituteNameOffset;
-       __le16  SubstituteNameLength;
-       __le16  PrintNameOffset;
-       __le16  PrintNameLength;
-       __le32  Flags;
-       __u8    PathBuffer[]; /* Variable Length */
-} __packed;
-
-/* See MS-FSCC 2.1.2.6 and cifspdu.h for struct reparse_posix_data */
-
-
 /* See MS-DFSC 2.2.2 */
 struct fsctl_get_dfs_referral_req {
        __le16 MaxReferralLevel;
@@ -350,22 +297,6 @@ struct network_resiliency_req {
 } __packed;
 /* There is no buffer for the response ie no struct network_resiliency_rsp */
 
-
-struct validate_negotiate_info_req {
-       __le32 Capabilities;
-       __u8   Guid[SMB2_CLIENT_GUID_SIZE];
-       __le16 SecurityMode;
-       __le16 DialectCount;
-       __le16 Dialects[4]; /* BB expand this if autonegotiate > 4 dialects */
-} __packed;
-
-struct validate_negotiate_info_rsp {
-       __le32 Capabilities;
-       __u8   Guid[SMB2_CLIENT_GUID_SIZE];
-       __le16 SecurityMode;
-       __le16 Dialect; /* Dialect in use for the connection */
-} __packed;
-
 #define RSS_CAPABLE    cpu_to_le32(0x00000001)
 #define RDMA_CAPABLE   cpu_to_le32(0x00000002)
 
@@ -401,14 +332,6 @@ struct compress_ioctl {
        __le16 CompressionState; /* See cifspdu.h for possible flag values */
 } __packed;
 
-struct duplicate_extents_to_file {
-       __u64 PersistentFileHandle; /* source file handle, opaque endianness */
-       __u64 VolatileFileHandle;
-       __le64 SourceFileOffset;
-       __le64 TargetFileOffset;
-       __le64 ByteCount;  /* Bytes to be copied */
-} __packed;
-
 /*
  * Maximum number of iovs we need for an ioctl request.
  * [0] : struct smb2_ioctl_req
@@ -416,41 +339,6 @@ struct duplicate_extents_to_file {
  */
 #define SMB2_IOCTL_IOV_SIZE 2
 
-struct smb2_oplock_break {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 24 */
-       __u8   OplockLevel;
-       __u8   Reserved;
-       __le32 Reserved2;
-       __u64  PersistentFid;
-       __u64  VolatileFid;
-} __packed;
-
-#define SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED cpu_to_le32(0x01)
-
-struct smb2_lease_break {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 44 */
-       __le16 Epoch;
-       __le32 Flags;
-       __u8   LeaseKey[16];
-       __le32 CurrentLeaseState;
-       __le32 NewLeaseState;
-       __le32 BreakReason;
-       __le32 AccessMaskHint;
-       __le32 ShareMaskHint;
-} __packed;
-
-struct smb2_lease_ack {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 36 */
-       __le16 Reserved;
-       __le32 Flags;
-       __u8   LeaseKey[16];
-       __le32 LeaseState;
-       __le64 LeaseDuration;
-} __packed;
-
 /*
  *     PDU query infolevel structure definitions
  *     BB consider moving to a different header
index 077b876..23871b1 100644 (file)
@@ -656,8 +656,8 @@ static void __smb2_oplock_break_noti(struct work_struct *wk)
                rsp->OplockLevel = SMB2_OPLOCK_LEVEL_NONE;
        rsp->Reserved = 0;
        rsp->Reserved2 = 0;
-       rsp->PersistentFid = cpu_to_le64(fp->persistent_id);
-       rsp->VolatileFid = cpu_to_le64(fp->volatile_id);
+       rsp->PersistentFid = fp->persistent_id;
+       rsp->VolatileFid = fp->volatile_id;
 
        inc_rfc1001_len(work->response_buf, 24);
 
index e7eb835..190b272 100644 (file)
@@ -7887,8 +7887,8 @@ static void smb20_oplock_break_ack(struct ksmbd_work *work)
        char req_oplevel = 0, rsp_oplevel = 0;
        unsigned int oplock_change_type;
 
-       volatile_id = le64_to_cpu(req->VolatileFid);
-       persistent_id = le64_to_cpu(req->PersistentFid);
+       volatile_id = req->VolatileFid;
+       persistent_id = req->PersistentFid;
        req_oplevel = req->OplockLevel;
        ksmbd_debug(OPLOCK, "v_id %llu, p_id %llu request oplock level %d\n",
                    volatile_id, persistent_id, req_oplevel);
@@ -7983,8 +7983,8 @@ static void smb20_oplock_break_ack(struct ksmbd_work *work)
        rsp->OplockLevel = rsp_oplevel;
        rsp->Reserved = 0;
        rsp->Reserved2 = 0;
-       rsp->VolatileFid = cpu_to_le64(volatile_id);
-       rsp->PersistentFid = cpu_to_le64(persistent_id);
+       rsp->VolatileFid = volatile_id;
+       rsp->PersistentFid = persistent_id;
        inc_rfc1001_len(work->response_buf, 24);
        return;
 
index 4db2896..b454308 100644 (file)
@@ -169,29 +169,6 @@ struct smb2_buffer_desc_v1 {
 
 #define SMB2_0_IOCTL_IS_FSCTL 0x00000001
 
-struct duplicate_extents_to_file {
-       __u64 PersistentFileHandle; /* source file handle, opaque endianness */
-       __u64 VolatileFileHandle;
-       __le64 SourceFileOffset;
-       __le64 TargetFileOffset;
-       __le64 ByteCount;  /* Bytes to be copied */
-} __packed;
-
-struct validate_negotiate_info_req {
-       __le32 Capabilities;
-       __u8   Guid[SMB2_CLIENT_GUID_SIZE];
-       __le16 SecurityMode;
-       __le16 DialectCount;
-       __le16 Dialects[1]; /* dialect (someday maybe list) client asked for */
-} __packed;
-
-struct validate_negotiate_info_rsp {
-       __le32 Capabilities;
-       __u8   Guid[SMB2_CLIENT_GUID_SIZE];
-       __le16 SecurityMode;
-       __le16 Dialect; /* Dialect in use for the connection */
-} __packed;
-
 struct smb_sockaddr_in {
        __be16 Port;
        __be32 IPv4address;
@@ -265,18 +242,6 @@ struct file_sparse {
        __u8    SetSparse;
 } __packed;
 
-struct file_zero_data_information {
-       __le64  FileOffset;
-       __le64  BeyondFinalZero;
-} __packed;
-
-struct reparse_data_buffer {
-       __le32  ReparseTag;
-       __le16  ReparseDataLength;
-       __u16   Reserved;
-       __u8    DataBuffer[]; /* Variable Length */
-} __packed;
-
 /* FILE Info response size */
 #define FILE_DIRECTORY_INFORMATION_SIZE       1
 #define FILE_FULL_DIRECTORY_INFORMATION_SIZE  2
@@ -332,49 +297,11 @@ struct fs_type_info {
        long            magic_number;
 } __packed;
 
-struct smb2_oplock_break {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 24 */
-       __u8   OplockLevel;
-       __u8   Reserved;
-       __le32 Reserved2;
-       __le64  PersistentFid;
-       __le64  VolatileFid;
-} __packed;
-
-#define SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED cpu_to_le32(0x01)
-
-struct smb2_lease_break {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 44 */
-       __le16 Epoch;
-       __le32 Flags;
-       __u8   LeaseKey[16];
-       __le32 CurrentLeaseState;
-       __le32 NewLeaseState;
-       __le32 BreakReason;
-       __le32 AccessMaskHint;
-       __le32 ShareMaskHint;
-} __packed;
-
-struct smb2_lease_ack {
-       struct smb2_hdr hdr;
-       __le16 StructureSize; /* Must be 36 */
-       __le16 Reserved;
-       __le32 Flags;
-       __u8   LeaseKey[16];
-       __le32 LeaseState;
-       __le64 LeaseDuration;
-} __packed;
-
 /*
  *     PDU query infolevel structure definitions
  *     BB consider moving to a different header
  */
 
-#define OP_BREAK_STRUCT_SIZE_20                24
-#define OP_BREAK_STRUCT_SIZE_21                36
-
 struct smb2_file_access_info {
        __le32 AccessFlags;
 } __packed;
index 1defcc8..0507aec 100644 (file)
@@ -1238,6 +1238,80 @@ struct smb2_ioctl_rsp {
        __u8   Buffer[];
 } __packed;
 
+/* this goes in the ioctl buffer when doing FSCTL_SET_ZERO_DATA */
+struct file_zero_data_information {
+       __le64  FileOffset;
+       __le64  BeyondFinalZero;
+} __packed;
+
+/* Reparse structures - see MS-FSCC 2.1.2 */
+
+/* struct fsctl_reparse_info_req is empty, only response structs (see below) */
+struct reparse_data_buffer {
+       __le32  ReparseTag;
+       __le16  ReparseDataLength;
+       __u16   Reserved;
+       __u8    DataBuffer[]; /* Variable Length */
+} __packed;
+
+struct reparse_guid_data_buffer {
+       __le32  ReparseTag;
+       __le16  ReparseDataLength;
+       __u16   Reserved;
+       __u8    ReparseGuid[16];
+       __u8    DataBuffer[]; /* Variable Length */
+} __packed;
+
+struct reparse_mount_point_data_buffer {
+       __le32  ReparseTag;
+       __le16  ReparseDataLength;
+       __u16   Reserved;
+       __le16  SubstituteNameOffset;
+       __le16  SubstituteNameLength;
+       __le16  PrintNameOffset;
+       __le16  PrintNameLength;
+       __u8    PathBuffer[]; /* Variable Length */
+} __packed;
+
+#define SYMLINK_FLAG_RELATIVE 0x00000001
+
+struct reparse_symlink_data_buffer {
+       __le32  ReparseTag;
+       __le16  ReparseDataLength;
+       __u16   Reserved;
+       __le16  SubstituteNameOffset;
+       __le16  SubstituteNameLength;
+       __le16  PrintNameOffset;
+       __le16  PrintNameLength;
+       __le32  Flags;
+       __u8    PathBuffer[]; /* Variable Length */
+} __packed;
+
+/* See MS-FSCC 2.1.2.6 and cifspdu.h for struct reparse_posix_data */
+
+struct validate_negotiate_info_req {
+       __le32 Capabilities;
+       __u8   Guid[SMB2_CLIENT_GUID_SIZE];
+       __le16 SecurityMode;
+       __le16 DialectCount;
+       __le16 Dialects[4]; /* BB expand this if autonegotiate > 4 dialects */
+} __packed;
+
+struct validate_negotiate_info_rsp {
+       __le32 Capabilities;
+       __u8   Guid[SMB2_CLIENT_GUID_SIZE];
+       __le16 SecurityMode;
+       __le16 Dialect; /* Dialect in use for the connection */
+} __packed;
+
+struct duplicate_extents_to_file {
+       __u64 PersistentFileHandle; /* source file handle, opaque endianness */
+       __u64 VolatileFileHandle;
+       __le64 SourceFileOffset;
+       __le64 TargetFileOffset;
+       __le64 ByteCount;  /* Bytes to be copied */
+} __packed;
+
 /* Possible InfoType values */
 #define SMB2_O_INFO_FILE       0x01
 #define SMB2_O_INFO_FILESYSTEM 0x02
@@ -1488,4 +1562,43 @@ struct smb3_fs_vol_info {
        __u8    Reserved;
        __u8    VolumeLabel[]; /* variable len */
 } __packed;
+
+/* See MS-SMB2 2.2.23 through 2.2.25 */
+struct smb2_oplock_break {
+       struct smb2_hdr hdr;
+       __le16 StructureSize; /* Must be 24 */
+       __u8   OplockLevel;
+       __u8   Reserved;
+       __le32 Reserved2;
+       __u64  PersistentFid;
+       __u64  VolatileFid;
+} __packed;
+
+#define SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED cpu_to_le32(0x01)
+
+struct smb2_lease_break {
+       struct smb2_hdr hdr;
+       __le16 StructureSize; /* Must be 44 */
+       __le16 Epoch;
+       __le32 Flags;
+       __u8   LeaseKey[16];
+       __le32 CurrentLeaseState;
+       __le32 NewLeaseState;
+       __le32 BreakReason;
+       __le32 AccessMaskHint;
+       __le32 ShareMaskHint;
+} __packed;
+
+struct smb2_lease_ack {
+       struct smb2_hdr hdr;
+       __le16 StructureSize; /* Must be 36 */
+       __le16 Reserved;
+       __le32 Flags;
+       __u8   LeaseKey[16];
+       __le32 LeaseState;
+       __le64 LeaseDuration;
+} __packed;
+
+#define OP_BREAK_STRUCT_SIZE_20                24
+#define OP_BREAK_STRUCT_SIZE_21                36
 #endif                         /* _COMMON_SMB2PDU_H */