diff options
| author | Gordon Ross <gwr@nexenta.com> | 2013-06-26 16:05:44 -0400 |
|---|---|---|
| committer | Gordon Ross <gwr@nexenta.com> | 2015-11-06 12:22:30 -0500 |
| commit | a90cf9f29973990687fa61de9f1f6ea22e924e40 (patch) | |
| tree | 42f77e59c4470ef6d2ba3118ba6c75e43686c398 /usr/src/cmd/smbsrv | |
| parent | b24e356b384ccc80805e7150979de2373d44347c (diff) | |
| download | illumos-joyent-a90cf9f29973990687fa61de9f1f6ea22e924e40.tar.gz | |
6399 SMB2 support
Portions contributed by: Alek Pinchuk <alek@nexenta.com>
Portions contributed by: Kevin Crowe <kevin.crowe@nexenta.com>
Portions contributed by: Matt Barden <Matt.Barden@nexenta.com>
Reviewed by: Alek Pinchuk <alek@nexenta.com>
Reviewed by: Bayard Bell <bayard.bell@nexenta.com>
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Daniel Borek <daniel.borek@nexenta.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Yuri Pankov <Yuri.Pankov@nexenta.com>
Approved by: Garrett D'Amore <garrett@damore.org>
Diffstat (limited to 'usr/src/cmd/smbsrv')
| -rw-r--r-- | usr/src/cmd/smbsrv/smbd/server.xml | 10 | ||||
| -rw-r--r-- | usr/src/cmd/smbsrv/smbd/smbd.h | 4 | ||||
| -rw-r--r-- | usr/src/cmd/smbsrv/smbd/smbd_doorsvc.c | 4 | ||||
| -rw-r--r-- | usr/src/cmd/smbsrv/smbd/smbd_main.c | 7 | ||||
| -rw-r--r-- | usr/src/cmd/smbsrv/smbd/smbd_vss.c | 27 | ||||
| -rw-r--r-- | usr/src/cmd/smbsrv/smbstat/smbstat.c | 201 |
6 files changed, 170 insertions, 83 deletions
diff --git a/usr/src/cmd/smbsrv/smbd/server.xml b/usr/src/cmd/smbsrv/smbd/server.xml index d8dc32c114..3364a193f3 100644 --- a/usr/src/cmd/smbsrv/smbd/server.xml +++ b/usr/src/cmd/smbsrv/smbd/server.xml @@ -22,7 +22,7 @@ information: Portions Copyright [yyyy] [name of copyright owner] CDDL HEADER END Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. -Copyright 2013 Nexenta Systems, Inc. All rights reserved. +Copyright 2015 Nexenta Systems, Inc. All rights reserved. NOTE: This service manifest is not editable; its contents will be overwritten by package or patch operations, including @@ -216,8 +216,16 @@ file. value='5.0' override='true'/> <propval name='dfs_stdroot_num' type='integer' value='0' override='true'/> + <propval name='print_enable' type='boolean' + value='false' override='true'/> <propval name='traverse_mounts' type='boolean' value='true' override='true'/> + <propval name='max_protocol' type='astring' + value='' override='true'/> + <propval name='initial_credits' type='integer' + value='20' override='true'/> + <propval name='maximum_credits' type='integer' + value='1000' override='true'/> </property_group> <!-- SMB service-specific shares exec configuration defaults --> diff --git a/usr/src/cmd/smbsrv/smbd/smbd.h b/usr/src/cmd/smbsrv/smbd/smbd.h index 436120a745..c389813f9d 100644 --- a/usr/src/cmd/smbsrv/smbd/smbd.h +++ b/usr/src/cmd/smbsrv/smbd/smbd.h @@ -21,7 +21,7 @@ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright 2013 Nexenta Systems, Inc. All rights reserved. + * Copyright 2014 Nexenta Systems, Inc. All rights reserved. */ #ifndef _SMBD_H @@ -67,7 +67,7 @@ void smbd_load_printers(void); int smbd_vss_get_count(const char *, uint32_t *); void smbd_vss_get_snapshots(const char *, uint32_t, uint32_t *, uint32_t *, char **); -int smbd_vss_map_gmttoken(const char *, char *, char *); +int smbd_vss_map_gmttoken(const char *, char *, time_t, char *); typedef struct smbd { const char *s_version; /* smbd version string */ diff --git a/usr/src/cmd/smbsrv/smbd/smbd_doorsvc.c b/usr/src/cmd/smbsrv/smbd/smbd_doorsvc.c index 6de84cadbe..ce606b7b97 100644 --- a/usr/src/cmd/smbsrv/smbd/smbd_doorsvc.c +++ b/usr/src/cmd/smbsrv/smbd/smbd_doorsvc.c @@ -20,7 +20,7 @@ */ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright 2013 Nexenta Systems, Inc. All rights reserved. + * Copyright 2014 Nexenta Systems, Inc. All rights reserved. */ #include <sys/list.h> @@ -806,7 +806,7 @@ smbd_dop_vss_map_gmttoken(smbd_arg_t *arg) } if ((smbd_vss_map_gmttoken(request.gts_path, request.gts_gmttoken, - snapname) != 0)) { + request.gts_toktime, snapname) != 0)) { *snapname = '\0'; } diff --git a/usr/src/cmd/smbsrv/smbd/smbd_main.c b/usr/src/cmd/smbsrv/smbd/smbd_main.c index b1c9dbc770..21dc7a20d1 100644 --- a/usr/src/cmd/smbsrv/smbd/smbd_main.c +++ b/usr/src/cmd/smbsrv/smbd/smbd_main.c @@ -20,7 +20,7 @@ */ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright 2014 Nexenta Systems, Inc. All rights reserved. + * Copyright 2015 Nexenta Systems, Inc. All rights reserved. */ #include <sys/types.h> @@ -473,6 +473,11 @@ smbd_service_init(void) return (-1); } +#ifndef FKSMBD + /* Upgrade SMF settings, if necessary. */ + smb_config_upgrade(); +#endif + smb_codepage_init(); rc = smbd_cups_init(); diff --git a/usr/src/cmd/smbsrv/smbd/smbd_vss.c b/usr/src/cmd/smbsrv/smbd/smbd_vss.c index 411037b8e6..be78fc1ccc 100644 --- a/usr/src/cmd/smbsrv/smbd/smbd_vss.c +++ b/usr/src/cmd/smbsrv/smbd/smbd_vss.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright 2014 Nexenta Systems, Inc. All rights reserved. */ #include <synch.h> @@ -88,7 +89,7 @@ typedef struct smbd_vss_get_uint64_date { } smbd_vss_get_uint64_date_t; typedef struct smbd_vss_map_gmttoken { - char *mg_gmttoken; + time_t mg_snaptime; char *mg_snapname; } smbd_vss_map_gmttoken_t; @@ -214,10 +215,14 @@ smbd_vss_get_snapshots(const char *path, uint32_t count, libzfs_fini(libhd); } +static const char +smbd_vss_gmttoken_fmt[] = "@GMT-%Y.%m.%d-%H.%M.%S"; + /* * path - path of the dataset for the operation * gmttoken - the @GMT token to be looked up - * snapname - the snapshot name to be returned + * toktime - time_t used if gmttoken == NULL + * snapname - the snapshot name to be returned [MAXPATHLEN] * * Here we are going to get the snapshot name from the @GMT token * The snapname returned by ZFS is : <dataset name>@<snapshot name> @@ -225,7 +230,8 @@ smbd_vss_get_snapshots(const char *path, uint32_t count, * the right place and then just return the snapshot name */ int -smbd_vss_map_gmttoken(const char *path, char *gmttoken, char *snapname) +smbd_vss_map_gmttoken(const char *path, char *gmttoken, time_t toktime, + char *snapname) { char dataset[MAXPATHLEN]; libzfs_handle_t *libhd; @@ -233,8 +239,14 @@ smbd_vss_map_gmttoken(const char *path, char *gmttoken, char *snapname) smbd_vss_map_gmttoken_t vss_map_gmttoken; char *zsnap; const char *lsnap; + struct tm tm; + + if (gmttoken != NULL && *gmttoken == '@' && + strptime(gmttoken, smbd_vss_gmttoken_fmt, &tm) != NULL) { + toktime = timegm(&tm); + } - vss_map_gmttoken.mg_gmttoken = gmttoken; + vss_map_gmttoken.mg_snaptime = toktime; vss_map_gmttoken.mg_snapname = snapname; *snapname = '\0'; @@ -281,7 +293,7 @@ smbd_vss_time2gmttoken(time_t time, char *gmttoken) (void) gmtime_r(&time, &t); (void) strftime(gmttoken, SMB_VSS_GMT_SIZE, - "@GMT-%Y.%m.%d-%H.%M.%S", &t); + smbd_vss_gmttoken_fmt, &t); } static int @@ -349,12 +361,9 @@ smbd_vss_iterate_map_gmttoken(zfs_handle_t *zhp, void *data) { smbd_vss_map_gmttoken_t *vss_data = data; time_t time; - char gmttoken[SMB_VSS_GMT_SIZE]; time = (time_t)zfs_prop_get_int(zhp, ZFS_PROP_CREATION); - smbd_vss_time2gmttoken(time, gmttoken); - - if (strncmp(gmttoken, vss_data->mg_gmttoken, SMB_VSS_GMT_SIZE) == 0) { + if (time == vss_data->mg_snaptime) { (void) strlcpy(vss_data->mg_snapname, zfs_get_name(zhp), MAXPATHLEN); diff --git a/usr/src/cmd/smbsrv/smbstat/smbstat.c b/usr/src/cmd/smbsrv/smbstat/smbstat.c index 1cc91b7232..c8ea26d7f9 100644 --- a/usr/src/cmd/smbsrv/smbstat/smbstat.c +++ b/usr/src/cmd/smbsrv/smbstat/smbstat.c @@ -20,8 +20,8 @@ */ /* - * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright 2015 Nexenta Systems, Inc. All rights reserved. */ /* @@ -214,7 +214,8 @@ typedef struct smbstat_srv_info { /* * Latency & Throughput per request */ - smbstat_req_info_t si_reqs[SMB_COM_NUM]; + smbstat_req_info_t si_reqs1[SMB_COM_NUM]; + smbstat_req_info_t si_reqs2[SMB2__NCMDS]; } smbstat_srv_info_t; static void smbstat_init(void); @@ -252,6 +253,9 @@ static void smbstat_srv_process_utilization(smbstat_srv_snapshot_t *, smbstat_srv_snapshot_t *); static void smbstat_srv_process_requests(smbstat_srv_snapshot_t *, smbstat_srv_snapshot_t *); +static void smbstat_srv_process_one_req(smbstat_req_info_t *, + smb_kstat_req_t *, smb_kstat_req_t *, boolean_t); + static smbstat_srv_snapshot_t *smbstat_srv_current_snapshot(void); static smbstat_srv_snapshot_t *smbstat_srv_previous_snapshot(void); @@ -445,6 +449,7 @@ smbstat_kstat_print(void) smbstat_print_throughput(); smbstat_print_utilization(); smbstat_print_requests(); + (void) fflush(stdout); } /* @@ -549,10 +554,9 @@ smbstat_print_requests(void) if (!smbstat_opt_r) return; - prq = smbstat_srv_info.si_reqs; - (void) printf(SMBSRV_REQUESTS_BANNER, " "); + prq = smbstat_srv_info.si_reqs1; for (i = 0; i < SMB_COM_NUM; i++) { if (!smbstat_opt_a && strncmp(prq[i].ri_name, "Invalid", sizeof ("Invalid")) == 0) @@ -570,6 +574,24 @@ smbstat_print_requests(void) prq[i].ri_stddev); } } + + prq = smbstat_srv_info.si_reqs2; + for (i = 0; i < SMB2__NCMDS; i++) { + if (!smbstat_opt_a && i == SMB2_INVALID_CMD) + continue; + + if (!smbstat_opt_z || (prq[i].ri_pct != 0)) { + (void) printf(SMBSRV_REQUESTS_FORMAT, + prq[i].ri_name, + prq[i].ri_opcode, + smbstat_zero(prq[i].ri_pct), + smbstat_zero(prq[i].ri_rbs), + smbstat_zero(prq[i].ri_tbs), + smbstat_zero(prq[i].ri_rqs), + prq[i].ri_mean, + prq[i].ri_stddev); + } + } } /* @@ -754,7 +776,7 @@ smbstat_wrk_process(void) curr = smbstat_wrk_current_snapshot(); - if (curr->ws_maxthreads >= curr->ws_bnalloc) + if (curr->ws_bnalloc >= curr->ws_maxthreads) smbstat_srv_info.si_sat = B_TRUE; else smbstat_srv_info.si_sat = B_FALSE; @@ -881,34 +903,40 @@ smbstat_srv_process_throughput( smbstat_srv_info.si_rqs /= smbstat_srv_info.si_etime; smbstat_srv_info.si_rds = smbstat_sub_64( - curr->ss_data.ks_reqs[SMB_COM_READ].kr_nreq, - prev->ss_data.ks_reqs[SMB_COM_READ].kr_nreq); + curr->ss_data.ks_reqs1[SMB_COM_READ].kr_nreq, + prev->ss_data.ks_reqs1[SMB_COM_READ].kr_nreq); + smbstat_srv_info.si_rds += smbstat_sub_64( + curr->ss_data.ks_reqs1[SMB_COM_LOCK_AND_READ].kr_nreq, + prev->ss_data.ks_reqs1[SMB_COM_LOCK_AND_READ].kr_nreq); smbstat_srv_info.si_rds += smbstat_sub_64( - curr->ss_data.ks_reqs[SMB_COM_LOCK_AND_READ].kr_nreq, - prev->ss_data.ks_reqs[SMB_COM_LOCK_AND_READ].kr_nreq); + curr->ss_data.ks_reqs1[SMB_COM_READ_RAW].kr_nreq, + prev->ss_data.ks_reqs1[SMB_COM_READ_RAW].kr_nreq); smbstat_srv_info.si_rds += smbstat_sub_64( - curr->ss_data.ks_reqs[SMB_COM_READ_RAW].kr_nreq, - prev->ss_data.ks_reqs[SMB_COM_READ_RAW].kr_nreq); + curr->ss_data.ks_reqs1[SMB_COM_READ_ANDX].kr_nreq, + prev->ss_data.ks_reqs1[SMB_COM_READ_ANDX].kr_nreq); smbstat_srv_info.si_rds += smbstat_sub_64( - curr->ss_data.ks_reqs[SMB_COM_READ_ANDX].kr_nreq, - prev->ss_data.ks_reqs[SMB_COM_READ_ANDX].kr_nreq); + curr->ss_data.ks_reqs2[SMB2_READ].kr_nreq, + prev->ss_data.ks_reqs2[SMB2_READ].kr_nreq); smbstat_srv_info.si_rds /= smbstat_srv_info.si_etime; smbstat_srv_info.si_wrs = smbstat_sub_64( - curr->ss_data.ks_reqs[SMB_COM_WRITE].kr_nreq, - prev->ss_data.ks_reqs[SMB_COM_WRITE].kr_nreq); + curr->ss_data.ks_reqs1[SMB_COM_WRITE].kr_nreq, + prev->ss_data.ks_reqs1[SMB_COM_WRITE].kr_nreq); smbstat_srv_info.si_wrs += smbstat_sub_64( - curr->ss_data.ks_reqs[SMB_COM_WRITE_AND_UNLOCK].kr_nreq, - prev->ss_data.ks_reqs[SMB_COM_WRITE_AND_UNLOCK].kr_nreq); + curr->ss_data.ks_reqs1[SMB_COM_WRITE_AND_UNLOCK].kr_nreq, + prev->ss_data.ks_reqs1[SMB_COM_WRITE_AND_UNLOCK].kr_nreq); smbstat_srv_info.si_wrs += smbstat_sub_64( - curr->ss_data.ks_reqs[SMB_COM_WRITE_RAW].kr_nreq, - prev->ss_data.ks_reqs[SMB_COM_WRITE_RAW].kr_nreq); + curr->ss_data.ks_reqs1[SMB_COM_WRITE_RAW].kr_nreq, + prev->ss_data.ks_reqs1[SMB_COM_WRITE_RAW].kr_nreq); smbstat_srv_info.si_wrs += smbstat_sub_64( - curr->ss_data.ks_reqs[SMB_COM_WRITE_AND_CLOSE].kr_nreq, - prev->ss_data.ks_reqs[SMB_COM_WRITE_AND_CLOSE].kr_nreq); + curr->ss_data.ks_reqs1[SMB_COM_WRITE_AND_CLOSE].kr_nreq, + prev->ss_data.ks_reqs1[SMB_COM_WRITE_AND_CLOSE].kr_nreq); smbstat_srv_info.si_wrs += smbstat_sub_64( - curr->ss_data.ks_reqs[SMB_COM_WRITE_ANDX].kr_nreq, - prev->ss_data.ks_reqs[SMB_COM_WRITE_ANDX].kr_nreq); + curr->ss_data.ks_reqs1[SMB_COM_WRITE_ANDX].kr_nreq, + prev->ss_data.ks_reqs1[SMB_COM_WRITE_ANDX].kr_nreq); + smbstat_srv_info.si_wrs += smbstat_sub_64( + curr->ss_data.ks_reqs2[SMB2_WRITE].kr_nreq, + prev->ss_data.ks_reqs2[SMB2_WRITE].kr_nreq); smbstat_srv_info.si_wrs /= smbstat_srv_info.si_etime; } @@ -999,55 +1027,79 @@ smbstat_srv_process_requests( smbstat_srv_snapshot_t *prev) { smbstat_req_info_t *info; - double nrqs; + smb_kstat_req_t *curr_req; + smb_kstat_req_t *prev_req; int i, idx; - - info = smbstat_srv_info.si_reqs; + boolean_t firstcall = (prev->ss_snaptime == 0); for (i = 0; i < SMB_COM_NUM; i++) { - idx = info[i].ri_opcode; - - nrqs = smbstat_sub_64(curr->ss_data.ks_reqs[idx].kr_nreq, - prev->ss_data.ks_reqs[idx].kr_nreq); - - info[i].ri_rqs = nrqs / smbstat_srv_info.si_etime; - - info[i].ri_rbs = smbstat_sub_64( - curr->ss_data.ks_reqs[idx].kr_rxb, - prev->ss_data.ks_reqs[idx].kr_rxb) / - smbstat_srv_info.si_etime; - - info[i].ri_tbs = smbstat_sub_64( - curr->ss_data.ks_reqs[idx].kr_txb, - prev->ss_data.ks_reqs[idx].kr_txb) / - smbstat_srv_info.si_etime; - - info[i].ri_pct = nrqs * 100; - if (smbstat_srv_info.si_total_nreqs > 0) - info[i].ri_pct /= smbstat_srv_info.si_total_nreqs; - - if (prev->ss_snaptime == 0) { - /* First time. Take the aggregate */ - info[i].ri_stddev = - curr->ss_data.ks_reqs[idx].kr_a_stddev; - info[i].ri_mean = curr->ss_data.ks_reqs[idx].kr_a_mean; - } else { - /* Take the differential */ - info[i].ri_stddev = - curr->ss_data.ks_reqs[idx].kr_d_stddev; - info[i].ri_mean = curr->ss_data.ks_reqs[idx].kr_d_mean; - } - if (nrqs > 0) { - info[i].ri_stddev /= nrqs; - info[i].ri_stddev = sqrt(info[i].ri_stddev); - } else { - info[i].ri_stddev = 0; - } - info[i].ri_stddev /= NANOSEC; - info[i].ri_mean /= NANOSEC; + info = &smbstat_srv_info.si_reqs1[i]; + idx = info[i].ri_opcode & 0xFF; + curr_req = &curr->ss_data.ks_reqs1[idx]; + prev_req = &prev->ss_data.ks_reqs1[idx]; + smbstat_srv_process_one_req( + info, curr_req, prev_req, firstcall); + } + + for (i = 0; i < SMB2__NCMDS; i++) { + info = &smbstat_srv_info.si_reqs2[i]; + curr_req = &curr->ss_data.ks_reqs2[i]; + prev_req = &prev->ss_data.ks_reqs2[i]; + smbstat_srv_process_one_req( + info, curr_req, prev_req, firstcall); + } +} + +static void +smbstat_srv_process_one_req( + smbstat_req_info_t *info, + smb_kstat_req_t *curr_req, + smb_kstat_req_t *prev_req, + boolean_t firstcall) +{ + double nrqs; + + nrqs = smbstat_sub_64(curr_req->kr_nreq, + prev_req->kr_nreq); + + info->ri_rqs = nrqs / smbstat_srv_info.si_etime; + + info->ri_rbs = smbstat_sub_64( + curr_req->kr_rxb, + prev_req->kr_rxb) / + smbstat_srv_info.si_etime; + + info->ri_tbs = smbstat_sub_64( + curr_req->kr_txb, + prev_req->kr_txb) / + smbstat_srv_info.si_etime; + + info->ri_pct = nrqs * 100; + if (smbstat_srv_info.si_total_nreqs > 0) + info->ri_pct /= smbstat_srv_info.si_total_nreqs; + + if (firstcall) { + /* First time. Take the aggregate */ + info->ri_stddev = + curr_req->kr_a_stddev; + info->ri_mean = curr_req->kr_a_mean; + } else { + /* Take the differential */ + info->ri_stddev = + curr_req->kr_d_stddev; + info->ri_mean = curr_req->kr_d_mean; + } + if (nrqs > 0) { + info->ri_stddev /= nrqs; + info->ri_stddev = sqrt(info->ri_stddev); + } else { + info->ri_stddev = 0; } + info->ri_stddev /= NANOSEC; + info->ri_mean /= NANOSEC; } + /* * smbstat_srv_current_snapshot * @@ -1216,14 +1268,16 @@ smbstat_req_cmp_name(const void *obj1, const void *obj2) static void smbstat_req_order(void) { + smbstat_srv_snapshot_t *ss; smbstat_req_info_t *info; smb_kstat_req_t *reqs; int i; smbstat_srv_snapshot(); - reqs = smbstat_srv_current_snapshot()->ss_data.ks_reqs; - info = smbstat_srv_info.si_reqs; + ss = smbstat_srv_current_snapshot(); + reqs = ss->ss_data.ks_reqs1; + info = smbstat_srv_info.si_reqs1; for (i = 0; i < SMB_COM_NUM; i++) { (void) strlcpy(info[i].ri_name, reqs[i].kr_name, sizeof (reqs[i].kr_name)); @@ -1232,6 +1286,17 @@ smbstat_req_order(void) if (smbstat_opt_n) qsort(info, SMB_COM_NUM, sizeof (smbstat_req_info_t), smbstat_req_cmp_name); + + reqs = ss->ss_data.ks_reqs2; + info = smbstat_srv_info.si_reqs2; + for (i = 0; i < SMB2__NCMDS; i++) { + (void) strlcpy(info[i].ri_name, reqs[i].kr_name, + sizeof (reqs[i].kr_name)); + info[i].ri_opcode = i; + } + if (smbstat_opt_n) + qsort(info, SMB2__NCMDS, sizeof (smbstat_req_info_t), + smbstat_req_cmp_name); } /* |
