Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
fb8c4b14
Commit
fb8c4b14
authored
Jul 10, 2007
by
Steve French
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[CIFS] whitespace cleanup
More than halfway there Signed-off-by:
Steve French
<
sfrench@us.ibm.com
>
parent
b609f06a
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
610 additions
and
591 deletions
+610
-591
fs/cifs/connect.c
fs/cifs/connect.c
+199
-199
fs/cifs/dir.c
fs/cifs/dir.c
+4
-4
fs/cifs/export.c
fs/cifs/export.c
+12
-12
fs/cifs/fcntl.c
fs/cifs/fcntl.c
+1
-1
fs/cifs/file.c
fs/cifs/file.c
+125
-120
fs/cifs/inode.c
fs/cifs/inode.c
+131
-128
fs/cifs/ioctl.c
fs/cifs/ioctl.c
+2
-2
fs/cifs/link.c
fs/cifs/link.c
+53
-44
fs/cifs/md4.c
fs/cifs/md4.c
+2
-2
fs/cifs/md5.c
fs/cifs/md5.c
+4
-4
fs/cifs/misc.c
fs/cifs/misc.c
+76
-74
fs/cifs/netmisc.c
fs/cifs/netmisc.c
+1
-1
No files found.
fs/cifs/connect.c
View file @
fb8c4b14
...
...
@@ -93,13 +93,13 @@ struct smb_vol {
unsigned
int
wsize
;
unsigned
int
sockopt
;
unsigned
short
int
port
;
char
*
prepath
;
char
*
prepath
;
};
static
int
ipv4_connect
(
struct
sockaddr_in
*
psin_server
,
struct
socket
**
csocket
,
char
*
netb_name
,
char
*
server_netb_name
);
char
*
netb_name
,
char
*
server_netb_name
);
static
int
ipv6_connect
(
struct
sockaddr_in6
*
psin_server
,
struct
socket
**
csocket
);
...
...
@@ -120,10 +120,10 @@ cifs_reconnect(struct TCP_Server_Info *server)
struct
list_head
*
tmp
;
struct
cifsSesInfo
*
ses
;
struct
cifsTconInfo
*
tcon
;
struct
mid_q_entry
*
mid_entry
;
struct
mid_q_entry
*
mid_entry
;
spin_lock
(
&
GlobalMid_Lock
);
if
(
kthread_should_stop
()
)
{
if
(
kthread_should_stop
()
)
{
/* the demux thread will exit normally
next time through the loop */
spin_unlock
(
&
GlobalMid_Lock
);
...
...
@@ -150,17 +150,17 @@ cifs_reconnect(struct TCP_Server_Info *server)
}
list_for_each
(
tmp
,
&
GlobalTreeConnectionList
)
{
tcon
=
list_entry
(
tmp
,
struct
cifsTconInfo
,
cifsConnectionList
);
if
((
tcon
)
&&
(
tcon
->
ses
)
&&
(
tcon
->
ses
->
server
==
server
))
{
if
((
tcon
)
&&
(
tcon
->
ses
)
&&
(
tcon
->
ses
->
server
==
server
))
{
tcon
->
tidStatus
=
CifsNeedReconnect
;
}
}
read_unlock
(
&
GlobalSMBSeslock
);
/* do not want to be sending data on a socket we are freeing */
down
(
&
server
->
tcpSem
);
if
(
server
->
ssocket
)
{
if
(
server
->
ssocket
)
{
cFYI
(
1
,
(
"State: 0x%x Flags: 0x%lx"
,
server
->
ssocket
->
state
,
server
->
ssocket
->
flags
));
server
->
ssocket
->
ops
->
shutdown
(
server
->
ssocket
,
SEND_SHUTDOWN
);
server
->
ssocket
->
ops
->
shutdown
(
server
->
ssocket
,
SEND_SHUTDOWN
);
cFYI
(
1
,
(
"Post shutdown state: 0x%x Flags: 0x%lx"
,
server
->
ssocket
->
state
,
server
->
ssocket
->
flags
));
...
...
@@ -173,8 +173,8 @@ cifs_reconnect(struct TCP_Server_Info *server)
mid_entry
=
list_entry
(
tmp
,
struct
mid_q_entry
,
qhead
);
if
(
mid_entry
)
{
if
(
mid_entry
->
midState
==
MID_REQUEST_SUBMITTED
)
{
if
(
mid_entry
)
{
if
(
mid_entry
->
midState
==
MID_REQUEST_SUBMITTED
)
{
/* Mark other intransit requests as needing
retry so we do not immediately mark the
session bad again (ie after we reconnect
...
...
@@ -186,24 +186,24 @@ cifs_reconnect(struct TCP_Server_Info *server)
spin_unlock
(
&
GlobalMid_Lock
);
up
(
&
server
->
tcpSem
);
while
(
(
!
kthread_should_stop
())
&&
(
server
->
tcpStatus
!=
CifsGood
))
{
while
(
(
!
kthread_should_stop
())
&&
(
server
->
tcpStatus
!=
CifsGood
))
{
try_to_freeze
();
if
(
server
->
protocolType
==
IPV6
)
{
rc
=
ipv6_connect
(
&
server
->
addr
.
sockAddr6
,
&
server
->
ssocket
);
if
(
server
->
protocolType
==
IPV6
)
{
rc
=
ipv6_connect
(
&
server
->
addr
.
sockAddr6
,
&
server
->
ssocket
);
}
else
{
rc
=
ipv4_connect
(
&
server
->
addr
.
sockAddr
,
&
server
->
ssocket
,
server
->
workstation_RFC1001_name
,
server
->
server_RFC1001_name
);
}
if
(
rc
)
{
cFYI
(
1
,
(
"reconnect error %d"
,
rc
));
if
(
rc
)
{
cFYI
(
1
,
(
"reconnect error %d"
,
rc
));
msleep
(
3000
);
}
else
{
atomic_inc
(
&
tcpSesReconnectCount
);
spin_lock
(
&
GlobalMid_Lock
);
if
(
!
kthread_should_stop
()
)
if
(
!
kthread_should_stop
()
)
server
->
tcpStatus
=
CifsGood
;
server
->
sequence_number
=
0
;
spin_unlock
(
&
GlobalMid_Lock
);
...
...
@@ -221,19 +221,19 @@ cifs_reconnect(struct TCP_Server_Info *server)
-EINVAL = invalid transact2
*/
static
int
check2ndT2
(
struct
smb_hdr
*
pSMB
,
unsigned
int
maxBufSize
)
static
int
check2ndT2
(
struct
smb_hdr
*
pSMB
,
unsigned
int
maxBufSize
)
{
struct
smb_t2_rsp
*
pSMBt
;
struct
smb_t2_rsp
*
pSMBt
;
int
total_data_size
;
int
data_in_this_rsp
;
int
remaining
;
if
(
pSMB
->
Command
!=
SMB_COM_TRANSACTION2
)
if
(
pSMB
->
Command
!=
SMB_COM_TRANSACTION2
)
return
0
;
/* check for plausible wct, bcc and t2 data and parm sizes */
/* check for parm and data offset going beyond end of smb */
if
(
pSMB
->
WordCount
!=
10
)
{
/* coalesce_t2 depends on this */
if
(
pSMB
->
WordCount
!=
10
)
{
/* coalesce_t2 depends on this */
cFYI
(
1
,
(
"invalid transact2 word count"
));
return
-
EINVAL
;
}
...
...
@@ -245,25 +245,25 @@ static int check2ndT2(struct smb_hdr * pSMB, unsigned int maxBufSize)
remaining
=
total_data_size
-
data_in_this_rsp
;
if
(
remaining
==
0
)
if
(
remaining
==
0
)
return
0
;
else
if
(
remaining
<
0
)
{
else
if
(
remaining
<
0
)
{
cFYI
(
1
,
(
"total data %d smaller than data in frame %d"
,
total_data_size
,
data_in_this_rsp
));
return
-
EINVAL
;
}
else
{
cFYI
(
1
,
(
"missing %d bytes from transact2, check next response"
,
remaining
));
if
(
total_data_size
>
maxBufSize
)
{
cERROR
(
1
,(
"TotalDataSize %d is over maximum buffer %d"
,
total_data_size
,
maxBufSize
));
if
(
total_data_size
>
maxBufSize
)
{
cERROR
(
1
,
(
"TotalDataSize %d is over maximum buffer %d"
,
total_data_size
,
maxBufSize
));
return
-
EINVAL
;
}
return
remaining
;
}
}
static
int
coalesce_t2
(
struct
smb_hdr
*
psecond
,
struct
smb_hdr
*
pTargetSMB
)
static
int
coalesce_t2
(
struct
smb_hdr
*
psecond
,
struct
smb_hdr
*
pTargetSMB
)
{
struct
smb_t2_rsp
*
pSMB2
=
(
struct
smb_t2_rsp
*
)
psecond
;
struct
smb_t2_rsp
*
pSMBt
=
(
struct
smb_t2_rsp
*
)
pTargetSMB
;
...
...
@@ -271,28 +271,28 @@ static int coalesce_t2(struct smb_hdr * psecond, struct smb_hdr *pTargetSMB)
int
total_in_buf
;
int
remaining
;
int
total_in_buf2
;
char
*
data_area_of_target
;
char
*
data_area_of_buf2
;
char
*
data_area_of_target
;
char
*
data_area_of_buf2
;
__u16
byte_count
;
total_data_size
=
le16_to_cpu
(
pSMBt
->
t2_rsp
.
TotalDataCount
);
if
(
total_data_size
!=
le16_to_cpu
(
pSMB2
->
t2_rsp
.
TotalDataCount
))
{
cFYI
(
1
,(
"total data sizes of primary and secondary t2 differ"
));
if
(
total_data_size
!=
le16_to_cpu
(
pSMB2
->
t2_rsp
.
TotalDataCount
))
{
cFYI
(
1
,
(
"total data sizes of primary and secondary t2 differ"
));
}
total_in_buf
=
le16_to_cpu
(
pSMBt
->
t2_rsp
.
DataCount
);
remaining
=
total_data_size
-
total_in_buf
;
if
(
remaining
<
0
)
if
(
remaining
<
0
)
return
-
EINVAL
;
if
(
remaining
==
0
)
/* nothing to do, ignore */
if
(
remaining
==
0
)
/* nothing to do, ignore */
return
0
;
total_in_buf2
=
le16_to_cpu
(
pSMB2
->
t2_rsp
.
DataCount
);
if
(
remaining
<
total_in_buf2
)
{
if
(
remaining
<
total_in_buf2
)
{
cFYI
(
1
,
(
"transact2 2nd response contains too much data"
));
}
...
...
@@ -307,7 +307,7 @@ static int coalesce_t2(struct smb_hdr * psecond, struct smb_hdr *pTargetSMB)
data_area_of_target
+=
total_in_buf
;
/* copy second buffer into end of first buffer */
memcpy
(
data_area_of_target
,
data_area_of_buf2
,
total_in_buf2
);
memcpy
(
data_area_of_target
,
data_area_of_buf2
,
total_in_buf2
);
total_in_buf
+=
total_in_buf2
;
pSMBt
->
t2_rsp
.
DataCount
=
cpu_to_le16
(
total_in_buf
);
byte_count
=
le16_to_cpu
(
BCC_LE
(
pTargetSMB
));
...
...
@@ -321,7 +321,7 @@ static int coalesce_t2(struct smb_hdr * psecond, struct smb_hdr *pTargetSMB)
pTargetSMB
->
smb_buf_length
=
byte_count
;
if
(
remaining
==
total_in_buf2
)
{
if
(
remaining
==
total_in_buf2
)
{
cFYI
(
1
,
(
"found the last secondary response"
));
return
0
;
/* we are done */
}
else
/* more responses to go */
...
...
@@ -357,7 +357,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
length
=
tcpSesAllocCount
.
counter
;
write_unlock
(
&
GlobalSMBSeslock
);
complete
(
&
cifsd_complete
);
if
(
length
>
1
)
{
if
(
length
>
1
)
{
mempool_resize
(
cifs_req_poolp
,
length
+
cifs_min_rcv
,
GFP_KERNEL
);
...
...
@@ -468,9 +468,9 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
}
else
if
(
temp
==
(
char
)
RFC1002_NEGATIVE_SESSION_RESPONSE
)
{
/* we get this from Windows 98 instead of
an error on SMB negprot response */
cFYI
(
1
,(
"Negative RFC1002 Session Response Error 0x%x)"
,
cFYI
(
1
,
(
"Negative RFC1002 Session Response Error 0x%x)"
,
pdu_length
));
if
(
server
->
tcpStatus
==
CifsNew
)
{
if
(
server
->
tcpStatus
==
CifsNew
)
{
/* if nack on negprot (rather than
ret of smb negprot error) reconnecting
not going to help, ret error to mount */
...
...
@@ -492,7 +492,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
continue
;
}
}
else
if
(
temp
!=
(
char
)
0
)
{
cERROR
(
1
,(
"Unknown RFC 1002 frame"
));
cERROR
(
1
,
(
"Unknown RFC 1002 frame"
));
cifs_dump_mem
(
" Received Data: "
,
(
char
*
)
smb_buffer
,
length
);
cifs_reconnect
(
server
);
...
...
@@ -501,7 +501,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
}
/* else we have an SMB response */
if
((
pdu_length
>
CIFSMaxBufSize
+
MAX_CIFS_HDR_SIZE
-
4
)
||
if
((
pdu_length
>
CIFSMaxBufSize
+
MAX_CIFS_HDR_SIZE
-
4
)
||
(
pdu_length
<
sizeof
(
struct
smb_hdr
)
-
1
-
4
))
{
cERROR
(
1
,
(
"Invalid size SMB length %d pdu_length %d"
,
length
,
pdu_length
+
4
));
...
...
@@ -514,7 +514,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
/* else length ok */
reconnect
=
0
;
if
(
pdu_length
>
MAX_CIFS_SMALL_BUFFER_SIZE
-
4
)
{
if
(
pdu_length
>
MAX_CIFS_SMALL_BUFFER_SIZE
-
4
)
{
isLargeBuf
=
TRUE
;
memcpy
(
bigbuf
,
smallbuf
,
4
);
smb_buffer
=
bigbuf
;
...
...
@@ -526,7 +526,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
total_read
+=
length
)
{
length
=
kernel_recvmsg
(
csocket
,
&
smb_msg
,
&
iov
,
1
,
pdu_length
-
total_read
,
0
);
if
(
kthread_should_stop
()
||
if
(
kthread_should_stop
()
||
(
length
==
-
EINTR
))
{
/* then will exit */
reconnect
=
2
;
...
...
@@ -546,7 +546,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
CifsNeedReconnect if server hung*/
continue
;
}
else
if
(
length
<=
0
)
{
cERROR
(
1
,(
"Received no data, expecting %d"
,
cERROR
(
1
,
(
"Received no data, expecting %d"
,
pdu_length
-
total_read
));
cifs_reconnect
(
server
);
csocket
=
server
->
ssocket
;
...
...
@@ -554,9 +554,9 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
break
;
}
}
if
(
reconnect
==
2
)
if
(
reconnect
==
2
)
break
;
else
if
(
reconnect
==
1
)
else
if
(
reconnect
==
1
)
continue
;
length
+=
4
;
/* account for rfc1002 hdr */
...
...
@@ -577,12 +577,12 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
if
((
mid_entry
->
mid
==
smb_buffer
->
Mid
)
&&
(
mid_entry
->
midState
==
MID_REQUEST_SUBMITTED
)
&&
(
mid_entry
->
command
==
smb_buffer
->
Command
))
{
if
(
check2ndT2
(
smb_buffer
,
server
->
maxBuf
)
>
0
)
{
if
(
check2ndT2
(
smb_buffer
,
server
->
maxBuf
)
>
0
)
{
/* We have a multipart transact2 resp */
isMultiRsp
=
TRUE
;
if
(
mid_entry
->
resp_buf
)
{
if
(
mid_entry
->
resp_buf
)
{
/* merge response - fix up 1st*/
if
(
coalesce_t2
(
smb_buffer
,
if
(
coalesce_t2
(
smb_buffer
,
mid_entry
->
resp_buf
))
{
mid_entry
->
multiRsp
=
1
;
break
;
...
...
@@ -592,7 +592,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
goto
multi_t2_fnd
;
}
}
else
{
if
(
!
isLargeBuf
)
{
if
(
!
isLargeBuf
)
{
cERROR
(
1
,(
"1st trans2 resp needs bigbuf"
));
/* BB maybe we can fix this up, switch
to already allocated large buffer? */
...
...
@@ -607,7 +607,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
break
;
}
mid_entry
->
resp_buf
=
smb_buffer
;
if
(
isLargeBuf
)
if
(
isLargeBuf
)
mid_entry
->
largeBuf
=
1
;
else
mid_entry
->
largeBuf
=
0
;
...
...
@@ -627,9 +627,9 @@ multi_t2_fnd:
spin_unlock
(
&
GlobalMid_Lock
);
if
(
task_to_wake
)
{
/* Was previous buf put in mpx struct for multi-rsp? */
if
(
!
isMultiRsp
)
{
if
(
!
isMultiRsp
)
{
/* smb buffer will be freed by user thread */
if
(
isLargeBuf
)
{
if
(
isLargeBuf
)
{
bigbuf
=
NULL
;
}
else
smallbuf
=
NULL
;
...
...
@@ -654,7 +654,7 @@ multi_t2_fnd:
/* check if we have blocked requests that need to free */
/* Note that cifs_max_pending is normally 50, but
can be set at module install time to as little as two */
if
(
atomic_read
(
&
server
->
inFlight
)
>=
cifs_max_pending
)
if
(
atomic_read
(
&
server
->
inFlight
)
>=
cifs_max_pending
)
atomic_set
(
&
server
->
inFlight
,
cifs_max_pending
-
1
);
/* We do not want to set the max_pending too low or we
could end up with the counter going negative */
...
...
@@ -668,7 +668,7 @@ multi_t2_fnd:
/* give those requests time to exit */
msleep
(
125
);
if
(
server
->
ssocket
)
{
if
(
server
->
ssocket
)
{
sock_release
(
csocket
);
server
->
ssocket
=
NULL
;
}
...
...
@@ -711,7 +711,7 @@ multi_t2_fnd:
cFYI
(
1
,
(
"Clearing Mid 0x%x - waking up "
,
mid_entry
->
mid
));
task_to_wake
=
mid_entry
->
tsk
;
if
(
task_to_wake
)
{
if
(
task_to_wake
)
{
wake_up_process
(
task_to_wake
);
}
}
...
...
@@ -753,7 +753,7 @@ multi_t2_fnd:
write_unlock
(
&
GlobalSMBSeslock
);
kfree
(
server
);
if
(
length
>
0
)
{
if
(
length
>
0
)
{
mempool_resize
(
cifs_req_poolp
,
length
+
cifs_min_rcv
,
GFP_KERNEL
);
...
...
@@ -804,8 +804,8 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
if
(
!
options
)
return
1
;
if
(
strncmp
(
options
,
"sep="
,
4
)
==
0
)
{
if
(
options
[
4
]
!=
0
)
{
if
(
strncmp
(
options
,
"sep="
,
4
)
==
0
)
{
if
(
options
[
4
]
!=
0
)
{
separator
[
0
]
=
options
[
4
];
options
+=
5
;
}
else
{
...
...
@@ -828,7 +828,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
printk
(
KERN_WARNING
"CIFS: invalid or missing username
\n
"
);
return
1
;
/* needs_arg; */
}
else
if
(
!*
value
)
{
}
else
if
(
!*
value
)
{
/* null user, ie anonymous, authentication */
vol
->
nullauth
=
1
;
}
...
...
@@ -842,12 +842,12 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
if
(
!
value
)
{
vol
->
password
=
NULL
;
continue
;
}
else
if
(
value
[
0
]
==
0
)
{
}
else
if
(
value
[
0
]
==
0
)
{
/* check if string begins with double comma
since that would mean the password really
does start with a comma, and would not
indicate an empty string */
if
(
value
[
1
]
!=
separator
[
0
])
{
if
(
value
[
1
]
!=
separator
[
0
])
{
vol
->
password
=
NULL
;
continue
;
}
...
...
@@ -885,7 +885,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
}
temp_len
++
;
}
if
(
value
[
temp_len
]
==
0
)
{
if
(
value
[
temp_len
]
==
0
)
{
options
=
NULL
;
}
else
{
value
[
temp_len
]
=
0
;
...
...
@@ -896,13 +896,13 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
double commas to singles. Note that this ends up
allocating a few bytes too many, which is ok */
vol
->
password
=
kzalloc
(
temp_len
,
GFP_KERNEL
);
if
(
vol
->
password
==
NULL
)
{
if
(
vol
->
password
==
NULL
)
{
printk
(
"CIFS: no memory for pass
\n
"
);
return
1
;
}
for
(
i
=
0
,
j
=
0
;
i
<
temp_len
;
i
++
,
j
++
)
{
vol
->
password
[
j
]
=
value
[
i
];
if
(
value
[
i
]
==
separator
[
0
]
if
(
value
[
i
]
==
separator
[
0
]
&&
value
[
i
+
1
]
==
separator
[
0
])
{
/* skip second comma */
i
++
;
...
...
@@ -911,7 +911,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
vol
->
password
[
j
]
=
0
;
}
else
{
vol
->
password
=
kzalloc
(
temp_len
+
1
,
GFP_KERNEL
);
if
(
vol
->
password
==
NULL
)
{
if
(
vol
->
password
==
NULL
)
{
printk
(
"CIFS: no memory for pass
\n
"
);
return
1
;
}
...
...
@@ -1089,7 +1089,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
}
}
else
if
(
strnicmp
(
data
,
"netbiosname"
,
4
)
==
0
)
{
if
(
!
value
||
!*
value
||
(
*
value
==
' '
))
{
cFYI
(
1
,(
"invalid (empty) netbiosname specified"
));
cFYI
(
1
,
(
"invalid (empty) netbiosname specified"
));
}
else
{
memset
(
vol
->
source_rfc1001_name
,
0x20
,
15
);
for
(
i
=
0
;
i
<
15
;
i
++
)
{
...
...
@@ -1187,7 +1187,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
/* turn off mandatory locking in mode
if remote locking is turned off since the
local vfs will do advisory */
if
(
vol
->
file_mode
==
(
S_IALLUGO
&
~
(
S_ISUID
|
S_IXGRP
)))
if
(
vol
->
file_mode
==
(
S_IALLUGO
&
~
(
S_ISUID
|
S_IXGRP
)))
vol
->
file_mode
=
S_IALLUGO
;
}
else
if
(
strnicmp
(
data
,
"setuids"
,
7
)
==
0
)
{
vol
->
setuids
=
1
;
...
...
@@ -1257,7 +1257,7 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
return
1
;
}
}
if
(
vol
->
UNCip
==
NULL
)
if
(
vol
->
UNCip
==
NULL
)
vol
->
UNCip
=
&
vol
->
UNC
[
2
];
return
0
;
...
...
@@ -1276,7 +1276,7 @@ cifs_find_tcp_session(struct in_addr * target_ip_addr,
list_for_each
(
tmp
,
&
GlobalSMBSessionList
)
{
ses
=
list_entry
(
tmp
,
struct
cifsSesInfo
,
cifsSessionList
);
if
(
ses
->
server
)
{
if
((
target_ip_addr
&&
if
((
target_ip_addr
&&
(
ses
->
server
->
addr
.
sockAddr
.
sin_addr
.
s_addr
==
target_ip_addr
->
s_addr
))
||
(
target_ip6_addr
&&
memcmp
(
&
ses
->
server
->
addr
.
sockAddr6
.
sin6_addr
,
...
...
@@ -1319,7 +1319,7 @@ find_unc(__be32 new_target_ip_addr, char *uncName, char *userName)
/* BB lock tcon, server and tcp session and increment use count here? */
/* found a match on the TCP session */
/* BB check if reconnection needed */
cFYI
(
1
,(
"IP match, old UNC: %s new: %s"
,
cFYI
(
1
,
(
"IP match, old UNC: %s new: %s"
,
tcon
->
treeName
,
uncName
));
if
(
strncmp
(
tcon
->
treeName
,
uncName
,
...
...
@@ -1423,7 +1423,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
int
connected
=
0
;
__be16
orig_port
=
0
;
if
(
*
csocket
==
NULL
)
{
if
(
*
csocket
==
NULL
)
{
rc
=
sock_create_kern
(
PF_INET
,
SOCK_STREAM
,
IPPROTO_TCP
,
csocket
);
if
(
rc
<
0
)
{
cERROR
(
1
,
(
"Error %d creating socket"
,
rc
));
...
...
@@ -1437,7 +1437,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
}
psin_server
->
sin_family
=
AF_INET
;
if
(
psin_server
->
sin_port
)
{
/* user overrode default port */
if
(
psin_server
->
sin_port
)
{
/* user overrode default port */
rc
=
(
*
csocket
)
->
ops
->
connect
(
*
csocket
,
(
struct
sockaddr
*
)
psin_server
,
sizeof
(
struct
sockaddr_in
),
0
);
...
...
@@ -1445,13 +1445,13 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
connected
=
1
;
}
if
(
!
connected
)
{
if
(
!
connected
)
{
/* save original port so we can retry user specified port
later if fall back ports fail this time */
orig_port
=
psin_server
->
sin_port
;
/* do not retry on the same port we just failed on */
if
(
psin_server
->
sin_port
!=
htons
(
CIFS_PORT
))
{
if
(
psin_server
->
sin_port
!=
htons
(
CIFS_PORT
))
{
psin_server
->
sin_port
=
htons
(
CIFS_PORT
);
rc
=
(
*
csocket
)
->
ops
->
connect
(
*
csocket
,
...
...
@@ -1472,9 +1472,9 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
/* give up here - unless we want to retry on different
protocol families some day */
if
(
!
connected
)
{
if
(
orig_port
)
if
(
orig_port
)
psin_server
->
sin_port
=
orig_port
;
cFYI
(
1
,(
"Error %d connecting to server via ipv4"
,
rc
));
cFYI
(
1
,
(
"Error %d connecting to server via ipv4"
,
rc
));
sock_release
(
*
csocket
);
*
csocket
=
NULL
;
return
rc
;
...
...
@@ -1482,26 +1482,26 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
/* Eventually check for other socket options to change from
the default. sock_setsockopt not used because it expects
user space buffer */
cFYI
(
1
,(
"sndbuf %d rcvbuf %d rcvtimeo 0x%lx"
,(
*
csocket
)
->
sk
->
sk_sndbuf
,
cFYI
(
1
,
(
"sndbuf %d rcvbuf %d rcvtimeo 0x%lx"
,(
*
csocket
)
->
sk
->
sk_sndbuf
,
(
*
csocket
)
->
sk
->
sk_rcvbuf
,
(
*
csocket
)
->
sk
->
sk_rcvtimeo
));
(
*
csocket
)
->
sk
->
sk_rcvtimeo
=
7
*
HZ
;
/* make the bufsizes depend on wsize/rsize and max requests */
if
((
*
csocket
)
->
sk
->
sk_sndbuf
<
(
200
*
1024
))
if
((
*
csocket
)
->
sk
->
sk_sndbuf
<
(
200
*
1024
))
(
*
csocket
)
->
sk
->
sk_sndbuf
=
200
*
1024
;
if
((
*
csocket
)
->
sk
->
sk_rcvbuf
<
(
140
*
1024
))
if
((
*
csocket
)
->
sk
->
sk_rcvbuf
<
(
140
*
1024
))
(
*
csocket
)
->
sk
->
sk_rcvbuf
=
140
*
1024
;
/* send RFC1001 sessinit */
if
(
psin_server
->
sin_port
==
htons
(
RFC1001_PORT
))
{
if
(
psin_server
->
sin_port
==
htons
(
RFC1001_PORT
))
{
/* some servers require RFC1001 sessinit before sending
negprot - BB check reconnection in case where second
sessinit is sent but no second negprot */
struct
rfc1002_session_packet
*
ses_init_buf
;
struct
smb_hdr
*
smb_buf
;
ses_init_buf
=
kzalloc
(
sizeof
(
struct
rfc1002_session_packet
),
GFP_KERNEL
);
if
(
ses_init_buf
)
{
if
(
ses_init_buf
)
{
ses_init_buf
->
trailer
.
session_req
.
called_len
=
32
;
if
(
target_name
&&
(
target_name
[
0
]
!=
0
))
{
if
(
target_name
&&
(
target_name
[
0
]
!=
0
))
{
rfc1002mangle
(
ses_init_buf
->
trailer
.
session_req
.
called_name
,
target_name
,
16
);
}
else
{
...
...
@@ -1512,7 +1512,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
ses_init_buf
->
trailer
.
session_req
.
calling_len
=
32
;
/* calling name ends in null (byte 16) from old smb
convention. */
if
(
netbios_name
&&
(
netbios_name
[
0
]
!=
0
))
{
if
(
netbios_name
&&
(
netbios_name
[
0
]
!=
0
))
{
rfc1002mangle
(
ses_init_buf
->
trailer
.
session_req
.
calling_name
,
netbios_name
,
16
);
}
else
{
...
...
@@ -1551,7 +1551,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
int
connected
=
0
;
__be16
orig_port
=
0
;
if
(
*
csocket
==
NULL
)
{
if
(
*
csocket
==
NULL
)
{
rc
=
sock_create_kern
(
PF_INET6
,
SOCK_STREAM
,
IPPROTO_TCP
,
csocket
);
if
(
rc
<
0
)
{
cERROR
(
1
,
(
"Error %d creating ipv6 socket"
,
rc
));
...
...
@@ -1559,14 +1559,14 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
return
rc
;
}
else
{
/* BB other socket options to set KEEPALIVE, NODELAY? */
cFYI
(
1
,(
"ipv6 Socket created"
));
cFYI
(
1
,
(
"ipv6 Socket created"
));
(
*
csocket
)
->
sk
->
sk_allocation
=
GFP_NOFS
;
}
}
psin_server
->
sin6_family
=
AF_INET6
;
if
(
psin_server
->
sin6_port
)
{
/* user overrode default port */
if
(
psin_server
->
sin6_port
)
{
/* user overrode default port */
rc
=
(
*
csocket
)
->
ops
->
connect
(
*
csocket
,
(
struct
sockaddr
*
)
psin_server
,
sizeof
(
struct
sockaddr_in6
),
0
);
...
...
@@ -1574,13 +1574,13 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
connected
=
1
;
}
if
(
!
connected
)
{
if
(
!
connected
)
{
/* save original port so we can retry user specified port
later if fall back ports fail this time */
orig_port
=
psin_server
->
sin6_port
;
/* do not retry on the same port we just failed on */
if
(
psin_server
->
sin6_port
!=
htons
(
CIFS_PORT
))
{
if
(
psin_server
->
sin6_port
!=
htons
(
CIFS_PORT
))
{
psin_server
->
sin6_port
=
htons
(
CIFS_PORT
);
rc
=
(
*
csocket
)
->
ops
->
connect
(
*
csocket
,
...
...
@@ -1601,9 +1601,9 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
/* give up here - unless we want to retry on different
protocol families some day */
if
(
!
connected
)
{
if
(
orig_port
)
if
(
orig_port
)
psin_server
->
sin6_port
=
orig_port
;
cFYI
(
1
,(
"Error %d connecting to server via ipv6"
,
rc
));
cFYI
(
1
,
(
"Error %d connecting to server via ipv6"
,
rc
));
sock_release
(
*
csocket
);
*
csocket
=
NULL
;
return
rc
;
...
...
@@ -1631,12 +1631,12 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon,
__u64
saved_cap
=
le64_to_cpu
(
tcon
->
fsUnixInfo
.
Capability
);
if
(
!
CIFSSMBQFSUnixInfo
(
xid
,
tcon
))
{
if
(
!
CIFSSMBQFSUnixInfo
(
xid
,
tcon
))
{
__u64
cap
=
le64_to_cpu
(
tcon
->
fsUnixInfo
.
Capability
);
/* check for reconnect case in which we do not
want to change the mount behavior if we can avoid it */
if
(
vol_info
==
NULL
)
{
if
(
vol_info
==
NULL
)
{
/* turn off POSIX ACL and PATHNAMES if not set
originally at mount time */
if
((
saved_cap
&
CIFS_UNIX_POSIX_ACL_CAP
)
==
0
)
...
...
@@ -1653,15 +1653,15 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon,
if
(
vol_info
&&
vol_info
->
no_psx_acl
)
cap
&=
~
CIFS_UNIX_POSIX_ACL_CAP
;
else
if
(
CIFS_UNIX_POSIX_ACL_CAP
&
cap
)
{
cFYI
(
1
,(
"negotiated posix acl support"
));
if
(
sb
)
cFYI
(
1
,
(
"negotiated posix acl support"
));
if
(
sb
)
sb
->
s_flags
|=
MS_POSIXACL
;
}
if
(
vol_info
&&
vol_info
->
posix_paths
==
0
)
cap
&=
~
CIFS_UNIX_POSIX_PATHNAMES_CAP
;
else
if
(
cap
&
CIFS_UNIX_POSIX_PATHNAMES_CAP
)
{
cFYI
(
1
,(
"negotiate posix pathnames"
));
cFYI
(
1
,
(
"negotiate posix pathnames"
));
if
(
sb
)
CIFS_SB
(
sb
)
->
mnt_cifs_flags
|=
CIFS_MOUNT_POSIX_PATHS
;
...
...
@@ -1677,31 +1677,31 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon,
if
((
cap
&
CIFS_UNIX_LARGE_READ_CAP
)
==
0
)
{
CIFS_SB
(
sb
)
->
rsize
=
127
*
1024
;
#ifdef CONFIG_CIFS_DEBUG2
cFYI
(
1
,(
"larger reads not supported by srv"
));
cFYI
(
1
,
(
"larger reads not supported by srv"
));
#endif
}
}
cFYI
(
1
,(
"Negotiate caps 0x%x"
,(
int
)
cap
));
cFYI
(
1
,
(
"Negotiate caps 0x%x"
,(
int
)
cap
));
#ifdef CONFIG_CIFS_DEBUG2
if
(
cap
&
CIFS_UNIX_FCNTL_CAP
)
cFYI
(
1
,(
"FCNTL cap"
));
cFYI
(
1
,
(
"FCNTL cap"
));
if
(
cap
&
CIFS_UNIX_EXTATTR_CAP
)
cFYI
(
1
,(
"EXTATTR cap"
));
cFYI
(
1
,
(
"EXTATTR cap"
));
if
(
cap
&
CIFS_UNIX_POSIX_PATHNAMES_CAP
)
cFYI
(
1
,(
"POSIX path cap"
));
cFYI
(
1
,
(
"POSIX path cap"
));
if
(
cap
&
CIFS_UNIX_XATTR_CAP
)
cFYI
(
1
,(
"XATTR cap"
));
cFYI
(
1
,
(
"XATTR cap"
));
if
(
cap
&
CIFS_UNIX_POSIX_ACL_CAP
)
cFYI
(
1
,(
"POSIX ACL cap"
));
cFYI
(
1
,
(
"POSIX ACL cap"
));
if
(
cap
&
CIFS_UNIX_LARGE_READ_CAP
)
cFYI
(
1
,(
"very large read cap"
));
cFYI
(
1
,
(
"very large read cap"
));
if
(
cap
&
CIFS_UNIX_LARGE_WRITE_CAP
)
cFYI
(
1
,(
"very large write cap"
));
cFYI
(
1
,
(
"very large write cap"
));
#endif
/* CIFS_DEBUG2 */
if
(
CIFSSMBSetFSUnixInfo
(
xid
,
tcon
,
cap
))
{
cFYI
(
1
,(
"setting capabilities failed"
));
cFYI
(
1
,
(
"setting capabilities failed"
));
}
}
}
...
...
@@ -1736,7 +1736,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
}
if
(
volume_info
.
nullauth
)
{
cFYI
(
1
,(
"null user"
));
cFYI
(
1
,
(
"null user"
));
volume_info
.
username
=
NULL
;
}
else
if
(
volume_info
.
username
)
{
/* BB fixme parse for domain name here */
...
...
@@ -1755,16 +1755,16 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
if
(
volume_info
.
UNCip
&&
volume_info
.
UNC
)
{
rc
=
cifs_inet_pton
(
AF_INET
,
volume_info
.
UNCip
,
&
sin_server
.
sin_addr
.
s_addr
);
if
(
rc
<=
0
)
{
if
(
rc
<=
0
)
{
/* not ipv4 address, try ipv6 */
rc
=
cifs_inet_pton
(
AF_INET6
,
volume_info
.
UNCip
,
&
sin_server6
.
sin6_addr
.
in6_u
);
if
(
rc
>
0
)
if
(
rc
>
0
)
address_type
=
AF_INET6
;
}
else
{
address_type
=
AF_INET
;
}
if
(
rc
<=
0
)
{
if
(
rc
<=
0
)
{
/* we failed translating address */
kfree
(
volume_info
.
UNC
);
kfree
(
volume_info
.
password
);
...
...
@@ -1795,12 +1795,12 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
}
/* this is needed for ASCII cp to Unicode converts */
if
(
volume_info
.
iocharset
==
NULL
)
{
if
(
volume_info
.
iocharset
==
NULL
)
{
cifs_sb
->
local_nls
=
load_nls_default
();
/* load_nls_default can not return null */
}
else
{
cifs_sb
->
local_nls
=
load_nls
(
volume_info
.
iocharset
);
if
(
cifs_sb
->
local_nls
==
NULL
)
{
if
(
cifs_sb
->
local_nls
==
NULL
)
{
cERROR
(
1
,(
"CIFS mount error: iocharset %s not found"
,
volume_info
.
iocharset
));
kfree
(
volume_info
.
UNC
);
kfree
(
volume_info
.
password
);
...
...
@@ -1810,12 +1810,12 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
}
}
if
(
address_type
==
AF_INET
)
if
(
address_type
==
AF_INET
)
existingCifsSes
=
cifs_find_tcp_session
(
&
sin_server
.
sin_addr
,
NULL
/* no ipv6 addr */
,
volume_info
.
username
,
&
srvTcp
);
else
if
(
address_type
==
AF_INET6
)
{
cFYI
(
1
,(
"looking for ipv6 address"
));
else
if
(
address_type
==
AF_INET6
)
{
cFYI
(
1
,
(
"looking for ipv6 address"
));
existingCifsSes
=
cifs_find_tcp_session
(
NULL
/* no ipv4 addr */
,
&
sin_server6
.
sin6_addr
,
volume_info
.
username
,
&
srvTcp
);
...
...
@@ -1836,7 +1836,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
else
sin_server
.
sin_port
=
0
;
if
(
address_type
==
AF_INET6
)
{
cFYI
(
1
,(
"attempting ipv6 connect"
));
cFYI
(
1
,
(
"attempting ipv6 connect"
));
/* BB should we allow ipv6 on port 139? */
/* other OS never observed in Wild doing 139 with v6 */
rc
=
ipv6_connect
(
&
sin_server6
,
&
csocket
);
...
...
@@ -2091,7 +2091,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
send_sig call */
force_sig
(
SIGKILL
,
srvTcp
->
tsk
);
tsk
=
srvTcp
->
tsk
;
if
(
tsk
)
if
(
tsk
)
kthread_stop
(
tsk
);
}
}
...
...
@@ -2133,7 +2133,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
/* tell server which Unix caps we support */
if
(
tcon
->
ses
->
capabilities
&
CAP_UNIX
)
reset_cifs_unix_caps
(
xid
,
tcon
,
sb
,
&
volume_info
);
else
if
(
cifs_sb
->
rsize
>
(
1024
*
127
))
{
else
if
(
cifs_sb
->
rsize
>
(
1024
*
127
))
{
cifs_sb
->
rsize
=
1024
*
127
;
#ifdef CONFIG_CIFS_DEBUG2
cFYI
(
1
,
(
"no very large read support, rsize 127K"
));
...
...
@@ -2200,7 +2200,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
pSMB
->
req_no_secext
.
MaxBufferSize
=
cpu_to_le16
(
ses
->
server
->
maxBuf
);
pSMB
->
req_no_secext
.
MaxMpxCount
=
cpu_to_le16
(
ses
->
server
->
maxReq
);
if
(
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
if
(
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
smb_buffer
->
Flags2
|=
SMBFLG2_SECURITY_SIGNATURE
;
capabilities
=
CAP_LARGE_FILES
|
CAP_NT_SMBS
|
CAP_LEVEL_II_OPLOCKS
|
...
...
@@ -2330,10 +2330,10 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
/* We look for obvious messed up bcc or strings in response so we do not go off
the end since (at least) WIN2K and Windows XP have a major bug in not null
terminating last Unicode string in response */
if
(
ses
->
serverOS
)
if
(
ses
->
serverOS
)
kfree
(
ses
->
serverOS
);
ses
->
serverOS
=
kzalloc
(
2
*
(
len
+
1
),
GFP_KERNEL
);
if
(
ses
->
serverOS
==
NULL
)
if
(
ses
->
serverOS
==
NULL
)
goto
sesssetup_nomem
;
cifs_strfromUCS_le
(
ses
->
serverOS
,
(
__le16
*
)
bcc_ptr
,
len
,
nls_codepage
);
...
...
@@ -2346,14 +2346,14 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
remaining_words
-
1
);
kfree
(
ses
->
serverNOS
);
ses
->
serverNOS
=
kzalloc
(
2
*
(
len
+
1
),
GFP_KERNEL
);
if
(
ses
->
serverNOS
==
NULL
)
if
(
ses
->
serverNOS
==
NULL
)
goto
sesssetup_nomem
;
cifs_strfromUCS_le
(
ses
->
serverNOS
,
(
__le16
*
)
bcc_ptr
,
len
,
nls_codepage
);
bcc_ptr
+=
2
*
(
len
+
1
);
ses
->
serverNOS
[
2
*
len
]
=
0
;
ses
->
serverNOS
[
1
+
(
2
*
len
)]
=
0
;
if
(
strncmp
(
ses
->
serverNOS
,
if
(
strncmp
(
ses
->
serverNOS
,
"NT LAN Manager 4"
,
16
)
==
0
)
{
cFYI
(
1
,
(
"NT4 server"
));
ses
->
flags
|=
CIFS_SES_NT4
;
...
...
@@ -2362,11 +2362,11 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
if
(
remaining_words
>
0
)
{
len
=
UniStrnlen
((
wchar_t
*
)
bcc_ptr
,
remaining_words
);
/* last string is not always null terminated (for e.g. for Windows XP & 2000) */
if
(
ses
->
serverDomain
)
if
(
ses
->
serverDomain
)
kfree
(
ses
->
serverDomain
);
ses
->
serverDomain
=
kzalloc
(
2
*
(
len
+
1
),
GFP_KERNEL
);
if
(
ses
->
serverDomain
==
NULL
)
if
(
ses
->
serverDomain
==
NULL
)
goto
sesssetup_nomem
;
cifs_strfromUCS_le
(
ses
->
serverDomain
,
(
__le16
*
)
bcc_ptr
,
len
,
nls_codepage
);
...
...
@@ -2375,7 +2375,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
ses
->
serverDomain
[
1
+
(
2
*
len
)]
=
0
;
}
/* else no more room so create dummy domain string */
else
{
if
(
ses
->
serverDomain
)
if
(
ses
->
serverDomain
)
kfree
(
ses
->
serverDomain
);
ses
->
serverDomain
=
kzalloc
(
2
,
GFP_KERNEL
);
...
...
@@ -2398,7 +2398,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
<=
BCC
(
smb_buffer_response
))
{
kfree
(
ses
->
serverOS
);
ses
->
serverOS
=
kzalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
ses
->
serverOS
==
NULL
)
if
(
ses
->
serverOS
==
NULL
)
goto
sesssetup_nomem
;
strncpy
(
ses
->
serverOS
,
bcc_ptr
,
len
);
...
...
@@ -2409,7 +2409,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
len
=
strnlen
(
bcc_ptr
,
1024
);
kfree
(
ses
->
serverNOS
);
ses
->
serverNOS
=
kzalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
ses
->
serverNOS
==
NULL
)
if
(
ses
->
serverNOS
==
NULL
)
goto
sesssetup_nomem
;
strncpy
(
ses
->
serverNOS
,
bcc_ptr
,
len
);
bcc_ptr
+=
len
;
...
...
@@ -2417,10 +2417,10 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses,
bcc_ptr
++
;
len
=
strnlen
(
bcc_ptr
,
1024
);
if
(
ses
->
serverDomain
)
if
(
ses
->
serverDomain
)
kfree
(
ses
->
serverDomain
);
ses
->
serverDomain
=
kzalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
ses
->
serverDomain
==
NULL
)
if
(
ses
->
serverDomain
==
NULL
)
goto
sesssetup_nomem
;
strncpy
(
ses
->
serverDomain
,
bcc_ptr
,
len
);
bcc_ptr
+=
len
;
...
...
@@ -2472,7 +2472,7 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
__u16
count
;
cFYI
(
1
,
(
"In NTLMSSP sesssetup (negotiate)"
));
if
(
ses
==
NULL
)
if
(
ses
==
NULL
)
return
-
EINVAL
;
domain
=
ses
->
domainName
;
*
pNTLMv2_flag
=
FALSE
;
...
...
@@ -2496,7 +2496,7 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
pSMB
->
req
.
MaxBufferSize
=
cpu_to_le16
(
ses
->
server
->
maxBuf
);
pSMB
->
req
.
MaxMpxCount
=
cpu_to_le16
(
ses
->
server
->
maxReq
);
if
(
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
if
(
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
smb_buffer
->
Flags2
|=
SMBFLG2_SECURITY_SIGNATURE
;
capabilities
=
CAP_LARGE_FILES
|
CAP_NT_SMBS
|
CAP_LEVEL_II_OPLOCKS
|
...
...
@@ -2524,9 +2524,9 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
NTLMSSP_REQUEST_TARGET
|
NTLMSSP_NEGOTIATE_NTLM
|
NTLMSSP_NEGOTIATE_56
|
/* NTLMSSP_NEGOTIATE_ALWAYS_SIGN | */
NTLMSSP_NEGOTIATE_128
;
if
(
sign_CIFS_PDUs
)
if
(
sign_CIFS_PDUs
)
negotiate_flags
|=
NTLMSSP_NEGOTIATE_SIGN
;
/* if(ntlmv2_support)
/* if
(ntlmv2_support)
negotiate_flags |= NTLMSSP_NEGOTIATE_NTLMV2;*/
/* setup pointers to domain name and workstation name */
bcc_ptr
+=
SecurityBlobLength
;
...
...
@@ -2626,11 +2626,11 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
memcpy
(
ses
->
server
->
cryptKey
,
SecurityBlob2
->
Challenge
,
CIFS_CRYPTO_KEY_SIZE
);
if
(
SecurityBlob2
->
NegotiateFlags
&
if
(
SecurityBlob2
->
NegotiateFlags
&
cpu_to_le32
(
NTLMSSP_NEGOTIATE_NTLMV2
))
*
pNTLMv2_flag
=
TRUE
;
if
((
SecurityBlob2
->
NegotiateFlags
&
if
((
SecurityBlob2
->
NegotiateFlags
&
cpu_to_le32
(
NTLMSSP_NEGOTIATE_ALWAYS_SIGN
))
||
(
sign_CIFS_PDUs
>
1
))
ses
->
server
->
secMode
|=
...
...
@@ -2657,7 +2657,7 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
/* We look for obvious messed up bcc or strings in response so we do not go off
the end since (at least) WIN2K and Windows XP have a major bug in not null
terminating last Unicode string in response */
if
(
ses
->
serverOS
)
if
(
ses
->
serverOS
)
kfree
(
ses
->
serverOS
);
ses
->
serverOS
=
kzalloc
(
2
*
(
len
+
1
),
GFP_KERNEL
);
...
...
@@ -2729,7 +2729,7 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid,
if
(((
long
)
bcc_ptr
+
len
)
-
(
long
)
pByteArea
(
smb_buffer_response
)
<=
BCC
(
smb_buffer_response
))
{
if
(
ses
->
serverOS
)
if
(
ses
->
serverOS
)
kfree
(
ses
->
serverOS
);
ses
->
serverOS
=
kzalloc
(
len
+
1
,
...
...
@@ -2806,7 +2806,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
__u16
count
;
cFYI
(
1
,
(
"In NTLMSSPSessSetup (Authenticate)"
));
if
(
ses
==
NULL
)
if
(
ses
==
NULL
)
return
-
EINVAL
;
user
=
ses
->
userName
;
domain
=
ses
->
domainName
;
...
...
@@ -2831,7 +2831,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
pSMB
->
req
.
hdr
.
Uid
=
ses
->
Suid
;
if
(
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
if
(
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
smb_buffer
->
Flags2
|=
SMBFLG2_SECURITY_SIGNATURE
;
capabilities
=
CAP_LARGE_FILES
|
CAP_NT_SMBS
|
CAP_LEVEL_II_OPLOCKS
|
...
...
@@ -2859,9 +2859,9 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
NTLMSSP_NEGOTIATE_UNICODE
|
NTLMSSP_REQUEST_TARGET
|
NTLMSSP_NEGOTIATE_NTLM
|
NTLMSSP_NEGOTIATE_TARGET_INFO
|
0x80000000
|
NTLMSSP_NEGOTIATE_128
;
if
(
sign_CIFS_PDUs
)
if
(
sign_CIFS_PDUs
)
negotiate_flags
|=
/* NTLMSSP_NEGOTIATE_ALWAYS_SIGN |*/
NTLMSSP_NEGOTIATE_SIGN
;
if
(
ntlmv2_flag
)
if
(
ntlmv2_flag
)
negotiate_flags
|=
NTLMSSP_NEGOTIATE_NTLMV2
;
/* setup pointers to domain name and workstation name */
...
...
@@ -3018,7 +3018,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
le16_to_cpu
(
pSMBr
->
resp
.
SecurityBlobLength
);
if
(
action
&
GUEST_LOGIN
)
cFYI
(
1
,
(
" Guest login"
));
/* BB do we want to set anything in SesInfo struct ? */
/* if(SecurityBlob2->MessageType != NtLm??){
/* if
(SecurityBlob2->MessageType != NtLm??){
cFYI("Unexpected message type on auth response is %d "));
} */
if
(
ses
)
{
...
...
@@ -3057,7 +3057,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
/* We look for obvious messed up bcc or strings in response so we do not go off
the end since (at least) WIN2K and Windows XP have a major bug in not null
terminating last Unicode string in response */
if
(
ses
->
serverOS
)
if
(
ses
->
serverOS
)
kfree
(
ses
->
serverOS
);
ses
->
serverOS
=
kzalloc
(
2
*
(
len
+
1
),
GFP_KERNEL
);
...
...
@@ -3091,7 +3091,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
if
(
remaining_words
>
0
)
{
len
=
UniStrnlen
((
wchar_t
*
)
bcc_ptr
,
remaining_words
);
/* last string not always null terminated (e.g. for Windows XP & 2000) */
if
(
ses
->
serverDomain
)
if
(
ses
->
serverDomain
)
kfree
(
ses
->
serverDomain
);
ses
->
serverDomain
=
kzalloc
(
2
*
...
...
@@ -3119,12 +3119,12 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
=
0
;
}
/* else no more room so create dummy domain string */
else
{
if
(
ses
->
serverDomain
)
if
(
ses
->
serverDomain
)
kfree
(
ses
->
serverDomain
);
ses
->
serverDomain
=
kzalloc
(
2
,
GFP_KERNEL
);
}
}
else
{
/* no room so create dummy domain and NOS string */
if
(
ses
->
serverDomain
)
if
(
ses
->
serverDomain
)
kfree
(
ses
->
serverDomain
);
ses
->
serverDomain
=
kzalloc
(
2
,
GFP_KERNEL
);
kfree
(
ses
->
serverNOS
);
...
...
@@ -3135,7 +3135,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
if
(((
long
)
bcc_ptr
+
len
)
-
(
long
)
pByteArea
(
smb_buffer_response
)
<=
BCC
(
smb_buffer_response
))
{
if
(
ses
->
serverOS
)
if
(
ses
->
serverOS
)
kfree
(
ses
->
serverOS
);
ses
->
serverOS
=
kzalloc
(
len
+
1
,
GFP_KERNEL
);
strncpy
(
ses
->
serverOS
,
bcc_ptr
,
len
);
...
...
@@ -3153,7 +3153,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses,
bcc_ptr
++
;
len
=
strnlen
(
bcc_ptr
,
1024
);
if
(
ses
->
serverDomain
)
if
(
ses
->
serverDomain
)
kfree
(
ses
->
serverDomain
);
ses
->
serverDomain
=
kzalloc
(
len
+
1
,
GFP_KERNEL
);
strncpy
(
ses
->
serverDomain
,
bcc_ptr
,
len
);
...
...
@@ -3219,7 +3219,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
pSMB
->
AndXCommand
=
0xFF
;
pSMB
->
Flags
=
cpu_to_le16
(
TCON_EXTENDED_SECINFO
);
bcc_ptr
=
&
pSMB
->
Password
[
0
];
if
((
ses
->
server
->
secMode
)
&
SECMODE_USER
)
{
if
((
ses
->
server
->
secMode
)
&
SECMODE_USER
)
{
pSMB
->
PasswordLength
=
cpu_to_le16
(
1
);
/* minimum */
*
bcc_ptr
=
0
;
/* password is null byte */
bcc_ptr
++
;
/* skip password */
...
...
@@ -3233,7 +3233,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
by Samba (not sure whether other servers allow
NTLMv2 password here) */
#ifdef CONFIG_CIFS_WEAK_PW_HASH
if
((
extended_security
&
CIFSSEC_MAY_LANMAN
)
&&
if
((
extended_security
&
CIFSSEC_MAY_LANMAN
)
&&
(
ses
->
server
->
secType
==
LANMAN
))
calc_lanman_hash
(
ses
,
bcc_ptr
);
else
...
...
@@ -3243,14 +3243,14 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
bcc_ptr
);
bcc_ptr
+=
CIFS_SESS_KEY_SIZE
;
if
(
ses
->
capabilities
&
CAP_UNICODE
)
{
if
(
ses
->
capabilities
&
CAP_UNICODE
)
{
/* must align unicode strings */
*
bcc_ptr
=
0
;
/* null byte password */
bcc_ptr
++
;
}
}
if
(
ses
->
server
->
secMode
&
if
(
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
smb_buffer
->
Flags2
|=
SMBFLG2_SECURITY_SIGNATURE
;
...
...
@@ -3321,7 +3321,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
}
/* else do not bother copying these informational fields */
}
if
((
smb_buffer_response
->
WordCount
==
3
)
||
if
((
smb_buffer_response
->
WordCount
==
3
)
||
(
smb_buffer_response
->
WordCount
==
7
))
/* field is in same location */
tcon
->
Flags
=
le16_to_cpu
(
pSMBr
->
OptionalSupport
);
...
...
@@ -3401,16 +3401,16 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
int
first_time
=
0
;
/* what if server changes its buffer size after dropping the session? */
if
(
pSesInfo
->
server
->
maxBuf
==
0
)
/* no need to send on reconnect */
{
if
(
pSesInfo
->
server
->
maxBuf
==
0
)
/* no need to send on reconnect */
{
rc
=
CIFSSMBNegotiate
(
xid
,
pSesInfo
);
if
(
rc
==
-
EAGAIN
)
/* retry only once on 1st time connection */
{
if
(
rc
==
-
EAGAIN
)
/* retry only once on 1st time connection */
{
rc
=
CIFSSMBNegotiate
(
xid
,
pSesInfo
);
if
(
rc
==
-
EAGAIN
)
if
(
rc
==
-
EAGAIN
)
rc
=
-
EHOSTDOWN
;
}
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
spin_lock
(
&
GlobalMid_Lock
);
if
(
pSesInfo
->
server
->
tcpStatus
!=
CifsExiting
)
if
(
pSesInfo
->
server
->
tcpStatus
!=
CifsExiting
)
pSesInfo
->
server
->
tcpStatus
=
CifsGood
;
else
rc
=
-
EHOSTDOWN
;
...
...
@@ -3422,14 +3422,14 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
if
(
!
rc
)
{
pSesInfo
->
flags
=
0
;
pSesInfo
->
capabilities
=
pSesInfo
->
server
->
capabilities
;
if
(
linuxExtEnabled
==
0
)
if
(
linuxExtEnabled
==
0
)
pSesInfo
->
capabilities
&=
(
~
CAP_UNIX
);
/* pSesInfo->sequence_number = 0;*/
cFYI
(
1
,(
"Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d"
,
cFYI
(
1
,
(
"Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d"
,
pSesInfo
->
server
->
secMode
,
pSesInfo
->
server
->
capabilities
,
pSesInfo
->
server
->
timeAdj
));
if
(
experimEnabled
<
2
)
if
(
experimEnabled
<
2
)
rc
=
CIFS_SessSetup
(
xid
,
pSesInfo
,
first_time
,
nls_info
);
else
if
(
extended_security
...
...
@@ -3446,18 +3446,18 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
&
ntlmv2_flag
,
nls_info
);
if
(
!
rc
)
{
if
(
ntlmv2_flag
)
{
if
(
ntlmv2_flag
)
{
char
*
v2_response
;
cFYI
(
1
,
(
"more secure NTLM ver2 hash"
));
if
(
CalcNTLMv2_partial_mac_key
(
pSesInfo
,
if
(
CalcNTLMv2_partial_mac_key
(
pSesInfo
,
nls_info
))
{
rc
=
-
ENOMEM
;
goto
ss_err_exit
;
}
else
v2_response
=
kmalloc
(
16
+
64
/* blob */
,
GFP_KERNEL
);
if
(
v2_response
)
{
if
(
v2_response
)
{
CalcNTLMv2_response
(
pSesInfo
,
v2_response
);
/* if(first_time)
/* if
(first_time)
cifs_calculate_ntlmv2_mac_key(
pSesInfo->server->mac_signing_key,
response, ntlm_session_key, */
...
...
@@ -3473,7 +3473,7 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
pSesInfo
->
server
->
cryptKey
,
ntlm_session_key
);
if
(
first_time
)
if
(
first_time
)
cifs_calculate_mac_key
(
&
pSesInfo
->
server
->
mac_signing_key
,
ntlm_session_key
,
...
...
@@ -3493,7 +3493,7 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
pSesInfo
->
server
->
cryptKey
,
ntlm_session_key
);
if
(
first_time
)
if
(
first_time
)
cifs_calculate_mac_key
(
&
pSesInfo
->
server
->
mac_signing_key
,
ntlm_session_key
,
pSesInfo
->
password
);
...
...
@@ -3502,7 +3502,7 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
ntlm_session_key
,
nls_info
);
}
if
(
rc
)
{
cERROR
(
1
,
(
"Send error in SessSetup = %d"
,
rc
));
cERROR
(
1
,
(
"Send error in SessSetup = %d"
,
rc
));
}
else
{
cFYI
(
1
,
(
"CIFS Session Established successfully"
));
pSesInfo
->
status
=
CifsGood
;
...
...
fs/cifs/dir.c
View file @
fb8c4b14
...
...
@@ -135,10 +135,10 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
struct
cifs_sb_info
*
cifs_sb
;
struct
cifsTconInfo
*
pTcon
;
char
*
full_path
=
NULL
;
FILE_ALL_INFO
*
buf
=
NULL
;
FILE_ALL_INFO
*
buf
=
NULL
;
struct
inode
*
newinode
=
NULL
;
struct
cifsFileInfo
*
pCifsFile
=
NULL
;
struct
cifsInodeInfo
*
pCifsInode
;
struct
cifsFileInfo
*
pCifsFile
=
NULL
;
struct
cifsInodeInfo
*
pCifsInode
;
int
disposition
=
FILE_OVERWRITE_IF
;
int
write_only
=
FALSE
;
...
...
@@ -323,7 +323,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
struct
cifs_sb_info
*
cifs_sb
;
struct
cifsTconInfo
*
pTcon
;
char
*
full_path
=
NULL
;
struct
inode
*
newinode
=
NULL
;
struct
inode
*
newinode
=
NULL
;
if
(
!
old_valid_dev
(
device_number
))
return
-
EINVAL
;
...
...
fs/cifs/export.c
View file @
fb8c4b14
...
...
@@ -40,13 +40,13 @@ static struct dentry *cifs_get_parent(struct dentry *dentry)
struct
export_operations
cifs_export_ops
=
{
.
get_parent
=
cifs_get_parent
,
/* Following five export operations are unneeded so far and can default
*/
/*
.get_dentry =
/* Following five export operations are unneeded so far and can default
:
.get_dentry =
.get_name =
.find_exported_dentry =
.decode_fh =
.encode_fs = */
};
};
#endif
/* EXPERIMENTAL */
fs/cifs/fcntl.c
View file @
fb8c4b14
...
...
@@ -66,7 +66,7 @@ static __u32 convert_to_cifs_notify_flags(unsigned long fcntl_notify_flags)
return
cifs_ntfy_flags
;
}
int
cifs_dir_notify
(
struct
file
*
file
,
unsigned
long
arg
)
int
cifs_dir_notify
(
struct
file
*
file
,
unsigned
long
arg
)
{
int
xid
;
int
rc
=
-
EINVAL
;
...
...
fs/cifs/file.c
View file @
fb8c4b14
...
...
@@ -3,7 +3,7 @@
*
* vfs operations that deal with files
*
* Copyright (C) International Business Machines Corp., 2002,200
3
* Copyright (C) International Business Machines Corp., 2002,200
7
* Author(s): Steve French (sfrench@us.ibm.com)
* Jeremy Allison (jra@samba.org)
*
...
...
@@ -57,7 +57,7 @@ static inline struct cifsFileInfo *cifs_init_private(
does not tell us which handle the write is for so there can
be a close (overlapping with write) of the filehandle that
cifs_writepages chose to use */
atomic_set
(
&
private_data
->
wrtPending
,
0
);
atomic_set
(
&
private_data
->
wrtPending
,
0
);
return
private_data
;
}
...
...
@@ -345,7 +345,7 @@ static int cifs_reopen_file(struct file *file, int can_flush)
struct
cifsTconInfo
*
pTcon
;
struct
cifsFileInfo
*
pCifsFile
;
struct
cifsInodeInfo
*
pCifsInode
;
struct
inode
*
inode
;
struct
inode
*
inode
;
char
*
full_path
=
NULL
;
int
desiredAccess
;
int
disposition
=
FILE_OPEN
;
...
...
@@ -372,7 +372,7 @@ static int cifs_reopen_file(struct file *file, int can_flush)
}
inode
=
file
->
f_path
.
dentry
->
d_inode
;
if
(
inode
==
NULL
)
{
if
(
inode
==
NULL
)
{
cERROR
(
1
,
(
"inode not valid"
));
dump_stack
();
rc
=
-
EBADF
;
...
...
@@ -396,7 +396,7 @@ reopen_error_exit:
}
cFYI
(
1
,
(
"inode = 0x%p file flags 0x%x for %s"
,
inode
,
file
->
f_flags
,
full_path
));
inode
,
file
->
f_flags
,
full_path
));
desiredAccess
=
cifs_convert_flags
(
file
->
f_flags
);
if
(
oplockEnabled
)
...
...
@@ -486,7 +486,7 @@ int cifs_close(struct inode *inode, struct file *file)
already closed */
if
(
pTcon
->
tidStatus
!=
CifsNeedReconnect
)
{
int
timeout
=
2
;
while
((
atomic_read
(
&
pSMBFile
->
wrtPending
)
!=
0
)
while
((
atomic_read
(
&
pSMBFile
->
wrtPending
)
!=
0
)
&&
(
timeout
<
1000
)
)
{
/* Give write a better chance to get to
server ahead of the close. We do not
...
...
@@ -496,12 +496,12 @@ int cifs_close(struct inode *inode, struct file *file)
but this should give enough time to
clear the socket */
#ifdef CONFIG_CIFS_DEBUG2
cFYI
(
1
,(
"close delay, write pending"
));
cFYI
(
1
,
(
"close delay, write pending"
));
#endif
/* DEBUG2 */
msleep
(
timeout
);
timeout
*=
4
;
}
if
(
atomic_read
(
&
pSMBFile
->
wrtPending
))
if
(
atomic_read
(
&
pSMBFile
->
wrtPending
))
cERROR
(
1
,(
"close with pending writes"
));
rc
=
CIFSSMBClose
(
xid
,
pTcon
,
pSMBFile
->
netfid
);
...
...
@@ -534,7 +534,7 @@ int cifs_close(struct inode *inode, struct file *file)
CIFS_I
(
inode
)
->
clientCanCacheRead
=
FALSE
;
CIFS_I
(
inode
)
->
clientCanCacheAll
=
FALSE
;
}
if
((
rc
==
0
)
&&
CIFS_I
(
inode
)
->
write_behind_rc
)
if
((
rc
==
0
)
&&
CIFS_I
(
inode
)
->
write_behind_rc
)
rc
=
CIFS_I
(
inode
)
->
write_behind_rc
;
FreeXid
(
xid
);
return
rc
;
...
...
@@ -554,7 +554,8 @@ int cifs_closedir(struct inode *inode, struct file *file)
if
(
pCFileStruct
)
{
struct
cifsTconInfo
*
pTcon
;
struct
cifs_sb_info
*
cifs_sb
=
CIFS_SB
(
file
->
f_path
.
dentry
->
d_sb
);
struct
cifs_sb_info
*
cifs_sb
=
CIFS_SB
(
file
->
f_path
.
dentry
->
d_sb
);
pTcon
=
cifs_sb
->
tcon
;
...
...
@@ -572,7 +573,7 @@ int cifs_closedir(struct inode *inode, struct file *file)
if
(
ptmp
)
{
cFYI
(
1
,
(
"closedir free smb buf in srch struct"
));
pCFileStruct
->
srch_inf
.
ntwrk_buf_start
=
NULL
;
if
(
pCFileStruct
->
srch_inf
.
smallBuf
)
if
(
pCFileStruct
->
srch_inf
.
smallBuf
)
cifs_small_buf_release
(
ptmp
);
else
cifs_buf_release
(
ptmp
);
...
...
@@ -594,7 +595,8 @@ int cifs_closedir(struct inode *inode, struct file *file)
static
int
store_file_lock
(
struct
cifsFileInfo
*
fid
,
__u64
len
,
__u64
offset
,
__u8
lockType
)
{
struct
cifsLockInfo
*
li
=
kmalloc
(
sizeof
(
struct
cifsLockInfo
),
GFP_KERNEL
);
struct
cifsLockInfo
*
li
=
kmalloc
(
sizeof
(
struct
cifsLockInfo
),
GFP_KERNEL
);
if
(
li
==
NULL
)
return
-
ENOMEM
;
li
->
offset
=
offset
;
...
...
@@ -683,9 +685,9 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
account for negative length which we can not accept over the
wire */
if
(
IS_GETLK
(
cmd
))
{
if
(
posix_locking
)
{
if
(
posix_locking
)
{
int
posix_lock_type
;
if
(
lockType
&
LOCKING_ANDX_SHARED_LOCK
)
if
(
lockType
&
LOCKING_ANDX_SHARED_LOCK
)
posix_lock_type
=
CIFS_RDLCK
;
else
posix_lock_type
=
CIFS_WRLCK
;
...
...
@@ -729,22 +731,24 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
if
(
posix_locking
)
{
int
posix_lock_type
;
if
(
lockType
&
LOCKING_ANDX_SHARED_LOCK
)
if
(
lockType
&
LOCKING_ANDX_SHARED_LOCK
)
posix_lock_type
=
CIFS_RDLCK
;
else
posix_lock_type
=
CIFS_WRLCK
;
if
(
numUnlock
==
1
)
if
(
numUnlock
==
1
)
posix_lock_type
=
CIFS_UNLCK
;
rc
=
CIFSSMBPosixLock
(
xid
,
pTcon
,
netfid
,
0
/* set */
,
length
,
pfLock
,
posix_lock_type
,
wait_flag
);
}
else
{
struct
cifsFileInfo
*
fid
=
(
struct
cifsFileInfo
*
)
file
->
private_data
;
struct
cifsFileInfo
*
fid
=
(
struct
cifsFileInfo
*
)
file
->
private_data
;
if
(
numLock
)
{
rc
=
CIFSSMBLock
(
xid
,
pTcon
,
netfid
,
length
,
pfLock
->
fl_start
,
rc
=
CIFSSMBLock
(
xid
,
pTcon
,
netfid
,
length
,
pfLock
->
fl_start
,
0
,
numLock
,
lockType
,
wait_flag
);
if
(
rc
==
0
)
{
...
...
@@ -763,7 +767,8 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
list_for_each_entry_safe
(
li
,
tmp
,
&
fid
->
llist
,
llist
)
{
if
(
pfLock
->
fl_start
<=
li
->
offset
&&
length
>=
li
->
length
)
{
stored_rc
=
CIFSSMBLock
(
xid
,
pTcon
,
netfid
,
stored_rc
=
CIFSSMBLock
(
xid
,
pTcon
,
netfid
,
li
->
length
,
li
->
offset
,
1
,
0
,
li
->
type
,
FALSE
);
if
(
stored_rc
)
...
...
@@ -898,7 +903,7 @@ static ssize_t cifs_write(struct file *file, const char *write_data,
pTcon
=
cifs_sb
->
tcon
;
cFYI
(
1
,(
"write %zd bytes to offset %lld of %s"
,
write_size
,
cFYI
(
1
,
(
"write %zd bytes to offset %lld of %s"
,
write_size
,
*
poffset
,
file
->
f_path
.
dentry
->
d_name
.
name
));
if
(
file
->
private_data
==
NULL
)
...
...
@@ -941,7 +946,7 @@ static ssize_t cifs_write(struct file *file, const char *write_data,
if
(
rc
!=
0
)
break
;
}
if
(
experimEnabled
||
(
pTcon
->
ses
->
server
&&
if
(
experimEnabled
||
(
pTcon
->
ses
->
server
&&
((
pTcon
->
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
==
0
)))
{
...
...
@@ -1009,8 +1014,8 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode)
the VFS or MM) should not happen but we had reports of on oops (due to
it being zero) during stress testcases so we need to check for it */
if
(
cifs_inode
==
NULL
)
{
cERROR
(
1
,(
"Null inode passed to cifs_writeable_file"
));
if
(
cifs_inode
==
NULL
)
{
cERROR
(
1
,
(
"Null inode passed to cifs_writeable_file"
));
dump_stack
();
return
NULL
;
}
...
...
@@ -1024,13 +1029,13 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode)
(
open_file
->
pfile
->
f_flags
&
O_WRONLY
)))
{
atomic_inc
(
&
open_file
->
wrtPending
);
read_unlock
(
&
GlobalSMBSeslock
);
if
((
open_file
->
invalidHandle
)
&&
if
((
open_file
->
invalidHandle
)
&&
(
!
open_file
->
closePend
)
/* BB fixme -since the second clause can not be true remove it BB */
)
{
rc
=
cifs_reopen_file
(
open_file
->
pfile
,
FALSE
);
/* if it fails, try another handle - might be */
/* dangerous to hold up writepages with retry */
if
(
rc
)
{
cFYI
(
1
,(
"failed on reopen file in wp"
));
if
(
rc
)
{
cFYI
(
1
,
(
"failed on reopen file in wp"
));
read_lock
(
&
GlobalSMBSeslock
);
/* can not use this handle, no write
pending on this one after all */
...
...
@@ -1117,7 +1122,7 @@ static int cifs_writepages(struct address_space *mapping,
pgoff_t
end
;
pgoff_t
index
;
int
range_whole
=
0
;
struct
kvec
*
iov
;
struct
kvec
*
iov
;
int
len
;
int
n_iov
=
0
;
pgoff_t
next
;
...
...
@@ -1139,14 +1144,14 @@ static int cifs_writepages(struct address_space *mapping,
if
(
cifs_sb
->
wsize
<
PAGE_CACHE_SIZE
)
return
generic_writepages
(
mapping
,
wbc
);
if
((
cifs_sb
->
tcon
->
ses
)
&&
(
cifs_sb
->
tcon
->
ses
->
server
))
if
(
cifs_sb
->
tcon
->
ses
->
server
->
secMode
&
if
((
cifs_sb
->
tcon
->
ses
)
&&
(
cifs_sb
->
tcon
->
ses
->
server
))
if
(
cifs_sb
->
tcon
->
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
if
(
!
experimEnabled
)
if
(
!
experimEnabled
)
return
generic_writepages
(
mapping
,
wbc
);
iov
=
kmalloc
(
32
*
sizeof
(
struct
kvec
),
GFP_KERNEL
);
if
(
iov
==
NULL
)
if
(
iov
==
NULL
)
return
generic_writepages
(
mapping
,
wbc
);
...
...
@@ -1296,7 +1301,7 @@ retry:
/* BB investigate retry logic on temporary
server crash cases and how recovery works
when page marked as error */
if
(
rc
)
if
(
rc
)
SetPageError
(
page
);
kunmap
(
page
);
unlock_page
(
page
);
...
...
@@ -1326,7 +1331,7 @@ retry:
return
rc
;
}
static
int
cifs_writepage
(
struct
page
*
page
,
struct
writeback_control
*
wbc
)
static
int
cifs_writepage
(
struct
page
*
page
,
struct
writeback_control
*
wbc
)
{
int
rc
=
-
EFAULT
;
int
xid
;
...
...
@@ -1456,7 +1461,7 @@ int cifs_fsync(struct file *file, struct dentry *dentry, int datasync)
*/
int
cifs_flush
(
struct
file
*
file
,
fl_owner_t
id
)
{
struct
inode
*
inode
=
file
->
f_path
.
dentry
->
d_inode
;
struct
inode
*
inode
=
file
->
f_path
.
dentry
->
d_inode
;
int
rc
=
0
;
/* Rather than do the steps manually:
...
...
@@ -1472,7 +1477,7 @@ int cifs_flush(struct file *file, fl_owner_t id)
if
(
!
rc
)
/* reset wb rc if we were able to write out dirty pages */
CIFS_I
(
inode
)
->
write_behind_rc
=
0
;
cFYI
(
1
,
(
"Flush inode %p file %p rc %d"
,
inode
,
file
,
rc
));
cFYI
(
1
,
(
"Flush inode %p file %p rc %d"
,
inode
,
file
,
rc
));
return
rc
;
}
...
...
@@ -1535,9 +1540,9 @@ ssize_t cifs_user_read(struct file *file, char __user *read_data,
rc
=
-
EFAULT
;
}
if
(
buf_type
==
CIFS_SMALL_BUFFER
)
if
(
buf_type
==
CIFS_SMALL_BUFFER
)
cifs_small_buf_release
(
smb_read_data
);
else
if
(
buf_type
==
CIFS_LARGE_BUFFER
)
else
if
(
buf_type
==
CIFS_LARGE_BUFFER
)
cifs_buf_release
(
smb_read_data
);
smb_read_data
=
NULL
;
}
...
...
@@ -1593,7 +1598,7 @@ static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size,
cifs_sb
->
rsize
);
/* For windows me and 9x we do not want to request more
than it negotiated since it will refuse the read then */
if
((
pTcon
->
ses
)
&&
if
((
pTcon
->
ses
)
&&
!
(
pTcon
->
ses
->
capabilities
&
CAP_LARGE_FILES
))
{
current_read_size
=
min_t
(
const
int
,
current_read_size
,
pTcon
->
ses
->
server
->
maxBuf
-
128
);
...
...
@@ -1669,7 +1674,7 @@ static void cifs_copy_cache_pages(struct address_space *mapping,
continue
;
}
target
=
kmap_atomic
(
page
,
KM_USER0
);
target
=
kmap_atomic
(
page
,
KM_USER0
);
if
(
PAGE_CACHE_SIZE
>
bytes_read
)
{
memcpy
(
target
,
data
,
bytes_read
);
...
...
@@ -1703,7 +1708,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
struct
cifs_sb_info
*
cifs_sb
;
struct
cifsTconInfo
*
pTcon
;
int
bytes_read
=
0
;
unsigned
int
read_size
,
i
;
unsigned
int
read_size
,
i
;
char
*
smb_read_data
=
NULL
;
struct
smb_com_read_rsp
*
pSMBr
;
struct
pagevec
lru_pvec
;
...
...
@@ -1721,7 +1726,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
pagevec_init
(
&
lru_pvec
,
0
);
#ifdef CONFIG_CIFS_DEBUG2
cFYI
(
1
,(
"rpages: num pages %d"
,
num_pages
));
cFYI
(
1
,
(
"rpages: num pages %d"
,
num_pages
));
#endif
for
(
i
=
0
;
i
<
num_pages
;
)
{
unsigned
contig_pages
;
...
...
@@ -1738,7 +1743,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
contig_pages
=
0
;
expected_index
=
list_entry
(
page_list
->
prev
,
struct
page
,
lru
)
->
index
;
list_for_each_entry_reverse
(
tmp_page
,
page_list
,
lru
)
{
list_for_each_entry_reverse
(
tmp_page
,
page_list
,
lru
)
{
if
(
tmp_page
->
index
==
expected_index
)
{
contig_pages
++
;
expected_index
++
;
...
...
@@ -1756,7 +1761,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
read_size
=
min_t
(
const
unsigned
int
,
read_size
,
cifs_sb
->
rsize
&
PAGE_CACHE_MASK
);
#ifdef CONFIG_CIFS_DEBUG2
cFYI
(
1
,(
"rpages: read size 0x%x contiguous pages %d"
,
cFYI
(
1
,
(
"rpages: read size 0x%x contiguous pages %d"
,
read_size
,
contig_pages
));
#endif
rc
=
-
EAGAIN
;
...
...
@@ -1774,11 +1779,11 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
&
bytes_read
,
&
smb_read_data
,
&
buf_type
);
/* BB more RC checks ? */
if
(
rc
==
-
EAGAIN
)
{
if
(
rc
==
-
EAGAIN
)
{
if
(
smb_read_data
)
{
if
(
buf_type
==
CIFS_SMALL_BUFFER
)
if
(
buf_type
==
CIFS_SMALL_BUFFER
)
cifs_small_buf_release
(
smb_read_data
);
else
if
(
buf_type
==
CIFS_LARGE_BUFFER
)
else
if
(
buf_type
==
CIFS_LARGE_BUFFER
)
cifs_buf_release
(
smb_read_data
);
smb_read_data
=
NULL
;
}
...
...
@@ -1816,9 +1821,9 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
break
;
}
if
(
smb_read_data
)
{
if
(
buf_type
==
CIFS_SMALL_BUFFER
)
if
(
buf_type
==
CIFS_SMALL_BUFFER
)
cifs_small_buf_release
(
smb_read_data
);
else
if
(
buf_type
==
CIFS_LARGE_BUFFER
)
else
if
(
buf_type
==
CIFS_LARGE_BUFFER
)
cifs_buf_release
(
smb_read_data
);
smb_read_data
=
NULL
;
}
...
...
@@ -1829,9 +1834,9 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
/* need to free smb_read_data buf before exit */
if
(
smb_read_data
)
{
if
(
buf_type
==
CIFS_SMALL_BUFFER
)
if
(
buf_type
==
CIFS_SMALL_BUFFER
)
cifs_small_buf_release
(
smb_read_data
);
else
if
(
buf_type
==
CIFS_LARGE_BUFFER
)
else
if
(
buf_type
==
CIFS_LARGE_BUFFER
)
cifs_buf_release
(
smb_read_data
);
smb_read_data
=
NULL
;
}
...
...
@@ -1855,7 +1860,7 @@ static int cifs_readpage_worker(struct file *file, struct page *page,
if
(
rc
<
0
)
goto
io_error
;
else
cFYI
(
1
,
(
"Bytes read %d"
,
rc
));
cFYI
(
1
,
(
"Bytes read %d"
,
rc
));
file
->
f_path
.
dentry
->
d_inode
->
i_atime
=
current_fs_time
(
file
->
f_path
.
dentry
->
d_inode
->
i_sb
);
...
...
@@ -1910,7 +1915,7 @@ int is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
if
(
cifsInode
)
open_file
=
find_writable_file
(
cifsInode
);
if
(
open_file
)
{
if
(
open_file
)
{
struct
cifs_sb_info
*
cifs_sb
;
/* there is not actually a write pending so let
...
...
@@ -1925,7 +1930,7 @@ int is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
return
1
;
}
if
(
i_size_read
(
&
cifsInode
->
vfs_inode
)
<
end_of_file
)
if
(
i_size_read
(
&
cifsInode
->
vfs_inode
)
<
end_of_file
)
return
1
;
return
0
;
...
...
@@ -1940,7 +1945,7 @@ static int cifs_prepare_write(struct file *file, struct page *page,
loff_t
i_size
;
loff_t
offset
;
cFYI
(
1
,
(
"prepare write for page %p from %d to %d"
,
page
,
from
,
to
));
cFYI
(
1
,
(
"prepare write for page %p from %d to %d"
,
page
,
from
,
to
));
if
(
PageUptodate
(
page
))
return
0
;
...
...
fs/cifs/inode.c
View file @
fb8c4b14
...
...
@@ -103,7 +103,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
cifsInfo
->
time
=
jiffies
;
cFYI
(
1
,
(
"New time %ld"
,
cifsInfo
->
time
));
/* this is ok to set on every inode revalidate */
atomic_set
(
&
cifsInfo
->
inUse
,
1
);
atomic_set
(
&
cifsInfo
->
inUse
,
1
);
inode
->
i_atime
=
cifs_NTtimeToUnix
(
le64_to_cpu
(
findData
.
LastAccessTime
));
...
...
@@ -137,7 +137,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
}
else
{
/* safest to call it a file if we do not know */
inode
->
i_mode
|=
S_IFREG
;
cFYI
(
1
,
(
"unknown type %d"
,
type
));
cFYI
(
1
,
(
"unknown type %d"
,
type
));
}
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_OVERR_UID
)
...
...
@@ -215,7 +215,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
return
rc
;
}
static
int
decode_sfu_inode
(
struct
inode
*
inode
,
__u64
size
,
static
int
decode_sfu_inode
(
struct
inode
*
inode
,
__u64
size
,
const
unsigned
char
*
path
,
struct
cifs_sb_info
*
cifs_sb
,
int
xid
)
{
...
...
@@ -225,7 +225,7 @@ static int decode_sfu_inode(struct inode * inode, __u64 size,
struct
cifsTconInfo
*
pTcon
=
cifs_sb
->
tcon
;
char
buf
[
24
];
unsigned
int
bytes_read
;
char
*
pbuf
;
char
*
pbuf
;
pbuf
=
buf
;
...
...
@@ -241,7 +241,7 @@ static int decode_sfu_inode(struct inode * inode, __u64 size,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
int
buf_type
=
CIFS_NO_BUFFER
;
/* Read header */
rc
=
CIFSSMBRead
(
xid
,
pTcon
,
...
...
@@ -250,7 +250,7 @@ static int decode_sfu_inode(struct inode * inode, __u64 size,
&
bytes_read
,
&
pbuf
,
&
buf_type
);
if
((
rc
==
0
)
&&
(
bytes_read
>=
8
))
{
if
(
memcmp
(
"IntxBLK"
,
pbuf
,
8
)
==
0
)
{
cFYI
(
1
,(
"Block device"
));
cFYI
(
1
,
(
"Block device"
));
inode
->
i_mode
|=
S_IFBLK
;
if
(
bytes_read
==
24
)
{
/* we have enough to decode dev num */
...
...
@@ -261,7 +261,7 @@ static int decode_sfu_inode(struct inode * inode, __u64 size,
inode
->
i_rdev
=
MKDEV
(
mjr
,
mnr
);
}
}
else
if
(
memcmp
(
"IntxCHR"
,
pbuf
,
8
)
==
0
)
{
cFYI
(
1
,(
"Char device"
));
cFYI
(
1
,
(
"Char device"
));
inode
->
i_mode
|=
S_IFCHR
;
if
(
bytes_read
==
24
)
{
/* we have enough to decode dev num */
...
...
@@ -272,7 +272,7 @@ static int decode_sfu_inode(struct inode * inode, __u64 size,
inode
->
i_rdev
=
MKDEV
(
mjr
,
mnr
);
}
}
else
if
(
memcmp
(
"IntxLNK"
,
pbuf
,
7
)
==
0
)
{
cFYI
(
1
,(
"Symlink"
));
cFYI
(
1
,
(
"Symlink"
));
inode
->
i_mode
|=
S_IFLNK
;
}
else
{
inode
->
i_mode
|=
S_IFREG
;
/* file? */
...
...
@@ -290,7 +290,7 @@ static int decode_sfu_inode(struct inode * inode, __u64 size,
#define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID)
/* SETFILEBITS valid bits */
static
int
get_sfu_uid_mode
(
struct
inode
*
inode
,
static
int
get_sfu_uid_mode
(
struct
inode
*
inode
,
const
unsigned
char
*
path
,
struct
cifs_sb_info
*
cifs_sb
,
int
xid
)
{
...
...
@@ -307,9 +307,9 @@ static int get_sfu_uid_mode(struct inode * inode,
else
if
(
rc
>
3
)
{
mode
=
le32_to_cpu
(
*
((
__le32
*
)
ea_value
));
inode
->
i_mode
&=
~
SFBITS_MASK
;
cFYI
(
1
,(
"special bits 0%o org mode 0%o"
,
mode
,
inode
->
i_mode
));
cFYI
(
1
,
(
"special bits 0%o org mode 0%o"
,
mode
,
inode
->
i_mode
));
inode
->
i_mode
=
(
mode
&
SFBITS_MASK
)
|
inode
->
i_mode
;
cFYI
(
1
,(
"special mode bits 0%o"
,
mode
));
cFYI
(
1
,
(
"special mode bits 0%o"
,
mode
));
return
0
;
}
else
{
return
0
;
...
...
@@ -334,11 +334,11 @@ int cifs_get_inode_info(struct inode **pinode,
int
adjustTZ
=
FALSE
;
pTcon
=
cifs_sb
->
tcon
;
cFYI
(
1
,(
"Getting info on %s"
,
search_path
));
cFYI
(
1
,
(
"Getting info on %s"
,
search_path
));
if
((
pfindData
==
NULL
)
&&
(
*
pinode
!=
NULL
))
{
if
(
CIFS_I
(
*
pinode
)
->
clientCanCacheRead
)
{
cFYI
(
1
,(
"No need to revalidate cached inode sizes"
));
cFYI
(
1
,
(
"No need to revalidate cached inode sizes"
));
return
rc
;
}
}
...
...
@@ -419,7 +419,7 @@ int cifs_get_inode_info(struct inode **pinode,
there Windows server or network appliances for which
IndexNumber field is not guaranteed unique? */
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_SERVER_INUM
){
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_SERVER_INUM
)
{
int
rc1
=
0
;
__u64
inode_num
;
...
...
@@ -429,7 +429,7 @@ int cifs_get_inode_info(struct inode **pinode,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
(
rc1
)
{
cFYI
(
1
,(
"GetSrvInodeNum rc %d"
,
rc1
));
cFYI
(
1
,
(
"GetSrvInodeNum rc %d"
,
rc1
));
/* BB EOPNOSUPP disable SERVER_INUM? */
}
else
/* do we need cast or hash to ino? */
(
*
pinode
)
->
i_ino
=
inode_num
;
...
...
@@ -471,7 +471,8 @@ int cifs_get_inode_info(struct inode **pinode,
/* new inode, can safely set these fields */
inode
->
i_mode
=
cifs_sb
->
mnt_file_mode
;
else
/* since we set the inode type below we need to mask off
to avoid strange results if type changes and both get orred in */
to avoid strange results if type changes and both
get orred in */
inode
->
i_mode
&=
~
S_IFMT
;
/* if (attr & ATTR_REPARSE) */
/* We no longer handle these as symlinks because we could not
...
...
@@ -494,9 +495,9 @@ int cifs_get_inode_info(struct inode **pinode,
le64_to_cpu
(
pfindData
->
EndOfFile
),
search_path
,
cifs_sb
,
xid
))
{
cFYI
(
1
,(
"Unrecognized sfu inode type"
));
cFYI
(
1
,
(
"Unrecognized sfu inode type"
));
}
cFYI
(
1
,
(
"sfu mode 0%o"
,
inode
->
i_mode
));
cFYI
(
1
,
(
"sfu mode 0%o"
,
inode
->
i_mode
));
}
else
{
inode
->
i_mode
|=
S_IFREG
;
/* treat the dos attribute of read-only as read-only
...
...
@@ -517,7 +518,7 @@ int cifs_get_inode_info(struct inode **pinode,
if
(
is_size_safe_to_change
(
cifsInfo
,
le64_to_cpu
(
pfindData
->
EndOfFile
)))
{
/* can not safely shrink the file size here if the
client is writing to it due to potential races */
i_size_write
(
inode
,
le64_to_cpu
(
pfindData
->
EndOfFile
));
i_size_write
(
inode
,
le64_to_cpu
(
pfindData
->
EndOfFile
));
/* 512 bytes (2**9) is the fake blocksize that must be
used for this calculation */
...
...
@@ -540,7 +541,7 @@ int cifs_get_inode_info(struct inode **pinode,
inode
->
i_gid
=
cifs_sb
->
mnt_gid
;
/* set so we do not keep refreshing these fields with
bad data after user has changed them in memory */
atomic_set
(
&
cifsInfo
->
inUse
,
1
);
atomic_set
(
&
cifsInfo
->
inUse
,
1
);
}
if
(
S_ISREG
(
inode
->
i_mode
))
{
...
...
@@ -587,9 +588,9 @@ void cifs_read_inode(struct inode *inode)
cifs_sb
=
CIFS_SB
(
inode
->
i_sb
);
xid
=
GetXid
();
if
(
cifs_sb
->
tcon
->
ses
->
capabilities
&
CAP_UNIX
)
cifs_get_inode_info_unix
(
&
inode
,
""
,
inode
->
i_sb
,
xid
);
cifs_get_inode_info_unix
(
&
inode
,
""
,
inode
->
i_sb
,
xid
);
else
cifs_get_inode_info
(
&
inode
,
""
,
NULL
,
inode
->
i_sb
,
xid
);
cifs_get_inode_info
(
&
inode
,
""
,
NULL
,
inode
->
i_sb
,
xid
);
/* can not call macro FreeXid here since in a void func */
_FreeXid
(
xid
);
}
...
...
@@ -640,7 +641,7 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
&
netfid
,
&
oplock
,
NULL
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
CIFSSMBRenameOpenFile
(
xid
,
pTcon
,
netfid
,
NULL
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
...
...
@@ -685,7 +686,7 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
rc
=
CIFSSMBSetFileTimes
(
xid
,
pTcon
,
pinfo_buf
,
netfid
);
...
...
@@ -694,7 +695,7 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
}
kfree
(
pinfo_buf
);
}
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
rc
=
CIFSSMBDelFile
(
xid
,
pTcon
,
full_path
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
...
...
@@ -714,7 +715,7 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry)
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
CIFSSMBRenameOpenFile
(
xid
,
pTcon
,
netfid
,
NULL
,
cifs_sb
->
local_nls
,
...
...
@@ -804,11 +805,11 @@ static void posix_fill_in_inode(struct inode *tmp_inode,
/* safest to just call it a file */
*
pobject_type
=
DT_REG
;
tmp_inode
->
i_mode
|=
S_IFREG
;
cFYI
(
1
,
(
"unknown inode type %d"
,
type
));
cFYI
(
1
,
(
"unknown inode type %d"
,
type
));
}
#ifdef CONFIG_CIFS_DEBUG2
cFYI
(
1
,(
"object type: %d"
,
type
));
cFYI
(
1
,
(
"object type: %d"
,
type
));
#endif
tmp_inode
->
i_uid
=
le64_to_cpu
(
pData
->
Uid
);
tmp_inode
->
i_gid
=
le64_to_cpu
(
pData
->
Gid
);
...
...
@@ -830,27 +831,28 @@ static void posix_fill_in_inode(struct inode *tmp_inode,
cFYI
(
1
,
(
"File inode"
));
tmp_inode
->
i_op
=
&
cifs_file_inode_ops
;
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_DIRECT_IO
)
{
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_BRL
)
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_DIRECT_IO
)
{
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_BRL
)
tmp_inode
->
i_fop
=
&
cifs_file_direct_nobrl_ops
;
else
tmp_inode
->
i_fop
=
&
cifs_file_direct_ops
;
}
else
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_BRL
)
}
else
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_BRL
)
tmp_inode
->
i_fop
=
&
cifs_file_nobrl_ops
;
else
tmp_inode
->
i_fop
=
&
cifs_file_ops
;
if
((
cifs_sb
->
tcon
)
&&
(
cifs_sb
->
tcon
->
ses
)
&&
if
((
cifs_sb
->
tcon
)
&&
(
cifs_sb
->
tcon
->
ses
)
&&
(
cifs_sb
->
tcon
->
ses
->
server
->
maxBuf
<
PAGE_CACHE_SIZE
+
MAX_CIFS_HDR_SIZE
))
tmp_inode
->
i_data
.
a_ops
=
&
cifs_addr_ops_smallbuf
;
else
tmp_inode
->
i_data
.
a_ops
=
&
cifs_addr_ops
;
if
(
isNewInode
)
return
;
/* No sense invalidating pages for new inode since we
have not started caching readahead file data yet */
if
(
isNewInode
)
return
;
/* No sense invalidating pages for new inode
since we we have not started caching
readahead file data yet */
if
(
timespec_equal
(
&
tmp_inode
->
i_mtime
,
&
local_mtime
)
&&
(
local_size
==
tmp_inode
->
i_size
))
{
...
...
@@ -897,13 +899,13 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
return
-
ENOMEM
;
}
if
((
pTcon
->
ses
->
capabilities
&
CAP_UNIX
)
&&
if
((
pTcon
->
ses
->
capabilities
&
CAP_UNIX
)
&&
(
CIFS_UNIX_POSIX_PATH_OPS_CAP
&
le64_to_cpu
(
pTcon
->
fsUnixInfo
.
Capability
)))
{
u32
oplock
=
0
;
FILE_UNIX_BASIC_INFO
*
pInfo
=
kzalloc
(
sizeof
(
FILE_UNIX_BASIC_INFO
),
GFP_KERNEL
);
if
(
pInfo
==
NULL
)
{
if
(
pInfo
==
NULL
)
{
rc
=
-
ENOMEM
;
goto
mkdir_out
;
}
...
...
@@ -920,7 +922,8 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
int
obj_type
;
if
(
pInfo
->
Type
==
-
1
)
/* no return info - go query */
goto
mkdir_get_info
;
/*BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if need to set uid/gid */
/*BB check (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID ) to see if need
to set uid/gid */
inc_nlink
(
inode
);
if
(
pTcon
->
nocase
)
direntry
->
d_op
=
&
cifs_ci_dentry_ops
;
...
...
@@ -937,7 +940,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
newinode
->
i_ino
=
(
unsigned
long
)
pInfo
->
UniqueId
;
}
/* note ino incremented to unique num in new_inode */
if
(
inode
->
i_sb
->
s_flags
&
MS_NOATIME
)
if
(
inode
->
i_sb
->
s_flags
&
MS_NOATIME
)
newinode
->
i_flags
|=
S_NOATIME
|
S_NOCMTIME
;
newinode
->
i_nlink
=
2
;
...
...
@@ -949,11 +952,11 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
posix_fill_in_inode
(
direntry
->
d_inode
,
pInfo
,
&
obj_type
,
1
/* NewInode */
);
#ifdef CONFIG_CIFS_DEBUG2
cFYI
(
1
,(
"instantiated dentry %p %s to inode %p"
,
cFYI
(
1
,
(
"instantiated dentry %p %s to inode %p"
,
direntry
,
direntry
->
d_name
.
name
,
newinode
));
if
(
newinode
->
i_nlink
!=
2
)
cFYI
(
1
,(
"unexpected number of links %d"
,
if
(
newinode
->
i_nlink
!=
2
)
cFYI
(
1
,
(
"unexpected number of links %d"
,
newinode
->
i_nlink
));
#endif
}
...
...
@@ -972,10 +975,10 @@ mkdir_get_info:
inc_nlink
(
inode
);
if
(
pTcon
->
ses
->
capabilities
&
CAP_UNIX
)
rc
=
cifs_get_inode_info_unix
(
&
newinode
,
full_path
,
inode
->
i_sb
,
xid
);
inode
->
i_sb
,
xid
);
else
rc
=
cifs_get_inode_info
(
&
newinode
,
full_path
,
NULL
,
inode
->
i_sb
,
xid
);
inode
->
i_sb
,
xid
);
if
(
pTcon
->
nocase
)
direntry
->
d_op
=
&
cifs_ci_dentry_ops
;
...
...
@@ -1009,10 +1012,10 @@ mkdir_get_info:
/* BB to be implemented via Windows secrty descriptors
eg CIFSSMBWinSetPerms(xid, pTcon, full_path, mode,
-1, -1, local_nls); */
if
(
direntry
->
d_inode
)
{
if
(
direntry
->
d_inode
)
{
direntry
->
d_inode
->
i_mode
=
mode
;
direntry
->
d_inode
->
i_mode
|=
S_IFDIR
;
if
(
cifs_sb
->
mnt_cifs_flags
&
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_SET_UID
)
{
direntry
->
d_inode
->
i_uid
=
current
->
fsuid
;
...
...
@@ -1056,7 +1059,7 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
if
(
!
rc
)
{
drop_nlink
(
inode
);
spin_lock
(
&
direntry
->
d_inode
->
i_lock
);
i_size_write
(
direntry
->
d_inode
,
0
);
i_size_write
(
direntry
->
d_inode
,
0
);
clear_nlink
(
direntry
->
d_inode
);
spin_unlock
(
&
direntry
->
d_inode
->
i_lock
);
}
...
...
@@ -1174,7 +1177,7 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry,
cifs_sb_source
->
local_nls
,
cifs_sb_source
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
rc
=
CIFSSMBRenameOpenFile
(
xid
,
pTcon
,
netfid
,
toName
,
cifs_sb_source
->
local_nls
,
cifs_sb_source
->
mnt_cifs_flags
&
...
...
@@ -1249,7 +1252,7 @@ int cifs_revalidate(struct dentry *direntry)
if
(
cifs_sb
->
tcon
->
ses
->
capabilities
&
CAP_UNIX
)
{
rc
=
cifs_get_inode_info_unix
(
&
direntry
->
d_inode
,
full_path
,
direntry
->
d_sb
,
xid
);
direntry
->
d_sb
,
xid
);
if
(
rc
)
{
cFYI
(
1
,
(
"error on getting revalidate info %d"
,
rc
));
/* if (rc != -ENOENT)
...
...
@@ -1258,7 +1261,7 @@ int cifs_revalidate(struct dentry *direntry)
}
}
else
{
rc
=
cifs_get_inode_info
(
&
direntry
->
d_inode
,
full_path
,
NULL
,
direntry
->
d_sb
,
xid
);
direntry
->
d_sb
,
xid
);
if
(
rc
)
{
cFYI
(
1
,
(
"error on getting revalidate info %d"
,
rc
));
/* if (rc != -ENOENT)
...
...
@@ -1271,7 +1274,7 @@ int cifs_revalidate(struct dentry *direntry)
/* if not oplocked, we invalidate inode pages if mtime or file size
had changed on server */
if
(
timespec_equal
(
&
local_mtime
,
&
direntry
->
d_inode
->
i_mtime
)
&&
if
(
timespec_equal
(
&
local_mtime
,
&
direntry
->
d_inode
->
i_mtime
)
&&
(
local_size
==
direntry
->
d_inode
->
i_size
))
{
cFYI
(
1
,
(
"cifs_revalidate - inode unchanged"
));
}
else
{
...
...
@@ -1298,7 +1301,7 @@ int cifs_revalidate(struct dentry *direntry)
if
(
invalidate_inode
)
{
/* shrink_dcache not necessary now that cifs dentry ops
are exported for negative dentries */
/* if
(S_ISDIR(direntry->d_inode->i_mode))
/* if
(S_ISDIR(direntry->d_inode->i_mode))
shrink_dcache_parent(direntry); */
if
(
S_ISREG
(
direntry
->
d_inode
->
i_mode
))
{
if
(
direntry
->
d_inode
->
i_mapping
)
...
...
@@ -1351,7 +1354,7 @@ static int cifs_truncate_page(struct address_space *mapping, loff_t from)
return
rc
;
}
static
int
cifs_vmtruncate
(
struct
inode
*
inode
,
loff_t
offset
)
static
int
cifs_vmtruncate
(
struct
inode
*
inode
,
loff_t
offset
)
{
struct
address_space
*
mapping
=
inode
->
i_mapping
;
unsigned
long
limit
;
...
...
@@ -1424,7 +1427,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
if
((
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_PERM
)
==
0
)
{
/* check if we have permission to change attrs */
rc
=
inode_change_ok
(
direntry
->
d_inode
,
attrs
);
if
(
rc
<
0
)
{
if
(
rc
<
0
)
{
FreeXid
(
xid
);
return
rc
;
}
else
...
...
@@ -1459,14 +1462,14 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
rc
=
CIFSSMBSetFileSize
(
xid
,
pTcon
,
attrs
->
ia_size
,
nfid
,
npid
,
FALSE
);
atomic_dec
(
&
open_file
->
wrtPending
);
cFYI
(
1
,(
"SetFSize for attrs rc = %d"
,
rc
));
if
((
rc
==
-
EINVAL
)
||
(
rc
==
-
EOPNOTSUPP
))
{
cFYI
(
1
,
(
"SetFSize for attrs rc = %d"
,
rc
));
if
((
rc
==
-
EINVAL
)
||
(
rc
==
-
EOPNOTSUPP
))
{
int
bytes_written
;
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
nfid
,
0
,
attrs
->
ia_size
,
&
bytes_written
,
NULL
,
NULL
,
1
/* 45 seconds */
);
cFYI
(
1
,(
"Wrt seteof rc %d"
,
rc
));
cFYI
(
1
,
(
"Wrt seteof rc %d"
,
rc
));
}
}
else
rc
=
-
EINVAL
;
...
...
@@ -1482,7 +1485,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
cFYI
(
1
,
(
"SetEOF by path (setattrs) rc = %d"
,
rc
));
if
((
rc
==
-
EINVAL
)
||
(
rc
==
-
EOPNOTSUPP
))
{
if
((
rc
==
-
EINVAL
)
||
(
rc
==
-
EOPNOTSUPP
))
{
__u16
netfid
;
int
oplock
=
FALSE
;
...
...
@@ -1493,14 +1496,14 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
NULL
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
int
bytes_written
;
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
netfid
,
0
,
attrs
->
ia_size
,
&
bytes_written
,
NULL
,
NULL
,
1
/* 45 sec */
);
cFYI
(
1
,
(
"wrt seteof rc %d"
,
rc
));
cFYI
(
1
,
(
"wrt seteof rc %d"
,
rc
));
CIFSSMBClose
(
xid
,
pTcon
,
netfid
);
}
...
...
@@ -1559,7 +1562,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
time_buf
.
Attributes
=
cpu_to_le32
(
cifsInode
->
cifsAttrs
&
(
~
ATTR_READONLY
));
/* Windows ignores set to zero */
if
(
time_buf
.
Attributes
==
0
)
if
(
time_buf
.
Attributes
==
0
)
time_buf
.
Attributes
|=
cpu_to_le32
(
ATTR_NORMAL
);
}
/* BB to be implemented -
...
...
@@ -1624,7 +1627,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
NULL
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
rc
=
CIFSSMBSetFileTimes
(
xid
,
pTcon
,
&
time_buf
,
netfid
);
CIFSSMBClose
(
xid
,
pTcon
,
netfid
);
...
...
@@ -1642,7 +1645,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
and this check ensures that we are not being called from
sys_utimes in which case we ought to fail the call back to
the user when the server rejects the call */
if
((
rc
)
&&
(
attrs
->
ia_valid
&
if
((
rc
)
&&
(
attrs
->
ia_valid
&
(
ATTR_MODE
|
ATTR_GID
|
ATTR_UID
|
ATTR_SIZE
)))
rc
=
0
;
}
...
...
fs/cifs/ioctl.c
View file @
fb8c4b14
...
...
@@ -3,7 +3,7 @@
*
* vfs operations that deal with io control
*
* Copyright (C) International Business Machines Corp., 2005
* Copyright (C) International Business Machines Corp., 2005
,2007
* Author(s): Steve French (sfrench@us.ibm.com)
*
* This library is free software; you can redistribute it and/or modify
...
...
@@ -30,7 +30,7 @@
#define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2)
int
cifs_ioctl
(
struct
inode
*
inode
,
struct
file
*
filep
,
int
cifs_ioctl
(
struct
inode
*
inode
,
struct
file
*
filep
,
unsigned
int
command
,
unsigned
long
arg
)
{
int
rc
=
-
ENOTTY
;
/* strange error - but the precedent */
...
...
fs/cifs/link.c
View file @
fb8c4b14
...
...
@@ -50,7 +50,7 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode,
fromName
=
build_path_from_dentry
(
old_file
);
toName
=
build_path_from_dentry
(
direntry
);
if
((
fromName
==
NULL
)
||
(
toName
==
NULL
))
{
if
((
fromName
==
NULL
)
||
(
toName
==
NULL
))
{
rc
=
-
ENOMEM
;
goto
cifs_hl_exit
;
}
...
...
@@ -65,7 +65,7 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode,
cifs_sb_target
->
local_nls
,
cifs_sb_target
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
((
rc
==
-
EIO
)
||
(
rc
==
-
EINVAL
))
if
((
rc
==
-
EIO
)
||
(
rc
==
-
EINVAL
))
rc
=
-
EOPNOTSUPP
;
}
...
...
@@ -73,9 +73,9 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode,
/* if source file is cached (oplocked) revalidate will not go to server
until the file is closed or oplock broken so update nlinks locally */
if
(
old_file
->
d_inode
)
{
if
(
old_file
->
d_inode
)
{
cifsInode
=
CIFS_I
(
old_file
->
d_inode
);
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
old_file
->
d_inode
->
i_nlink
++
;
/* BB should we make this contingent on superblock flag NOATIME? */
/* old_file->d_inode->i_ctime = CURRENT_TIME;*/
...
...
@@ -109,7 +109,7 @@ cifs_follow_link(struct dentry *direntry, struct nameidata *nd)
int
rc
=
-
EACCES
;
int
xid
;
char
*
full_path
=
NULL
;
char
*
target_path
=
ERR_PTR
(
-
ENOMEM
);
char
*
target_path
=
ERR_PTR
(
-
ENOMEM
);
struct
cifs_sb_info
*
cifs_sb
;
struct
cifsTconInfo
*
pTcon
;
...
...
@@ -129,7 +129,8 @@ cifs_follow_link(struct dentry *direntry, struct nameidata *nd)
goto
out
;
}
/* BB add read reparse point symlink code and Unix extensions symlink code here BB */
/* BB add read reparse point symlink code and Unix extensions
symlink code here BB */
if
(
pTcon
->
ses
->
capabilities
&
CAP_UNIX
)
rc
=
CIFSSMBUnixQuerySymLink
(
xid
,
pTcon
,
full_path
,
target_path
,
...
...
@@ -176,7 +177,7 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname)
full_path
=
build_path_from_dentry
(
direntry
);
if
(
full_path
==
NULL
)
{
if
(
full_path
==
NULL
)
{
FreeXid
(
xid
);
return
-
ENOMEM
;
}
...
...
@@ -189,15 +190,16 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname)
rc
=
CIFSUnixCreateSymLink
(
xid
,
pTcon
,
full_path
,
symname
,
cifs_sb
->
local_nls
);
/* else
rc = CIFSCreateReparseSymLink(xid, pTcon, fromName, toName,cifs_sb_target->local_nls); */
rc = CIFSCreateReparseSymLink(xid, pTcon, fromName, toName,
cifs_sb_target->local_nls); */
if
(
rc
==
0
)
{
if
(
pTcon
->
ses
->
capabilities
&
CAP_UNIX
)
rc
=
cifs_get_inode_info_unix
(
&
newinode
,
full_path
,
inode
->
i_sb
,
xid
);
inode
->
i_sb
,
xid
);
else
rc
=
cifs_get_inode_info
(
&
newinode
,
full_path
,
NULL
,
inode
->
i_sb
,
xid
);
inode
->
i_sb
,
xid
);
if
(
rc
!=
0
)
{
cFYI
(
1
,
(
"Create symlink ok, getinodeinfo fail rc = %d"
,
...
...
@@ -227,8 +229,8 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
struct
cifsTconInfo
*
pTcon
;
char
*
full_path
=
NULL
;
char
*
tmp_path
=
NULL
;
char
*
tmpbuffer
;
unsigned
char
*
referrals
=
NULL
;
char
*
tmpbuffer
;
unsigned
char
*
referrals
=
NULL
;
int
num_referrals
=
0
;
int
len
;
__u16
fid
;
...
...
@@ -243,7 +245,7 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
full_path
=
build_path_from_dentry
(
direntry
);
/* mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);*/
if
(
full_path
==
NULL
)
{
if
(
full_path
==
NULL
)
{
FreeXid
(
xid
);
return
-
ENOMEM
;
}
...
...
@@ -251,70 +253,77 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
cFYI
(
1
,
(
"Full path: %s inode = 0x%p pBuffer = 0x%p buflen = %d"
,
full_path
,
inode
,
pBuffer
,
buflen
));
if
(
buflen
>
PATH_MAX
)
if
(
buflen
>
PATH_MAX
)
len
=
PATH_MAX
;
else
len
=
buflen
;
tmpbuffer
=
kmalloc
(
len
,
GFP_KERNEL
);
if
(
tmpbuffer
==
NULL
)
{
tmpbuffer
=
kmalloc
(
len
,
GFP_KERNEL
);
if
(
tmpbuffer
==
NULL
)
{
kfree
(
full_path
);
FreeXid
(
xid
);
return
-
ENOMEM
;
}
/* BB add read reparse point symlink code and Unix extensions symlink code here BB */
/* BB add read reparse point symlink code and
Unix extensions symlink code here BB */
if
(
cifs_sb
->
tcon
->
ses
->
capabilities
&
CAP_UNIX
)
rc
=
CIFSSMBUnixQuerySymLink
(
xid
,
pTcon
,
full_path
,
tmpbuffer
,
len
-
1
,
cifs_sb
->
local_nls
);
else
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_UNX_EMUL
)
{
cERROR
(
1
,(
"SFU style symlinks not implemented yet"
));
cERROR
(
1
,
(
"SFU style symlinks not implemented yet"
));
/* add open and read as in fs/cifs/inode.c */
}
else
{
rc
=
CIFSSMBOpen
(
xid
,
pTcon
,
full_path
,
FILE_OPEN
,
GENERIC_READ
,
OPEN_REPARSE_POINT
,
&
fid
,
&
oplock
,
NULL
,
OPEN_REPARSE_POINT
,
&
fid
,
&
oplock
,
NULL
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
(
!
rc
)
{
if
(
!
rc
)
{
rc
=
CIFSSMBQueryReparseLinkInfo
(
xid
,
pTcon
,
full_path
,
tmpbuffer
,
len
-
1
,
fid
,
cifs_sb
->
local_nls
);
if
(
CIFSSMBClose
(
xid
,
pTcon
,
fid
))
{
if
(
CIFSSMBClose
(
xid
,
pTcon
,
fid
))
{
cFYI
(
1
,(
"Error closing junction point (open for ioctl)"
));
}
if
(
rc
==
-
EIO
)
{
if
(
rc
==
-
EIO
)
{
/* Query if DFS Junction */
tmp_path
=
kmalloc
(
MAX_TREE_SIZE
+
MAX_PATHCONF
+
1
,
GFP_KERNEL
);
if
(
tmp_path
)
{
strncpy
(
tmp_path
,
pTcon
->
treeName
,
MAX_TREE_SIZE
);
strncat
(
tmp_path
,
full_path
,
MAX_PATHCONF
);
rc
=
get_dfs_path
(
xid
,
pTcon
->
ses
,
tmp_path
,
strncpy
(
tmp_path
,
pTcon
->
treeName
,
MAX_TREE_SIZE
);
strncat
(
tmp_path
,
full_path
,
MAX_PATHCONF
);
rc
=
get_dfs_path
(
xid
,
pTcon
->
ses
,
tmp_path
,
cifs_sb
->
local_nls
,
&
num_referrals
,
&
referrals
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
cFYI
(
1
,(
"Get DFS for %s rc = %d "
,
tmp_path
,
rc
));
if
((
num_referrals
==
0
)
&&
(
rc
==
0
))
cFYI
(
1
,
(
"Get DFS for %s rc = %d "
,
tmp_path
,
rc
));
if
((
num_referrals
==
0
)
&&
(
rc
==
0
))
rc
=
-
EACCES
;
else
{
cFYI
(
1
,(
"num referral: %d"
,
num_referrals
));
if
(
referrals
)
{
cFYI
(
1
,(
"referral string: %s"
,
referrals
));
cFYI
(
1
,
(
"num referral: %d"
,
num_referrals
));
if
(
referrals
)
{
cFYI
(
1
,(
"referral string: %s"
,
referrals
));
strncpy
(
tmpbuffer
,
referrals
,
len
-
1
);
}
}
kfree
(
referrals
);
kfree
(
tmp_path
);
}
/* BB add code like else decode referrals then memcpy to
tmpbuffer and free referrals string array BB */
/* BB add code like else decode referrals
then memcpy to tmpbuffer and free referrals
string array BB */
}
}
}
...
...
fs/cifs/md4.c
View file @
fb8c4b14
...
...
@@ -170,7 +170,7 @@ mdfour(unsigned char *out, unsigned char *in, int n)
while
(
n
>
64
)
{
copy64
(
M
,
in
);
mdfour64
(
M
,
&
A
,
&
B
,
&
C
,
&
D
);
mdfour64
(
M
,
&
A
,
&
B
,
&
C
,
&
D
);
in
+=
64
;
n
-=
64
;
}
...
...
fs/cifs/md5.c
View file @
fb8c4b14
fs/cifs/misc.c
View file @
fb8c4b14
...
...
@@ -32,7 +32,7 @@
extern
mempool_t
*
cifs_sm_req_poolp
;
extern
mempool_t
*
cifs_req_poolp
;
extern
struct
task_struct
*
oplockThread
;
extern
struct
task_struct
*
oplockThread
;
/* The xid serves as a useful identifier for each incoming vfs request,
in a similar way to the mid which is useful to track each sent smb,
...
...
@@ -50,7 +50,7 @@ _GetXid(void)
if
(
GlobalTotalActiveXid
>
GlobalMaxActiveXid
)
GlobalMaxActiveXid
=
GlobalTotalActiveXid
;
/* keep high water mark for number of simultaneous vfs ops in our filesystem */
if
(
GlobalTotalActiveXid
>
65000
)
cFYI
(
1
,(
"warning: more than 65000 requests active"
));
cFYI
(
1
,
(
"warning: more than 65000 requests active"
));
xid
=
GlobalCurrentXid
++
;
spin_unlock
(
&
GlobalMid_Lock
);
return
xid
;
...
...
@@ -172,7 +172,7 @@ cifs_buf_release(void *buf_to_free)
/* cFYI(1, ("Null buffer passed to cifs_buf_release"));*/
return
;
}
mempool_free
(
buf_to_free
,
cifs_req_poolp
);
mempool_free
(
buf_to_free
,
cifs_req_poolp
);
atomic_dec
(
&
bufAllocCount
);
return
;
...
...
@@ -209,7 +209,7 @@ cifs_small_buf_release(void *buf_to_free)
cFYI
(
1
,
(
"Null buffer passed to cifs_small_buf_release"
));
return
;
}
mempool_free
(
buf_to_free
,
cifs_sm_req_poolp
);
mempool_free
(
buf_to_free
,
cifs_sm_req_poolp
);
atomic_dec
(
&
smBufAllocCount
);
return
;
...
...
@@ -255,7 +255,7 @@ __u16 GetNextMid(struct TCP_Server_Info *server)
takes longer than the 64 thousand requests before it
(and it would also have to have been a request that
did not time out) */
while
(
server
->
CurrentMid
!=
last_mid
)
{
while
(
server
->
CurrentMid
!=
last_mid
)
{
struct
list_head
*
tmp
;
struct
mid_q_entry
*
mid_entry
;
...
...
@@ -290,11 +290,11 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ ,
const
struct
cifsTconInfo
*
treeCon
,
int
word_count
/* length of fixed section (word count) in two byte units */
)
{
struct
list_head
*
temp_item
;
struct
cifsSesInfo
*
ses
;
struct
list_head
*
temp_item
;
struct
cifsSesInfo
*
ses
;
char
*
temp
=
(
char
*
)
buffer
;
memset
(
temp
,
0
,
256
);
/* bigger than MAX_CIFS_HDR_SIZE */
memset
(
temp
,
0
,
256
);
/* bigger than MAX_CIFS_HDR_SIZE */
buffer
->
smb_buf_length
=
(
2
*
word_count
)
+
sizeof
(
struct
smb_hdr
)
-
...
...
@@ -357,12 +357,12 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ ,
ses
=
list_entry
(
temp_item
,
struct
cifsSesInfo
,
cifsSessionList
);
if
(
ses
->
linux_uid
==
current
->
fsuid
)
{
if
(
ses
->
server
==
treeCon
->
ses
->
server
)
{
cFYI
(
1
,
(
"found matching uid substitute right smb_uid"
));
cFYI
(
1
,
(
"found matching uid substitute right smb_uid"
));
buffer
->
Uid
=
ses
->
Suid
;
break
;
}
else
{
/* BB eventually call cifs_setup_session here */
cFYI
(
1
,
(
"local UID found but smb sess with this server does not exist"
));
cFYI
(
1
,
(
"local UID found but no smb sess with this server exists"
));
}
}
}
...
...
@@ -399,7 +399,7 @@ checkSMBhdr(struct smb_hdr *smb, __u16 mid)
if
(
smb
->
Command
==
SMB_COM_LOCKING_ANDX
)
return
0
;
else
cERROR
(
1
,
(
"R
cvd Request not response"
));
cERROR
(
1
,
(
"R
eceived Request not response"
));
}
}
else
{
/* bad signature or mid */
if
(
*
(
__le32
*
)
smb
->
Protocol
!=
cpu_to_le32
(
0x424d53ff
))
...
...
@@ -428,7 +428,7 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length)
return
0
;
}
else
if
((
length
==
sizeof
(
struct
smb_hdr
)
+
1
)
&&
(
smb
->
WordCount
==
0
))
{
char
*
tmp
=
(
char
*
)
smb
;
char
*
tmp
=
(
char
*
)
smb
;
/* Need to work around a bug in two servers here */
/* First, check if the part of bcc they sent was zero */
if
(
tmp
[
sizeof
(
struct
smb_hdr
)]
==
0
)
{
...
...
@@ -442,7 +442,7 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length)
tmp
[
sizeof
(
struct
smb_hdr
)
+
1
]
=
0
;
return
0
;
}
cERROR
(
1
,(
"rcvd invalid byte count (bcc)"
));
cERROR
(
1
,
(
"rcvd invalid byte count (bcc)"
));
}
else
{
cERROR
(
1
,
(
"Length less than smb header size"
));
}
...
...
@@ -496,32 +496,33 @@ checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length)
int
is_valid_oplock_break
(
struct
smb_hdr
*
buf
,
struct
TCP_Server_Info
*
srv
)
{
struct
smb_com_lock_req
*
pSMB
=
(
struct
smb_com_lock_req
*
)
buf
;
struct
smb_com_lock_req
*
pSMB
=
(
struct
smb_com_lock_req
*
)
buf
;
struct
list_head
*
tmp
;
struct
list_head
*
tmp1
;
struct
cifsTconInfo
*
tcon
;
struct
cifsFileInfo
*
netfile
;
cFYI
(
1
,(
"Checking for oplock break or dnotify response"
));
cFYI
(
1
,
(
"Checking for oplock break or dnotify response"
));
if
((
pSMB
->
hdr
.
Command
==
SMB_COM_NT_TRANSACT
)
&&
(
pSMB
->
hdr
.
Flags
&
SMBFLG_RESPONSE
))
{
struct
smb_com_transaction_change_notify_rsp
*
pSMBr
=
struct
smb_com_transaction_change_notify_rsp
*
pSMBr
=
(
struct
smb_com_transaction_change_notify_rsp
*
)
buf
;
struct
file_notify_information
*
pnotify
;
struct
file_notify_information
*
pnotify
;
__u32
data_offset
=
0
;
if
(
pSMBr
->
ByteCount
>
sizeof
(
struct
file_notify_information
))
{
data_offset
=
le32_to_cpu
(
pSMBr
->
DataOffset
);
pnotify
=
(
struct
file_notify_information
*
)
((
char
*
)
&
pSMBr
->
hdr
.
Protocol
+
data_offset
);
cFYI
(
1
,(
"dnotify on %s Action: 0x%x"
,
pnotify
->
FileName
,
cFYI
(
1
,(
"dnotify on %s Action: 0x%x"
,
pnotify
->
FileName
,
pnotify
->
Action
));
/* BB removeme BB */
/* cifs_dump_mem("Rcvd notify Data: ",buf,
sizeof(struct smb_hdr)+60); */
return
TRUE
;
}
if
(
pSMBr
->
hdr
.
Status
.
CifsError
)
{
cFYI
(
1
,(
"notify err 0x%d"
,
pSMBr
->
hdr
.
Status
.
CifsError
));
cFYI
(
1
,
(
"notify err 0x%d"
,
pSMBr
->
hdr
.
Status
.
CifsError
));
return
TRUE
;
}
return
FALSE
;
...
...
@@ -535,7 +536,7 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
large dirty files cached on the client */
if
((
NT_STATUS_INVALID_HANDLE
)
==
le32_to_cpu
(
pSMB
->
hdr
.
Status
.
CifsError
))
{
cFYI
(
1
,(
"invalid handle on oplock break"
));
cFYI
(
1
,
(
"invalid handle on oplock break"
));
return
TRUE
;
}
else
if
(
ERRbadfid
==
le16_to_cpu
(
pSMB
->
hdr
.
Status
.
DosError
.
Error
))
{
...
...
@@ -547,7 +548,8 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
if
(
pSMB
->
hdr
.
WordCount
!=
8
)
return
FALSE
;
cFYI
(
1
,(
" oplock type 0x%d level 0x%d"
,
pSMB
->
LockType
,
pSMB
->
OplockLevel
));
cFYI
(
1
,
(
"oplock type 0x%d level 0x%d"
,
pSMB
->
LockType
,
pSMB
->
OplockLevel
));
if
(
!
(
pSMB
->
LockType
&
LOCKING_ANDX_OPLOCK_RELEASE
))
return
FALSE
;
...
...
@@ -557,8 +559,8 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
tcon
=
list_entry
(
tmp
,
struct
cifsTconInfo
,
cifsConnectionList
);
if
((
tcon
->
tid
==
buf
->
Tid
)
&&
(
srv
==
tcon
->
ses
->
server
))
{
cifs_stats_inc
(
&
tcon
->
num_oplock_brks
);
list_for_each
(
tmp1
,
&
tcon
->
openFileList
)
{
netfile
=
list_entry
(
tmp1
,
struct
cifsFileInfo
,
list_for_each
(
tmp1
,
&
tcon
->
openFileList
)
{
netfile
=
list_entry
(
tmp1
,
struct
cifsFileInfo
,
tlist
);
if
(
pSMB
->
Fid
==
netfile
->
netfid
)
{
struct
cifsInodeInfo
*
pCifsInode
;
...
...
@@ -581,12 +583,12 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
}
}
read_unlock
(
&
GlobalSMBSeslock
);
cFYI
(
1
,(
"No matching file for oplock break"
));
cFYI
(
1
,
(
"No matching file for oplock break"
));
return
TRUE
;
}
}
read_unlock
(
&
GlobalSMBSeslock
);
cFYI
(
1
,(
"Can not process oplock break for non-existent connection"
));
cFYI
(
1
,
(
"Can not process oplock break for non-existent connection"
));
return
TRUE
;
}
...
...
@@ -643,13 +645,13 @@ dump_smb(struct smb_hdr *smb_buf, int smb_buf_length)
only legal in POSIX-like OS (if they are present in the string). Path
names are little endian 16 bit Unicode on the wire */
int
cifs_convertUCSpath
(
char
*
target
,
const
__le16
*
source
,
int
maxlen
,
const
struct
nls_table
*
cp
)
cifs_convertUCSpath
(
char
*
target
,
const
__le16
*
source
,
int
maxlen
,
const
struct
nls_table
*
cp
)
{
int
i
,
j
,
len
;
int
i
,
j
,
len
;
__u16
src_char
;
for
(
i
=
0
,
j
=
0
;
i
<
maxlen
;
i
++
)
{
for
(
i
=
0
,
j
=
0
;
i
<
maxlen
;
i
++
)
{
src_char
=
le16_to_cpu
(
source
[
i
]);
switch
(
src_char
)
{
case
0
:
...
...
@@ -703,10 +705,10 @@ cUCS_out:
only legal in POSIX-like OS (if they are present in the string). Path
names are little endian 16 bit Unicode on the wire */
int
cifsConvertToUCS
(
__le16
*
target
,
const
char
*
source
,
int
maxlen
,
const
struct
nls_table
*
cp
,
int
mapChars
)
cifsConvertToUCS
(
__le16
*
target
,
const
char
*
source
,
int
maxlen
,
const
struct
nls_table
*
cp
,
int
mapChars
)
{
int
i
,
j
,
charlen
;
int
i
,
j
,
charlen
;
int
len_remaining
=
maxlen
;
char
src_char
;
__u16
temp
;
...
...
@@ -714,7 +716,7 @@ cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
if
(
!
mapChars
)
return
cifs_strtoUCS
(
target
,
source
,
PATH_MAX
,
cp
);
for
(
i
=
0
,
j
=
0
;
i
<
maxlen
;
j
++
)
{
for
(
i
=
0
,
j
=
0
;
i
<
maxlen
;
j
++
)
{
src_char
=
source
[
i
];
switch
(
src_char
)
{
case
0
:
...
...
@@ -758,7 +760,7 @@ cifsConvertToUCS(__le16 * target, const char *source, int maxlen,
/* character may take more than one byte in the
the source string, but will take exactly two
bytes in the target string */
i
+=
charlen
;
i
+=
charlen
;
continue
;
}
i
++
;
/* move to next char in source string */
...
...
fs/cifs/netmisc.c
View file @
fb8c4b14
...
...
@@ -145,7 +145,7 @@ cifs_inet_pton(int address_family, char *cp, void *dst)
ret
=
in6_pton
(
cp
,
-
1
/* len */
,
dst
,
'\\'
,
NULL
);
}
#ifdef CONFIG_CIFS_DEBUG2
cFYI
(
1
,(
"address conversion returned %d for %s"
,
ret
,
cp
));
cFYI
(
1
,
(
"address conversion returned %d for %s"
,
ret
,
cp
));
#endif
if
(
ret
>
0
)
ret
=
1
;
...
...
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