1
/*********************************************************
2
* Copyright (C) 2004 VMware, Inc. All rights reserved.
4
* The contents of this file are subject to the terms of the Common
5
* Development and Distribution License (the "License") version 1.0
6
* and no later version. You may not use this file except in
7
* compliance with the License.
9
* You can obtain a copy of the License at
10
* http://www.opensource.org/licenses/cddl1.php
12
* See the License for the specific language governing permissions
13
* and limitations under the License.
15
*********************************************************/
21
* Routines for debugging Solaris kernel module.
27
#include "filesystem.h"
29
#include <sys/cred_impl.h>
39
*----------------------------------------------------------------------------
41
* HgfsDebugPrintVfssw --
43
* Prints the provided VFS Switch structure.
52
*----------------------------------------------------------------------------
56
HgfsDebugPrintVfssw(char *str, struct vfssw *vfsswp)
61
DEBUG(VM_DEBUG_STRUCT, "struct vfssw from %s\n", str);
62
DEBUG(VM_DEBUG_STRUCT, " vsw_name : %s\n",
63
(vfsswp->vsw_name) ? vfsswp->vsw_name : "NULL");
64
DEBUG(VM_DEBUG_STRUCT, " vsw_init : %p\n", vfsswp->vsw_init);
65
DEBUG(VM_DEBUG_STRUCT, " vsw_flag : %x\n", vfsswp->vsw_flag);
67
DEBUG(VM_DEBUG_STRUCT, " vsw_vfsops : %x\n", vfsswp->vsw_vfsops);
68
DEBUG(VM_DEBUG_STRUCT, " vsw_optproto: %x\n", vfsswp->vsw_optproto);
70
DEBUG(VM_DEBUG_STRUCT, " vsw_count : %d\n", vfsswp->vsw_count);
75
*----------------------------------------------------------------------------
77
* HgfsDebugPrintVfs --
79
* Prints the provided VFS structure.
88
*----------------------------------------------------------------------------
92
HgfsDebugPrintVfs(char *str, struct vfs *vfsp)
97
DEBUG(VM_DEBUG_STRUCT, "struct vfs from %s\n", str);
98
DEBUG(VM_DEBUG_STRUCT, " vfs_next : %p\n", vfsp->vfs_next);
99
DEBUG(VM_DEBUG_STRUCT, " vfs_op : %p\n", vfsp->vfs_op);
100
DEBUG(VM_DEBUG_STRUCT, " vfs_vnodecovered: %p\n", vfsp->vfs_vnodecovered);
101
DEBUG(VM_DEBUG_STRUCT, " vfs_flag : %d\n", vfsp->vfs_flag);
102
DEBUG(VM_DEBUG_STRUCT, " vfs_bsize : %d\n", vfsp->vfs_bsize);
103
DEBUG(VM_DEBUG_STRUCT, " vfs_fstype : %d\n", vfsp->vfs_fstype);
105
DEBUG(VM_DEBUG_STRUCT, " vfs_fsid : %d\n", vfsp->vfs_fsid);
107
DEBUG(VM_DEBUG_STRUCT, " vfs_fsid.val[0] : %d\n", vfsp->vfs_fsid.val[0]);
108
DEBUG(VM_DEBUG_STRUCT, " vfs_fsid.val[1] : %d\n", vfsp->vfs_fsid.val[1]);
110
DEBUG(VM_DEBUG_STRUCT, " vfs_vadata : %p\n", vfsp->vfs_data);
111
DEBUG(VM_DEBUG_STRUCT, " vfs_dev : %lu\n", vfsp->vfs_dev);
112
DEBUG(VM_DEBUG_STRUCT, " vfs_bcount : %lu\n", vfsp->vfs_bcount);
114
DEBUG(VM_DEBUG_STRUCT, " vfs_nsubmounts : %d\n", vfsp->vfs_nsubmounts);
116
DEBUG(VM_DEBUG_STRUCT, " vfs_list : %p\n", vfsp->vfs_list);
117
DEBUG(VM_DEBUG_STRUCT, " vfs_hash : %p\n", vfsp->vfs_hash);
118
DEBUG(VM_DEBUG_STRUCT, " vfs_reflock : %p\n", &vfsp->vfs_reflock);
119
DEBUG(VM_DEBUG_STRUCT, " vfs_count : %d\n", vfsp->vfs_count);
121
DEBUG(VM_DEBUG_STRUCT, " vfs_mntopts : %x\n", vfsp->vfs_mntopts);
122
DEBUG(VM_DEBUG_STRUCT, " vfs_resource : %s\n",
123
(vfsp->vfs_resource) ? vfsp->vfs_resource : "NULL");
125
DEBUG(VM_DEBUG_STRUCT, " vfs_mtime : %ld\n", vfsp->vfs_mtime);
131
*----------------------------------------------------------------------------
133
* HgfsDebugPrintVnode --
135
* Prints the provided vnode structure.
144
*----------------------------------------------------------------------------
148
HgfsDebugPrintVnode(uint32 level, char *str,
149
struct vnode *vnodep, Bool printFileName)
154
DEBUG(level, "struct vnode from %s located at %p\n", str, vnodep);
155
DEBUG(level, " v_lock : %p\n", &vnodep->v_lock);
156
DEBUG(level, " v_flag : %d\n", vnodep->v_flag);
157
DEBUG(level, " v_count : %d\n", vnodep->v_count);
158
DEBUG(level, " v_vfsmountedhere: %p\n", vnodep->v_vfsmountedhere);
159
DEBUG(level, " v_op : %p\n", vnodep->v_op);
160
DEBUG(level, " v_vfsp : %p\n", vnodep->v_vfsp);
161
DEBUG(level, " v_stream : %p\n", vnodep->v_stream);
162
DEBUG(level, " v_pages : %p\n", vnodep->v_pages);
164
DEBUG(level, " v_next : %p\n", vnodep->v_next);
165
DEBUG(level, " v_prev : %p\n", vnodep->v_prev);
167
DEBUG(level, " v_type : %d\n", vnodep->v_type);
168
DEBUG(level, " v_rdev : %lu\n", vnodep->v_rdev);
169
DEBUG(level, " v_data : %p\n", vnodep->v_data);
170
DEBUG(level, " v_filocks : %p\n", vnodep->v_filocks);
171
DEBUG(level, " v_shrlocks : %p\n", vnodep->v_shrlocks);
172
DEBUG(level, " v_cv : %p\n", &vnodep->v_cv);
173
DEBUG(level, " v_locality : %p\n", vnodep->v_locality);
174
DEBUG(level, " v_nbllock : %p\n", &vnodep->v_nbllock);
176
if (printFileName && HGFS_VP_TO_OFP(vnodep) && HGFS_VP_TO_FP(vnodep)) {
177
DEBUG(level, " filename : %s\n", HGFS_VP_TO_FILENAME(vnodep));
183
*----------------------------------------------------------------------------
185
* HgfsDebugPrintCred --
187
* Prints the provided cred structure the describes the credentials of the
197
*----------------------------------------------------------------------------
201
HgfsDebugPrintCred(char *str, struct cred *credp)
203
DEBUG(VM_DEBUG_STRUCT, "struct cred from %s\n", str);
204
DEBUG(VM_DEBUG_STRUCT, " cr_ref : %d\n", credp->cr_ref);
205
DEBUG(VM_DEBUG_STRUCT, " cr_uid : %d\n", credp->cr_uid);
206
DEBUG(VM_DEBUG_STRUCT, " cr_gid : %d\n", credp->cr_gid);
207
DEBUG(VM_DEBUG_STRUCT, " cr_ruid : %d\n", credp->cr_ruid);
208
DEBUG(VM_DEBUG_STRUCT, " cr_rgid : %d\n", credp->cr_rgid);
209
DEBUG(VM_DEBUG_STRUCT, " cr_suid : %d\n", credp->cr_suid);
210
DEBUG(VM_DEBUG_STRUCT, " cr_sgid : %d\n", credp->cr_sgid);
211
DEBUG(VM_DEBUG_STRUCT, " cr_ngroups: %d\n", credp->cr_ngroups);
212
DEBUG(VM_DEBUG_STRUCT, " cr_groups : %p\n", credp->cr_groups);
217
*----------------------------------------------------------------------------
221
* Prints the provided mounta structure that describes the arguments
231
*----------------------------------------------------------------------------
235
HgfsDebugPrintMounta(char *str, struct mounta *mntp)
240
DEBUG(VM_DEBUG_STRUCT, "struct mounta from %s\n", str);
241
DEBUG(VM_DEBUG_STRUCT, " spec : %s\n",
242
(mntp->spec) ? mntp->spec : "NULL");
243
DEBUG(VM_DEBUG_STRUCT, " dir : %s\n",
244
(mntp->dir) ? mntp->dir : "NULL");
245
DEBUG(VM_DEBUG_STRUCT, " flags : %x\n", mntp->flags);
246
DEBUG(VM_DEBUG_STRUCT, " fstype : %s\n",
247
(mntp->fstype) ? mntp->fstype : "NULL");
248
DEBUG(VM_DEBUG_STRUCT, " dataptr : %p\n", mntp->dataptr);
249
DEBUG(VM_DEBUG_STRUCT, " datalen : %d\n", mntp->datalen);
250
DEBUG(VM_DEBUG_STRUCT, " optptr : %p\n", mntp->optptr);
251
DEBUG(VM_DEBUG_STRUCT, " optlen : %d\n", mntp->optlen);
256
*----------------------------------------------------------------------------
258
* HgfsDebugPrintVattr --
260
* Prints the contents of an attributes structure.
268
*----------------------------------------------------------------------------
272
HgfsDebugPrintVattr(const struct vattr *vap)
274
DEBUG(VM_DEBUG_STRUCT, " va_mask: %x\n", vap->va_mask);
275
DEBUG(VM_DEBUG_STRUCT, " va_type: %d\n", vap->va_type);
276
DEBUG(VM_DEBUG_STRUCT, " va_mode: %x\n", vap->va_mode);
277
DEBUG(VM_DEBUG_STRUCT, " va_uid: %u\n", vap->va_uid);
278
DEBUG(VM_DEBUG_STRUCT, " va_gid: %u\n", vap->va_gid);
279
DEBUG(VM_DEBUG_STRUCT, " va_fsid: %lu\n", vap->va_fsid);
280
DEBUG(VM_DEBUG_STRUCT, " va_nodeid: %llu\n", vap->va_nodeid);
281
DEBUG(VM_DEBUG_STRUCT, " va_nlink: %x\n", vap->va_nlink);
282
DEBUG(VM_DEBUG_STRUCT, " va_size: %llu\n", vap->va_size);
283
DEBUG(VM_DEBUG_STRUCT, " va_atime.tv_sec: %ld\n", vap->va_atime.tv_sec);
284
DEBUG(VM_DEBUG_STRUCT, " va_atime.tv_nsec: %ld\n", vap->va_atime.tv_nsec);
285
DEBUG(VM_DEBUG_STRUCT, " va_mtime.tv_sec: %ld\n", vap->va_mtime.tv_sec);
286
DEBUG(VM_DEBUG_STRUCT, " va_mtime.tv_nsec: %ld\n", vap->va_mtime.tv_nsec);
287
DEBUG(VM_DEBUG_STRUCT, " va_ctime.tv_sec: %ld\n", vap->va_ctime.tv_sec);
288
DEBUG(VM_DEBUG_STRUCT, " va_ctime.tv_nsec: %ld\n", vap->va_ctime.tv_nsec);
289
DEBUG(VM_DEBUG_STRUCT, " va_rdev: %lu\n", vap->va_rdev);
290
DEBUG(VM_DEBUG_STRUCT, " va_blksize: %u\n", vap->va_blksize);
291
DEBUG(VM_DEBUG_STRUCT, " va_nblocks: %llu\n", vap->va_nblocks);
293
DEBUG(VM_DEBUG_STRUCT, " va_vcode: %u\n", vap->va_vcode);
295
DEBUG(VM_DEBUG_STRUCT, " va_seq: %u\n", vap->va_seq);
301
*----------------------------------------------------------------------------
303
* HgfsDebugPrintReqList --
305
* For debugging. Prints out the request list for the provided list
307
* Note: Assumes called with the list lock held.
315
*----------------------------------------------------------------------------
319
HgfsDebugPrintReqList(DblLnkLst_Links *listAnchor) // IN: Anchor of list to print
321
DblLnkLst_Links *currNode;
326
DEBUG(VM_DEBUG_STRUCT, "Request List:\n");
327
DEBUG(VM_DEBUG_STRUCT, " anchor: %p\n", listAnchor);
329
for (currNode = listAnchor->next; currNode != listAnchor; currNode = currNode->next)
331
currReq = DblLnkLst_Container(currNode, HgfsReq, listNode);
332
DEBUG(VM_DEBUG_STRUCT, " address: %p (id=%d)\n",
333
currReq, currReq->id);
336
DEBUG(VM_DEBUG_STRUCT, "--DONE--\n");
341
*----------------------------------------------------------------------------
343
* HgfsDebugPrintReq --
345
* Prints the relevant portions of the provided HgfsReq structure.
354
*----------------------------------------------------------------------------
358
HgfsDebugPrintReq(const char *str,
364
DEBUG(VM_DEBUG_STRUCT, "struct HgfsReq from %s\n", str);
365
DEBUG(VM_DEBUG_STRUCT, " id: %d\n", req->id);
366
DEBUG(VM_DEBUG_STRUCT, " listNode: %p\n", &req->listNode);
367
DEBUG(VM_DEBUG_STRUCT, " next=%p\n", req->listNode.next);
368
DEBUG(VM_DEBUG_STRUCT, " prev=%p\n", req->listNode.prev);
369
DEBUG(VM_DEBUG_STRUCT, " packetSize: %d\n", req->packetSize);
370
DEBUG(VM_DEBUG_STRUCT, " state: %d (see hgfsSolaris.h)\n", req->state);
375
*----------------------------------------------------------------------------
377
* HgfsDebugPrintReqPool --
379
* Prints the contents if the request pool.
388
*----------------------------------------------------------------------------
392
HgfsDebugPrintReqPool(const char *str)
398
DEBUG(VM_DEBUG_STRUCT, "Request pool from %s\n", str);
400
for (i = 0; i < ARRAYSIZE(requestPool); i++) {
401
DEBUG(VM_DEBUG_STRUCT, " Index: %d, ID: %d\n", i, requestPool[i].id);
402
DEBUG(VM_DEBUG_STRUCT, " listNode: %p\n", &requestPool[i].listNode);
403
DEBUG(VM_DEBUG_STRUCT, " next=%p\n", requestPool[i].listNode.next);
404
DEBUG(VM_DEBUG_STRUCT, " prev=%p\n", requestPool[i].listNode.prev);
405
DEBUG(VM_DEBUG_STRUCT, " packetSize: %d\n", requestPool[i].packetSize);
406
DEBUG(VM_DEBUG_STRUCT, " state: %d (see hgfsSolaris.h)\n", requestPool[i].state);
409
DEBUG(VM_DEBUG_STRUCT, "--request pool done--\n");
414
* There is a problem in Solaris 9's header files when using the va_start
415
* and va_end macros, so we manually do what the preprocessor would have
418
* Note, the line using __builtin_next_arg is equivalent to:
419
* args = ((char *)(&fmt) + sizeof (char *));
421
* That is, it just provides a pointer to the unnamed first variable
425
# define compat_va_start(arg, fmt) arg = ((char *)__builtin_next_arg(fmt))
426
# define compat_va_end(arg)
428
# define compat_va_start(arg, fmt) va_start(arg, fmt)
429
# define compat_va_end(arg) va_end(arg)
433
vLog(const char *fmt,
440
* We check this here to avoid unnecessarily manipulating buffer if we
441
* aren't even going to print the log.
443
if (VM_DEBUG_LOG & VM_DEBUG_LEV) {
444
vsprintf(buffer, fmt, args);
445
cmn_err(HGFS_DEBUG, "%s", buffer);
452
* For compatibility with existing code.
456
Log(const char *fmt, ...) // IN: format string, etc
460
compat_va_start(args, fmt);
467
* For compatibility with existing code.
471
Debug(const char *fmt, ...) // IN: format string, etc.
475
compat_va_start(args, fmt);
481
#undef compat_va_list
482
#undef compat_va_start