Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag '6.7-rc-smb3-client-fixes-part1' of git://git.samba.org/sfrench/cifs-2.6

Pull smb client updates from Steve French:

- use after free fixes and deadlock fix

- symlink timestamp fix

- hashing perf improvement

- multichannel fixes

- minor debugging improvements

- fix creating fifos when using "sfu" mounts

- NTLMSSP authentication improvement

- minor fixes to include some missing create flags and structures from
recently updated protocol documentation

* tag '6.7-rc-smb3-client-fixes-part1' of git://git.samba.org/sfrench/cifs-2.6:
cifs: force interface update before a fresh session setup
cifs: do not reset chan_max if multichannel is not supported at mount
cifs: reconnect helper should set reconnect for the right channel
smb: client: fix use-after-free in smb2_query_info_compound()
smb: client: remove extra @chan_count check in __cifs_put_smb_ses()
cifs: add xid to query server interface call
cifs: print server capabilities in DebugData
smb: use crypto_shash_digest() in symlink_hash()
smb: client: fix use-after-free bug in cifs_debug_data_proc_show()
smb: client: fix potential deadlock when releasing mids
smb3: fix creating FIFOs when mounting with "sfu" mount option
Add definition for new smb3.1.1 command type
SMB3: clarify some of the unused CreateOption flags
cifs: Add client version details to NTLM authenticate message
smb3: fix touch -h of symlink

+138 -90
+49 -35
fs/smb/client/cached_dir.c
··· 32 32 * fully cached or it may be in the process of 33 33 * being deleted due to a lease break. 34 34 */ 35 - if (!cfid->has_lease) { 35 + if (!cfid->time || !cfid->has_lease) { 36 36 spin_unlock(&cfids->cfid_list_lock); 37 37 return NULL; 38 38 } ··· 193 193 npath = path_no_prefix(cifs_sb, path); 194 194 if (IS_ERR(npath)) { 195 195 rc = PTR_ERR(npath); 196 - kfree(utf16_path); 197 - return rc; 196 + goto out; 198 197 } 198 + 199 + if (!npath[0]) { 200 + dentry = dget(cifs_sb->root); 201 + } else { 202 + dentry = path_to_dentry(cifs_sb, npath); 203 + if (IS_ERR(dentry)) { 204 + rc = -ENOENT; 205 + goto out; 206 + } 207 + } 208 + cfid->dentry = dentry; 199 209 200 210 /* 201 211 * We do not hold the lock for the open because in case ··· 259 249 260 250 smb2_set_related(&rqst[1]); 261 251 252 + /* 253 + * Set @cfid->has_lease to true before sending out compounded request so 254 + * its lease reference can be put in cached_dir_lease_break() due to a 255 + * potential lease break right after the request is sent or while @cfid 256 + * is still being cached. Concurrent processes won't be to use it yet 257 + * due to @cfid->time being zero. 258 + */ 259 + cfid->has_lease = true; 260 + 262 261 rc = compound_send_recv(xid, ses, server, 263 262 flags, 2, rqst, 264 263 resp_buftype, rsp_iov); ··· 282 263 cfid->tcon = tcon; 283 264 cfid->is_open = true; 284 265 266 + spin_lock(&cfids->cfid_list_lock); 267 + 285 268 o_rsp = (struct smb2_create_rsp *)rsp_iov[0].iov_base; 286 269 oparms.fid->persistent_fid = o_rsp->PersistentFileId; 287 270 oparms.fid->volatile_fid = o_rsp->VolatileFileId; ··· 291 270 oparms.fid->mid = le64_to_cpu(o_rsp->hdr.MessageId); 292 271 #endif /* CIFS_DEBUG2 */ 293 272 294 - if (o_rsp->OplockLevel != SMB2_OPLOCK_LEVEL_LEASE) 273 + rc = -EINVAL; 274 + if (o_rsp->OplockLevel != SMB2_OPLOCK_LEVEL_LEASE) { 275 + spin_unlock(&cfids->cfid_list_lock); 295 276 goto oshr_free; 277 + } 296 278 297 279 smb2_parse_contexts(server, o_rsp, 298 280 &oparms.fid->epoch, 299 281 oparms.fid->lease_key, &oplock, 300 282 NULL, NULL); 301 - if (!(oplock & SMB2_LEASE_READ_CACHING_HE)) 283 + if (!(oplock & SMB2_LEASE_READ_CACHING_HE)) { 284 + spin_unlock(&cfids->cfid_list_lock); 302 285 goto oshr_free; 286 + } 303 287 qi_rsp = (struct smb2_query_info_rsp *)rsp_iov[1].iov_base; 304 - if (le32_to_cpu(qi_rsp->OutputBufferLength) < sizeof(struct smb2_file_all_info)) 288 + if (le32_to_cpu(qi_rsp->OutputBufferLength) < sizeof(struct smb2_file_all_info)) { 289 + spin_unlock(&cfids->cfid_list_lock); 305 290 goto oshr_free; 291 + } 306 292 if (!smb2_validate_and_copy_iov( 307 293 le16_to_cpu(qi_rsp->OutputBufferOffset), 308 294 sizeof(struct smb2_file_all_info), ··· 317 289 (char *)&cfid->file_all_info)) 318 290 cfid->file_all_info_is_valid = true; 319 291 320 - if (!npath[0]) 321 - dentry = dget(cifs_sb->root); 322 - else { 323 - dentry = path_to_dentry(cifs_sb, npath); 324 - if (IS_ERR(dentry)) { 325 - rc = -ENOENT; 326 - goto oshr_free; 327 - } 328 - } 329 - spin_lock(&cfids->cfid_list_lock); 330 - cfid->dentry = dentry; 331 292 cfid->time = jiffies; 332 - cfid->has_lease = true; 333 293 spin_unlock(&cfids->cfid_list_lock); 294 + /* At this point the directory handle is fully cached */ 295 + rc = 0; 334 296 335 297 oshr_free: 336 - kfree(utf16_path); 337 298 SMB2_open_free(&rqst[0]); 338 299 SMB2_query_info_free(&rqst[1]); 339 300 free_rsp_buf(resp_buftype[0], rsp_iov[0].iov_base); 340 301 free_rsp_buf(resp_buftype[1], rsp_iov[1].iov_base); 341 - spin_lock(&cfids->cfid_list_lock); 342 - if (!cfid->has_lease) { 343 - if (rc) { 344 - if (cfid->on_list) { 345 - list_del(&cfid->entry); 346 - cfid->on_list = false; 347 - cfids->num_entries--; 348 - } 349 - rc = -ENOENT; 350 - } else { 302 + if (rc) { 303 + spin_lock(&cfids->cfid_list_lock); 304 + if (cfid->on_list) { 305 + list_del(&cfid->entry); 306 + cfid->on_list = false; 307 + cfids->num_entries--; 308 + } 309 + if (cfid->has_lease) { 351 310 /* 352 311 * We are guaranteed to have two references at this 353 312 * point. One for the caller and one for a potential ··· 342 327 * will be closed when the caller closes the cached 343 328 * handle. 344 329 */ 330 + cfid->has_lease = false; 345 331 spin_unlock(&cfids->cfid_list_lock); 346 332 kref_put(&cfid->refcount, smb2_close_cached_fid); 347 333 goto out; 348 334 } 335 + spin_unlock(&cfids->cfid_list_lock); 349 336 } 350 - spin_unlock(&cfids->cfid_list_lock); 337 + out: 351 338 if (rc) { 352 339 if (cfid->is_open) 353 340 SMB2_close(0, cfid->tcon, cfid->fid.persistent_fid, 354 341 cfid->fid.volatile_fid); 355 342 free_cached_dir(cfid); 356 - cfid = NULL; 357 - } 358 - out: 359 - if (rc == 0) { 343 + } else { 360 344 *ret_cfid = cfid; 361 345 atomic_inc(&tcon->num_remote_opens); 362 346 } 363 - 347 + kfree(utf16_path); 364 348 return rc; 365 349 } 366 350
+8
fs/smb/client/cifs_debug.c
··· 427 427 if (server->nosharesock) 428 428 seq_printf(m, " nosharesock"); 429 429 430 + seq_printf(m, "\nServer capabilities: 0x%x", server->capabilities); 431 + 430 432 if (server->rdma) 431 433 seq_printf(m, "\nRDMA "); 432 434 seq_printf(m, "\nTCP status: %d Instance: %d" ··· 454 452 seq_printf(m, "\n\n\tSessions: "); 455 453 i = 0; 456 454 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) { 455 + spin_lock(&ses->ses_lock); 456 + if (ses->ses_status == SES_EXITING) { 457 + spin_unlock(&ses->ses_lock); 458 + continue; 459 + } 457 460 i++; 458 461 if ((ses->serverDomain == NULL) || 459 462 (ses->serverOS == NULL) || ··· 479 472 ses->ses_count, ses->serverOS, ses->serverNOS, 480 473 ses->capabilities, ses->ses_status); 481 474 } 475 + spin_unlock(&ses->ses_lock); 482 476 483 477 seq_printf(m, "\n\tSecurity type: %s ", 484 478 get_security_type_str(server->ops->select_sectype(server, ses->sectype)));
+1
fs/smb/client/cifsfs.c
··· 1191 1191 1192 1192 const struct inode_operations cifs_symlink_inode_ops = { 1193 1193 .get_link = cifs_get_link, 1194 + .setattr = cifs_setattr, 1194 1195 .permission = cifs_permission, 1195 1196 .listxattr = cifs_listxattr, 1196 1197 };
+1 -1
fs/smb/client/cifspdu.h
··· 2570 2570 2571 2571 2572 2572 struct win_dev { 2573 - unsigned char type[8]; /* IntxCHR or IntxBLK */ 2573 + unsigned char type[8]; /* IntxCHR or IntxBLK or LnxFIFO*/ 2574 2574 __le64 major; 2575 2575 __le64 minor; 2576 2576 } __attribute__((packed));
+6 -1
fs/smb/client/cifsproto.h
··· 81 81 extern char *build_wildcard_path_from_dentry(struct dentry *direntry); 82 82 char *cifs_build_devname(char *nodename, const char *prepath); 83 83 extern void delete_mid(struct mid_q_entry *mid); 84 - extern void release_mid(struct mid_q_entry *mid); 84 + void __release_mid(struct kref *refcount); 85 85 extern void cifs_wake_up_task(struct mid_q_entry *mid); 86 86 extern int cifs_handle_standard(struct TCP_Server_Info *server, 87 87 struct mid_q_entry *mid); ··· 738 738 return false; 739 739 } 740 740 return true; 741 + } 742 + 743 + static inline void release_mid(struct mid_q_entry *mid) 744 + { 745 + kref_put(&mid->refcount, __release_mid); 741 746 } 742 747 743 748 #endif /* _CIFSPROTO_H */
+24 -20
fs/smb/client/connect.c
··· 119 119 static void smb2_query_server_interfaces(struct work_struct *work) 120 120 { 121 121 int rc; 122 + int xid; 122 123 struct cifs_tcon *tcon = container_of(work, 123 124 struct cifs_tcon, 124 125 query_interfaces.work); ··· 127 126 /* 128 127 * query server network interfaces, in case they change 129 128 */ 130 - rc = SMB3_request_interfaces(0, tcon, false); 129 + xid = get_xid(); 130 + rc = SMB3_request_interfaces(xid, tcon, false); 131 + free_xid(xid); 132 + 131 133 if (rc) { 132 134 cifs_dbg(FYI, "%s: failed to query server interfaces: %d\n", 133 135 __func__, rc); ··· 160 156 /* If server is a channel, select the primary channel */ 161 157 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; 162 158 163 - spin_lock(&pserver->srv_lock); 159 + /* if we need to signal just this channel */ 164 160 if (!all_channels) { 165 - pserver->tcpStatus = CifsNeedReconnect; 166 - spin_unlock(&pserver->srv_lock); 161 + spin_lock(&server->srv_lock); 162 + if (server->tcpStatus != CifsExiting) 163 + server->tcpStatus = CifsNeedReconnect; 164 + spin_unlock(&server->srv_lock); 167 165 return; 168 166 } 169 - spin_unlock(&pserver->srv_lock); 170 167 171 168 spin_lock(&cifs_tcp_ses_lock); 172 169 list_for_each_entry(ses, &pserver->smb_ses_list, smb_ses_list) { ··· 1974 1969 1975 1970 void __cifs_put_smb_ses(struct cifs_ses *ses) 1976 1971 { 1977 - unsigned int rc, xid; 1978 - unsigned int chan_count; 1979 1972 struct TCP_Server_Info *server = ses->server; 1973 + unsigned int xid; 1974 + size_t i; 1975 + int rc; 1980 1976 1981 1977 spin_lock(&ses->ses_lock); 1982 1978 if (ses->ses_status == SES_EXITING) { ··· 2023 2017 list_del_init(&ses->smb_ses_list); 2024 2018 spin_unlock(&cifs_tcp_ses_lock); 2025 2019 2026 - chan_count = ses->chan_count; 2027 - 2028 2020 /* close any extra channels */ 2029 - if (chan_count > 1) { 2030 - int i; 2031 - 2032 - for (i = 1; i < chan_count; i++) { 2033 - if (ses->chans[i].iface) { 2034 - kref_put(&ses->chans[i].iface->refcount, release_iface); 2035 - ses->chans[i].iface = NULL; 2036 - } 2037 - cifs_put_tcp_session(ses->chans[i].server, 0); 2038 - ses->chans[i].server = NULL; 2021 + for (i = 1; i < ses->chan_count; i++) { 2022 + if (ses->chans[i].iface) { 2023 + kref_put(&ses->chans[i].iface->refcount, release_iface); 2024 + ses->chans[i].iface = NULL; 2039 2025 } 2026 + cifs_put_tcp_session(ses->chans[i].server, 0); 2027 + ses->chans[i].server = NULL; 2040 2028 } 2041 2029 2042 2030 sesInfoFree(ses); ··· 3849 3849 is_binding = !CIFS_ALL_CHANS_NEED_RECONNECT(ses); 3850 3850 spin_unlock(&ses->chan_lock); 3851 3851 3852 - if (!is_binding) 3852 + if (!is_binding) { 3853 3853 ses->ses_status = SES_IN_SETUP; 3854 + 3855 + /* force iface_list refresh */ 3856 + ses->iface_last_update = 0; 3857 + } 3854 3858 spin_unlock(&ses->ses_lock); 3855 3859 3856 3860 /* update ses ip_addr only for primary chan */
+4
fs/smb/client/inode.c
··· 594 594 cifs_dbg(FYI, "Symlink\n"); 595 595 fattr->cf_mode |= S_IFLNK; 596 596 fattr->cf_dtype = DT_LNK; 597 + } else if (memcmp("LnxFIFO", pbuf, 8) == 0) { 598 + cifs_dbg(FYI, "FIFO\n"); 599 + fattr->cf_mode |= S_IFIFO; 600 + fattr->cf_dtype = DT_FIFO; 597 601 } else { 598 602 fattr->cf_mode |= S_IFREG; /* file? */ 599 603 fattr->cf_dtype = DT_REG;
+2 -14
fs/smb/client/link.c
··· 42 42 43 43 rc = cifs_alloc_hash("md5", &md5); 44 44 if (rc) 45 - goto symlink_hash_err; 45 + return rc; 46 46 47 - rc = crypto_shash_init(md5); 48 - if (rc) { 49 - cifs_dbg(VFS, "%s: Could not init md5 shash\n", __func__); 50 - goto symlink_hash_err; 51 - } 52 - rc = crypto_shash_update(md5, link_str, link_len); 53 - if (rc) { 54 - cifs_dbg(VFS, "%s: Could not update with link_str\n", __func__); 55 - goto symlink_hash_err; 56 - } 57 - rc = crypto_shash_final(md5, md5_hash); 47 + rc = crypto_shash_digest(md5, link_str, link_len, md5_hash); 58 48 if (rc) 59 49 cifs_dbg(VFS, "%s: Could not generate md5 hash\n", __func__); 60 - 61 - symlink_hash_err: 62 50 cifs_free_hash(&md5); 63 51 return rc; 64 52 }
+2 -2
fs/smb/client/ntlmssp.h
··· 133 133 SECURITY_BUFFER WorkstationName; 134 134 SECURITY_BUFFER SessionKey; 135 135 __le32 NegotiateFlags; 136 - /* SECURITY_BUFFER for version info not present since we 137 - do not set the version is present flag */ 136 + struct ntlmssp_version Version; 137 + /* SECURITY_BUFFER */ 138 138 char UserString[]; 139 139 } __attribute__((packed)) AUTHENTICATE_MESSAGE, *PAUTHENTICATE_MESSAGE; 140 140
+9 -4
fs/smb/client/sess.c
··· 186 186 } 187 187 188 188 if (!(server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) { 189 - ses->chan_max = 1; 190 189 spin_unlock(&ses->chan_lock); 191 190 cifs_server_dbg(VFS, "no multichannel support\n"); 192 191 return 0; ··· 1059 1060 memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8); 1060 1061 sec_blob->MessageType = NtLmAuthenticate; 1061 1062 1063 + /* send version information in ntlmssp authenticate also */ 1062 1064 flags = ses->ntlmssp->server_flags | NTLMSSP_REQUEST_TARGET | 1063 - NTLMSSP_NEGOTIATE_TARGET_INFO | NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED; 1064 - /* we only send version information in ntlmssp negotiate, so do not set this flag */ 1065 - flags = flags & ~NTLMSSP_NEGOTIATE_VERSION; 1065 + NTLMSSP_NEGOTIATE_TARGET_INFO | NTLMSSP_NEGOTIATE_VERSION | 1066 + NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED; 1067 + 1068 + sec_blob->Version.ProductMajorVersion = LINUX_VERSION_MAJOR; 1069 + sec_blob->Version.ProductMinorVersion = LINUX_VERSION_PATCHLEVEL; 1070 + sec_blob->Version.ProductBuild = cpu_to_le16(SMB3_PRODUCT_BUILD); 1071 + sec_blob->Version.NTLMRevisionCurrent = NTLMSSP_REVISION_W2K3; 1072 + 1066 1073 tmp = *pbuffer + sizeof(AUTHENTICATE_MESSAGE); 1067 1074 sec_blob->NegotiateFlags = cpu_to_le32(flags); 1068 1075
+1 -1
fs/smb/client/smb2misc.c
··· 787 787 { 788 788 struct close_cancelled_open *cancelled; 789 789 790 - cancelled = kzalloc(sizeof(*cancelled), GFP_ATOMIC); 790 + cancelled = kzalloc(sizeof(*cancelled), GFP_KERNEL); 791 791 if (!cancelled) 792 792 return -ENOMEM; 793 793
+7 -1
fs/smb/client/smb2ops.c
··· 5089 5089 * over SMB2/SMB3 and Samba will do this with SMB3.1.1 POSIX Extensions 5090 5090 */ 5091 5091 5092 - if (!S_ISCHR(mode) && !S_ISBLK(mode)) 5092 + if (!S_ISCHR(mode) && !S_ISBLK(mode) && !S_ISFIFO(mode)) 5093 5093 return rc; 5094 5094 5095 5095 cifs_dbg(FYI, "sfu compat create special file\n"); ··· 5135 5135 memcpy(pdev->type, "IntxBLK", 8); 5136 5136 pdev->major = cpu_to_le64(MAJOR(dev)); 5137 5137 pdev->minor = cpu_to_le64(MINOR(dev)); 5138 + rc = tcon->ses->server->ops->sync_write(xid, &fid, &io_parms, 5139 + &bytes_written, iov, 1); 5140 + } else if (S_ISFIFO(mode)) { 5141 + memcpy(pdev->type, "LnxFIFO", 8); 5142 + pdev->major = 0; 5143 + pdev->minor = 0; 5138 5144 rc = tcon->ses->server->ops->sync_write(xid, &fid, &io_parms, 5139 5145 &bytes_written, iov, 1); 5140 5146 }
+1 -10
fs/smb/client/transport.c
··· 76 76 return temp; 77 77 } 78 78 79 - static void __release_mid(struct kref *refcount) 79 + void __release_mid(struct kref *refcount) 80 80 { 81 81 struct mid_q_entry *midEntry = 82 82 container_of(refcount, struct mid_q_entry, refcount); ··· 154 154 put_task_struct(midEntry->creator); 155 155 156 156 mempool_free(midEntry, cifs_mid_poolp); 157 - } 158 - 159 - void release_mid(struct mid_q_entry *mid) 160 - { 161 - struct TCP_Server_Info *server = mid->server; 162 - 163 - spin_lock(&server->mid_lock); 164 - kref_put(&mid->refcount, __release_mid); 165 - spin_unlock(&server->mid_lock); 166 157 } 167 158 168 159 void
+23 -1
fs/smb/common/smb2pdu.h
··· 34 34 #define SMB2_QUERY_INFO_HE 0x0010 35 35 #define SMB2_SET_INFO_HE 0x0011 36 36 #define SMB2_OPLOCK_BREAK_HE 0x0012 37 + #define SMB2_SERVER_TO_CLIENT_NOTIFICATION 0x0013 37 38 38 39 /* The same list in little endian */ 39 40 #define SMB2_NEGOTIATE cpu_to_le16(SMB2_NEGOTIATE_HE) ··· 412 411 #define SMB2_GLOBAL_CAP_PERSISTENT_HANDLES 0x00000010 /* New to SMB3 */ 413 412 #define SMB2_GLOBAL_CAP_DIRECTORY_LEASING 0x00000020 /* New to SMB3 */ 414 413 #define SMB2_GLOBAL_CAP_ENCRYPTION 0x00000040 /* New to SMB3 */ 414 + #define SMB2_GLOBAL_CAP_NOTIFICATIONS 0x00000080 /* New to SMB3.1.1 */ 415 415 /* Internal types */ 416 416 #define SMB2_NT_FIND 0x00100000 417 417 #define SMB2_LARGE_FILES 0x00200000 ··· 983 981 __u8 Buffer[]; /* array of file notify structs */ 984 982 } __packed; 985 983 984 + /* 985 + * SMB2_SERVER_TO_CLIENT_NOTIFICATION: See MS-SMB2 section 2.2.44 986 + */ 987 + 988 + #define SMB2_NOTIFY_SESSION_CLOSED 0x0000 989 + 990 + struct smb2_server_client_notification { 991 + struct smb2_hdr hdr; 992 + __le16 StructureSize; 993 + __u16 Reserved; /* MBZ */ 994 + __le32 NotificationType; 995 + __u8 NotificationBuffer[4]; /* MBZ */ 996 + } __packed; 986 997 987 998 /* 988 999 * SMB2_CREATE See MS-SMB2 section 2.2.13 ··· 1112 1097 #define FILE_WRITE_THROUGH_LE cpu_to_le32(0x00000002) 1113 1098 #define FILE_SEQUENTIAL_ONLY_LE cpu_to_le32(0x00000004) 1114 1099 #define FILE_NO_INTERMEDIATE_BUFFERING_LE cpu_to_le32(0x00000008) 1100 + /* FILE_SYNCHRONOUS_IO_ALERT_LE cpu_to_le32(0x00000010) should be zero, ignored */ 1101 + /* FILE_SYNCHRONOUS_IO_NONALERT cpu_to_le32(0x00000020) should be zero, ignored */ 1115 1102 #define FILE_NON_DIRECTORY_FILE_LE cpu_to_le32(0x00000040) 1116 1103 #define FILE_COMPLETE_IF_OPLOCKED_LE cpu_to_le32(0x00000100) 1117 1104 #define FILE_NO_EA_KNOWLEDGE_LE cpu_to_le32(0x00000200) 1105 + /* FILE_OPEN_REMOTE_INSTANCE cpu_to_le32(0x00000400) should be zero, ignored */ 1118 1106 #define FILE_RANDOM_ACCESS_LE cpu_to_le32(0x00000800) 1119 - #define FILE_DELETE_ON_CLOSE_LE cpu_to_le32(0x00001000) 1107 + #define FILE_DELETE_ON_CLOSE_LE cpu_to_le32(0x00001000) /* MBZ */ 1120 1108 #define FILE_OPEN_BY_FILE_ID_LE cpu_to_le32(0x00002000) 1121 1109 #define FILE_OPEN_FOR_BACKUP_INTENT_LE cpu_to_le32(0x00004000) 1122 1110 #define FILE_NO_COMPRESSION_LE cpu_to_le32(0x00008000) 1111 + /* FILE_OPEN_REQUIRING_OPLOCK cpu_to_le32(0x00010000) should be zero, ignored */ 1112 + /* FILE_DISALLOW_EXCLUSIVE cpu_to_le32(0x00020000) should be zero, ignored */ 1113 + /* FILE_RESERVE_OPFILTER cpu_to_le32(0x00100000) MBZ */ 1123 1114 #define FILE_OPEN_REPARSE_POINT_LE cpu_to_le32(0x00200000) 1124 1115 #define FILE_OPEN_NO_RECALL_LE cpu_to_le32(0x00400000) 1116 + /* #define FILE_OPEN_FOR_FREE_SPACE_QUERY cpu_to_le32(0x00800000) should be zero, ignored */ 1125 1117 #define CREATE_OPTIONS_MASK_LE cpu_to_le32(0x00FFFFFF) 1126 1118 1127 1119 #define FILE_READ_RIGHTS_LE (FILE_READ_DATA_LE | FILE_READ_EA_LE \