Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
79a58d1f
Commit
79a58d1f
authored
Jul 06, 2007
by
Steve French
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[CIFS] whitespace cleanup
checkpatch.pl redux Signed-off-by:
Steve French
<
sfrench@us.ibm.com
>
parent
d20acd09
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
232 additions
and
228 deletions
+232
-228
fs/cifs/smberr.h
fs/cifs/smberr.h
+4
-4
fs/cifs/transport.c
fs/cifs/transport.c
+113
-113
fs/cifs/xattr.c
fs/cifs/xattr.c
+115
-111
No files found.
fs/cifs/smberr.h
View file @
79a58d1f
...
...
@@ -4,8 +4,8 @@
* Copyright (c) International Business Machines Corp., 2002,2004
* Author(s): Steve French (sfrench@us.ibm.com)
*
* See Error Codes section of the SNIA CIFS Specification
* for more information
* See Error Codes section of the SNIA CIFS Specification
* for more information
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
...
...
@@ -19,7 +19,7 @@
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define SUCCESS 0x00
/* The request was successful. */
...
...
@@ -110,7 +110,7 @@
/* Below errors are used internally (do not come over the wire) for passthrough
from STATUS codes to POSIX only */
#define ErrTooManyLinks 0xFFFE
#define ErrTooManyLinks 0xFFFE
/* Following error codes may be generated with the ERRSRV error class.*/
...
...
fs/cifs/transport.c
View file @
79a58d1f
/*
* fs/cifs/transport.c
*
* Copyright (C) International Business Machines Corp., 2002,200
5
* Copyright (C) International Business Machines Corp., 2002,200
7
* Author(s): Steve French (sfrench@us.ibm.com)
* Jeremy Allison (jra@samba.org) 2006.
*
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
...
...
@@ -17,7 +17,7 @@
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <linux/fs.h>
...
...
@@ -86,7 +86,7 @@ DeleteMidQEntry(struct mid_q_entry *midEntry)
list_del
(
&
midEntry
->
qhead
);
atomic_dec
(
&
midCount
);
spin_unlock
(
&
GlobalMid_Lock
);
if
(
midEntry
->
largeBuf
)
if
(
midEntry
->
largeBuf
)
cifs_buf_release
(
midEntry
->
resp_buf
);
else
cifs_small_buf_release
(
midEntry
->
resp_buf
);
...
...
@@ -94,8 +94,8 @@ DeleteMidQEntry(struct mid_q_entry *midEntry)
now
=
jiffies
;
/* commands taking longer than one second are indications that
something is wrong, unless it is quite a slow link or server */
if
((
now
-
midEntry
->
when_alloc
)
>
HZ
)
{
if
((
cifsFYI
&
CIFS_TIMER
)
&&
if
((
now
-
midEntry
->
when_alloc
)
>
HZ
)
{
if
((
cifsFYI
&
CIFS_TIMER
)
&&
(
midEntry
->
command
!=
SMB_COM_LOCKING_ANDX
))
{
printk
(
KERN_DEBUG
" CIFS slow rsp: cmd %d mid %d"
,
midEntry
->
command
,
midEntry
->
mid
);
...
...
@@ -110,10 +110,10 @@ DeleteMidQEntry(struct mid_q_entry *midEntry)
}
struct
oplock_q_entry
*
AllocOplockQEntry
(
struct
inode
*
pinode
,
__u16
fid
,
struct
cifsTconInfo
*
tcon
)
AllocOplockQEntry
(
struct
inode
*
pinode
,
__u16
fid
,
struct
cifsTconInfo
*
tcon
)
{
struct
oplock_q_entry
*
temp
;
if
((
pinode
==
NULL
)
||
(
tcon
==
NULL
))
{
if
((
pinode
==
NULL
)
||
(
tcon
==
NULL
))
{
cERROR
(
1
,
(
"Null parms passed to AllocOplockQEntry"
));
return
NULL
;
}
...
...
@@ -133,9 +133,9 @@ AllocOplockQEntry(struct inode * pinode, __u16 fid, struct cifsTconInfo * tcon)
}
void
DeleteOplockQEntry
(
struct
oplock_q_entry
*
oplockEntry
)
void
DeleteOplockQEntry
(
struct
oplock_q_entry
*
oplockEntry
)
{
spin_lock
(
&
GlobalMid_Lock
);
spin_lock
(
&
GlobalMid_Lock
);
/* should we check if list empty first? */
list_del
(
&
oplockEntry
->
qhead
);
spin_unlock
(
&
GlobalMid_Lock
);
...
...
@@ -152,7 +152,7 @@ smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer,
struct
kvec
iov
;
unsigned
len
=
smb_buf_length
+
4
;
if
(
ssocket
==
NULL
)
if
(
ssocket
==
NULL
)
return
-
ENOTSOCK
;
/* BB eventually add reconnect code here */
iov
.
iov_base
=
smb_buffer
;
iov
.
iov_len
=
len
;
...
...
@@ -164,8 +164,8 @@ smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer,
smb_msg
.
msg_flags
=
MSG_DONTWAIT
+
MSG_NOSIGNAL
;
/* BB add more flags?*/
/* smb header is converted in header_assemble. bcc and rest of SMB word
area, and byte area if necessary, is converted to littleendian in
cifssmb.c and RFC1001 len is converted to bigendian in smb_send
area, and byte area if necessary, is converted to littleendian in
cifssmb.c and RFC1001 len is converted to bigendian in smb_send
Flags2 is converted in SendReceive */
smb_buffer
->
smb_buf_length
=
cpu_to_be32
(
smb_buffer
->
smb_buf_length
);
...
...
@@ -177,9 +177,9 @@ smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer,
if
((
rc
==
-
ENOSPC
)
||
(
rc
==
-
EAGAIN
))
{
i
++
;
/* smaller timeout here than send2 since smaller size */
/* Although it may not be required, this also is smaller
oplock break time */
if
(
i
>
12
)
{
/* Although it may not be required, this also is smaller
oplock break time */
if
(
i
>
12
)
{
cERROR
(
1
,
(
"sends on sock %p stuck for 7 seconds"
,
ssocket
));
...
...
@@ -189,7 +189,7 @@ smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer,
msleep
(
1
<<
i
);
continue
;
}
if
(
rc
<
0
)
if
(
rc
<
0
)
break
;
else
i
=
0
;
/* reset i after each successful send */
...
...
@@ -199,7 +199,7 @@ smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer,
}
if
(
rc
<
0
)
{
cERROR
(
1
,(
"Error %d sending data on socket to server"
,
rc
));
cERROR
(
1
,
(
"Error %d sending data on socket to server"
,
rc
));
}
else
{
rc
=
0
;
}
...
...
@@ -224,7 +224,7 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
int
first_vec
=
0
;
unsigned
int
smb_buf_length
=
smb_buffer
->
smb_buf_length
;
if
(
ssocket
==
NULL
)
if
(
ssocket
==
NULL
)
return
-
ENOTSOCK
;
/* BB eventually add reconnect code here */
smb_msg
.
msg_name
=
sin
;
...
...
@@ -234,8 +234,8 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
smb_msg
.
msg_flags
=
MSG_DONTWAIT
+
MSG_NOSIGNAL
;
/* BB add more flags?*/
/* smb header is converted in header_assemble. bcc and rest of SMB word
area, and byte area if necessary, is converted to littleendian in
cifssmb.c and RFC1001 len is converted to bigendian in smb_send
area, and byte area if necessary, is converted to littleendian in
cifssmb.c and RFC1001 len is converted to bigendian in smb_send
Flags2 is converted in SendReceive */
...
...
@@ -252,7 +252,7 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
n_vec
-
first_vec
,
total_len
);
if
((
rc
==
-
ENOSPC
)
||
(
rc
==
-
EAGAIN
))
{
i
++
;
if
(
i
>=
14
)
{
if
(
i
>=
14
)
{
cERROR
(
1
,
(
"sends on sock %p stuck for 15 seconds"
,
ssocket
));
...
...
@@ -262,17 +262,17 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
msleep
(
1
<<
i
);
continue
;
}
if
(
rc
<
0
)
if
(
rc
<
0
)
break
;
if
(
rc
>=
total_len
)
{
WARN_ON
(
rc
>
total_len
);
break
;
}
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
/* should never happen, letting socket clear before
retrying is our only obvious option here */
cERROR
(
1
,(
"tcp sent no data"
));
cERROR
(
1
,
(
"tcp sent no data"
));
msleep
(
500
);
continue
;
}
...
...
@@ -295,7 +295,7 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
}
if
(
rc
<
0
)
{
cERROR
(
1
,(
"Error %d sending data on socket to server"
,
rc
));
cERROR
(
1
,
(
"Error %d sending data on socket to server"
,
rc
));
}
else
rc
=
0
;
...
...
@@ -308,13 +308,13 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
static
int
wait_for_free_request
(
struct
cifsSesInfo
*
ses
,
const
int
long_op
)
{
if
(
long_op
==
-
1
)
{
if
(
long_op
==
-
1
)
{
/* oplock breaks must not be held up */
atomic_inc
(
&
ses
->
server
->
inFlight
);
}
else
{
spin_lock
(
&
GlobalMid_Lock
);
while
(
1
)
{
if
(
atomic_read
(
&
ses
->
server
->
inFlight
)
>=
spin_lock
(
&
GlobalMid_Lock
);
while
(
1
)
{
if
(
atomic_read
(
&
ses
->
server
->
inFlight
)
>=
cifs_max_pending
){
spin_unlock
(
&
GlobalMid_Lock
);
#ifdef CONFIG_CIFS_STATS2
...
...
@@ -328,13 +328,13 @@ static int wait_for_free_request(struct cifsSesInfo *ses, const int long_op)
#endif
spin_lock
(
&
GlobalMid_Lock
);
}
else
{
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
{
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
{
spin_unlock
(
&
GlobalMid_Lock
);
return
-
ENOENT
;
}
/* can not count locking commands against total
since
they are allowed to block on server */
/* can not count locking commands against total
as
they are allowed to block on server */
/* update # of requests on the wire to server */
if
(
long_op
<
3
)
...
...
@@ -353,11 +353,11 @@ static int allocate_mid(struct cifsSesInfo *ses, struct smb_hdr *in_buf,
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
{
return
-
ENOENT
;
}
else
if
(
ses
->
server
->
tcpStatus
==
CifsNeedReconnect
)
{
cFYI
(
1
,(
"tcp session dead - return to caller to retry"
));
cFYI
(
1
,
(
"tcp session dead - return to caller to retry"
));
return
-
EAGAIN
;
}
else
if
(
ses
->
status
!=
CifsGood
)
{
/* check if SMB session is bad because we are setting it up */
if
((
in_buf
->
Command
!=
SMB_COM_SESSION_SETUP_ANDX
)
&&
if
((
in_buf
->
Command
!=
SMB_COM_SESSION_SETUP_ANDX
)
&&
(
in_buf
->
Command
!=
SMB_COM_NEGOTIATE
))
{
return
-
EAGAIN
;
}
/* else ok - we are setting up session */
...
...
@@ -369,7 +369,7 @@ static int allocate_mid(struct cifsSesInfo *ses, struct smb_hdr *in_buf,
return
0
;
}
static
int
wait_for_response
(
struct
cifsSesInfo
*
ses
,
static
int
wait_for_response
(
struct
cifsSesInfo
*
ses
,
struct
mid_q_entry
*
midQ
,
unsigned
long
timeout
,
unsigned
long
time_to_wait
)
...
...
@@ -379,8 +379,8 @@ static int wait_for_response(struct cifsSesInfo *ses,
for
(;;)
{
curr_timeout
=
timeout
+
jiffies
;
wait_event
(
ses
->
server
->
response_q
,
(
!
(
midQ
->
midState
==
MID_REQUEST_SUBMITTED
))
||
time_after
(
jiffies
,
curr_timeout
)
||
(
!
(
midQ
->
midState
==
MID_REQUEST_SUBMITTED
))
||
time_after
(
jiffies
,
curr_timeout
)
||
((
ses
->
server
->
tcpStatus
!=
CifsGood
)
&&
(
ses
->
server
->
tcpStatus
!=
CifsNew
)));
...
...
@@ -398,16 +398,16 @@ static int wait_for_response(struct cifsSesInfo *ses,
spin_unlock
(
&
GlobalMid_Lock
);
/* Calculate time_to_wait past last receive time.
Although we prefer not to time out if the
Although we prefer not to time out if the
server is still responding - we will time
out if the server takes more than 15 (or 45
out if the server takes more than 15 (or 45
or 180) seconds to respond to this request
and has not responded to any request from
and has not responded to any request from
other threads on the client within 10 seconds */
lrt
+=
time_to_wait
;
if
(
time_after
(
jiffies
,
lrt
))
{
/* No replies for time_to_wait. */
cERROR
(
1
,(
"server not responding"
));
cERROR
(
1
,
(
"server not responding"
));
return
-
1
;
}
}
else
{
...
...
@@ -417,8 +417,8 @@ static int wait_for_response(struct cifsSesInfo *ses,
}
int
SendReceive2
(
const
unsigned
int
xid
,
struct
cifsSesInfo
*
ses
,
struct
kvec
*
iov
,
int
n_vec
,
int
*
pRespBufType
/* ret */
,
SendReceive2
(
const
unsigned
int
xid
,
struct
cifsSesInfo
*
ses
,
struct
kvec
*
iov
,
int
n_vec
,
int
*
pRespBufType
/* ret */
,
const
int
long_op
)
{
int
rc
=
0
;
...
...
@@ -431,16 +431,16 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
if
((
ses
==
NULL
)
||
(
ses
->
server
==
NULL
))
{
cifs_small_buf_release
(
in_buf
);
cERROR
(
1
,(
"Null session"
));
cERROR
(
1
,
(
"Null session"
));
return
-
EIO
;
}
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
{
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
{
cifs_small_buf_release
(
in_buf
);
return
-
ENOENT
;
}
/* Ensure that we do not send more than 50 overlapping requests
/* Ensure that we do not send more than 50 overlapping requests
to the same server. We may make this configurable later or
use ses->maxReq */
...
...
@@ -450,23 +450,23 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
return
rc
;
}
/* make sure that we sign in the same order that we send on this socket
/* make sure that we sign in the same order that we send on this socket
and avoid races inside tcp sendmsg code that could cause corruption
of smb data */
down
(
&
ses
->
server
->
tcpSem
);
down
(
&
ses
->
server
->
tcpSem
);
rc
=
allocate_mid
(
ses
,
in_buf
,
&
midQ
);
if
(
rc
)
{
up
(
&
ses
->
server
->
tcpSem
);
cifs_small_buf_release
(
in_buf
);
/* Update # of requests on wire to server */
atomic_dec
(
&
ses
->
server
->
inFlight
);
atomic_dec
(
&
ses
->
server
->
inFlight
);
wake_up
(
&
ses
->
server
->
request_q
);
return
rc
;
}
rc
=
cifs_sign_smb2
(
iov
,
n_vec
,
ses
->
server
,
&
midQ
->
sequence_number
);
rc
=
cifs_sign_smb2
(
iov
,
n_vec
,
ses
->
server
,
&
midQ
->
sequence_number
);
midQ
->
midState
=
MID_REQUEST_SUBMITTED
;
#ifdef CONFIG_CIFS_STATS2
...
...
@@ -482,7 +482,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
up
(
&
ses
->
server
->
tcpSem
);
cifs_small_buf_release
(
in_buf
);
if
(
rc
<
0
)
if
(
rc
<
0
)
goto
out
;
if
(
long_op
==
-
1
)
...
...
@@ -490,18 +490,18 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
else
if
(
long_op
==
2
)
/* writes past end of file can take loong time */
timeout
=
180
*
HZ
;
else
if
(
long_op
==
1
)
timeout
=
45
*
HZ
;
/* should be greater than
timeout
=
45
*
HZ
;
/* should be greater than
servers oplock break timeout (about 43 seconds) */
else
timeout
=
15
*
HZ
;
/* wait for 15 seconds or until woken up due to response arriving or
/* wait for 15 seconds or until woken up due to response arriving or
due to last connection to this server being unmounted */
if
(
signal_pending
(
current
))
{
/* if signal pending do not hold up user for full smb timeout
but we still give response a chance to complete */
timeout
=
2
*
HZ
;
}
}
/* No user interrupts in wait - wreaks havoc with performance */
wait_for_response
(
ses
,
midQ
,
timeout
,
10
*
HZ
);
...
...
@@ -511,10 +511,10 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
spin_unlock
(
&
GlobalMid_Lock
);
receive_len
=
midQ
->
resp_buf
->
smb_buf_length
;
}
else
{
cERROR
(
1
,(
"No response to cmd %d mid %d"
,
cERROR
(
1
,
(
"No response to cmd %d mid %d"
,
midQ
->
command
,
midQ
->
mid
));
if
(
midQ
->
midState
==
MID_REQUEST_SUBMITTED
)
{
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
if
(
midQ
->
midState
==
MID_REQUEST_SUBMITTED
)
{
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
rc
=
-
EHOSTDOWN
;
else
{
ses
->
server
->
tcpStatus
=
CifsNeedReconnect
;
...
...
@@ -523,9 +523,9 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
}
if
(
rc
!=
-
EHOSTDOWN
)
{
if
(
midQ
->
midState
==
MID_RETRY_NEEDED
)
{
if
(
midQ
->
midState
==
MID_RETRY_NEEDED
)
{
rc
=
-
EAGAIN
;
cFYI
(
1
,(
"marking request for retry"
));
cFYI
(
1
,
(
"marking request for retry"
));
}
else
{
rc
=
-
EIO
;
}
...
...
@@ -533,7 +533,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
spin_unlock
(
&
GlobalMid_Lock
);
DeleteMidQEntry
(
midQ
);
/* Update # of requests on wire to server */
atomic_dec
(
&
ses
->
server
->
inFlight
);
atomic_dec
(
&
ses
->
server
->
inFlight
);
wake_up
(
&
ses
->
server
->
request_q
);
return
rc
;
}
...
...
@@ -543,11 +543,11 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
receive_len
,
xid
));
rc
=
-
EIO
;
}
else
{
/* rcvd frame is ok */
if
(
midQ
->
resp_buf
&&
if
(
midQ
->
resp_buf
&&
(
midQ
->
midState
==
MID_RESPONSE_RECEIVED
))
{
iov
[
0
].
iov_base
=
(
char
*
)
midQ
->
resp_buf
;
if
(
midQ
->
largeBuf
)
if
(
midQ
->
largeBuf
)
*
pRespBufType
=
CIFS_LARGE_BUFFER
;
else
*
pRespBufType
=
CIFS_SMALL_BUFFER
;
...
...
@@ -555,14 +555,14 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
dump_smb
(
midQ
->
resp_buf
,
80
);
/* convert the length into a more usable form */
if
((
receive_len
>
24
)
&&
if
((
receive_len
>
24
)
&&
(
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
)))
{
rc
=
cifs_verify_signature
(
midQ
->
resp_buf
,
ses
->
server
->
mac_signing_key
,
midQ
->
sequence_number
+
1
);
if
(
rc
)
{
cERROR
(
1
,(
"Unexpected SMB signature"
));
if
(
rc
)
{
cERROR
(
1
,
(
"Unexpected SMB signature"
));
/* BB FIXME add code to kill session */
}
}
...
...
@@ -576,19 +576,19 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
sizeof
(
struct
smb_hdr
)
-
4
/* do not count RFC1001 header */
+
(
2
*
midQ
->
resp_buf
->
WordCount
)
+
2
/* bcc */
)
BCC
(
midQ
->
resp_buf
)
=
BCC
(
midQ
->
resp_buf
)
=
le16_to_cpu
(
BCC_LE
(
midQ
->
resp_buf
));
midQ
->
resp_buf
=
NULL
;
/* mark it so will not be freed
by DeleteMidQEntry */
}
else
{
rc
=
-
EIO
;
cFYI
(
1
,(
"Bad MID state?"
));
cFYI
(
1
,
(
"Bad MID state?"
));
}
}
out:
DeleteMidQEntry
(
midQ
);
atomic_dec
(
&
ses
->
server
->
inFlight
);
atomic_dec
(
&
ses
->
server
->
inFlight
);
wake_up
(
&
ses
->
server
->
request_q
);
return
rc
;
...
...
@@ -605,18 +605,18 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
struct
mid_q_entry
*
midQ
;
if
(
ses
==
NULL
)
{
cERROR
(
1
,(
"Null smb session"
));
cERROR
(
1
,
(
"Null smb session"
));
return
-
EIO
;
}
if
(
ses
->
server
==
NULL
)
{
cERROR
(
1
,(
"Null tcp session"
));
if
(
ses
->
server
==
NULL
)
{
cERROR
(
1
,
(
"Null tcp session"
));
return
-
EIO
;
}
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
return
-
ENOENT
;
/* Ensure that we do not send more than 50 overlapping requests
/* Ensure that we do not send more than 50 overlapping requests
to the same server. We may make this configurable later or
use ses->maxReq */
...
...
@@ -624,17 +624,17 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
if
(
rc
)
return
rc
;
/* make sure that we sign in the same order that we send on this socket
/* make sure that we sign in the same order that we send on this socket
and avoid races inside tcp sendmsg code that could cause corruption
of smb data */
down
(
&
ses
->
server
->
tcpSem
);
down
(
&
ses
->
server
->
tcpSem
);
rc
=
allocate_mid
(
ses
,
in_buf
,
&
midQ
);
if
(
rc
)
{
up
(
&
ses
->
server
->
tcpSem
);
/* Update # of requests on wire to server */
atomic_dec
(
&
ses
->
server
->
inFlight
);
atomic_dec
(
&
ses
->
server
->
inFlight
);
wake_up
(
&
ses
->
server
->
request_q
);
return
rc
;
}
...
...
@@ -645,7 +645,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
DeleteMidQEntry
(
midQ
);
up
(
&
ses
->
server
->
tcpSem
);
/* Update # of requests on wire to server */
atomic_dec
(
&
ses
->
server
->
inFlight
);
atomic_dec
(
&
ses
->
server
->
inFlight
);
wake_up
(
&
ses
->
server
->
request_q
);
return
-
EIO
;
}
...
...
@@ -664,7 +664,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
#endif
up
(
&
ses
->
server
->
tcpSem
);
if
(
rc
<
0
)
if
(
rc
<
0
)
goto
out
;
if
(
long_op
==
-
1
)
...
...
@@ -672,17 +672,17 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
else
if
(
long_op
==
2
)
/* writes past end of file can take loong time */
timeout
=
180
*
HZ
;
else
if
(
long_op
==
1
)
timeout
=
45
*
HZ
;
/* should be greater than
timeout
=
45
*
HZ
;
/* should be greater than
servers oplock break timeout (about 43 seconds) */
else
timeout
=
15
*
HZ
;
/* wait for 15 seconds or until woken up due to response arriving or
/* wait for 15 seconds or until woken up due to response arriving or
due to last connection to this server being unmounted */
if
(
signal_pending
(
current
))
{
/* if signal pending do not hold up user for full smb timeout
but we still give response a chance to complete */
timeout
=
2
*
HZ
;
}
}
/* No user interrupts in wait - wreaks havoc with performance */
wait_for_response
(
ses
,
midQ
,
timeout
,
10
*
HZ
);
...
...
@@ -692,10 +692,10 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
spin_unlock
(
&
GlobalMid_Lock
);
receive_len
=
midQ
->
resp_buf
->
smb_buf_length
;
}
else
{
cERROR
(
1
,(
"No response for cmd %d mid %d"
,
cERROR
(
1
,
(
"No response for cmd %d mid %d"
,
midQ
->
command
,
midQ
->
mid
));
if
(
midQ
->
midState
==
MID_REQUEST_SUBMITTED
)
{
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
if
(
midQ
->
midState
==
MID_REQUEST_SUBMITTED
)
{
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
rc
=
-
EHOSTDOWN
;
else
{
ses
->
server
->
tcpStatus
=
CifsNeedReconnect
;
...
...
@@ -704,9 +704,9 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
}
if
(
rc
!=
-
EHOSTDOWN
)
{
if
(
midQ
->
midState
==
MID_RETRY_NEEDED
)
{
if
(
midQ
->
midState
==
MID_RETRY_NEEDED
)
{
rc
=
-
EAGAIN
;
cFYI
(
1
,(
"marking request for retry"
));
cFYI
(
1
,
(
"marking request for retry"
));
}
else
{
rc
=
-
EIO
;
}
...
...
@@ -714,7 +714,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
spin_unlock
(
&
GlobalMid_Lock
);
DeleteMidQEntry
(
midQ
);
/* Update # of requests on wire to server */
atomic_dec
(
&
ses
->
server
->
inFlight
);
atomic_dec
(
&
ses
->
server
->
inFlight
);
wake_up
(
&
ses
->
server
->
request_q
);
return
rc
;
}
...
...
@@ -734,14 +734,14 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
dump_smb
(
out_buf
,
92
);
/* convert the length into a more usable form */
if
((
receive_len
>
24
)
&&
if
((
receive_len
>
24
)
&&
(
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
)))
{
rc
=
cifs_verify_signature
(
out_buf
,
ses
->
server
->
mac_signing_key
,
midQ
->
sequence_number
+
1
);
if
(
rc
)
{
cERROR
(
1
,(
"Unexpected SMB signature"
));
if
(
rc
)
{
cERROR
(
1
,
(
"Unexpected SMB signature"
));
/* BB FIXME add code to kill session */
}
}
...
...
@@ -759,13 +759,13 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
BCC
(
out_buf
)
=
le16_to_cpu
(
BCC_LE
(
out_buf
));
}
else
{
rc
=
-
EIO
;
cERROR
(
1
,(
"Bad MID state?"
));
cERROR
(
1
,
(
"Bad MID state?"
));
}
}
out:
DeleteMidQEntry
(
midQ
);
atomic_dec
(
&
ses
->
server
->
inFlight
);
atomic_dec
(
&
ses
->
server
->
inFlight
);
wake_up
(
&
ses
->
server
->
request_q
);
return
rc
;
...
...
@@ -783,7 +783,7 @@ send_nt_cancel(struct cifsTconInfo *tcon, struct smb_hdr *in_buf,
header_assemble
(
in_buf
,
SMB_COM_NT_CANCEL
,
tcon
,
0
);
in_buf
->
Mid
=
mid
;
down
(
&
ses
->
server
->
tcpSem
);
down
(
&
ses
->
server
->
tcpSem
);
rc
=
cifs_sign_smb
(
in_buf
,
ses
->
server
,
&
midQ
->
sequence_number
);
if
(
rc
)
{
up
(
&
ses
->
server
->
tcpSem
);
...
...
@@ -832,20 +832,20 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon,
struct
cifsSesInfo
*
ses
;
if
(
tcon
==
NULL
||
tcon
->
ses
==
NULL
)
{
cERROR
(
1
,(
"Null smb session"
));
cERROR
(
1
,
(
"Null smb session"
));
return
-
EIO
;
}
ses
=
tcon
->
ses
;
if
(
ses
->
server
==
NULL
)
{
cERROR
(
1
,(
"Null tcp session"
));
if
(
ses
->
server
==
NULL
)
{
cERROR
(
1
,
(
"Null tcp session"
));
return
-
EIO
;
}
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
return
-
ENOENT
;
/* Ensure that we do not send more than 50 overlapping requests
/* Ensure that we do not send more than 50 overlapping requests
to the same server. We may make this configurable later or
use ses->maxReq */
...
...
@@ -853,11 +853,11 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon,
if
(
rc
)
return
rc
;
/* make sure that we sign in the same order that we send on this socket
/* make sure that we sign in the same order that we send on this socket
and avoid races inside tcp sendmsg code that could cause corruption
of smb data */
down
(
&
ses
->
server
->
tcpSem
);
down
(
&
ses
->
server
->
tcpSem
);
rc
=
allocate_mid
(
ses
,
in_buf
,
&
midQ
);
if
(
rc
)
{
...
...
@@ -887,14 +887,14 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon,
#endif
up
(
&
ses
->
server
->
tcpSem
);
if
(
rc
<
0
)
{
if
(
rc
<
0
)
{
DeleteMidQEntry
(
midQ
);
return
rc
;
}
/* Wait for a reply - allow signals to interrupt. */
rc
=
wait_event_interruptible
(
ses
->
server
->
response_q
,
(
!
(
midQ
->
midState
==
MID_REQUEST_SUBMITTED
))
||
(
!
(
midQ
->
midState
==
MID_REQUEST_SUBMITTED
))
||
((
ses
->
server
->
tcpStatus
!=
CifsGood
)
&&
(
ses
->
server
->
tcpStatus
!=
CifsNew
)));
...
...
@@ -928,7 +928,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon,
}
/* Wait 5 seconds for the response. */
if
(
wait_for_response
(
ses
,
midQ
,
5
*
HZ
,
5
*
HZ
)
==
0
)
{
if
(
wait_for_response
(
ses
,
midQ
,
5
*
HZ
,
5
*
HZ
)
==
0
)
{
/* We got the response - restart system call. */
rstart
=
1
;
}
...
...
@@ -939,10 +939,10 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon,
spin_unlock
(
&
GlobalMid_Lock
);
receive_len
=
midQ
->
resp_buf
->
smb_buf_length
;
}
else
{
cERROR
(
1
,(
"No response for cmd %d mid %d"
,
cERROR
(
1
,
(
"No response for cmd %d mid %d"
,
midQ
->
command
,
midQ
->
mid
));
if
(
midQ
->
midState
==
MID_REQUEST_SUBMITTED
)
{
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
if
(
midQ
->
midState
==
MID_REQUEST_SUBMITTED
)
{
if
(
ses
->
server
->
tcpStatus
==
CifsExiting
)
rc
=
-
EHOSTDOWN
;
else
{
ses
->
server
->
tcpStatus
=
CifsNeedReconnect
;
...
...
@@ -951,9 +951,9 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon,
}
if
(
rc
!=
-
EHOSTDOWN
)
{
if
(
midQ
->
midState
==
MID_RETRY_NEEDED
)
{
if
(
midQ
->
midState
==
MID_RETRY_NEEDED
)
{
rc
=
-
EAGAIN
;
cFYI
(
1
,(
"marking request for retry"
));
cFYI
(
1
,
(
"marking request for retry"
));
}
else
{
rc
=
-
EIO
;
}
...
...
@@ -978,14 +978,14 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon,
dump_smb
(
out_buf
,
92
);
/* convert the length into a more usable form */
if
((
receive_len
>
24
)
&&
if
((
receive_len
>
24
)
&&
(
ses
->
server
->
secMode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
)))
{
rc
=
cifs_verify_signature
(
out_buf
,
ses
->
server
->
mac_signing_key
,
midQ
->
sequence_number
+
1
);
if
(
rc
)
{
cERROR
(
1
,(
"Unexpected SMB signature"
));
if
(
rc
)
{
cERROR
(
1
,
(
"Unexpected SMB signature"
));
/* BB FIXME add code to kill session */
}
}
...
...
@@ -1003,7 +1003,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon,
BCC
(
out_buf
)
=
le16_to_cpu
(
BCC_LE
(
out_buf
));
}
else
{
rc
=
-
EIO
;
cERROR
(
1
,(
"Bad MID state?"
));
cERROR
(
1
,
(
"Bad MID state?"
));
}
}
DeleteMidQEntry
(
midQ
);
...
...
fs/cifs/xattr.c
View file @
79a58d1f
/*
* fs/cifs/xattr.c
*
* Copyright (c) International Business Machines Corp., 2003
* Copyright (c) International Business Machines Corp., 2003
, 2007
* Author(s): Steve French (sfrench@us.ibm.com)
*
* This library is free software; you can redistribute it and/or modify
...
...
@@ -40,47 +40,49 @@
int
cifs_removexattr
(
struct
dentry
*
direntry
,
const
char
*
ea_name
)
int
cifs_removexattr
(
struct
dentry
*
direntry
,
const
char
*
ea_name
)
{
int
rc
=
-
EOPNOTSUPP
;
#ifdef CONFIG_CIFS_XATTR
int
xid
;
struct
cifs_sb_info
*
cifs_sb
;
struct
cifsTconInfo
*
pTcon
;
struct
super_block
*
sb
;
char
*
full_path
;
if
(
direntry
==
NULL
)
struct
super_block
*
sb
;
char
*
full_path
;
if
(
direntry
==
NULL
)
return
-
EIO
;
if
(
direntry
->
d_inode
==
NULL
)
if
(
direntry
->
d_inode
==
NULL
)
return
-
EIO
;
sb
=
direntry
->
d_inode
->
i_sb
;
if
(
sb
==
NULL
)
if
(
sb
==
NULL
)
return
-
EIO
;
xid
=
GetXid
();
cifs_sb
=
CIFS_SB
(
sb
);
pTcon
=
cifs_sb
->
tcon
;
full_path
=
build_path_from_dentry
(
direntry
);
if
(
full_path
==
NULL
)
{
if
(
full_path
==
NULL
)
{
FreeXid
(
xid
);
return
-
ENOMEM
;
}
if
(
ea_name
==
NULL
)
{
cFYI
(
1
,(
"Null xattr names not supported"
));
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_USER_PREFIX
,
5
)
&&
(
strncmp
(
ea_name
,
CIFS_XATTR_OS2_PREFIX
,
4
)))
{
cFYI
(
1
,(
"illegal xattr namespace %s (only user namespace supported)"
,
ea_name
));
if
(
ea_name
==
NULL
)
{
cFYI
(
1
,
(
"Null xattr names not supported"
));
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_USER_PREFIX
,
5
)
&&
(
strncmp
(
ea_name
,
CIFS_XATTR_OS2_PREFIX
,
4
)))
{
cFYI
(
1
,
(
"illegal xattr request %s (only user namespace supported)"
,
ea_name
));
/* BB what if no namespace prefix? */
/* Should we just pass them to server, except for
system and perhaps security prefixes? */
}
else
{
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
goto
remove_ea_exit
;
ea_name
+=
5
;
/* skip past user. prefix */
rc
=
CIFSSMBSetEA
(
xid
,
pTcon
,
full_path
,
ea_name
,
NULL
,
ea_name
+=
5
;
/* skip past user. prefix */
rc
=
CIFSSMBSetEA
(
xid
,
pTcon
,
full_path
,
ea_name
,
NULL
,
(
__u16
)
0
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
}
...
...
@@ -91,23 +93,23 @@ int cifs_removexattr(struct dentry * direntry, const char * ea_name)
return
rc
;
}
int
cifs_setxattr
(
struct
dentry
*
direntry
,
const
char
*
ea_name
,
const
void
*
ea_value
,
size_t
value_size
,
int
flags
)
int
cifs_setxattr
(
struct
dentry
*
direntry
,
const
char
*
ea_name
,
const
void
*
ea_value
,
size_t
value_size
,
int
flags
)
{
int
rc
=
-
EOPNOTSUPP
;
#ifdef CONFIG_CIFS_XATTR
int
xid
;
struct
cifs_sb_info
*
cifs_sb
;
struct
cifsTconInfo
*
pTcon
;
struct
super_block
*
sb
;
char
*
full_path
;
struct
super_block
*
sb
;
char
*
full_path
;
if
(
direntry
==
NULL
)
if
(
direntry
==
NULL
)
return
-
EIO
;
if
(
direntry
->
d_inode
==
NULL
)
if
(
direntry
->
d_inode
==
NULL
)
return
-
EIO
;
sb
=
direntry
->
d_inode
->
i_sb
;
if
(
sb
==
NULL
)
if
(
sb
==
NULL
)
return
-
EIO
;
xid
=
GetXid
();
...
...
@@ -115,7 +117,7 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name,
pTcon
=
cifs_sb
->
tcon
;
full_path
=
build_path_from_dentry
(
direntry
);
if
(
full_path
==
NULL
)
{
if
(
full_path
==
NULL
)
{
FreeXid
(
xid
);
return
-
ENOMEM
;
}
...
...
@@ -123,67 +125,68 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name,
/* return alt name if available as pseudo attr */
/* if proc/fs/cifs/streamstoxattr is set then
search server for EAs or streams to
search server for EAs or streams to
returns as xattrs */
if
(
value_size
>
MAX_EA_VALUE_SIZE
)
{
cFYI
(
1
,(
"size of EA value too large"
));
if
(
value_size
>
MAX_EA_VALUE_SIZE
)
{
cFYI
(
1
,
(
"size of EA value too large"
));
kfree
(
full_path
);
FreeXid
(
xid
);
return
-
EOPNOTSUPP
;
}
if
(
ea_name
==
NULL
)
{
cFYI
(
1
,(
"Null xattr names not supported"
));
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_USER_PREFIX
,
5
)
==
0
)
{
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
if
(
ea_name
==
NULL
)
{
cFYI
(
1
,
(
"Null xattr names not supported"
));
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_USER_PREFIX
,
5
)
==
0
)
{
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
goto
set_ea_exit
;
if
(
strncmp
(
ea_name
,
CIFS_XATTR_DOS_ATTRIB
,
14
)
==
0
)
{
cFYI
(
1
,(
"attempt to set cifs inode metadata"
));
if
(
strncmp
(
ea_name
,
CIFS_XATTR_DOS_ATTRIB
,
14
)
==
0
)
{
cFYI
(
1
,
(
"attempt to set cifs inode metadata"
));
}
ea_name
+=
5
;
/* skip past user. prefix */
rc
=
CIFSSMBSetEA
(
xid
,
pTcon
,
full_path
,
ea_name
,
ea_value
,
rc
=
CIFSSMBSetEA
(
xid
,
pTcon
,
full_path
,
ea_name
,
ea_value
,
(
__u16
)
value_size
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_OS2_PREFIX
,
4
)
==
0
)
{
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_OS2_PREFIX
,
4
)
==
0
)
{
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
goto
set_ea_exit
;
ea_name
+=
4
;
/* skip past os2. prefix */
rc
=
CIFSSMBSetEA
(
xid
,
pTcon
,
full_path
,
ea_name
,
ea_value
,
rc
=
CIFSSMBSetEA
(
xid
,
pTcon
,
full_path
,
ea_name
,
ea_value
,
(
__u16
)
value_size
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
}
else
{
int
temp
;
temp
=
strncmp
(
ea_name
,
POSIX_ACL_XATTR_ACCESS
,
int
temp
;
temp
=
strncmp
(
ea_name
,
POSIX_ACL_XATTR_ACCESS
,
strlen
(
POSIX_ACL_XATTR_ACCESS
));
if
(
temp
==
0
)
{
#ifdef CONFIG_CIFS_POSIX
if
(
sb
->
s_flags
&
MS_POSIXACL
)
rc
=
CIFSSMBSetPosixACL
(
xid
,
pTcon
,
full_path
,
ea_value
,
(
const
int
)
value_size
,
ACL_TYPE_ACCESS
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
if
(
sb
->
s_flags
&
MS_POSIXACL
)
rc
=
CIFSSMBSetPosixACL
(
xid
,
pTcon
,
full_path
,
ea_value
,
(
const
int
)
value_size
,
ACL_TYPE_ACCESS
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
cFYI
(
1
,
(
"set POSIX ACL rc %d"
,
rc
));
cFYI
(
1
,
(
"set POSIX ACL rc %d"
,
rc
));
#else
cFYI
(
1
,(
"set POSIX ACL not supported"
));
cFYI
(
1
,
(
"set POSIX ACL not supported"
));
#endif
}
else
if
(
strncmp
(
ea_name
,
POSIX_ACL_XATTR_DEFAULT
,
strlen
(
POSIX_ACL_XATTR_DEFAULT
))
==
0
)
{
}
else
if
(
strncmp
(
ea_name
,
POSIX_ACL_XATTR_DEFAULT
,
strlen
(
POSIX_ACL_XATTR_DEFAULT
))
==
0
)
{
#ifdef CONFIG_CIFS_POSIX
if
(
sb
->
s_flags
&
MS_POSIXACL
)
rc
=
CIFSSMBSetPosixACL
(
xid
,
pTcon
,
full_path
,
ea_value
,
(
const
int
)
value_size
,
if
(
sb
->
s_flags
&
MS_POSIXACL
)
rc
=
CIFSSMBSetPosixACL
(
xid
,
pTcon
,
full_path
,
ea_value
,
(
const
int
)
value_size
,
ACL_TYPE_DEFAULT
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
cFYI
(
1
,
(
"set POSIX default ACL rc %d"
,
rc
));
cFYI
(
1
,
(
"set POSIX default ACL rc %d"
,
rc
));
#else
cFYI
(
1
,(
"set default POSIX ACL not supported"
));
cFYI
(
1
,
(
"set default POSIX ACL not supported"
));
#endif
}
else
{
cFYI
(
1
,
(
"illegal xattr request %s (only user namespace supported)"
,
ea_name
));
cFYI
(
1
,
(
"illegal xattr request %s (only user namespace supported)"
,
ea_name
));
/* BB what if no namespace prefix? */
/* Should we just pass them to server, except for
/* Should we just pass them to server, except for
system and perhaps security prefixes? */
}
}
...
...
@@ -195,23 +198,23 @@ int cifs_setxattr(struct dentry * direntry, const char * ea_name,
return
rc
;
}
ssize_t
cifs_getxattr
(
struct
dentry
*
direntry
,
const
char
*
ea_name
,
void
*
ea_value
,
size_t
buf_size
)
ssize_t
cifs_getxattr
(
struct
dentry
*
direntry
,
const
char
*
ea_name
,
void
*
ea_value
,
size_t
buf_size
)
{
ssize_t
rc
=
-
EOPNOTSUPP
;
#ifdef CONFIG_CIFS_XATTR
int
xid
;
struct
cifs_sb_info
*
cifs_sb
;
struct
cifsTconInfo
*
pTcon
;
struct
super_block
*
sb
;
char
*
full_path
;
struct
super_block
*
sb
;
char
*
full_path
;
if
(
direntry
==
NULL
)
if
(
direntry
==
NULL
)
return
-
EIO
;
if
(
direntry
->
d_inode
==
NULL
)
if
(
direntry
->
d_inode
==
NULL
)
return
-
EIO
;
sb
=
direntry
->
d_inode
->
i_sb
;
if
(
sb
==
NULL
)
if
(
sb
==
NULL
)
return
-
EIO
;
xid
=
GetXid
();
...
...
@@ -220,42 +223,42 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
pTcon
=
cifs_sb
->
tcon
;
full_path
=
build_path_from_dentry
(
direntry
);
if
(
full_path
==
NULL
)
{
if
(
full_path
==
NULL
)
{
FreeXid
(
xid
);
return
-
ENOMEM
;
}
/* return dos attributes as pseudo xattr */
/* return alt name if available as pseudo attr */
if
(
ea_name
==
NULL
)
{
cFYI
(
1
,(
"Null xattr names not supported"
));
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_USER_PREFIX
,
5
)
==
0
)
{
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
if
(
ea_name
==
NULL
)
{
cFYI
(
1
,
(
"Null xattr names not supported"
));
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_USER_PREFIX
,
5
)
==
0
)
{
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
goto
get_ea_exit
;
if
(
strncmp
(
ea_name
,
CIFS_XATTR_DOS_ATTRIB
,
14
)
==
0
)
{
cFYI
(
1
,(
"attempt to query cifs inode metadata"
));
if
(
strncmp
(
ea_name
,
CIFS_XATTR_DOS_ATTRIB
,
14
)
==
0
)
{
cFYI
(
1
,
(
"attempt to query cifs inode metadata"
));
/* revalidate/getattr then populate from inode */
}
/* BB add else when above is implemented */
ea_name
+=
5
;
/* skip past user. prefix */
rc
=
CIFSSMBQueryEA
(
xid
,
pTcon
,
full_path
,
ea_name
,
ea_value
,
rc
=
CIFSSMBQueryEA
(
xid
,
pTcon
,
full_path
,
ea_name
,
ea_value
,
buf_size
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_OS2_PREFIX
,
4
)
==
0
)
{
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_OS2_PREFIX
,
4
)
==
0
)
{
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
goto
get_ea_exit
;
ea_name
+=
4
;
/* skip past os2. prefix */
rc
=
CIFSSMBQueryEA
(
xid
,
pTcon
,
full_path
,
ea_name
,
ea_value
,
rc
=
CIFSSMBQueryEA
(
xid
,
pTcon
,
full_path
,
ea_name
,
ea_value
,
buf_size
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
}
else
if
(
strncmp
(
ea_name
,
POSIX_ACL_XATTR_ACCESS
,
}
else
if
(
strncmp
(
ea_name
,
POSIX_ACL_XATTR_ACCESS
,
strlen
(
POSIX_ACL_XATTR_ACCESS
))
==
0
)
{
#ifdef CONFIG_CIFS_POSIX
if
(
sb
->
s_flags
&
MS_POSIXACL
)
if
(
sb
->
s_flags
&
MS_POSIXACL
)
rc
=
CIFSSMBGetPosixACL
(
xid
,
pTcon
,
full_path
,
ea_value
,
buf_size
,
ACL_TYPE_ACCESS
,
ea_value
,
buf_size
,
ACL_TYPE_ACCESS
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
/* else if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
__u16 fid;
...
...
@@ -272,39 +275,40 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
CIFSSMBClose(xid, pTcon, fid);
}
} */
/* BB enable after fixing up return data */
#else
cFYI
(
1
,(
"query POSIX ACL not supported yet"
));
#else
cFYI
(
1
,
(
"query POSIX ACL not supported yet"
));
#endif
/* CONFIG_CIFS_POSIX */
}
else
if
(
strncmp
(
ea_name
,
POSIX_ACL_XATTR_DEFAULT
,
}
else
if
(
strncmp
(
ea_name
,
POSIX_ACL_XATTR_DEFAULT
,
strlen
(
POSIX_ACL_XATTR_DEFAULT
))
==
0
)
{
#ifdef CONFIG_CIFS_POSIX
if
(
sb
->
s_flags
&
MS_POSIXACL
)
if
(
sb
->
s_flags
&
MS_POSIXACL
)
rc
=
CIFSSMBGetPosixACL
(
xid
,
pTcon
,
full_path
,
ea_value
,
buf_size
,
ACL_TYPE_DEFAULT
,
ea_value
,
buf_size
,
ACL_TYPE_DEFAULT
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
#else
cFYI
(
1
,(
"query POSIX default ACL not supported yet"
));
#else
cFYI
(
1
,
(
"query POSIX default ACL not supported yet"
));
#endif
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_TRUSTED_PREFIX
,
XATTR_TRUSTED_PREFIX_LEN
)
==
0
)
{
cFYI
(
1
,(
"Trusted xattr namespace not supported yet"
));
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_SECURITY_PREFIX
,
XATTR_SECURITY_PREFIX_LEN
)
==
0
)
{
cFYI
(
1
,(
"Security xattr namespace not supported yet"
));
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_TRUSTED_PREFIX
,
XATTR_TRUSTED_PREFIX_LEN
)
==
0
)
{
cFYI
(
1
,
(
"Trusted xattr namespace not supported yet"
));
}
else
if
(
strncmp
(
ea_name
,
CIFS_XATTR_SECURITY_PREFIX
,
XATTR_SECURITY_PREFIX_LEN
)
==
0
)
{
cFYI
(
1
,
(
"Security xattr namespace not supported yet"
));
}
else
{
cFYI
(
1
,(
"illegal xattr name request %s (only user namespace supported)"
,
ea_name
));
cFYI
(
1
,
(
"illegal xattr request %s (only user namespace supported)"
,
ea_name
));
}
/* We could add an additional check for streams ie
/* We could add an additional check for streams ie
if proc/fs/cifs/streamstoxattr is set then
search server for EAs or streams to
search server for EAs or streams to
returns as xattrs */
if
(
rc
==
-
EINVAL
)
rc
=
-
EOPNOTSUPP
;
if
(
rc
==
-
EINVAL
)
rc
=
-
EOPNOTSUPP
;
get_ea_exit:
kfree
(
full_path
);
...
...
@@ -313,34 +317,34 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
return
rc
;
}
ssize_t
cifs_listxattr
(
struct
dentry
*
direntry
,
char
*
data
,
size_t
buf_size
)
ssize_t
cifs_listxattr
(
struct
dentry
*
direntry
,
char
*
data
,
size_t
buf_size
)
{
ssize_t
rc
=
-
EOPNOTSUPP
;
#ifdef CONFIG_CIFS_XATTR
int
xid
;
struct
cifs_sb_info
*
cifs_sb
;
struct
cifsTconInfo
*
pTcon
;
struct
super_block
*
sb
;
char
*
full_path
;
struct
super_block
*
sb
;
char
*
full_path
;
if
(
direntry
==
NULL
)
if
(
direntry
==
NULL
)
return
-
EIO
;
if
(
direntry
->
d_inode
==
NULL
)
if
(
direntry
->
d_inode
==
NULL
)
return
-
EIO
;
sb
=
direntry
->
d_inode
->
i_sb
;
if
(
sb
==
NULL
)
if
(
sb
==
NULL
)
return
-
EIO
;
cifs_sb
=
CIFS_SB
(
sb
);
pTcon
=
cifs_sb
->
tcon
;
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
return
-
EOPNOTSUPP
;
xid
=
GetXid
();
full_path
=
build_path_from_dentry
(
direntry
);
if
(
full_path
==
NULL
)
{
if
(
full_path
==
NULL
)
{
FreeXid
(
xid
);
return
-
ENOMEM
;
}
...
...
@@ -348,11 +352,11 @@ ssize_t cifs_listxattr(struct dentry * direntry, char * data, size_t buf_size)
/* return alt name if available as pseudo attr */
/* if proc/fs/cifs/streamstoxattr is set then
search server for EAs or streams to
search server for EAs or streams to
returns as xattrs */
rc
=
CIFSSMBQAllEAs
(
xid
,
pTcon
,
full_path
,
data
,
buf_size
,
rc
=
CIFSSMBQAllEAs
(
xid
,
pTcon
,
full_path
,
data
,
buf_size
,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
kfree
(
full_path
);
...
...
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