Print this page
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,17 +18,23 @@
*
* CDDL HEADER END
*/
/*
- * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2017 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 <sys/types.h>
+#include <sys/mdb_modapi.h>
+
+#ifdef _USER
+#include "../genunix/avl.h"
+#define _FAKE_KERNEL
+#endif
+
#include <sys/refstr_impl.h>
#include <sys/vnode.h>
#include <sys/vfs.h>
#include <smbfs/smbfs.h>
@@ -147,11 +153,11 @@
NULL) != argc) {
return (DCMD_USAGE);
}
if (!(flags & DCMD_ADDRSPEC)) {
- if (mdb_walk("genunix`vfs", smbfs_vfs_cb, cbd)
+ if (mdb_walk("vfs", smbfs_vfs_cb, cbd)
== -1) {
mdb_warn("can't walk smbfs vfs");
return (DCMD_ERR);
}
return (DCMD_OK);
@@ -236,11 +242,11 @@
mdb_warn("expect an smbmntinfo_t addr");
return (DCMD_USAGE);
}
addr += OFFSETOF(smbmntinfo_t, smi_hash_avl);
- if (mdb_pwalk("genunix`avl", smbfs_node_cb, cbd, addr) == -1) {
+ if (mdb_pwalk("avl", smbfs_node_cb, cbd, addr) == -1) {
mdb_warn("cannot walk smbfs nodes");
return (DCMD_ERR);
}
return (DCMD_OK);
@@ -265,14 +271,63 @@
smbfs_node_dcmd, smbfs_node_help
},
{NULL}
};
+#ifdef _USER
+/*
+ * Sadly, can't just compile ../genunix/vfs.c with this since
+ * it has become a catch-all for FS-specific headers etc.
+ */
+int
+vfs_walk_init(mdb_walk_state_t *wsp)
+{
+ if (wsp->walk_addr == NULL &&
+ mdb_readvar(&wsp->walk_addr, "rootvfs") == -1) {
+ mdb_warn("failed to read 'rootvfs'");
+ return (WALK_ERR);
+ }
+
+ wsp->walk_data = (void *)wsp->walk_addr;
+ return (WALK_NEXT);
+}
+
+int
+vfs_walk_step(mdb_walk_state_t *wsp)
+{
+ vfs_t vfs;
+ int status;
+
+ if (mdb_vread(&vfs, sizeof (vfs), wsp->walk_addr) == -1) {
+ mdb_warn("failed to read vfs_t at %p", wsp->walk_addr);
+ return (WALK_DONE);
+ }
+
+ status = wsp->walk_callback(wsp->walk_addr, &vfs, wsp->walk_cbdata);
+
+ if (vfs.vfs_next == wsp->walk_data)
+ return (WALK_DONE);
+
+ wsp->walk_addr = (uintptr_t)vfs.vfs_next;
+
+ return (status);
+}
+#endif // _USER
+
static const mdb_walker_t walkers[] = {
+#ifdef _USER
+ /* from avl.c */
+ { AVL_WALK_NAME, AVL_WALK_DESC,
+ avl_walk_init, avl_walk_step, avl_walk_fini },
+ /* from vfs.c */
+ { "vfs", "walk file system list",
+ vfs_walk_init, vfs_walk_step },
+#endif // _USER
{NULL}
};
+
static const mdb_modinfo_t modinfo = {
MDB_API_VERSION,
dcmds,
walkers
};