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,10 +20,12 @@
  */
 
 /*
  * 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,26 +69,23 @@
  */
 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;
+        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);
 
-        /* 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;

@@ -93,12 +92,12 @@
 
 again:
         /*
          * This does the OTW Get
          */
-        error = smbfs_smb_getsec_m(smi->smi_share, fid,
-            &scred, selector, mp, &sdlen);
+        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,18 +112,14 @@
         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);
+        smbfs_smb_tmpclose(np, fid);
 
 out:
         smb_credrele(&scred);
-        smbfs_rw_exit(&np->r_lkserlock);
 
         return (error);
 }
 
 /*

@@ -137,15 +132,15 @@
  */
 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;
+        smb_fh_t        *fid = NULL;
+        int error;
 
         np = VTOSMB(vp);
         smi = VTOSMI(vp);
 
         /*

@@ -162,13 +157,10 @@
         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;

@@ -183,21 +175,17 @@
         mutex_exit(&np->r_statelock);
 
         /*
          * This does the OTW Set
          */
-        error = smbfs_smb_setsec_m(smi->smi_share, fid,
-            &scred, selector, mp);
+        error = smbfs_smb_setsec(smi->smi_share, fid,
+            selector, mp, &scred);
 
-        cerror = smbfs_smb_tmpclose(np, fid, &scred);
-        if (cerror)
-                SMBVDEBUG("error %d closing file %s\n",
-                    cerror, np->n_rpath);
+        smbfs_smb_tmpclose(np, fid);
 
 out:
         smb_credrele(&scred);
-        smbfs_rw_exit(&np->r_lkserlock);
 
         return (error);
 }
 
 /*