Print this page
NEX-14666 Need to provide SMB 2.1 Client
NEX-17187 panic in smbfs_acl_store
NEX-17231 smbfs create xattr files finds wrong file
NEX-17224 smbfs lookup EINVAL should be ENOENT
NEX-17260 SMB1 client fails to list directory after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
and: (cleanup)

*** 20,29 **** --- 20,31 ---- */ /* * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * + * Copyright 2018 Nexenta Systems, Inc. All rights reserved. */ /* * ACL support for smbfs */
*** 67,92 **** */ static int smbfs_getsd(vnode_t *vp, uint32_t selector, mblk_t **mp, cred_t *cr) { struct smb_cred scred; - int error, cerror; smbmntinfo_t *smi; smbnode_t *np; ! u_int16_t fid = SMB_FID_UNUSED; uint32_t sdlen = SMALL_SD_SIZE; uint32_t rights = STD_RIGHT_READ_CONTROL_ACCESS; if (selector & SACL_SECURITY_INFORMATION) rights |= SEC_RIGHT_SYSTEM_SECURITY; np = VTOSMB(vp); smi = VTOSMI(vp); - /* Shared lock for (possible) n_fid use. */ - if (smbfs_rw_enter_sig(&np->r_lkserlock, RW_READER, SMBINTR(vp))) - return (EINTR); smb_credinit(&scred, cr); error = smbfs_smb_tmpopen(np, rights, &scred, &fid); if (error) goto out; --- 69,91 ---- */ static int smbfs_getsd(vnode_t *vp, uint32_t selector, mblk_t **mp, cred_t *cr) { struct smb_cred scred; smbmntinfo_t *smi; smbnode_t *np; ! smb_fh_t *fid = NULL; uint32_t sdlen = SMALL_SD_SIZE; uint32_t rights = STD_RIGHT_READ_CONTROL_ACCESS; + int error; if (selector & SACL_SECURITY_INFORMATION) rights |= SEC_RIGHT_SYSTEM_SECURITY; np = VTOSMB(vp); smi = VTOSMI(vp); smb_credinit(&scred, cr); error = smbfs_smb_tmpopen(np, rights, &scred, &fid); if (error) goto out;
*** 93,104 **** again: /* * This does the OTW Get */ ! error = smbfs_smb_getsec_m(smi->smi_share, fid, ! &scred, selector, mp, &sdlen); /* * Server may give us an error indicating that we * need a larger data buffer to receive the SD, * and the size we'll need. Use the given size, * but only after a sanity check. --- 92,103 ---- again: /* * This does the OTW Get */ ! error = smbfs_smb_getsec(smi->smi_share, fid, ! selector, mp, &sdlen, &scred); /* * Server may give us an error indicating that we * need a larger data buffer to receive the SD, * and the size we'll need. Use the given size, * but only after a sanity check.
*** 113,130 **** if (error == E2BIG && sdlen > SMALL_SD_SIZE && sdlen <= MAX_RAW_SD_SIZE) goto again; ! cerror = smbfs_smb_tmpclose(np, fid, &scred); ! if (cerror) ! SMBVDEBUG("error %d closing file %s\n", ! cerror, np->n_rpath); out: smb_credrele(&scred); - smbfs_rw_exit(&np->r_lkserlock); return (error); } /* --- 112,125 ---- if (error == E2BIG && sdlen > SMALL_SD_SIZE && sdlen <= MAX_RAW_SD_SIZE) goto again; ! smbfs_smb_tmpclose(np, fid); out: smb_credrele(&scred); return (error); } /*
*** 137,151 **** */ static int smbfs_setsd(vnode_t *vp, uint32_t selector, mblk_t **mp, cred_t *cr) { struct smb_cred scred; - int error, cerror; smbmntinfo_t *smi; smbnode_t *np; uint32_t rights; ! u_int16_t fid = SMB_FID_UNUSED; np = VTOSMB(vp); smi = VTOSMI(vp); /* --- 132,146 ---- */ static int smbfs_setsd(vnode_t *vp, uint32_t selector, mblk_t **mp, cred_t *cr) { struct smb_cred scred; smbmntinfo_t *smi; smbnode_t *np; uint32_t rights; ! smb_fh_t *fid = NULL; ! int error; np = VTOSMB(vp); smi = VTOSMI(vp); /*
*** 162,174 **** if (selector & DACL_SECURITY_INFORMATION) rights |= STD_RIGHT_WRITE_DAC_ACCESS; if (selector & SACL_SECURITY_INFORMATION) rights |= SEC_RIGHT_SYSTEM_SECURITY; - /* Shared lock for (possible) n_fid use. */ - if (smbfs_rw_enter_sig(&np->r_lkserlock, RW_READER, SMBINTR(vp))) - return (EINTR); smb_credinit(&scred, cr); error = smbfs_smb_tmpopen(np, rights, &scred, &fid); if (error) goto out; --- 157,166 ----
*** 183,203 **** mutex_exit(&np->r_statelock); /* * This does the OTW Set */ ! error = smbfs_smb_setsec_m(smi->smi_share, fid, ! &scred, selector, mp); ! cerror = smbfs_smb_tmpclose(np, fid, &scred); ! if (cerror) ! SMBVDEBUG("error %d closing file %s\n", ! cerror, np->n_rpath); out: smb_credrele(&scred); - smbfs_rw_exit(&np->r_lkserlock); return (error); } /* --- 175,191 ---- mutex_exit(&np->r_statelock); /* * This does the OTW Set */ ! error = smbfs_smb_setsec(smi->smi_share, fid, ! selector, mp, &scred); ! smbfs_smb_tmpclose(np, fid); out: smb_credrele(&scred); return (error); } /*