📄 cifsglob.h
字号:
/* * fs/cifs/cifsglob.h * * Copyright (C) International Business Machines Corp., 2002,2007 * Author(s): Steve French (sfrench@us.ibm.com) * Jeremy Allison (jra@samba.org) * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library 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 Lesser General Public License for more details. * */#include <linux/in.h>#include <linux/in6.h>#include <linux/version.h>#include "cifs_fs_sb.h"/* * The sizes of various internal tables and strings */#define MAX_UID_INFO 16#define MAX_SES_INFO 2#define MAX_TCON_INFO 4#define MAX_TREE_SIZE 2 + MAX_SERVER_SIZE + 1 + MAX_SHARE_SIZE + 1#define MAX_SERVER_SIZE 15#define MAX_SHARE_SIZE 64 /* used to be 20, this should still be enough */#define MAX_USERNAME_SIZE 32 /* 32 is to allow for 15 char names + null termination then *2 for unicode versions */#define MAX_PASSWORD_SIZE 16#define CIFS_MIN_RCV_POOL 4/* * MAX_REQ is the maximum number of requests that WE will send * on one socket concurently. It also matches the most common * value of max multiplex returned by servers. We may * eventually want to use the negotiated value (in case * future servers can handle more) when we are more confident that * we will not have problems oveloading the socket with pending * write data. */#define CIFS_MAX_REQ 50#define SERVER_NAME_LENGTH 15#define SERVER_NAME_LEN_WITH_NULL (SERVER_NAME_LENGTH + 1)/* used to define string lengths for reversing unicode strings *//* (256+1)*2 = 514 *//* (max path length + 1 for null) * 2 for unicode */#define MAX_NAME 514#include "cifspdu.h"#ifndef FALSE#define FALSE 0#endif#ifndef TRUE#define TRUE 1#endif#ifndef XATTR_DOS_ATTRIB#define XATTR_DOS_ATTRIB "user.DOSATTRIB"#endif#ifndef SLAB_NOFS#define SLAB_NOFS GFP_NOFS#endif#ifndef SLAB_KERNEL#define SLAB_KERNEL GFP_KERNEL#endif/* * This information is kept on every Server we know about. * * Some things to note: * */#define SERVER_NAME_LEN_WITH_NULL (SERVER_NAME_LENGTH + 1)/* * CIFS vfs client Status information (based on what we know.) */ /* associated with each tcp and smb session */enum statusEnum { CifsNew = 0, CifsGood, CifsExiting, CifsNeedReconnect};enum securityEnum { LANMAN = 0, /* Legacy LANMAN auth */ NTLM, /* Legacy NTLM012 auth with NTLM hash */ NTLMv2, /* Legacy NTLM auth with NTLMv2 hash */ RawNTLMSSP, /* NTLMSSP without SPNEGO */ NTLMSSP, /* NTLMSSP via SPNEGO */ Kerberos /* Kerberos via SPNEGO */};enum protocolEnum { IPV4 = 0, IPV6, SCTP /* Netbios frames protocol not supported at this time */};struct mac_key { unsigned int len; union { char ntlm[CIFS_SESS_KEY_SIZE + 16]; struct { char key[16]; struct ntlmv2_resp resp; } ntlmv2; } data;};/* ***************************************************************** * Except the CIFS PDUs themselves all the * globally interesting structs should go here ***************************************************************** */struct TCP_Server_Info { /* 15 character server name + 0x20 16th byte indicating type = srv */ char server_RFC1001_name[SERVER_NAME_LEN_WITH_NULL]; char unicode_server_Name[SERVER_NAME_LEN_WITH_NULL * 2]; struct socket *ssocket; union { struct sockaddr_in sockAddr; struct sockaddr_in6 sockAddr6; } addr; wait_queue_head_t response_q; wait_queue_head_t request_q; /* if more than maxmpx to srvr must block*/ struct list_head pending_mid_q; void *Server_NlsInfo; /* BB - placeholder for future NLS info */ unsigned short server_codepage; /* codepage for the server */ unsigned long ip_address; /* IP addr for the server if known */ enum protocolEnum protocolType; char versionMajor; char versionMinor; unsigned svlocal:1; /* local server or remote */ atomic_t socketUseCount; /* number of open cifs sessions on socket */ atomic_t inFlight; /* number of requests on the wire to server */#ifdef CONFIG_CIFS_STATS2 atomic_t inSend; /* requests trying to send */ atomic_t num_waiters; /* blocked waiting to get in sendrecv */#endif enum statusEnum tcpStatus; /* what we think the status is */ struct semaphore tcpSem; struct task_struct *tsk; char server_GUID[16]; char secMode; enum securityEnum secType; unsigned int maxReq; /* Clients should submit no more */ /* than maxReq distinct unanswered SMBs to the server when using */ /* multiplexed reads or writes */ unsigned int maxBuf; /* maxBuf specifies the maximum */ /* message size the server can send or receive for non-raw SMBs */ unsigned int maxRw; /* maxRw specifies the maximum */ /* message size the server can send or receive for */ /* SMB_COM_WRITE_RAW or SMB_COM_READ_RAW. */ char sessid[4]; /* unique token id for this session */ /* (returned on Negotiate */ int capabilities; /* allow selective disabling of caps by smb sess */ int timeAdj; /* Adjust for difference in server time zone in sec */ __u16 CurrentMid; /* multiplex id - rotating counter */ char cryptKey[CIFS_CRYPTO_KEY_SIZE]; /* 16th byte of RFC1001 workstation name is always null */ char workstation_RFC1001_name[SERVER_NAME_LEN_WITH_NULL]; __u32 sequence_number; /* needed for CIFS PDU signature */ struct mac_key mac_signing_key; char ntlmv2_hash[16]; unsigned long lstrp; /* when we got last response from this server */};/* * The following is our shortcut to user information. We surface the uid, * and name. We always get the password on the fly in case it * has changed. We also hang a list of sessions owned by this user off here. */struct cifsUidInfo { struct list_head userList; struct list_head sessionList; /* SMB sessions for this user */ uid_t linux_uid; char user[MAX_USERNAME_SIZE + 1]; /* ascii name of user */ /* BB may need ptr or callback for PAM or WinBind info */};/* * Session structure. One of these for each uid session with a particular host */struct cifsSesInfo { struct list_head cifsSessionList; struct semaphore sesSem;#if 0 struct cifsUidInfo *uidInfo; /* pointer to user info */#endif struct TCP_Server_Info *server; /* pointer to server info */ atomic_t inUse; /* # of mounts (tree connections) on this ses */ enum statusEnum status; unsigned overrideSecFlg; /* if non-zero override global sec flags */ __u16 ipc_tid; /* special tid for connection to IPC share */ __u16 flags; char *serverOS; /* name of operating system underlying server */ char *serverNOS; /* name of network operating system of server */ char *serverDomain; /* security realm of server */ int Suid; /* remote smb uid */ uid_t linux_uid; /* local Linux uid */ int capabilities; char serverName[SERVER_NAME_LEN_WITH_NULL * 2]; /* BB make bigger for TCP names - will ipv6 and sctp addresses fit? */ char userName[MAX_USERNAME_SIZE + 1]; char *domainName; char *password;};/* no more than one of the following three session flags may be set */#define CIFS_SES_NT4 1#define CIFS_SES_OS2 2#define CIFS_SES_W9X 4/* following flag is set for old servers such as OS2 (and Win95?) which do not negotiate NTLM or POSIX dialects, but instead negotiate one of the older LANMAN dialects */#define CIFS_SES_LANMAN 8/* * there is one of these for each connection to a resource on a particular * session */struct cifsTconInfo { struct list_head cifsConnectionList; struct list_head openFileList; struct semaphore tconSem; struct cifsSesInfo *ses; /* pointer to session associated with */ char treeName[MAX_TREE_SIZE + 1]; /* UNC name of resource in ASCII */ char *nativeFileSystem; __u16 tid; /* The 2 byte tree id */ __u16 Flags; /* optional support bits */ enum statusEnum tidStatus; atomic_t useCount; /* how many explicit/implicit mounts to share */#ifdef CONFIG_CIFS_STATS atomic_t num_smbs_sent; atomic_t num_writes; atomic_t num_reads; atomic_t num_oplock_brks; atomic_t num_opens; atomic_t num_closes; atomic_t num_deletes; atomic_t num_mkdirs; atomic_t num_rmdirs; atomic_t num_renames; atomic_t num_t2renames; atomic_t num_ffirst; atomic_t num_fnext; atomic_t num_fclose; atomic_t num_hardlinks; atomic_t num_symlinks; atomic_t num_locks; atomic_t num_acl_get; atomic_t num_acl_set;#ifdef CONFIG_CIFS_STATS2 unsigned long long time_writes; unsigned long long time_reads; unsigned long long time_opens; unsigned long long time_deletes; unsigned long long time_closes; unsigned long long time_mkdirs; unsigned long long time_rmdirs; unsigned long long time_renames; unsigned long long time_t2renames; unsigned long long time_ffirst; unsigned long long time_fnext; unsigned long long time_fclose;#endif /* CONFIG_CIFS_STATS2 */ __u64 bytes_read; __u64 bytes_written; spinlock_t stat_lock;#endif /* CONFIG_CIFS_STATS */ FILE_SYSTEM_DEVICE_INFO fsDevInfo; FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo; /* ok if fs name truncated */ FILE_SYSTEM_UNIX_INFO fsUnixInfo; unsigned retry:1; unsigned nocase:1; unsigned unix_ext:1; /* if off disable Linux extensions to CIFS protocol for this mount even if server would support */ /* BB add field for back pointer to sb struct(s)? */};/* * This info hangs off the cifsFileInfo structure, pointed to by llist. * This is used to track byte stream locks on the file */struct cifsLockInfo { struct list_head llist; /* pointer to next cifsLockInfo */ __u64 offset; __u64 length; __u8 type;};/* * One of these for each open instance of a file */struct cifs_search_info { loff_t index_of_last_entry; __u16 entries_in_buffer; __u16 info_level;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -