⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cifs_debug.c

📁 Linux内核自带的cifs模块
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *   fs/cifs_debug.c * *   Copyright (C) International Business Machines  Corp., 2000,2005 * *   Modified by Steve French (sfrench@us.ibm.com) * *   This program is free software;  you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation; either version 2 of the License, or *   (at your option) any later version. * *   This program is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY;  without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See *   the GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with this program;  if not, write to the Free Software *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include <linux/fs.h>#include <linux/string.h>#include <linux/ctype.h>#include <linux/module.h>#include <linux/proc_fs.h>#include <asm/uaccess.h>#include "cifspdu.h"#include "cifsglob.h"#include "cifsproto.h"#include "cifs_debug.h"#include "cifsfs.h"voidcifs_dump_mem(char *label, void *data, int length){	int i, j;	int *intptr = data;	char *charptr = data;	char buf[10], line[80];	printk(KERN_DEBUG "%s: dump of %d bytes of data at 0x%p\n",		label, length, data);	for (i = 0; i < length; i += 16) {		line[0] = 0;		for (j = 0; (j < 4) && (i + j * 4 < length); j++) {			sprintf(buf, " %08x", intptr[i / 4 + j]);			strcat(line, buf);		}		buf[0] = ' ';		buf[2] = 0;		for (j = 0; (j < 16) && (i + j < length); j++) {			buf[1] = isprint(charptr[i + j]) ? charptr[i + j] : '.';			strcat(line, buf);		}		printk(KERN_DEBUG "%s\n", line);	}}#ifdef CONFIG_CIFS_DEBUG2void cifs_dump_detail(struct smb_hdr *smb){	cERROR(1, ("Cmd: %d Err: 0x%x Flags: 0x%x Flgs2: 0x%x Mid: %d Pid: %d",		  smb->Command, smb->Status.CifsError,		  smb->Flags, smb->Flags2, smb->Mid, smb->Pid));	cERROR(1, ("smb buf %p len %d", smb, smbCalcSize_LE(smb)));}void cifs_dump_mids(struct TCP_Server_Info *server){	struct list_head *tmp;	struct mid_q_entry *mid_entry;	if (server == NULL)		return;	cERROR(1, ("Dump pending requests:"));	spin_lock(&GlobalMid_Lock);	list_for_each(tmp, &server->pending_mid_q) {		mid_entry = list_entry(tmp, struct mid_q_entry, qhead);		if (mid_entry) {			cERROR(1, ("State: %d Cmd: %d Pid: %d Tsk: %p Mid %d",				mid_entry->midState,				(int)mid_entry->command,				mid_entry->pid,				mid_entry->tsk,				mid_entry->mid));#ifdef CONFIG_CIFS_STATS2			cERROR(1, ("IsLarge: %d buf: %p time rcv: %ld now: %ld",				mid_entry->largeBuf,				mid_entry->resp_buf,				mid_entry->when_received,				jiffies));#endif /* STATS2 */			cERROR(1, ("IsMult: %d IsEnd: %d", mid_entry->multiRsp,				  mid_entry->multiEnd));			if (mid_entry->resp_buf) {				cifs_dump_detail(mid_entry->resp_buf);				cifs_dump_mem("existing buf: ",					mid_entry->resp_buf,					62 /* fixme */);			}		}	}	spin_unlock(&GlobalMid_Lock);}#endif /* CONFIG_CIFS_DEBUG2 */#ifdef CONFIG_PROC_FSstatic intcifs_debug_data_read(char *buf, char **beginBuffer, off_t offset,		     int count, int *eof, void *data){	struct list_head *tmp;	struct list_head *tmp1;	struct mid_q_entry *mid_entry;	struct cifsSesInfo *ses;	struct cifsTconInfo *tcon;	int i;	int length = 0;	char *original_buf = buf;	*beginBuffer = buf + offset;	length =	    sprintf(buf,		    "Display Internal CIFS Data Structures for Debugging\n"		    "---------------------------------------------------\n");	buf += length;	length = sprintf(buf, "CIFS Version %s\n", CIFS_VERSION);	buf += length;	length = sprintf(buf,		"Active VFS Requests: %d\n", GlobalTotalActiveXid);	buf += length;	length = sprintf(buf, "Servers:");	buf += length;	i = 0;	read_lock(&GlobalSMBSeslock);	list_for_each(tmp, &GlobalSMBSessionList) {		i++;		ses = list_entry(tmp, struct cifsSesInfo, cifsSessionList);		if ((ses->serverDomain == NULL) || (ses->serverOS == NULL) ||		   (ses->serverNOS == NULL)) {			buf += sprintf(buf, "\nentry for %s not fully "					"displayed\n\t", ses->serverName);		} else {			length =			    sprintf(buf,				    "\n%d) Name: %s  Domain: %s Mounts: %d OS:"				    " %s  \n\tNOS: %s\tCapability: 0x%x\n\tSMB"				    " session status: %d\t",				i, ses->serverName, ses->serverDomain,				atomic_read(&ses->inUse),				ses->serverOS, ses->serverNOS,				ses->capabilities, ses->status);			buf += length;		}		if (ses->server) {			buf += sprintf(buf, "TCP status: %d\n\tLocal Users To "				    "Server: %d SecMode: 0x%x Req On Wire: %d",				ses->server->tcpStatus,				atomic_read(&ses->server->socketUseCount),				ses->server->secMode,				atomic_read(&ses->server->inFlight));#ifdef CONFIG_CIFS_STATS2			buf += sprintf(buf, " In Send: %d In MaxReq Wait: %d",				atomic_read(&ses->server->inSend),				atomic_read(&ses->server->num_waiters));#endif			length = sprintf(buf, "\nMIDs:\n");			buf += length;			spin_lock(&GlobalMid_Lock);			list_for_each(tmp1, &ses->server->pending_mid_q) {				mid_entry = list_entry(tmp1, struct					mid_q_entry,					qhead);				if (mid_entry) {					length = sprintf(buf,							"State: %d com: %d pid:"							" %d tsk: %p mid %d\n",							mid_entry->midState,							(int)mid_entry->command,							mid_entry->pid,							mid_entry->tsk,							mid_entry->mid);					buf += length;				}			}			spin_unlock(&GlobalMid_Lock);		}	}	read_unlock(&GlobalSMBSeslock);	sprintf(buf, "\n");	buf++;	length = sprintf(buf, "Shares:");	buf += length;	i = 0;	read_lock(&GlobalSMBSeslock);	list_for_each(tmp, &GlobalTreeConnectionList) {		__u32 dev_type;		i++;		tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);		dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType);		length = sprintf(buf, "\n%d) %s Uses: %d ", i,				 tcon->treeName, atomic_read(&tcon->useCount));		buf += length;		if (tcon->nativeFileSystem) {			length = sprintf(buf, "Type: %s ",					 tcon->nativeFileSystem);			buf += length;		}		length = sprintf(buf, "DevInfo: 0x%x Attributes: 0x%x"				 "\nPathComponentMax: %d Status: %d",			    le32_to_cpu(tcon->fsDevInfo.DeviceCharacteristics),			    le32_to_cpu(tcon->fsAttrInfo.Attributes),			    le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength),			    tcon->tidStatus);		buf += length;		if (dev_type == FILE_DEVICE_DISK)			length = sprintf(buf, " type: DISK ");		else if (dev_type == FILE_DEVICE_CD_ROM)			length = sprintf(buf, " type: CDROM ");		else			length =			    sprintf(buf, " type: %d ", dev_type);		buf += length;		if (tcon->tidStatus == CifsNeedReconnect) {			buf += sprintf(buf, "\tDISCONNECTED ");			length += 14;		}	}	read_unlock(&GlobalSMBSeslock);	length = sprintf(buf, "\n");	buf += length;	/* BB add code to dump additional info such as TCP session info now */	/* Now calculate total size of returned data */	length = buf - original_buf;	if (offset + count >= length)		*eof = 1;	if (length < offset) {		*eof = 1;		return 0;	} else {		length = length - offset;	}	if (length > count)		length = count;	return length;}#ifdef CONFIG_CIFS_STATSstatic intcifs_stats_write(struct file *file, const char __user *buffer,		 unsigned long count, void *data){	char c;	int rc;	struct list_head *tmp;	struct cifsTconInfo *tcon;	rc = get_user(c, buffer);	if (rc)		return rc;	if (c == '1' || c == 'y' || c == 'Y' || c == '0') {		read_lock(&GlobalSMBSeslock);#ifdef CONFIG_CIFS_STATS2		atomic_set(&totBufAllocCount, 0);		atomic_set(&totSmBufAllocCount, 0);#endif /* CONFIG_CIFS_STATS2 */		list_for_each(tmp, &GlobalTreeConnectionList) {			tcon = list_entry(tmp, struct cifsTconInfo,					cifsConnectionList);			atomic_set(&tcon->num_smbs_sent, 0);			atomic_set(&tcon->num_writes, 0);			atomic_set(&tcon->num_reads, 0);			atomic_set(&tcon->num_oplock_brks, 0);			atomic_set(&tcon->num_opens, 0);			atomic_set(&tcon->num_closes, 0);			atomic_set(&tcon->num_deletes, 0);			atomic_set(&tcon->num_mkdirs, 0);			atomic_set(&tcon->num_rmdirs, 0);			atomic_set(&tcon->num_renames, 0);			atomic_set(&tcon->num_t2renames, 0);			atomic_set(&tcon->num_ffirst, 0);			atomic_set(&tcon->num_fnext, 0);			atomic_set(&tcon->num_fclose, 0);			atomic_set(&tcon->num_hardlinks, 0);			atomic_set(&tcon->num_symlinks, 0);			atomic_set(&tcon->num_locks, 0);		}		read_unlock(&GlobalSMBSeslock);	}	return count;}static intcifs_stats_read(char *buf, char **beginBuffer, off_t offset,		  int count, int *eof, void *data){	int item_length, i, length;	struct list_head *tmp;	struct cifsTconInfo *tcon;	*beginBuffer = buf + offset;	length = sprintf(buf,			"Resources in use\nCIFS Session: %d\n",			sesInfoAllocCount.counter);	buf += length;	item_length =		sprintf(buf, "Share (unique mount targets): %d\n",			tconInfoAllocCount.counter);	length += item_length;	buf += item_length;	item_length =		sprintf(buf, "SMB Request/Response Buffer: %d Pool size: %d\n",			bufAllocCount.counter,			cifs_min_rcv + tcpSesAllocCount.counter);	length += item_length;	buf += item_length;	item_length =		sprintf(buf, "SMB Small Req/Resp Buffer: %d Pool size: %d\n",			smBufAllocCount.counter, cifs_min_small);	length += item_length;	buf += item_length;#ifdef CONFIG_CIFS_STATS2	item_length = sprintf(buf, "Total Large %d Small %d Allocations\n",				atomic_read(&totBufAllocCount),				atomic_read(&totSmBufAllocCount));	length += item_length;	buf += item_length;#endif /* CONFIG_CIFS_STATS2 */	item_length =		sprintf(buf, "Operations (MIDs): %d\n",			midCount.counter);	length += item_length;	buf += item_length;	item_length = sprintf(buf,		"\n%d session %d share reconnects\n",		tcpSesReconnectCount.counter, tconInfoReconnectCount.counter);	length += item_length;	buf += item_length;	item_length = sprintf(buf,		"Total vfs operations: %d maximum at one time: %d\n",		GlobalCurrentXid, GlobalMaxActiveXid);	length += item_length;	buf += item_length;	i = 0;	read_lock(&GlobalSMBSeslock);	list_for_each(tmp, &GlobalTreeConnectionList) {		i++;		tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);		item_length = sprintf(buf, "\n%d) %s", i, tcon->treeName);		buf += item_length;		length += item_length;		if (tcon->tidStatus == CifsNeedReconnect) {			buf += sprintf(buf, "\tDISCONNECTED ");			length += 14;		}		item_length = sprintf(buf, "\nSMBs: %d Oplock Breaks: %d",			atomic_read(&tcon->num_smbs_sent),			atomic_read(&tcon->num_oplock_brks));		buf += item_length;		length += item_length;		item_length = sprintf(buf, "\nReads:  %d Bytes: %lld",			atomic_read(&tcon->num_reads),			(long long)(tcon->bytes_read));		buf += item_length;		length += item_length;		item_length = sprintf(buf, "\nWrites: %d Bytes: %lld",			atomic_read(&tcon->num_writes),			(long long)(tcon->bytes_written));		buf += item_length;		length += item_length;		item_length = sprintf(buf,			"\nLocks: %d HardLinks: %d Symlinks: %d",			atomic_read(&tcon->num_locks),			atomic_read(&tcon->num_hardlinks),			atomic_read(&tcon->num_symlinks));		buf += item_length;		length += item_length;		item_length = sprintf(buf, "\nOpens: %d Closes: %d Deletes: %d",			atomic_read(&tcon->num_opens),			atomic_read(&tcon->num_closes),			atomic_read(&tcon->num_deletes));		buf += item_length;		length += item_length;		item_length = sprintf(buf, "\nMkdirs: %d Rmdirs: %d",			atomic_read(&tcon->num_mkdirs),			atomic_read(&tcon->num_rmdirs));		buf += item_length;		length += item_length;		item_length = sprintf(buf, "\nRenames: %d T2 Renames %d",			atomic_read(&tcon->num_renames),			atomic_read(&tcon->num_t2renames));		buf += item_length;		length += item_length;		item_length = sprintf(buf, "\nFindFirst: %d FNext %d FClose %d",			atomic_read(&tcon->num_ffirst),			atomic_read(&tcon->num_fnext),			atomic_read(&tcon->num_fclose));		buf += item_length;		length += item_length;	}	read_unlock(&GlobalSMBSeslock);	buf += sprintf(buf, "\n");	length++;	if (offset + count >= length)		*eof = 1;	if (length < offset) {		*eof = 1;		return 0;	} else {		length = length - offset;	}	if (length > count)		length = count;	return length;}#endifstatic struct proc_dir_entry *proc_fs_cifs;read_proc_t cifs_txanchor_read;static read_proc_t cifsFYI_read;static write_proc_t cifsFYI_write;static read_proc_t oplockEnabled_read;static write_proc_t oplockEnabled_write;static read_proc_t lookupFlag_read;static write_proc_t lookupFlag_write;static read_proc_t traceSMB_read;static write_proc_t traceSMB_write;static read_proc_t multiuser_mount_read;static write_proc_t multiuser_mount_write;static read_proc_t security_flags_read;static write_proc_t security_flags_write;/* static read_proc_t ntlmv2_enabled_read;static write_proc_t ntlmv2_enabled_write;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -