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)
NEX-16818 Add fksmbcl development tool
NEX-17264 SMB client test tp_smbutil_013 fails after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
and: (fix ref leaks)
*** 18,30 ****
*
* CDDL HEADER END
*/
/*
- * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#include <sys/mdb_modapi.h>
#include <mdb/mdb_ctf.h>
--- 18,31 ----
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
*/
#include <sys/mdb_modapi.h>
#include <mdb/mdb_ctf.h>
*** 33,42 ****
--- 34,49 ----
#include <netsmb/smb_conn.h>
#include <netsmb/smb_rq.h>
#include <netsmb/smb_pass.h>
+ #ifdef _KERNEL
+ #define NSMB_OBJNAME "nsmb"
+ #else
+ #define NSMB_OBJNAME "libfknsmb.so.1"
+ #endif
+
#define OPT_VERBOSE 0x0001 /* Be [-v]erbose in dcmd's */
#define OPT_RECURSE 0x0002 /* recursive display */
/*
* We need to read in a private copy
*** 64,79 ****
* Tricky: Exploit the "inheritance" of smb_connobj_t
* with common functions for walk_init, walk_next.
*/
typedef struct smb_co_walk_data {
uintptr_t pp;
! int level; /* SMBL_SM, SMBL_VC, SMBL_SHARE */
int size; /* sizeof (union member) */
union co_u {
smb_connobj_t co; /* copy of the list element */
smb_vc_t vc;
smb_share_t ss;
} u;
} smb_co_walk_data_t;
/*
* Common walk_init for walking structs inherited
--- 71,87 ----
* Tricky: Exploit the "inheritance" of smb_connobj_t
* with common functions for walk_init, walk_next.
*/
typedef struct smb_co_walk_data {
uintptr_t pp;
! int level; /* SMBL_SM, SMBL_VC, SMBL_SHARE, ... */
int size; /* sizeof (union member) */
union co_u {
smb_connobj_t co; /* copy of the list element */
smb_vc_t vc;
smb_share_t ss;
+ smb_fh_t fh;
} u;
} smb_co_walk_data_t;
/*
* Common walk_init for walking structs inherited
*** 106,115 ****
--- 114,126 ----
smbw->size = sizeof (smbw->u.vc);
break;
case SMBL_SHARE:
smbw->size = sizeof (smbw->u.ss);
break;
+ case SMBL_FH:
+ smbw->size = sizeof (smbw->u.fh);
+ break;
default:
smbw->size = sizeof (smbw->u);
break;
}
*** 144,154 ****
mdb_warn("::walk smb_vc only supports global walks\n");
return (WALK_ERR);
}
/* Locate the VC list head. */
! if (mdb_lookup_by_obj("nsmb", "smb_vclist", &sym)) {
mdb_warn("failed to lookup `smb_vclist'\n");
return (WALK_ERR);
}
wsp->walk_addr = sym.st_value;
--- 155,165 ----
mdb_warn("::walk smb_vc only supports global walks\n");
return (WALK_ERR);
}
/* Locate the VC list head. */
! if (mdb_lookup_by_obj(NSMB_OBJNAME, "smb_vclist", &sym)) {
mdb_warn("failed to lookup `smb_vclist'\n");
return (WALK_ERR);
}
wsp->walk_addr = sym.st_value;
*** 172,181 ****
--- 183,210 ----
return (smb_co_walk_init(wsp, SMBL_SHARE));
}
/*
+ * Walk the file hande list below some share.
+ */
+ int
+ smb_fh_walk_init(mdb_walk_state_t *wsp)
+ {
+
+ /*
+ * Initial walk_addr is address of parent (share)
+ */
+ if (wsp->walk_addr == 0) {
+ mdb_warn("::walk smb_fh does not support global walks\n");
+ return (WALK_ERR);
+ }
+
+ return (smb_co_walk_init(wsp, SMBL_FH));
+ }
+
+ /*
* Common walk_step for walking structs inherited
* from smb_connobj_t (smb_vc_t, smb_share_t)
*/
int
smb_co_walk_step(mdb_walk_state_t *wsp)
*** 213,235 ****
int printed_header;
mdb_ctf_id_t ctf_id;
} smb_co_cbdata_t;
/*
* Call-back function for walking a share list.
*/
int
smb_ss_cb(uintptr_t addr, const void *data, void *arg)
{
const smb_share_t *ssp = data;
smb_co_cbdata_t *cbd = arg;
! mdb_printf(" %-p\t%s\n", addr, ssp->ss_name);
! if (cbd->flags & OPT_VERBOSE) {
mdb_inc_indent(2);
! /* Anything wanted here? */
mdb_dec_indent(2);
}
return (WALK_NEXT);
}
--- 242,296 ----
int printed_header;
mdb_ctf_id_t ctf_id;
} smb_co_cbdata_t;
/*
+ * Call-back function for walking a file handle list.
+ */
+ /* ARGSUSED */
+ int
+ smb_fh_cb(uintptr_t addr, const void *data, void *arg)
+ {
+ const smb_fh_t *fhp = data;
+ // smb_co_cbdata_t *cbd = arg;
+
+ mdb_inc_indent(2);
+ mdb_printf(" %-p", addr);
+ if (fhp->fh_fid2.fid_volatile != 0) {
+ mdb_printf("\t0x%llx\n",
+ (long long) fhp->fh_fid2.fid_volatile);
+ } else {
+ mdb_printf("\t0x%x\n", fhp->fh_fid1);
+ }
+
+ mdb_dec_indent(2);
+
+ return (WALK_NEXT);
+ }
+
+ /*
* Call-back function for walking a share list.
*/
int
smb_ss_cb(uintptr_t addr, const void *data, void *arg)
{
const smb_share_t *ssp = data;
smb_co_cbdata_t *cbd = arg;
+ uint32_t tid;
! tid = ssp->ss2_tree_id;
! if (tid == 0)
! tid = ssp->ss_tid;
! mdb_printf(" %-p\t0x%x\t%s\n", addr, tid, ssp->ss_name);
!
! if (cbd->flags & OPT_RECURSE) {
mdb_inc_indent(2);
! if (mdb_pwalk("nsmb_fh", smb_fh_cb, cbd, addr) < 0) {
! mdb_warn("failed to walk 'nsmb_fh'");
! /* Don't: return (WALK_ERR); */
! }
mdb_dec_indent(2);
}
return (WALK_NEXT);
}
*** 406,415 ****
--- 467,477 ----
return (status);
}
typedef struct rqlist_cbdata {
int printed_header;
+ int vcflags;
uintptr_t uid; /* optional filtering by UID */
} rqlist_cbdata_t;
int
rqlist_cb(uintptr_t addr, const void *data, void *arg)
*** 421,432 ****
--- 483,499 ----
cbd->printed_header = 1;
mdb_printf("// smb_rq_t MID cmd sr_state sr_flags\n");
}
mdb_printf(" %-p", addr); /* smb_rq_t */
+ if ((cbd->vcflags & SMBV_SMB2) != 0) {
+ mdb_printf(" x%04llx", (long long)rq->sr2_messageid);
+ mdb_printf(" x%02x", rq->sr2_command);
+ } else {
mdb_printf(" x%04x", rq->sr_mid);
mdb_printf(" x%02x", rq->sr_cmd);
+ }
mdb_printf(" %d", rq->sr_state);
mdb_printf(" x%x", rq->sr_flags);
mdb_printf("\n");
return (WALK_NEXT);
*** 435,447 ****
--- 502,525 ----
/*ARGSUSED*/
int
rqlist_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
{
rqlist_cbdata_t cbd;
+ smb_vc_t *vcp;
+ size_t vcsz;
memset(&cbd, 0, sizeof (cbd));
+ /* Need the VC again to get */
+ vcsz = sizeof (*vcp);
+ vcp = mdb_alloc(vcsz, UM_SLEEP | UM_GC);
+ if (mdb_vread(vcp, vcsz, addr) != vcsz) {
+ mdb_warn("cannot read VC from %p", addr);
+ return (DCMD_ERR);
+ }
+ cbd.vcflags = vcp->vc_flags;
+
/*
* Initial walk_addr is address of parent (VC)
*/
if (!(flags & DCMD_ADDRSPEC)) {
mdb_warn("address required\n");
*** 469,479 ****
if (wsp->walk_addr != NULL) {
mdb_warn("pwtree walk only supports global walks\n");
return (WALK_ERR);
}
! if (mdb_lookup_by_obj("nsmb", "smb_ptd", &sym) == -1) {
mdb_warn("failed to find symbol 'smb_ptd'");
return (WALK_ERR);
}
wsp->walk_addr = (uintptr_t)sym.st_value;
--- 547,557 ----
if (wsp->walk_addr != NULL) {
mdb_warn("pwtree walk only supports global walks\n");
return (WALK_ERR);
}
! if (mdb_lookup_by_obj(NSMB_OBJNAME, "smb_ptd", &sym) == -1) {
mdb_warn("failed to find symbol 'smb_ptd'");
return (WALK_ERR);
}
wsp->walk_addr = (uintptr_t)sym.st_value;
*** 598,607 ****
--- 676,687 ----
static const mdb_walker_t walkers[] = {
{ "nsmb_vc", "walk nsmb VC list",
smb_vc_walk_init, smb_co_walk_step, NULL },
{ "nsmb_ss", "walk nsmb share list for some VC",
smb_ss_walk_init, smb_co_walk_step, NULL },
+ { "nsmb_fh", "walk nsmb share list for some VC",
+ smb_fh_walk_init, smb_co_walk_step, NULL },
{ "nsmb_rqlist", "walk request list for some VC",
rqlist_walk_init, rqlist_walk_step, NULL },
{ "nsmb_pwtree", "walk passord AVL tree",
pwtree_walk_init, pwtree_walk_step, NULL },
{NULL}