Print this page
NEX-17289 Minimal SMB 3.0.2 support
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-5665 SMB2 oplock leases
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-5665 SMB2 oplock leases
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-1643 dtrace provider for smbsrv
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
NEX-5844 want SMB2 ioctl FSCTL_SRV_COPYCHUNK
NEX-6124 smb_fsop_read/write should allow file != sr->fid_ofile
NEX-6125 smbtorture invalid response with smb2.ioctl
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
NEX-6041 Should pass the smbtorture lock tests
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
NEX-3662 Backport illumos 1501: taskq_create_proc ... TQ_DYNAMIC puts tasks in p0 (take 2)
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Marcel Telka <marcel.telka@nexenta.com>
NEX-3576 RPC error when displaying open files via Windows MMC
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
NEX-2188 Browsing top level share produces RPC error 1728
SMB-69 read-raw, write-raw are dead code
SMB-39 Use AF_UNIX pipes for RPC

*** 18,28 **** * * CDDL HEADER END */ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. ! * Copyright 2015 Nexenta Systems, Inc. All rights reserved. */ #include <smbsrv/smb_kproto.h> #include <smbsrv/smb_fsops.h> --- 18,28 ---- * * CDDL HEADER END */ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. ! * Copyright 2018 Nexenta Systems, Inc. All rights reserved. */ #include <smbsrv/smb_kproto.h> #include <smbsrv/smb_fsops.h>
*** 71,91 **** param->rw_offset = (uint64_t)off_low; param->rw_count = (uint32_t)count; param->rw_mincnt = 0; ! DTRACE_SMB_2(op__Read__start, smb_request_t *, sr, ! smb_rw_param_t *, param); return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); } void smb_post_read(smb_request_t *sr) { ! DTRACE_SMB_2(op__Read__done, smb_request_t *, sr, ! smb_rw_param_t *, sr->arg.rw); kmem_free(sr->arg.rw, sizeof (smb_rw_param_t)); } smb_sdrc_t --- 71,89 ---- param->rw_offset = (uint64_t)off_low; param->rw_count = (uint32_t)count; param->rw_mincnt = 0; ! DTRACE_SMB_START(op__Read, smb_request_t *, sr); /* arg.rw */ return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); } void smb_post_read(smb_request_t *sr) { ! DTRACE_SMB_DONE(op__Read, smb_request_t *, sr); /* arg.rw */ kmem_free(sr->arg.rw, sizeof (smb_rw_param_t)); } smb_sdrc_t
*** 157,186 **** param->rw_offset = (uint64_t)off_low; param->rw_count = (uint32_t)count; param->rw_mincnt = 0; ! DTRACE_SMB_2(op__LockAndRead__start, smb_request_t *, sr, ! smb_rw_param_t *, param); return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); } void smb_post_lock_and_read(smb_request_t *sr) { ! DTRACE_SMB_2(op__LockAndRead__done, smb_request_t *, sr, ! smb_rw_param_t *, sr->arg.rw); kmem_free(sr->arg.rw, sizeof (smb_rw_param_t)); } smb_sdrc_t smb_com_lock_and_read(smb_request_t *sr) { smb_rw_param_t *param = sr->arg.rw; DWORD status; uint16_t count; int rc; if (STYPE_ISDSK(sr->tid_tree->t_res_type) == 0) { smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRDOS, ERRnoaccess); --- 155,183 ---- param->rw_offset = (uint64_t)off_low; param->rw_count = (uint32_t)count; param->rw_mincnt = 0; ! DTRACE_SMB_START(op__LockAndRead, smb_request_t *, sr); /* arg.rw */ return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); } void smb_post_lock_and_read(smb_request_t *sr) { ! DTRACE_SMB_DONE(op__LockAndRead, smb_request_t *, sr); /* arg.rw */ kmem_free(sr->arg.rw, sizeof (smb_rw_param_t)); } smb_sdrc_t smb_com_lock_and_read(smb_request_t *sr) { smb_rw_param_t *param = sr->arg.rw; DWORD status; + uint32_t lk_pid; uint16_t count; int rc; if (STYPE_ISDSK(sr->tid_tree->t_res_type) == 0) { smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRDOS, ERRnoaccess);
*** 193,204 **** return (SDRC_ERROR); } sr->user_cr = smb_ofile_getcred(sr->fid_ofile); status = smb_lock_range(sr, param->rw_offset, (uint64_t)param->rw_count, ! 0, SMB_LOCK_TYPE_READWRITE); if (status != NT_STATUS_SUCCESS) { smb_lock_range_error(sr, status); return (SDRC_ERROR); } --- 190,204 ---- return (SDRC_ERROR); } sr->user_cr = smb_ofile_getcred(sr->fid_ofile); + /* Note: SMB1 locking uses 16-bit PIDs. */ + lk_pid = sr->smb_pid & 0xFFFF; + status = smb_lock_range(sr, param->rw_offset, (uint64_t)param->rw_count, ! lk_pid, SMB_LOCK_TYPE_READWRITE, 0); if (status != NT_STATUS_SUCCESS) { smb_lock_range_error(sr, status); return (SDRC_ERROR); }
*** 217,226 **** --- 217,255 ---- return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); } /* + * The SMB_COM_READ_RAW protocol was a negotiated option introduced in + * SMB Core Plus to maximize performance when reading a large block + * of data from a server. It's obsolete and no longer supported. + * + * We keep a handler for it so the dtrace provider can see if + * the client tried to use this command. + */ + smb_sdrc_t + smb_pre_read_raw(smb_request_t *sr) + { + DTRACE_SMB_START(op__ReadRaw, smb_request_t *, sr); + return (SDRC_SUCCESS); + } + + void + smb_post_read_raw(smb_request_t *sr) + { + DTRACE_SMB_DONE(op__ReadRaw, smb_request_t *, sr); + } + + smb_sdrc_t + smb_com_read_raw(smb_request_t *sr) + { + smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, ERRDOS, + ERROR_NOT_SUPPORTED); + return (SDRC_ERROR); + } + + /* * Read bytes from a file (SMB Core). This request was extended in * LM 0.12 to support 64-bit offsets, indicated by sending a wct of * 12 and including additional offset information. * * MS-SMB 3.3.5.7 update to LM 0.12 4.2.4:
*** 266,286 **** param->rw_count = (uint32_t)maxcnt_low; } param->rw_mincnt = 0; ! DTRACE_SMB_2(op__ReadX__start, smb_request_t *, sr, ! smb_rw_param_t *, param); return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); } void smb_post_read_andx(smb_request_t *sr) { ! DTRACE_SMB_2(op__ReadX__done, smb_request_t *, sr, ! smb_rw_param_t *, sr->arg.rw); kmem_free(sr->arg.rw, sizeof (smb_rw_param_t)); } smb_sdrc_t --- 295,313 ---- param->rw_count = (uint32_t)maxcnt_low; } param->rw_mincnt = 0; ! DTRACE_SMB_START(op__ReadX, smb_request_t *, sr); /* arg.rw */ return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); } void smb_post_read_andx(smb_request_t *sr) { ! DTRACE_SMB_DONE(op__ReadX, smb_request_t *, sr); /* arg.rw */ kmem_free(sr->arg.rw, sizeof (smb_rw_param_t)); } smb_sdrc_t
*** 356,370 **** * Common function for reading files or IPC/MSRPC named pipes. All * protocol read functions should lookup the fid before calling this * function. We can't move the fid lookup here because lock-and-read * requires the fid to do locking before attempting the read. * ! * Reading from a file should break oplocks on the file to LEVEL_II. ! * A call to smb_oplock_break(SMB_OPLOCK_BREAK_TO_LEVEL_II) is not ! * required as it is a no-op. If there's anything greater than a ! * LEVEL_II oplock on the file, the oplock MUST be owned by the ofile ! * on which the read is occuring and therefore would not be broken. * * Returns errno values. */ int smb_common_read(smb_request_t *sr, smb_rw_param_t *param) --- 383,394 ---- * Common function for reading files or IPC/MSRPC named pipes. All * protocol read functions should lookup the fid before calling this * function. We can't move the fid lookup here because lock-and-read * requires the fid to do locking before attempting the read. * ! * Reading from a file does not break oplocks because any need for ! * breaking before read is handled in open. * * Returns errno values. */ int smb_common_read(smb_request_t *sr, smb_rw_param_t *param)
*** 411,421 **** } sr->raw_data.max_bytes = vdb->vdb_uio.uio_resid; top = smb_mbuf_allocate(&vdb->vdb_uio); ! rc = smb_fsop_read(sr, sr->user_cr, node, &vdb->vdb_uio); sr->raw_data.max_bytes -= vdb->vdb_uio.uio_resid; smb_mbuf_trim(top, sr->raw_data.max_bytes); MBC_ATTACH_MBUF(&sr->raw_data, top); break; --- 435,446 ---- } sr->raw_data.max_bytes = vdb->vdb_uio.uio_resid; top = smb_mbuf_allocate(&vdb->vdb_uio); ! rc = smb_fsop_read(sr, sr->user_cr, node, ofile, ! &vdb->vdb_uio, 0); sr->raw_data.max_bytes -= vdb->vdb_uio.uio_resid; smb_mbuf_trim(top, sr->raw_data.max_bytes); MBC_ATTACH_MBUF(&sr->raw_data, top); break;