summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGordon Ross <gwr@racktopsystems.com>2022-01-18 09:38:37 -0500
committerToomas Soome <tsoome@me.com>2022-11-09 19:40:26 +0200
commit814e0daa42b0648d115fbe8c5d2858e4eb099cbd (patch)
tree1de4eca49eae3d6655a19af82909f18edd44db04
parent0d5d3873da6f8c195c095c01db06e31cedc0aa5a (diff)
downloadillumos-joyent-814e0daa42b0648d115fbe8c5d2858e4eb099cbd.tar.gz
15108 SMB option to enable short names
Reviewed by: Andy Stormont <astormont@racktopsystems.com> Reviewed by: Garrett D'Amore <garrett@damore.org> Reviewed by: Matt Barden <mbarden@tintri.com> Reviewed by: Yuri Pankov <yuri@aetern.org> Approved by: Dan McDonald <danmcd@mnx.io>
-rw-r--r--usr/src/cmd/smbsrv/smbd/server.xml4
-rw-r--r--usr/src/lib/libshare/smb/libshare_smb.c3
-rw-r--r--usr/src/lib/smbsrv/libsmb/common/libsmb.h3
-rw-r--r--usr/src/lib/smbsrv/libsmb/common/smb_cfg.c3
-rw-r--r--usr/src/lib/smbsrv/libsmb/common/smb_info.c4
-rw-r--r--usr/src/lib/smbsrv/libsmb/common/smb_kmod.c4
-rw-r--r--usr/src/man/man5/smb.517
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb2_tree_connect.c1
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_init.c2
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_kshare.c11
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_server.c1
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_tree.c21
-rw-r--r--usr/src/uts/common/smbsrv/smb_ioctl.h3
-rw-r--r--usr/src/uts/common/smbsrv/smbinfo.h3
14 files changed, 57 insertions, 23 deletions
diff --git a/usr/src/cmd/smbsrv/smbd/server.xml b/usr/src/cmd/smbsrv/smbd/server.xml
index 44e3666067..dd45594349 100644
--- a/usr/src/cmd/smbsrv/smbd/server.xml
+++ b/usr/src/cmd/smbsrv/smbd/server.xml
@@ -25,7 +25,7 @@ Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
Copyright 2018 Nexenta Systems, Inc. All rights reserved.
Copyright 2016 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
Copyright 2020 Tintri by DDN, Inc. All rights reserved.
-Copyright 2020 RackTop Systems.
+Copyright 2022 RackTop Systems, Inc.
NOTE: This service manifest is not editable; its contents will
be overwritten by package or patch operations, including
@@ -227,6 +227,8 @@ file.
value='0' override='true'/>
<propval name='print_enable' type='boolean'
value='false' override='true'/>
+ <propval name='short_names' type='boolean'
+ value='false' override='true'/>
<propval name='traverse_mounts' type='boolean'
value='true' override='true'/>
<propval name='max_protocol' type='astring'
diff --git a/usr/src/lib/libshare/smb/libshare_smb.c b/usr/src/lib/libshare/smb/libshare_smb.c
index b926637def..4b5d4a4662 100644
--- a/usr/src/lib/libshare/smb/libshare_smb.c
+++ b/usr/src/lib/libshare/smb/libshare_smb.c
@@ -22,6 +22,7 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2017 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2022 RackTop Systems.
*/
/*
@@ -900,6 +901,8 @@ struct smb_proto_option_defs {
SMB_REFRESH_REFRESH },
{ SMB_CI_OPLOCK_ENABLE, 0, 0, true_false_validator,
SMB_REFRESH_REFRESH },
+ { SMB_CI_SHORT_NAMES, 0, 0, true_false_validator,
+ SMB_REFRESH_REFRESH },
};
#define SMB_OPT_NUM \
diff --git a/usr/src/lib/smbsrv/libsmb/common/libsmb.h b/usr/src/lib/smbsrv/libsmb/common/libsmb.h
index 388553e03c..bb21e1021a 100644
--- a/usr/src/lib/smbsrv/libsmb/common/libsmb.h
+++ b/usr/src/lib/smbsrv/libsmb/common/libsmb.h
@@ -22,7 +22,7 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2020 Tintri by DDN, Inc. All rights reserved.
- * Copyright 2020 RackTop Systems, Inc.
+ * Copyright 2022 RackTop Systems, Inc.
*/
#ifndef _LIBSMB_H
@@ -163,6 +163,7 @@ typedef enum {
SMB_CI_BYPASS_TRAVERSE_CHECKING,
SMB_CI_ENCRYPT_CIPHER,
SMB_CI_NETLOGON_FLAGS,
+ SMB_CI_SHORT_NAMES,
SMB_CI_MAX
} smb_cfg_id_t;
diff --git a/usr/src/lib/smbsrv/libsmb/common/smb_cfg.c b/usr/src/lib/smbsrv/libsmb/common/smb_cfg.c
index b295916cb3..2e38586f22 100644
--- a/usr/src/lib/smbsrv/libsmb/common/smb_cfg.c
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_cfg.c
@@ -21,7 +21,7 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2022 Tintri by DDN, Inc. All rights reserved.
- * Copyright 2021 RackTop Systems, Inc.
+ * Copyright 2022 RackTop Systems, Inc.
*/
/*
@@ -160,6 +160,7 @@ static smb_cfg_param_t smb_cfg_table[] =
"bypass_traverse_checking", SCF_TYPE_BOOLEAN, 0},
{SMB_CI_ENCRYPT_CIPHER, "encrypt_cipher", SCF_TYPE_ASTRING, 0},
{SMB_CI_NETLOGON_FLAGS, "netlogon_flags", SCF_TYPE_INTEGER, 0},
+ {SMB_CI_SHORT_NAMES, "short_names", SCF_TYPE_BOOLEAN, 0},
/* SMB_CI_MAX */
};
diff --git a/usr/src/lib/smbsrv/libsmb/common/smb_info.c b/usr/src/lib/smbsrv/libsmb/common/smb_info.c
index 1cd213cc9a..dac9f8323e 100644
--- a/usr/src/lib/smbsrv/libsmb/common/smb_info.c
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_info.c
@@ -21,7 +21,7 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2020 Tintri by DDN, Inc. All rights reserved.
- * Copyright 2020 RackTop Systems, Inc.
+ * Copyright 2022 RackTop Systems, Inc.
*/
#include <sys/types.h>
@@ -157,6 +157,8 @@ smb_load_kconfig(smb_kmod_cfg_t *kcfg)
kcfg->skc_oplock_enable = smb_config_getbool(SMB_CI_OPLOCK_ENABLE);
kcfg->skc_sync_enable = smb_config_getbool(SMB_CI_SYNC_ENABLE);
kcfg->skc_traverse_mounts = smb_config_getbool(SMB_CI_TRAVERSE_MOUNTS);
+ kcfg->skc_short_names = smb_config_getbool(SMB_CI_SHORT_NAMES);
+
kcfg->skc_max_protocol = smb_config_get_max_protocol();
kcfg->skc_min_protocol = smb_config_get_min_protocol();
kcfg->skc_secmode = smb_config_get_secmode();
diff --git a/usr/src/lib/smbsrv/libsmb/common/smb_kmod.c b/usr/src/lib/smbsrv/libsmb/common/smb_kmod.c
index 06654400f1..726e9f1600 100644
--- a/usr/src/lib/smbsrv/libsmb/common/smb_kmod.c
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_kmod.c
@@ -22,7 +22,7 @@
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2017 Nexenta Systems, Inc. All rights reserved.
* Copyright 2017 Joyent, Inc.
- * Copyright 2020 RackTop Systems, Inc.
+ * Copyright 2022 RackTop Systems, Inc.
*/
#include <sys/types.h>
@@ -89,6 +89,8 @@ smb_kmod_setcfg(smb_kmod_cfg_t *cfg)
ioc.ipv6_enable = cfg->skc_ipv6_enable;
ioc.print_enable = cfg->skc_print_enable;
ioc.traverse_mounts = cfg->skc_traverse_mounts;
+ ioc.short_names = cfg->skc_short_names;
+
ioc.max_protocol = cfg->skc_max_protocol;
ioc.min_protocol = cfg->skc_min_protocol;
ioc.exec_flags = cfg->skc_execflags;
diff --git a/usr/src/man/man5/smb.5 b/usr/src/man/man5/smb.5
index 50977b3e1a..024327b05b 100644
--- a/usr/src/man/man5/smb.5
+++ b/usr/src/man/man5/smb.5
@@ -1,7 +1,7 @@
'\" te
.\" Copyright (c) 2009, Sun Microsystems, Inc. All Rights Reserved.
.\" Copyright 2017, Nexenta Systems, Inc. All Rights Reserved.
-.\" Copyright 2021, RackTop Systems, Inc. All Rights Reserved.
+.\" Copyright 2022, RackTop Systems, Inc. All Rights Reserved.
.\" The contents of this file are subject to the terms of the
.\" Common Development and Distribution License (the "License").
.\" You may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@
.\" fields enclosed by brackets "[]" replaced with your own identifying
.\" information: Portions Copyright [yyyy] [name of copyright owner]
.\"
-.TH SMB 5 "December 28, 2020"
+.TH SMB 5 "January 17, 2022"
.SH NAME
smb \- configuration properties for Solaris CIFS server
.SH DESCRIPTION
@@ -501,6 +501,19 @@ enables anonymous access.
.sp
.ne 2
.na
+\fB\fBshort_names\fR\fR
+.ad
+.sp .6
+.RS 4n
+Enables use of "short names" by SMB clients. The default value is
+\fBfalse\fR because modern SMB clients do not need short names, and
+using short names has some performance cost while listing directories
+and opening or renaming files.
+.RE
+
+.sp
+.ne 2
+.na
\fB\fBsigning_enabled\fR\fR
.ad
.sp .6
diff --git a/usr/src/uts/common/fs/smbsrv/smb2_tree_connect.c b/usr/src/uts/common/fs/smbsrv/smb2_tree_connect.c
index c783d2b19e..a371f90e8d 100644
--- a/usr/src/uts/common/fs/smbsrv/smb2_tree_connect.c
+++ b/usr/src/uts/common/fs/smbsrv/smb2_tree_connect.c
@@ -127,6 +127,7 @@ errout:
/*
* XXX These need work..
+ * See SMB1 flags in tcon->optional_support
*/
if (tree->t_encrypt != SMB_CONFIG_DISABLED)
ShareFlags = SMB2_SHAREFLAG_ENCRYPT_DATA;
diff --git a/usr/src/uts/common/fs/smbsrv/smb_init.c b/usr/src/uts/common/fs/smbsrv/smb_init.c
index f7e1739367..9f8d1130f0 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_init.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_init.c
@@ -22,6 +22,7 @@
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2014 Nexenta Systems, Inc. All rights reserved.
* Copyright 2019 Joyent, Inc.
+ * Copyright 2022 RackTop Systems, Inc.
*/
#include <sys/types.h>
@@ -67,7 +68,6 @@ int smb_maxbufsize = SMB_NT_MAXBUF;
int smb_flush_required = 1;
int smb_dirsymlink_enable = 1;
int smb_sign_debug = 0;
-int smb_shortnames = 1;
uint_t smb_audit_flags =
#ifdef DEBUG
SMB_AUDIT_NODE;
diff --git a/usr/src/uts/common/fs/smbsrv/smb_kshare.c b/usr/src/uts/common/fs/smbsrv/smb_kshare.c
index 0bdd85ddba..01d382fed7 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_kshare.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_kshare.c
@@ -23,6 +23,7 @@
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2017 Nexenta Systems, Inc. All rights reserved.
* Copyright 2017 Joyent, Inc.
+ * Copyright 2022 RackTop Systems.
*/
#include <smbsrv/smb_door.h>
@@ -508,8 +509,14 @@ out:
int
smb_kshare_info(smb_ioc_shareinfo_t *ioc)
{
- ioc->shortnames = smb_shortnames;
- return (0);
+ smb_server_t *sv;
+ int rc;
+
+ if ((rc = smb_server_lookup(&sv)) == 0) {
+ ioc->shortnames = sv->sv_cfg.skc_short_names;
+ smb_server_release(sv);
+ }
+ return (rc);
}
/*
diff --git a/usr/src/uts/common/fs/smbsrv/smb_server.c b/usr/src/uts/common/fs/smbsrv/smb_server.c
index 63ca6343bc..ca2d584498 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_server.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_server.c
@@ -2123,6 +2123,7 @@ smb_server_store_cfg(smb_server_t *sv, smb_ioc_cfg_t *ioc)
sv->sv_cfg.skc_ipv6_enable = ioc->ipv6_enable;
sv->sv_cfg.skc_print_enable = ioc->print_enable;
sv->sv_cfg.skc_traverse_mounts = ioc->traverse_mounts;
+ sv->sv_cfg.skc_short_names = ioc->short_names;
sv->sv_cfg.skc_max_protocol = ioc->max_protocol;
sv->sv_cfg.skc_min_protocol = ioc->min_protocol;
sv->sv_cfg.skc_encrypt = ioc->encrypt;
diff --git a/usr/src/uts/common/fs/smbsrv/smb_tree.c b/usr/src/uts/common/fs/smbsrv/smb_tree.c
index 2aadc3bf38..b0f2d9b222 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_tree.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_tree.c
@@ -22,7 +22,7 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2016 by Delphix. All rights reserved.
- * Copyright 2021 Tintri by DDN, Inc. All rights reserved.
+ * Copyright 2022 Tintri by DDN, Inc. All rights reserved.
*/
/*
@@ -743,15 +743,14 @@ smb_tree_connect_disk(smb_request_t *sr, smb_arg_tcon_t *tcon)
if (si->shr_flags & SMB_SHRF_DFSROOT)
tcon->optional_support |= SMB_SHARE_IS_IN_DFS;
- /* if 'smb' zfs property: shortnames=disabled */
- if (!smb_shortnames)
- sr->arg.tcon.optional_support |= SMB_UNIQUE_FILE_NAME;
-
tree = smb_tree_alloc(sr, si, snode, access, sr->sr_cfg->skc_execflags);
if (tree == NULL)
return (NT_STATUS_INSUFF_SERVER_RESOURCES);
+ if (tree->t_flags & SMB_TREE_SHORTNAMES)
+ tcon->optional_support |= SMB_UNIQUE_FILE_NAME;
+
if (tree->t_execflags & SMB_EXEC_MAP) {
smb_tree_set_execinfo(tree, &execinfo, SMB_EXEC_MAP);
@@ -1097,6 +1096,7 @@ smb_tree_get_sharename(char *unc_path)
/*
* Obtain the tree attributes: volume name, typename and flags.
+ * Called only with DISK and PRINTQ shares.
*/
static int
smb_tree_getattr(const smb_kshare_t *si, smb_node_t *node, smb_tree_t *tree)
@@ -1187,6 +1187,9 @@ smb_tree_get_volname(vfs_t *vfsp, smb_tree_t *tree)
}
/*
+ * Get flags from the VFS (and other places) for a new tree.
+ * Called only with DISK and PRINTQ shares.
+ *
* Always set "unicode on disk" because we always use utf8 names locally.
* Always set ACL support because the VFS will fake ACLs for file systems
* that don't support them.
@@ -1238,17 +1241,13 @@ smb_tree_get_flags(const smb_kshare_t *si, vfs_t *vfsp, smb_tree_t *tree)
if (si->shr_flags & SMB_SHRF_FSO)
flags |= SMB_TREE_FORCE_L2_OPLOCK;
- if (ssn->s_cfg.skc_oplock_enable) {
- /* if 'smb' zfs property: oplocks=enabled */
+ if (ssn->s_cfg.skc_oplock_enable)
flags |= SMB_TREE_OPLOCKS;
- }
- /* Global config option for now. Later make per-share. */
if (ssn->s_cfg.skc_traverse_mounts)
flags |= SMB_TREE_TRAVERSE_MOUNTS;
- /* if 'smb' zfs property: shortnames=enabled */
- if (smb_shortnames)
+ if (ssn->s_cfg.skc_short_names)
flags |= SMB_TREE_SHORTNAMES;
if (vfsp->vfs_flag & VFS_RDONLY)
diff --git a/usr/src/uts/common/smbsrv/smb_ioctl.h b/usr/src/uts/common/smbsrv/smb_ioctl.h
index fcd912a744..3144c36d03 100644
--- a/usr/src/uts/common/smbsrv/smb_ioctl.h
+++ b/usr/src/uts/common/smbsrv/smb_ioctl.h
@@ -22,7 +22,7 @@
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2017 Nexenta Systems, Inc. All rights reserved.
* Copyright 2017 Joyent, Inc.
- * Copyright 2020 RackTop Systems, Inc.
+ * Copyright 2022 RackTop Systems, Inc.
*/
#ifndef _SMB_IOCTL_H_
@@ -172,6 +172,7 @@ typedef struct smb_ioc_cfg {
int32_t ipv6_enable;
int32_t print_enable;
int32_t traverse_mounts;
+ int32_t short_names;
uint32_t max_protocol;
uint32_t min_protocol;
uint32_t encrypt;
diff --git a/usr/src/uts/common/smbsrv/smbinfo.h b/usr/src/uts/common/smbsrv/smbinfo.h
index e83d871bff..bb42925757 100644
--- a/usr/src/uts/common/smbsrv/smbinfo.h
+++ b/usr/src/uts/common/smbsrv/smbinfo.h
@@ -21,7 +21,7 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2020 Tintri by DDN, Inc. All rights reserved.
- * Copyright 2021 RackTop Systems, Inc.
+ * Copyright 2022 RackTop Systems, Inc.
*/
#ifndef _SMBSRV_SMBINFO_H
@@ -158,6 +158,7 @@ typedef struct smb_kmod_cfg {
int32_t skc_ipv6_enable;
int32_t skc_print_enable;
int32_t skc_traverse_mounts;
+ int32_t skc_short_names;
uint32_t skc_max_protocol; /* SMB_VERS_... */
uint32_t skc_min_protocol; /* SMB_VERS_... */
smb_cfg_val_t skc_encrypt; /* EncryptData and RejectUnencryptedAccess */