Print this page
NEX-19057 All zfs/nfs/smb threads in door calls to idle idmap
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-4083 Upstream changes from illumos 5917 and 5995
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-2225 Unable to join NexentaStor to 2008 AD
NEX-2286 smbadm join error messages are uninformative
NEX-1638 Updated DC Locator
 Includes work by: matt.barden@nexenta.com, kevin.crowe@nexenta.com
SMB-149 mount.cifs RedHat\Centos 6 doesn't work with default security options (fix lint)
SMB-149 mount.cifs RedHat\Centos 6 doesn't work with default security options
SMB-136 Snapshots not visible in Windows previous versions
SMB-39 Use AF_UNIX pipes for RPC
SMB-50 User-mode SMB server
 Includes work by these authors:
 Thomas Keiser <thomas.keiser@nexenta.com>
 Albert Lee <trisk@nexenta.com>
        
*** 18,28 ****
   *
   * CDDL HEADER END
   */
  /*
   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
   */
  
  #include <sys/list.h>
  #include <assert.h>
  #include <alloca.h>
--- 18,28 ----
   *
   * CDDL HEADER END
   */
  /*
   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2019 Nexenta Systems, Inc.  All rights reserved.
   */
  
  #include <sys/list.h>
  #include <assert.h>
  #include <alloca.h>
*** 101,111 ****
          { SMB_DR_QUOTA_QUERY,           smbd_dop_quota_query },
          { SMB_DR_QUOTA_SET,             smbd_dop_quota_set },
          { SMB_DR_DFS_GET_REFERRALS,     smbd_dop_dfs_get_referrals },
          { SMB_DR_SHR_HOSTACCESS,        smbd_dop_shr_hostaccess },
          { SMB_DR_SHR_EXEC,              smbd_dop_shr_exec },
!         { SMB_DR_NOTIFY_DC_CHANGED,     smbd_dop_notify_dc_changed }
  };
  
  static int smbd_ndoorop = (sizeof (smbd_doorops) / sizeof (smbd_doorops[0]));
  
  static smbd_doorsvc_t smbd_doorsvc;
--- 101,113 ----
          { SMB_DR_QUOTA_QUERY,           smbd_dop_quota_query },
          { SMB_DR_QUOTA_SET,             smbd_dop_quota_set },
          { SMB_DR_DFS_GET_REFERRALS,     smbd_dop_dfs_get_referrals },
          { SMB_DR_SHR_HOSTACCESS,        smbd_dop_shr_hostaccess },
          { SMB_DR_SHR_EXEC,              smbd_dop_shr_exec },
!         { SMB_DR_NOTIFY_DC_CHANGED,     smbd_dop_notify_dc_changed },
!         { SMB_DR_LOOKUP_LSID,           smbd_dop_lookup_sid },
!         { SMB_DR_LOOKUP_LNAME,          smbd_dop_lookup_name }
  };
  
  static int smbd_ndoorop = (sizeof (smbd_doorops) / sizeof (smbd_doorops[0]));
  
  static smbd_doorsvc_t smbd_doorsvc;
*** 579,588 ****
--- 581,594 ----
  
          /* No longer used */
          return (SMB_DOP_EMPTYBUF);
  }
  
+ /*
+  * SMB_DR_LOOKUP_NAME,
+  * SMB_DR_LOOKUP_LNAME (local-only, for idmap)
+  */
  static int
  smbd_dop_lookup_name(smbd_arg_t *arg)
  {
          smb_domain_t    dinfo;
          smb_account_t   ainfo;
*** 602,612 ****
--- 608,635 ----
                      acct.a_domain);
          else
                  (void) snprintf(buf, MAXNAMELEN, "%s\\%s", acct.a_domain,
                      acct.a_name);
  
+         switch (arg->hdr.dh_op) {
+         case SMB_DR_LOOKUP_NAME:
                  acct.a_status = lsa_lookup_name(buf, acct.a_sidtype, &ainfo);
+                 break;
+ 
+         case SMB_DR_LOOKUP_LNAME:
+                 /*
+                  * Basically for idmap.  Don't call out to AD.
+                  */
+                 acct.a_status = lsa_lookup_lname(buf, acct.a_sidtype, &ainfo);
+                 break;
+ 
+         default:
+                 assert(!"arg->hdr.dh_op");
+                 acct.a_status = NT_STATUS_INTERNAL_ERROR;
+                 break;
+         }
+ 
          if (acct.a_status == NT_STATUS_SUCCESS) {
                  acct.a_sidtype = ainfo.a_type;
                  smb_sid_tostr(ainfo.a_sid, acct.a_sid);
                  (void) strlcpy(acct.a_name, ainfo.a_name, MAXNAMELEN);
  
*** 624,633 ****
--- 647,660 ----
          if (arg->rbuf == NULL)
                  return (SMB_DOP_ENCODE_ERROR);
          return (SMB_DOP_SUCCESS);
  }
  
+ /*
+  * SMB_DR_LOOKUP_SID,
+  * SMB_DR_LOOKUP_LSID (local-only, for idmap)
+  */
  static int
  smbd_dop_lookup_sid(smbd_arg_t *arg)
  {
          smb_domain_t    dinfo;
          smb_account_t   ainfo;
*** 639,649 ****
--- 666,694 ----
          if (smb_common_decode(arg->data, arg->datalen,
              lsa_account_xdr, &acct) != 0)
                  return (SMB_DOP_DECODE_ERROR);
  
          sid = smb_sid_fromstr(acct.a_sid);
+ 
+         switch (arg->hdr.dh_op) {
+         case SMB_DR_LOOKUP_SID:
                  acct.a_status = lsa_lookup_sid(sid, &ainfo);
+                 break;
+ 
+         case SMB_DR_LOOKUP_LSID:
+                 /*
+                  * Basically for idmap.  Don't call out to AD.
+                  */
+                 acct.a_status = lsa_lookup_lsid(sid, &ainfo);
+                 break;
+ 
+         default:
+                 assert(!"arg->hdr.dh_op");
+                 acct.a_status = NT_STATUS_INTERNAL_ERROR;
+                 break;
+         }
+ 
          smb_sid_free(sid);
  
          if (acct.a_status == NT_STATUS_SUCCESS) {
                  acct.a_sidtype = ainfo.a_type;
                  smb_sid_tostr(ainfo.a_sid, acct.a_sid);