Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
6ab007bf
Commit
6ab007bf
authored
Feb 19, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://cifs.bkbits.net/linux-2.5cifs
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
af61a2bd
6c1f0746
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
148 additions
and
116 deletions
+148
-116
fs/cifs/cifsglob.h
fs/cifs/cifsglob.h
+2
-2
fs/cifs/cifsproto.h
fs/cifs/cifsproto.h
+19
-19
fs/cifs/cifssmb.c
fs/cifs/cifssmb.c
+83
-73
fs/cifs/connect.c
fs/cifs/connect.c
+19
-11
fs/cifs/file.c
fs/cifs/file.c
+4
-2
fs/cifs/misc.c
fs/cifs/misc.c
+2
-0
fs/cifs/transport.c
fs/cifs/transport.c
+19
-9
No files found.
fs/cifs/cifsglob.h
View file @
6ab007bf
...
...
@@ -170,7 +170,7 @@ struct cifsTconInfo {
struct
list_head
openFileList
;
struct
semaphore
tconSem
;
struct
cifsSesInfo
*
ses
;
/* pointer to session associated with */
char
treeName
[
MAX_TREE_SIZE
+
1
];
/* The ascii or unicode name of this resource depending on the ses->capabilities *//* BB fill in this field
*/
char
treeName
[
MAX_TREE_SIZE
+
1
];
/* UNC name of resource (in ASCII not UTF)
*/
char
*
nativeFileSystem
;
__u16
tid
;
/* The 2 byte transaction id */
__u16
Flags
;
/* optional support bits */
...
...
fs/cifs/cifsproto.h
View file @
6ab007bf
...
...
@@ -93,26 +93,26 @@ extern int CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
const
char
*
tree
,
struct
cifsTconInfo
*
tcon
,
const
struct
nls_table
*
);
extern
int
CIFSFindFirst
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSFindFirst
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
searchName
,
FILE_DIRECTORY_INFO
*
findData
,
T2_FFIRST_RSP_PARMS
*
findParms
,
const
struct
nls_table
*
nls_codepage
,
int
*
pUnicodeFlag
,
int
*
pUnixFlag
/* if Unix extensions used */
);
extern
int
CIFSFindNext
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSFindNext
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
FILE_DIRECTORY_INFO
*
findData
,
T2_FNEXT_RSP_PARMS
*
findParms
,
const
__u16
searchHandle
,
const
__u32
resumeKey
,
int
*
UnicodeFlag
,
int
*
pUnixFlag
);
extern
int
CIFSSMBQPathInfo
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBQPathInfo
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
unsigned
char
*
searchName
,
FILE_ALL_INFO
*
findData
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBUnixQPathInfo
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
struct
cifsTconInfo
*
tcon
,
const
unsigned
char
*
searchName
,
FILE_UNIX_BASIC_INFO
*
pFindData
,
const
struct
nls_table
*
nls_codepage
);
...
...
@@ -127,7 +127,7 @@ extern int connect_to_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
const
char
*
old_path
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBQFSInfo
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBQFSInfo
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
struct
statfs
*
FSData
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBQFSAttributeInfo
(
const
int
xid
,
...
...
@@ -150,57 +150,57 @@ extern int CIFSSMBUnixSetPerms(const int xid, struct cifsTconInfo *pTcon,
char
*
full_path
,
__u64
mode
,
__u64
uid
,
__u64
gid
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBMkDir
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBMkDir
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
newName
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBRmDir
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBRmDir
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
name
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBDelFile
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBDelFile
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
name
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBRename
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBRename
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fromName
,
const
char
*
toName
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSCreateHardLink
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fromName
,
const
char
*
toName
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSUnixCreateHardLink
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fromName
,
const
char
*
toName
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSUnixCreateSymLink
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fromName
,
const
char
*
toName
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBUnixQuerySymLink
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
struct
cifsTconInfo
*
tcon
,
const
unsigned
char
*
searchName
,
char
*
syminfo
,
const
int
buflen
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBQueryReparseLinkInfo
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
struct
cifsTconInfo
*
tcon
,
const
unsigned
char
*
searchName
,
char
*
symlinkinfo
,
const
int
buflen
,
__u16
fid
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBOpen
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBOpen
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fileName
,
const
int
disposition
,
const
int
access_flags
,
const
int
omode
,
__u16
*
netfid
,
int
*
pOplock
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBClose
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBClose
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
int
smb_file_id
);
extern
int
CIFSSMBRead
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBRead
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
int
netfid
,
unsigned
int
count
,
const
__u64
lseek
,
unsigned
int
*
nbytes
,
char
**
buf
);
extern
int
CIFSSMBWrite
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBWrite
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
int
netfid
,
const
unsigned
int
count
,
const
__u64
lseek
,
unsigned
int
*
nbytes
,
const
char
*
buf
,
const
int
long_op
);
extern
int
CIFSSMBLock
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBLock
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
__u16
netfid
,
const
__u64
len
,
const
__u64
offset
,
const
__u32
numUnlock
,
const
__u32
numLock
,
const
__u8
lockType
,
...
...
fs/cifs/cifssmb.c
View file @
6ab007bf
...
...
@@ -43,16 +43,27 @@ static struct {
};
int
smb_init
(
int
smb_command
,
int
wct
,
const
struct
cifsTconInfo
*
tcon
,
smb_init
(
int
smb_command
,
int
wct
,
struct
cifsTconInfo
*
tcon
,
void
**
request_buf
/* returned */
,
void
**
response_buf
/* returned */
)
{
int
rc
=
0
;
if
(
tcon
)
if
(
tcon
->
ses
)
if
(
tcon
&&
(
tcon
->
tidStatus
==
CifsNeedReconnect
))
{
rc
=
-
EIO
;
if
(
tcon
->
ses
)
{
struct
nls_table
*
nls_codepage
=
load_nls_default
();
if
(
tcon
->
ses
->
status
==
CifsNeedReconnect
)
setup_session
(
0
,
tcon
->
ses
,
load_nls_default
());
rc
=
setup_session
(
0
,
tcon
->
ses
,
nls_codepage
);
if
(
!
rc
)
{
rc
=
CIFSTCon
(
0
,
tcon
->
ses
,
tcon
->
treeName
,
tcon
,
nls_codepage
);
cFYI
(
1
,
(
"reconnect tcon rc = %d"
,
rc
));
}
}
}
if
(
rc
)
return
rc
;
*
request_buf
=
buf_get
();
if
(
request_buf
==
0
)
{
...
...
@@ -143,7 +154,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
pSMBr
->
u
.
extended_response
.
GUID
,
16
)
!=
0
)
{
cFYI
(
1
,
(
"UID of server does not match
that of
previous connection to same ip address"
));
(
"UID of server does not match previous connection to same ip address"
));
memcpy
(
server
->
server_GUID
,
pSMBr
->
u
.
...
...
@@ -166,7 +177,8 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
server
->
capabilities
&=
~
CAP_EXTENDED_SECURITY
;
if
(
sign_CIFS_PDUs
==
FALSE
)
{
if
(
server
->
secMode
&
SECMODE_SIGN_REQUIRED
)
cERROR
(
1
,(
"Server required CIFS packet signing - enable /proc/fs/cifs/PacketSigningEnabled"
));
cERROR
(
1
,
(
"Server requires /proc/fs/cifs/PacketSigningEnabled"
));
server
->
secMode
&=
~
(
SECMODE_SIGN_ENABLED
|
SECMODE_SIGN_REQUIRED
);
}
}
...
...
@@ -188,8 +200,8 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon)
* If last user of the connection and
* connection alive - disconnect it
* If this is the last connection on the server session disconnect it
* (and inside session disconnect we should check if tcp socket needs
to
* be freed and kernel thread woken up).
* (and inside session disconnect we should check if tcp socket needs
*
to
be freed and kernel thread woken up).
*/
if
(
tcon
)
down
(
&
tcon
->
tconSem
);
...
...
@@ -237,7 +249,7 @@ CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses)
cFYI
(
1
,
(
"In SMBLogoff for session disconnect"
));
if
(
ses
)
down
(
&
ses
->
sesSem
);
/* need to add more places where this sem is checked
*/
down
(
&
ses
->
sesSem
);
/* check this sem more places
*/
else
return
-
EIO
;
...
...
@@ -248,7 +260,7 @@ CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses)
}
if
(
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
pSMB
->
hdr
.
Flags2
|=
SMBFLG2_SECURITY_SIGNATURE
;
rc
=
smb_init
(
SMB_COM_LOGOFF_ANDX
,
2
,
0
/* no tcon anymore */
,
rc
=
smb_init
(
SMB_COM_LOGOFF_ANDX
,
2
,
0
/* no tcon anymore */
,
(
void
**
)
&
pSMB
,
(
void
**
)
&
smb_buffer_response
);
if
(
rc
)
{
up
(
&
ses
->
sesSem
);
...
...
@@ -272,7 +284,7 @@ CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses)
}
int
CIFSSMBDelFile
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBDelFile
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fileName
,
const
struct
nls_table
*
nls_codepage
)
{
DELETE_FILE_REQ
*
pSMB
=
NULL
;
...
...
@@ -315,7 +327,7 @@ CIFSSMBDelFile(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSSMBRmDir
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBRmDir
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
dirName
,
const
struct
nls_table
*
nls_codepage
)
{
DELETE_DIRECTORY_REQ
*
pSMB
=
NULL
;
...
...
@@ -358,7 +370,7 @@ CIFSSMBRmDir(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSSMBMkDir
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBMkDir
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
name
,
const
struct
nls_table
*
nls_codepage
)
{
int
rc
=
0
;
...
...
@@ -402,7 +414,7 @@ CIFSSMBMkDir(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSSMBOpen
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBOpen
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fileName
,
const
int
openDisposition
,
const
int
access_flags
,
const
int
create_options
,
__u16
*
netfid
,
int
*
pOplock
,
const
struct
nls_table
*
nls_codepage
)
...
...
@@ -447,13 +459,14 @@ CIFSSMBOpen(const int xid, const struct cifsTconInfo *tcon,
pSMB
->
FileAttributes
=
ATTR_NORMAL
;
/* XP does not handle ATTR_POSIX_SEMANTICS */
/*if ((omode & S_IWUGO) == 0)
pSMB->FileAttributes |= ATTR_READONLY;*/
/* Above line causes problems due to problem with vfs splitting create into
two pieces - need to set mode after file created not while it is being created */
/* Above line causes problems due to vfs splitting create into two
pieces - need to set mode after file created not while it is
being created */
pSMB
->
FileAttributes
=
cpu_to_le32
(
pSMB
->
FileAttributes
);
pSMB
->
ShareAccess
=
cpu_to_le32
(
FILE_SHARE_ALL
);
pSMB
->
CreateDisposition
=
cpu_to_le32
(
openDisposition
);
pSMB
->
CreateOptions
=
cpu_to_le32
(
create_options
);
pSMB
->
ImpersonationLevel
=
cpu_to_le32
(
SECURITY_IMPERSONATION
);
/* BB ??
BB
*/
pSMB
->
ImpersonationLevel
=
cpu_to_le32
(
SECURITY_IMPERSONATION
);
/* BB ??*/
pSMB
->
SecurityFlags
=
cpu_to_le32
(
SECURITY_CONTEXT_TRACKING
|
SECURITY_EFFECTIVE_ONLY
);
...
...
@@ -470,7 +483,7 @@ CIFSSMBOpen(const int xid, const struct cifsTconInfo *tcon,
*
netfid
=
pSMBr
->
Fid
;
/* cifs fid stays in le */
/* Do we care about the CreateAction in any cases? */
/* BB add code to update inode
with
file sizes from create response */
/* BB add code to update inode file sizes from create response */
}
if
(
pSMB
)
buf_release
(
pSMB
);
...
...
@@ -483,7 +496,7 @@ CIFSSMBOpen(const int xid, const struct cifsTconInfo *tcon,
freed by the caller */
int
CIFSSMBRead
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBRead
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
int
netfid
,
const
unsigned
int
count
,
const
__u64
lseek
,
unsigned
int
*
nbytes
,
char
**
buf
)
{
...
...
@@ -504,9 +517,8 @@ CIFSSMBRead(const int xid, const struct cifsTconInfo *tcon,
pSMB
->
OffsetLow
=
cpu_to_le32
(
lseek
&
0xFFFFFFFF
);
pSMB
->
OffsetHigh
=
cpu_to_le32
(
lseek
>>
32
);
pSMB
->
Remaining
=
0
;
pSMB
->
MaxCount
=
cpu_to_le16
(
min
(
count
,
(
tcon
->
ses
->
server
->
maxBuf
-
MAX_CIFS_HDR_SIZE
)
&
0xFFFFFF00
));
pSMB
->
MaxCount
=
cpu_to_le16
(
min_t
(
const
unsigned
int
,
count
,
(
tcon
->
ses
->
server
->
maxBuf
-
MAX_CIFS_HDR_SIZE
)
&
0xFFFFFF00
));
pSMB
->
MaxCountHigh
=
0
;
pSMB
->
ByteCount
=
0
;
/* no need to do le conversion since it is 0 */
...
...
@@ -545,7 +557,7 @@ CIFSSMBRead(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSSMBWrite
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBWrite
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
int
netfid
,
const
unsigned
int
count
,
const
__u64
offset
,
unsigned
int
*
nbytes
,
const
char
*
buf
,
const
int
long_op
)
...
...
@@ -596,7 +608,7 @@ CIFSSMBWrite(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSSMBLock
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBLock
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
__u16
smb_file_id
,
const
__u64
len
,
const
__u64
offset
,
const
__u32
numUnlock
,
const
__u32
numLock
,
const
__u8
lockType
,
const
int
waitFlag
)
...
...
@@ -639,7 +651,7 @@ CIFSSMBLock(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSSMBClose
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
int
smb_file_id
)
CIFSSMBClose
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
int
smb_file_id
)
{
int
rc
=
0
;
CLOSE_REQ
*
pSMB
=
NULL
;
...
...
@@ -667,7 +679,7 @@ CIFSSMBClose(const int xid, const struct cifsTconInfo *tcon, int smb_file_id)
}
int
CIFSSMBRename
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBRename
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fromName
,
const
char
*
toName
,
const
struct
nls_table
*
nls_codepage
)
{
...
...
@@ -697,7 +709,8 @@ CIFSSMBRename(const int xid, const struct cifsTconInfo *tcon,
name_len
++
;
/* trailing null */
name_len
*=
2
;
pSMB
->
OldFileName
[
name_len
]
=
0
;
/* pad */
pSMB
->
OldFileName
[
name_len
+
1
]
=
0x04
;
/* strange that protocol requires an ASCII signature byte on Unicode string */
/* protocol requires ASCII signature byte on Unicode string */
pSMB
->
OldFileName
[
name_len
+
1
]
=
0x04
;
name_len2
=
cifs_strtoUCS
((
wchar_t
*
)
&
pSMB
->
OldFileName
[
name_len
+
2
],
toName
,
530
,
...
...
@@ -733,7 +746,7 @@ CIFSSMBRename(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSUnixCreateSymLink
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSUnixCreateSymLink
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fromName
,
const
char
*
toName
,
const
struct
nls_table
*
nls_codepage
)
{
...
...
@@ -791,7 +804,8 @@ CIFSUnixCreateSymLink(const int xid, const struct cifsTconInfo *tcon,
pSMB
->
DataCount
=
name_len_target
;
pSMB
->
MaxParameterCount
=
cpu_to_le16
(
2
);
pSMB
->
MaxDataCount
=
cpu_to_le16
(
1000
);
/*BB find exact max SMB from sess */
/* BB find exact max on data count below from sess */
pSMB
->
MaxDataCount
=
cpu_to_le16
(
1000
);
pSMB
->
SetupCount
=
1
;
pSMB
->
Reserved3
=
0
;
pSMB
->
SubCommand
=
cpu_to_le16
(
TRANS2_SET_PATH_INFORMATION
);
...
...
@@ -820,7 +834,7 @@ CIFSUnixCreateSymLink(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSUnixCreateHardLink
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSUnixCreateHardLink
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fromName
,
const
char
*
toName
,
const
struct
nls_table
*
nls_codepage
)
{
...
...
@@ -877,7 +891,8 @@ CIFSUnixCreateHardLink(const int xid, const struct cifsTconInfo *tcon,
pSMB
->
DataCount
=
name_len_target
;
pSMB
->
MaxParameterCount
=
cpu_to_le16
(
2
);
pSMB
->
MaxDataCount
=
cpu_to_le16
(
1000
);
/* BB find exact max SMB from sess*/
/* BB find exact max on data count below from sess*/
pSMB
->
MaxDataCount
=
cpu_to_le16
(
1000
);
pSMB
->
SetupCount
=
1
;
pSMB
->
Reserved3
=
0
;
pSMB
->
SubCommand
=
cpu_to_le16
(
TRANS2_SET_PATH_INFORMATION
);
...
...
@@ -904,7 +919,7 @@ CIFSUnixCreateHardLink(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSCreateHardLink
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSCreateHardLink
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fromName
,
const
char
*
toName
,
const
struct
nls_table
*
nls_codepage
)
{
...
...
@@ -937,7 +952,7 @@ CIFSCreateHardLink(const int xid, const struct cifsTconInfo *tcon,
name_len
++
;
/* trailing null */
name_len
*=
2
;
pSMB
->
OldFileName
[
name_len
]
=
0
;
/* pad */
pSMB
->
OldFileName
[
name_len
+
1
]
=
0x04
;
/* strange that protocol requires an ASCII signature byte on Unicode string */
pSMB
->
OldFileName
[
name_len
+
1
]
=
0x04
;
name_len2
=
cifs_strtoUCS
((
wchar_t
*
)
&
pSMB
->
OldFileName
[
name_len
+
2
],
toName
,
530
,
...
...
@@ -972,7 +987,7 @@ CIFSCreateHardLink(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSSMBUnixQuerySymLink
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBUnixQuerySymLink
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
unsigned
char
*
searchName
,
char
*
symlinkinfo
,
const
int
buflen
,
const
struct
nls_table
*
nls_codepage
)
...
...
@@ -1007,7 +1022,8 @@ CIFSSMBUnixQuerySymLink(const int xid, const struct cifsTconInfo *tcon,
2
/* level */
+
4
/* rsrvd */
+
name_len
/* incl null */
;
pSMB
->
TotalDataCount
=
0
;
pSMB
->
MaxParameterCount
=
cpu_to_le16
(
2
);
pSMB
->
MaxDataCount
=
cpu_to_le16
(
4000
);
/* BB find exact max SMB PDU from sess structure BB */
/* BB find exact max data count below from sess structure BB */
pSMB
->
MaxDataCount
=
cpu_to_le16
(
4000
);
pSMB
->
MaxSetupCount
=
0
;
pSMB
->
Reserved
=
0
;
pSMB
->
Flags
=
0
;
...
...
@@ -1041,27 +1057,17 @@ CIFSSMBUnixQuerySymLink(const int xid, const struct cifsTconInfo *tcon,
else
{
if
(
pSMBr
->
hdr
.
Flags2
&
SMBFLG2_UNICODE
)
{
name_len
=
UniStrnlen
((
wchar_t
*
)
((
char
*
)
&
pSMBr
->
hdr
.
Protocol
+
pSMBr
->
DataOffset
),
min
(
buflen
,
(
int
)
pSMBr
->
DataCount
)
/
2
);
&
pSMBr
->
hdr
.
Protocol
+
pSMBr
->
DataOffset
),
min_t
(
const
int
,
buflen
,
pSMBr
->
DataCount
)
/
2
);
cifs_strfromUCS_le
(
symlinkinfo
,
(
wchar_t
*
)
((
char
*
)
&
pSMBr
->
hdr
.
Protocol
+
pSMBr
->
DataOffset
),
(
wchar_t
*
)
((
char
*
)
&
pSMBr
->
hdr
.
Protocol
+
pSMBr
->
DataOffset
),
name_len
,
nls_codepage
);
}
else
{
strncpy
(
symlinkinfo
,
(
char
*
)
&
pSMBr
->
hdr
.
Protocol
+
pSMBr
->
DataOffset
,
min
(
buflen
,
(
int
)
pSMBr
->
DataCount
));
pSMBr
->
DataOffset
,
min_t
(
const
int
,
buflen
,
pSMBr
->
DataCount
));
}
symlinkinfo
[
buflen
]
=
0
;
/* just in case so calling code does not go off the end of buffer */
...
...
@@ -1075,7 +1081,7 @@ CIFSSMBUnixQuerySymLink(const int xid, const struct cifsTconInfo *tcon,
int
CIFSSMBQueryReparseLinkInfo
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBQueryReparseLinkInfo
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
unsigned
char
*
searchName
,
char
*
symlinkinfo
,
const
int
buflen
,
__u16
fid
,
const
struct
nls_table
*
nls_codepage
)
...
...
@@ -1086,7 +1092,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, const struct cifsTconInfo *tcon,
struct
smb_com_transaction_ioctl_req
*
pSMB
;
struct
smb_com_transaction_ioctl_rsp
*
pSMBr
;
cFYI
(
1
,
(
"In Windows reparse style QueryLink
info
for path %s"
,
searchName
));
cFYI
(
1
,
(
"In Windows reparse style QueryLink for path %s"
,
searchName
));
rc
=
smb_init
(
SMB_COM_NT_TRANSACT
,
23
,
tcon
,
(
void
**
)
&
pSMB
,
(
void
**
)
&
pSMBr
);
if
(
rc
)
...
...
@@ -1095,7 +1101,8 @@ CIFSSMBQueryReparseLinkInfo(const int xid, const struct cifsTconInfo *tcon,
pSMB
->
TotalParameterCount
=
0
;
pSMB
->
TotalDataCount
=
0
;
pSMB
->
MaxParameterCount
=
cpu_to_le16
(
2
);
pSMB
->
MaxDataCount
=
cpu_to_le16
(
4000
);
/* BB find exact max SMB PDU from sess structure BB */
/* BB find exact data count max from sess structure BB */
pSMB
->
MaxDataCount
=
cpu_to_le16
(
4000
);
pSMB
->
MaxSetupCount
=
4
;
pSMB
->
Reserved
=
0
;
pSMB
->
ParameterOffset
=
0
;
...
...
@@ -1122,7 +1129,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, const struct cifsTconInfo *tcon,
rc
=
-
EIO
;
/* bad smb */
else
{
if
(
pSMBr
->
DataCount
&&
(
pSMBr
->
DataCount
<
2048
))
{
/* could also validat
a
reparse tag && better check name length */
/* could also validat
e
reparse tag && better check name length */
struct
reparse_data
*
reparse_buf
=
(
struct
reparse_data
*
)
((
char
*
)
&
pSMBr
->
hdr
.
Protocol
+
pSMBr
->
DataOffset
);
if
(
pSMBr
->
hdr
.
Flags2
&
SMBFLG2_UNICODE
)
{
...
...
@@ -1137,7 +1144,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, const struct cifsTconInfo *tcon,
}
else
{
/* ASCII names */
strncpy
(
symlinkinfo
,
reparse_buf
->
LinkNamesBuf
+
reparse_buf
->
TargetNameOffset
,
min
(
buflen
,
(
int
)
reparse_buf
->
TargetNameLen
));
min
_t
(
const
int
,
buflen
,
reparse_buf
->
TargetNameLen
));
}
}
else
{
rc
=
-
EIO
;
...
...
@@ -1154,7 +1161,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSSMBQPathInfo
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBQPathInfo
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
unsigned
char
*
searchName
,
FILE_ALL_INFO
*
pFindData
,
const
struct
nls_table
*
nls_codepage
)
...
...
@@ -1216,7 +1223,8 @@ CIFSSMBQPathInfo(const int xid, const struct cifsTconInfo *tcon,
cFYI
(
1
,
(
"Send error in QPathInfo = %d"
,
rc
));
}
else
{
/* decode response */
pSMBr
->
DataOffset
=
le16_to_cpu
(
pSMBr
->
DataOffset
);
if
((
pSMBr
->
ByteCount
<
40
)
||
(
pSMBr
->
DataOffset
>
512
))
/* BB also check enough total bytes returned */
/* BB also check enough total bytes returned */
if
((
pSMBr
->
ByteCount
<
40
)
||
(
pSMBr
->
DataOffset
>
512
))
rc
=
-
EIO
;
/* bad smb */
else
{
memcpy
((
char
*
)
pFindData
,
...
...
@@ -1230,7 +1238,7 @@ CIFSSMBQPathInfo(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSSMBUnixQPathInfo
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBUnixQPathInfo
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
unsigned
char
*
searchName
,
FILE_UNIX_BASIC_INFO
*
pFindData
,
const
struct
nls_table
*
nls_codepage
)
...
...
@@ -1265,7 +1273,8 @@ CIFSSMBUnixQPathInfo(const int xid, const struct cifsTconInfo *tcon,
name_len
/* includes null */
;
pSMB
->
TotalDataCount
=
0
;
pSMB
->
MaxParameterCount
=
cpu_to_le16
(
2
);
pSMB
->
MaxDataCount
=
cpu_to_le16
(
4000
);
/* BB find exact max SMB PDU from sess structure BB */
/* BB find exact max SMB PDU from sess structure BB */
pSMB
->
MaxDataCount
=
cpu_to_le16
(
4000
);
pSMB
->
MaxSetupCount
=
0
;
pSMB
->
Reserved
=
0
;
pSMB
->
Flags
=
0
;
...
...
@@ -1292,7 +1301,8 @@ CIFSSMBUnixQPathInfo(const int xid, const struct cifsTconInfo *tcon,
cFYI
(
1
,
(
"Send error in QPathInfo = %d"
,
rc
));
}
else
{
/* decode response */
pSMBr
->
DataOffset
=
le16_to_cpu
(
pSMBr
->
DataOffset
);
if
((
pSMBr
->
ByteCount
<
40
)
||
(
pSMBr
->
DataOffset
>
512
))
/* BB also check enough total bytes returned */
/* BB also check if enough total bytes returned */
if
((
pSMBr
->
ByteCount
<
40
)
||
(
pSMBr
->
DataOffset
>
512
))
rc
=
-
EIO
;
/* bad smb */
else
{
memcpy
((
char
*
)
pFindData
,
...
...
@@ -1307,7 +1317,7 @@ CIFSSMBUnixQPathInfo(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSFindSingle
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSFindSingle
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
searchName
,
FILE_ALL_INFO
*
findData
,
const
struct
nls_table
*
nls_codepage
)
{
...
...
@@ -1381,7 +1391,7 @@ CIFSFindSingle(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSFindFirst
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSFindFirst
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
searchName
,
FILE_DIRECTORY_INFO
*
findData
,
T2_FFIRST_RSP_PARMS
*
findParms
,
const
struct
nls_table
*
nls_codepage
,
int
*
pUnicodeFlag
,
...
...
@@ -1484,7 +1494,7 @@ CIFSFindFirst(const int xid, const struct cifsTconInfo *tcon,
}
int
CIFSFindNext
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSFindNext
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
FILE_DIRECTORY_INFO
*
findData
,
T2_FNEXT_RSP_PARMS
*
findParms
,
const
__u16
searchHandle
,
__u32
resumeKey
,
int
*
pUnicodeFlag
,
int
*
pUnixFlag
)
...
...
@@ -1661,7 +1671,7 @@ CIFSGetDFSRefer(const int xid, struct cifsSesInfo *ses,
}
int
CIFSSMBQFSInfo
(
const
int
xid
,
const
struct
cifsTconInfo
*
tcon
,
CIFSSMBQFSInfo
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
struct
statfs
*
FSData
,
const
struct
nls_table
*
nls_codepage
)
{
/* level 0x103 SMB_QUERY_FILE_SYSTEM_INFO */
...
...
fs/cifs/connect.c
View file @
6ab007bf
...
...
@@ -76,22 +76,32 @@ cifs_reconnect(struct TCP_Server_Info *server)
int
rc
=
0
;
struct
list_head
*
tmp
;
struct
cifsSesInfo
*
ses
;
struct
cifsTconInfo
*
tcon
;
server
->
tcpStatus
=
CifsNeedReconnect
;
server
->
maxBuf
=
0
;
cFYI
(
1
,
(
"Reconnecting tcp session "
));
/* before reconnecting the tcp session, mark the smb session (uid)
and the tid bad so they are not used until reconnected */
read_lock
(
&
GlobalSMBSeslock
);
list_for_each
(
tmp
,
&
GlobalSMBSessionList
)
{
ses
=
list_entry
(
tmp
,
struct
cifsSesInfo
,
cifsSessionList
);
if
(
ses
->
server
)
{
if
(
ses
->
server
==
server
)
{
ses
->
status
=
CifsNeedReconnect
;
ses
->
ipc_tid
=
0
;
}
}
/* else tcp and smb sessions need reconnection */
}
list_for_each
(
tmp
,
&
GlobalTreeConnectionList
)
{
tcon
=
list_entry
(
tmp
,
struct
cifsTconInfo
,
cifsConnectionList
);
if
(
tcon
->
ses
->
server
==
server
)
{
tcon
->
tidStatus
=
CifsNeedReconnect
;
}
}
read_unlock
(
&
GlobalSMBSeslock
);
if
(
server
->
ssocket
)
{
...
...
@@ -112,6 +122,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
schedule_timeout
(
3
*
HZ
);
}
else
{
server
->
tcpStatus
=
CifsGood
;
wake_up
(
&
server
->
response_q
);
}
}
...
...
@@ -174,15 +185,12 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
csocket
=
server
->
ssocket
;
continue
;
}
else
{
/* find define for the -512 returned at unmount time */
cFYI
(
1
,
(
"Received error on sock_recvmsg( peek) with length = %d"
,
cFYI
(
1
,(
"Error on sock_recvmsg(peek) length = %d"
,
length
));
}
break
;
}
if
(
length
==
0
)
{
cFYI
(
1
,
(
"Zero length peek received - dead session?"
));
}
else
if
(
length
==
0
)
{
cFYI
(
1
,(
"Zero length peek received - dead session?"
));
cifs_reconnect
(
server
);
csocket
=
server
->
ssocket
;
continue
;
...
...
@@ -507,8 +515,7 @@ find_unc(__u32 new_target_ip_addr, char *uncName, char *userName)
/* BB lock tcon and server and tcp session and increment use count here? */
/* found a match on the TCP session */
/* BB check if reconnection needed */
cFYI
(
1
,
(
"Matched ip, old UNC: %s == new: %s ?"
,
cFYI
(
1
,(
"Matched ip, old UNC: %s == new: %s ?"
,
tcon
->
treeName
,
uncName
));
if
(
strncmp
(
tcon
->
treeName
,
uncName
,
...
...
@@ -2196,6 +2203,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
/* if (rc) rc = map_smb_to_linux_error(smb_buffer_response); */
/* above now done in SendReceive */
if
((
rc
==
0
)
&&
(
tcon
!=
NULL
))
{
tcon
->
tidStatus
=
CifsGood
;
tcon
->
tid
=
smb_buffer_response
->
Tid
;
bcc_ptr
=
pByteArea
(
smb_buffer_response
);
length
=
strnlen
(
bcc_ptr
,
BCC
(
smb_buffer_response
)
-
2
);
...
...
fs/cifs/file.c
View file @
6ab007bf
...
...
@@ -423,6 +423,7 @@ cifs_partialpagewrite(struct page *page,unsigned from, unsigned to)
return
rc
;
}
#if 0
static int
cifs_writepages(struct address_space *mapping, struct writeback_control *wbc)
{
...
...
@@ -434,6 +435,7 @@ cifs_writepages(struct address_space *mapping, struct writeback_control *wbc)
FreeXid(xid);
return rc;
}
#endif
static
int
cifs_writepage
(
struct
page
*
page
,
struct
writeback_control
*
wbc
)
...
...
@@ -635,7 +637,7 @@ static void cifs_copy_cache_pages(struct address_space *mapping,
}
page_cache_get
(
page
);
target
=
kmap
(
page
);
target
=
kmap
_atomic
(
page
,
KM_USER0
);
if
(
PAGE_CACHE_SIZE
>
bytes_read
)
{
memcpy
(
target
,
data
,
bytes_read
);
...
...
@@ -649,7 +651,7 @@ static void cifs_copy_cache_pages(struct address_space *mapping,
__pagevec_lru_add
(
plru_pvec
);
flush_dcache_page
(
page
);
SetPageUptodate
(
page
);
kunmap
(
page
);
kunmap
_atomic
(
page
,
KM_USER0
);
unlock_page
(
page
);
page_cache_release
(
page
);
data
+=
PAGE_CACHE_SIZE
;
...
...
fs/cifs/misc.c
View file @
6ab007bf
...
...
@@ -70,6 +70,7 @@ sesInfoAlloc(void)
memset
(
ret_buf
,
0
,
sizeof
(
struct
cifsSesInfo
));
write_lock
(
&
GlobalSMBSeslock
);
atomic_inc
(
&
sesInfoAllocCount
);
ret_buf
->
status
=
CifsNew
;
list_add
(
&
ret_buf
->
cifsSessionList
,
&
GlobalSMBSessionList
);
init_MUTEX
(
&
ret_buf
->
sesSem
);
write_unlock
(
&
GlobalSMBSeslock
);
...
...
@@ -111,6 +112,7 @@ tconInfoAlloc(void)
atomic_inc
(
&
tconInfoAllocCount
);
list_add
(
&
ret_buf
->
cifsConnectionList
,
&
GlobalTreeConnectionList
);
ret_buf
->
tidStatus
=
CifsNew
;
INIT_LIST_HEAD
(
&
ret_buf
->
openFileList
);
init_MUTEX
(
&
ret_buf
->
tconSem
);
write_unlock
(
&
GlobalSMBSeslock
);
...
...
fs/cifs/transport.c
View file @
6ab007bf
...
...
@@ -37,6 +37,7 @@ struct mid_q_entry *
AllocMidQEntry
(
struct
smb_hdr
*
smb_buffer
,
struct
cifsSesInfo
*
ses
)
{
struct
mid_q_entry
*
temp
;
int
timeout
=
10
*
HZ
;
/* BB add spinlock to protect midq for each session BB */
if
(
ses
==
NULL
)
{
...
...
@@ -57,13 +58,22 @@ AllocMidQEntry(struct smb_hdr *smb_buffer, struct cifsSesInfo *ses)
temp
->
ses
=
ses
;
temp
->
tsk
=
current
;
}
while
((
ses
->
server
->
tcpStatus
!=
CifsGood
)
&&
(
timeout
>
0
)){
/* Give the tcp thread up to 10 seconds to reconnect */
/* Should we wake up tcp thread first? BB */
timeout
=
wait_event_interruptible_timeout
(
ses
->
server
->
response_q
,
(
ses
->
server
->
tcpStatus
==
CifsGood
),
timeout
);
cFYI
(
1
,(
"timeout (after reconnection wait) %d"
,
timeout
));
}
if
(
ses
->
server
->
tcpStatus
==
CifsGood
)
{
write_lock
(
&
GlobalMid_Lock
);
list_add_tail
(
&
temp
->
qhead
,
&
ses
->
server
->
pending_mid_q
);
atomic_inc
(
&
midCount
);
temp
->
midState
=
MID_REQUEST_ALLOCATED
;
write_unlock
(
&
GlobalMid_Lock
);
}
else
{
/* could add more reconnect code here BB */
}
else
{
cERROR
(
1
,(
"Need to reconnect after session died to server"
));
if
(
temp
)
kmem_cache_free
(
cifs_mid_cachep
,
temp
);
...
...
@@ -106,11 +116,11 @@ smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer,
smb_msg
.
msg_iovlen
=
1
;
smb_msg
.
msg_control
=
NULL
;
smb_msg
.
msg_controllen
=
0
;
smb_msg
.
msg_flags
=
MSG_DONTWAIT
+
MSG_NOSIGNAL
;
/* BB add more flags?
*/
smb_msg
.
msg_flags
=
MSG_DONTWAIT
+
MSG_NOSIGNAL
;
/* BB add more flags?
*/
/* smb header is converted in header_assemble. bcc and rest of SMB word
area,
a
nd byte area if necessary, is converted to littleendian in cifssmb.c and RFC1001
len is converted to bigendian in smb_send */
/* smb header is converted in header_assemble. bcc and rest of SMB word
a
rea, and byte area if necessary, is converted to littleendian in
cifssmb.c and RFC1001
len is converted to bigendian in smb_send */
if
(
smb_buf_length
>
12
)
smb_buffer
->
Flags2
=
cpu_to_le16
(
smb_buffer
->
Flags2
);
...
...
@@ -148,7 +158,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
midQ
=
AllocMidQEntry
(
in_buf
,
ses
);
if
(
midQ
==
NULL
)
return
-
EIO
;
/* reconnect should be done, if possible, in AllocMidQEntry */
return
-
EIO
;
if
(
in_buf
->
smb_buf_length
>
CIFS_MAX_MSGSIZE
+
MAX_CIFS_HDR_SIZE
)
{
cERROR
(
1
,
(
"Illegal length, greater than maximum frame, %d "
,
...
...
@@ -219,7 +229,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
*
pbytes_returned
=
out_buf
->
smb_buf_length
;
/* BB special case reconnect tid and reconnect uid here? */
rc
=
map_smb_to_linux_error
(
out_buf
);
/* BB watch endianness here BB */
rc
=
map_smb_to_linux_error
(
out_buf
);
/* convert ByteCount if necessary */
if
(
receive_len
>=
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment