Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
etercifs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
etersoft
etercifs
Commits
ae6f5a20
Commit
ae6f5a20
authored
Mar 03, 2015
by
Pavel Shilovsky
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update 3.13 sources from stable (v3.13.11-ckt16)
parent
905a6252
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
223 additions
and
54 deletions
+223
-54
cifs_unicode.c
sources/3.13/cifs_unicode.c
+4
-3
cifsfs.c
sources/3.13/cifsfs.c
+13
-1
cifsglob.h
sources/3.13/cifsglob.h
+10
-5
cifsproto.h
sources/3.13/cifsproto.h
+3
-0
file.c
sources/3.13/file.c
+31
-6
inode.c
sources/3.13/inode.c
+11
-2
ioctl.c
sources/3.13/ioctl.c
+5
-16
misc.c
sources/3.13/misc.c
+72
-2
readdir.c
sources/3.13/readdir.c
+3
-3
smb1ops.c
sources/3.13/smb1ops.c
+19
-1
smb2file.c
sources/3.13/smb2file.c
+1
-1
smb2inode.c
sources/3.13/smb2inode.c
+1
-1
smb2maperror.c
sources/3.13/smb2maperror.c
+4
-2
smb2misc.c
sources/3.13/smb2misc.c
+15
-3
smb2ops.c
sources/3.13/smb2ops.c
+24
-1
smb2pdu.c
sources/3.13/smb2pdu.c
+7
-7
No files found.
sources/3.13/cifs_unicode.c
View file @
ae6f5a20
...
...
@@ -290,7 +290,8 @@ int
cifsConvertToUTF16
(
__le16
*
target
,
const
char
*
source
,
int
srclen
,
const
struct
nls_table
*
cp
,
int
mapChars
)
{
int
i
,
j
,
charlen
;
int
i
,
charlen
;
int
j
=
0
;
char
src_char
;
__le16
dst_char
;
wchar_t
tmp
;
...
...
@@ -298,12 +299,11 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen,
if
(
!
mapChars
)
return
cifs_strtoUTF16
(
target
,
source
,
PATH_MAX
,
cp
);
for
(
i
=
0
,
j
=
0
;
i
<
srclen
;
j
++
)
{
for
(
i
=
0
;
i
<
srclen
;
j
++
)
{
src_char
=
source
[
i
];
charlen
=
1
;
switch
(
src_char
)
{
case
0
:
put_unaligned
(
0
,
&
target
[
j
]);
goto
ctoUTF16_out
;
case
':'
:
dst_char
=
cpu_to_le16
(
UNI_COLON
);
...
...
@@ -350,6 +350,7 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen,
}
ctoUTF16_out:
put_unaligned
(
0
,
&
target
[
j
]);
/* Null terminate target unicode string */
return
j
;
}
...
...
sources/3.13/cifsfs.c
View file @
ae6f5a20
...
...
@@ -253,6 +253,11 @@ cifs_alloc_inode(struct super_block *sb)
cifs_set_oplock_level
(
cifs_inode
,
0
);
cifs_inode
->
delete_pending
=
false
;
cifs_inode
->
invalid_mapping
=
false
;
clear_bit
(
CIFS_INODE_PENDING_OPLOCK_BREAK
,
&
cifs_inode
->
flags
);
clear_bit
(
CIFS_INODE_PENDING_WRITERS
,
&
cifs_inode
->
flags
);
clear_bit
(
CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2
,
&
cifs_inode
->
flags
);
spin_lock_init
(
&
cifs_inode
->
writers_lock
);
cifs_inode
->
writers
=
0
;
cifs_inode
->
vfs_inode
.
i_blkbits
=
14
;
/* 2**14 = CIFS_MAX_MSGSIZE */
cifs_inode
->
server_eof
=
0
;
cifs_inode
->
uniqueid
=
0
;
...
...
@@ -734,19 +739,26 @@ static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
unsigned
long
nr_segs
,
loff_t
pos
)
{
struct
inode
*
inode
=
file_inode
(
iocb
->
ki_filp
);
struct
cifsInodeInfo
*
cinode
=
CIFS_I
(
inode
);
ssize_t
written
;
int
rc
;
written
=
cifs_get_writer
(
cinode
);
if
(
written
)
return
written
;
written
=
generic_file_aio_write
(
iocb
,
iov
,
nr_segs
,
pos
);
if
(
CIFS_CACHE_WRITE
(
CIFS_I
(
inode
)))
return
written
;
goto
out
;
rc
=
filemap_fdatawrite
(
inode
->
i_mapping
);
if
(
rc
)
cifs_dbg
(
FYI
,
"cifs_file_aio_write: %d rc on %p inode
\n
"
,
rc
,
inode
);
out:
cifs_put_writer
(
cinode
);
return
written
;
}
...
...
sources/3.13/cifsglob.h
View file @
ae6f5a20
...
...
@@ -70,11 +70,6 @@
#define SERVER_NAME_LENGTH 40
#define SERVER_NAME_LEN_WITH_NULL (SERVER_NAME_LENGTH + 1)
/* used to define string lengths for reversing unicode strings */
/* (256+1)*2 = 514 */
/* (max path length + 1 for null) * 2 for unicode */
#define MAX_NAME 514
/* SMB echo "timeout" -- FIXME: tunable? */
#define SMB_ECHO_INTERVAL (60 * HZ)
...
...
@@ -228,6 +223,8 @@ struct smb_version_operations {
/* verify the message */
int
(
*
check_message
)(
char
*
,
unsigned
int
);
bool
(
*
is_oplock_break
)(
char
*
,
struct
TCP_Server_Info
*
);
void
(
*
downgrade_oplock
)(
struct
TCP_Server_Info
*
,
struct
cifsInodeInfo
*
,
bool
);
/* process transaction2 response */
bool
(
*
check_trans2
)(
struct
mid_q_entry
*
,
struct
TCP_Server_Info
*
,
char
*
,
int
);
...
...
@@ -395,6 +392,8 @@ struct smb_version_operations {
const
char
*
,
u32
*
);
int
(
*
set_acl
)(
struct
cifs_ntsd
*
,
__u32
,
struct
inode
*
,
const
char
*
,
int
);
/* check if we need to issue closedir */
bool
(
*
dir_needs_close
)(
struct
cifsFileInfo
*
);
};
struct
smb_version_values
{
...
...
@@ -1114,6 +1113,12 @@ struct cifsInodeInfo {
unsigned
int
epoch
;
/* used to track lease state changes */
bool
delete_pending
;
/* DELETE_ON_CLOSE is set */
bool
invalid_mapping
;
/* pagecache is invalid */
unsigned
long
flags
;
#define CIFS_INODE_PENDING_OPLOCK_BREAK (0)
/* oplock break in progress */
#define CIFS_INODE_PENDING_WRITERS (1)
/* Writes in progress */
#define CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 (2)
/* Downgrade oplock to L2 */
spinlock_t
writers_lock
;
unsigned
int
writers
;
/* Number of writers on this inode */
unsigned
long
time
;
/* jiffies of last update of inode */
u64
server_eof
;
/* current file size on server -- protected by i_lock */
u64
uniqueid
;
/* server inode number */
...
...
sources/3.13/cifsproto.h
View file @
ae6f5a20
...
...
@@ -127,6 +127,9 @@ extern u64 cifs_UnixTimeToNT(struct timespec);
extern
struct
timespec
cnvrtDosUnixTm
(
__le16
le_date
,
__le16
le_time
,
int
offset
);
extern
void
cifs_set_oplock_level
(
struct
cifsInodeInfo
*
cinode
,
__u32
oplock
);
extern
int
cifs_get_writer
(
struct
cifsInodeInfo
*
cinode
);
extern
void
cifs_put_writer
(
struct
cifsInodeInfo
*
cinode
);
extern
void
cifs_done_oplock_break
(
struct
cifsInodeInfo
*
cinode
);
extern
int
cifs_unlock_range
(
struct
cifsFileInfo
*
cfile
,
struct
file_lock
*
flock
,
const
unsigned
int
xid
);
extern
int
cifs_push_mandatory_locks
(
struct
cifsFileInfo
*
cfile
);
...
...
sources/3.13/file.c
View file @
ae6f5a20
...
...
@@ -770,7 +770,7 @@ int cifs_closedir(struct inode *inode, struct file *file)
cifs_dbg
(
FYI
,
"Freeing private data in close dir
\n
"
);
spin_lock
(
&
cifs_file_list_lock
);
if
(
!
cfile
->
srch_inf
.
endOfSearch
&&
!
cfile
->
invalidHandle
)
{
if
(
server
->
ops
->
dir_needs_close
(
cfile
)
)
{
cfile
->
invalidHandle
=
true
;
spin_unlock
(
&
cifs_file_list_lock
);
if
(
server
->
ops
->
close_dir
)
...
...
@@ -2619,12 +2619,20 @@ cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
struct
cifs_tcon
*
tcon
=
tlink_tcon
(
cfile
->
tlink
);
ssize_t
written
;
written
=
cifs_get_writer
(
cinode
);
if
(
written
)
return
written
;
if
(
CIFS_CACHE_WRITE
(
cinode
))
{
if
(
cap_unix
(
tcon
->
ses
)
&&
(
CIFS_UNIX_FCNTL_CAP
&
le64_to_cpu
(
tcon
->
fsUnixInfo
.
Capability
))
&&
((
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NOPOSIXBRL
)
==
0
))
return
generic_file_aio_write
(
iocb
,
iov
,
nr_segs
,
pos
);
return
cifs_writev
(
iocb
,
iov
,
nr_segs
,
pos
);
&&
((
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NOPOSIXBRL
)
==
0
))
{
written
=
generic_file_aio_write
(
iocb
,
iov
,
nr_segs
,
pos
);
goto
out
;
}
written
=
cifs_writev
(
iocb
,
iov
,
nr_segs
,
pos
);
goto
out
;
}
/*
* For non-oplocked files in strict cache mode we need to write the data
...
...
@@ -2644,6 +2652,8 @@ cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
inode
);
cinode
->
oplock
=
0
;
}
out:
cifs_put_writer
(
cinode
);
return
written
;
}
...
...
@@ -2845,7 +2855,7 @@ cifs_uncached_read_into_pages(struct TCP_Server_Info *server,
total_read
+=
result
;
}
return
total_read
>
0
?
total_read
:
result
;
return
total_read
>
0
&&
result
!=
-
EAGAIN
?
total_read
:
result
;
}
static
ssize_t
...
...
@@ -3268,7 +3278,7 @@ cifs_readpages_read_into_pages(struct TCP_Server_Info *server,
total_read
+=
result
;
}
return
total_read
>
0
?
total_read
:
result
;
return
total_read
>
0
&&
result
!=
-
EAGAIN
?
total_read
:
result
;
}
static
int
cifs_readpages
(
struct
file
*
file
,
struct
address_space
*
mapping
,
...
...
@@ -3655,6 +3665,13 @@ static int cifs_launder_page(struct page *page)
return
rc
;
}
static
int
cifs_pending_writers_wait
(
void
*
unused
)
{
schedule
();
return
0
;
}
void
cifs_oplock_break
(
struct
work_struct
*
work
)
{
struct
cifsFileInfo
*
cfile
=
container_of
(
work
,
struct
cifsFileInfo
,
...
...
@@ -3662,8 +3679,15 @@ void cifs_oplock_break(struct work_struct *work)
struct
inode
*
inode
=
cfile
->
dentry
->
d_inode
;
struct
cifsInodeInfo
*
cinode
=
CIFS_I
(
inode
);
struct
cifs_tcon
*
tcon
=
tlink_tcon
(
cfile
->
tlink
);
struct
TCP_Server_Info
*
server
=
tcon
->
ses
->
server
;
int
rc
=
0
;
wait_on_bit
(
&
cinode
->
flags
,
CIFS_INODE_PENDING_WRITERS
,
cifs_pending_writers_wait
,
TASK_UNINTERRUPTIBLE
);
server
->
ops
->
downgrade_oplock
(
server
,
cinode
,
test_bit
(
CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2
,
&
cinode
->
flags
));
if
(
!
CIFS_CACHE_WRITE
(
cinode
)
&&
CIFS_CACHE_READ
(
cinode
)
&&
cifs_has_mand_locks
(
cinode
))
{
cifs_dbg
(
FYI
,
"Reset oplock to None for inode=%p due to mand locks
\n
"
,
...
...
@@ -3700,6 +3724,7 @@ void cifs_oplock_break(struct work_struct *work)
cinode
);
cifs_dbg
(
FYI
,
"Oplock release rc = %d
\n
"
,
rc
);
}
cifs_done_oplock_break
(
cinode
);
}
/*
...
...
sources/3.13/inode.c
View file @
ae6f5a20
...
...
@@ -874,7 +874,7 @@ inode_has_hashed_dentries(struct inode *inode)
struct
dentry
*
dentry
;
spin_lock
(
&
inode
->
i_lock
);
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_alias
)
{
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_
u
.
d_
alias
)
{
if
(
!
d_unhashed
(
dentry
)
||
IS_ROOT
(
dentry
))
{
spin_unlock
(
&
inode
->
i_lock
);
return
true
;
...
...
@@ -1684,13 +1684,22 @@ cifs_rename(struct inode *source_dir, struct dentry *source_dentry,
unlink_target:
/* Try unlinking the target dentry if it's not negative */
if
(
target_dentry
->
d_inode
&&
(
rc
==
-
EACCES
||
rc
==
-
EEXIST
))
{
tmprc
=
cifs_unlink
(
target_dir
,
target_dentry
);
if
(
d_is_dir
(
target_dentry
))
tmprc
=
cifs_rmdir
(
target_dir
,
target_dentry
);
else
tmprc
=
cifs_unlink
(
target_dir
,
target_dentry
);
if
(
tmprc
)
goto
cifs_rename_exit
;
rc
=
cifs_do_rename
(
xid
,
source_dentry
,
from_name
,
target_dentry
,
to_name
);
}
/* force revalidate to go get info when needed */
CIFS_I
(
source_dir
)
->
time
=
CIFS_I
(
target_dir
)
->
time
=
0
;
source_dir
->
i_ctime
=
source_dir
->
i_mtime
=
target_dir
->
i_ctime
=
target_dir
->
i_mtime
=
current_fs_time
(
source_dir
->
i_sb
);
cifs_rename_exit:
kfree
(
info_buf_source
);
kfree
(
from_name
);
...
...
sources/3.13/ioctl.c
View file @
ae6f5a20
...
...
@@ -86,21 +86,16 @@ static long cifs_ioctl_clone(unsigned int xid, struct file *dst_file,
}
src_inode
=
src_file
.
file
->
f_dentry
->
d_inode
;
rc
=
-
EINVAL
;
if
(
S_ISDIR
(
src_inode
->
i_mode
))
goto
out_fput
;
/*
* Note: cifs case is easier than btrfs since server responsible for
* checks for proper open modes and file type and if it wants
* server could even support copy of range where source = target
*/
/* so we do not deadlock racing two ioctls on same files */
if
(
target_inode
<
src_inode
)
{
mutex_lock_nested
(
&
target_inode
->
i_mutex
,
I_MUTEX_PARENT
);
mutex_lock_nested
(
&
src_inode
->
i_mutex
,
I_MUTEX_CHILD
);
}
else
{
mutex_lock_nested
(
&
src_inode
->
i_mutex
,
I_MUTEX_PARENT
);
mutex_lock_nested
(
&
target_inode
->
i_mutex
,
I_MUTEX_CHILD
);
}
lock_two_nondirectories
(
target_inode
,
src_inode
);
/* determine range to clone */
rc
=
-
EINVAL
;
...
...
@@ -124,13 +119,7 @@ static long cifs_ioctl_clone(unsigned int xid, struct file *dst_file,
out_unlock:
/* although unlocking in the reverse order from locking is not
strictly necessary here it is a little cleaner to be consistent */
if
(
target_inode
<
src_inode
)
{
mutex_unlock
(
&
src_inode
->
i_mutex
);
mutex_unlock
(
&
target_inode
->
i_mutex
);
}
else
{
mutex_unlock
(
&
target_inode
->
i_mutex
);
mutex_unlock
(
&
src_inode
->
i_mutex
);
}
unlock_two_nondirectories
(
src_inode
,
target_inode
);
out_fput:
fdput
(
src_file
);
out_drop_write:
...
...
sources/3.13/misc.c
View file @
ae6f5a20
...
...
@@ -466,8 +466,22 @@ is_valid_oplock_break(char *buffer, struct TCP_Server_Info *srv)
cifs_dbg
(
FYI
,
"file id match, oplock break
\n
"
);
pCifsInode
=
CIFS_I
(
netfile
->
dentry
->
d_inode
);
cifs_set_oplock_level
(
pCifsInode
,
pSMB
->
OplockLevel
?
OPLOCK_READ
:
0
);
set_bit
(
CIFS_INODE_PENDING_OPLOCK_BREAK
,
&
pCifsInode
->
flags
);
/*
* Set flag if the server downgrades the oplock
* to L2 else clear.
*/
if
(
pSMB
->
OplockLevel
)
set_bit
(
CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2
,
&
pCifsInode
->
flags
);
else
clear_bit
(
CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2
,
&
pCifsInode
->
flags
);
queue_work
(
cifsiod_wq
,
&
netfile
->
oplock_break
);
netfile
->
oplock_break_cancelled
=
false
;
...
...
@@ -551,6 +565,62 @@ void cifs_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock)
cinode
->
oplock
=
0
;
}
static
int
cifs_oplock_break_wait
(
void
*
unused
)
{
schedule
();
return
signal_pending
(
current
)
?
-
ERESTARTSYS
:
0
;
}
/*
* We wait for oplock breaks to be processed before we attempt to perform
* writes.
*/
int
cifs_get_writer
(
struct
cifsInodeInfo
*
cinode
)
{
int
rc
;
start:
rc
=
wait_on_bit
(
&
cinode
->
flags
,
CIFS_INODE_PENDING_OPLOCK_BREAK
,
cifs_oplock_break_wait
,
TASK_KILLABLE
);
if
(
rc
)
return
rc
;
spin_lock
(
&
cinode
->
writers_lock
);
if
(
!
cinode
->
writers
)
set_bit
(
CIFS_INODE_PENDING_WRITERS
,
&
cinode
->
flags
);
cinode
->
writers
++
;
/* Check to see if we have started servicing an oplock break */
if
(
test_bit
(
CIFS_INODE_PENDING_OPLOCK_BREAK
,
&
cinode
->
flags
))
{
cinode
->
writers
--
;
if
(
cinode
->
writers
==
0
)
{
clear_bit
(
CIFS_INODE_PENDING_WRITERS
,
&
cinode
->
flags
);
wake_up_bit
(
&
cinode
->
flags
,
CIFS_INODE_PENDING_WRITERS
);
}
spin_unlock
(
&
cinode
->
writers_lock
);
goto
start
;
}
spin_unlock
(
&
cinode
->
writers_lock
);
return
0
;
}
void
cifs_put_writer
(
struct
cifsInodeInfo
*
cinode
)
{
spin_lock
(
&
cinode
->
writers_lock
);
cinode
->
writers
--
;
if
(
cinode
->
writers
==
0
)
{
clear_bit
(
CIFS_INODE_PENDING_WRITERS
,
&
cinode
->
flags
);
wake_up_bit
(
&
cinode
->
flags
,
CIFS_INODE_PENDING_WRITERS
);
}
spin_unlock
(
&
cinode
->
writers_lock
);
}
void
cifs_done_oplock_break
(
struct
cifsInodeInfo
*
cinode
)
{
clear_bit
(
CIFS_INODE_PENDING_OPLOCK_BREAK
,
&
cinode
->
flags
);
wake_up_bit
(
&
cinode
->
flags
,
CIFS_INODE_PENDING_OPLOCK_BREAK
);
}
bool
backup_cred
(
struct
cifs_sb_info
*
cifs_sb
)
{
...
...
sources/3.13/readdir.c
View file @
ae6f5a20
...
...
@@ -593,11 +593,11 @@ find_cifs_entry(const unsigned int xid, struct cifs_tcon *tcon, loff_t pos,
/* close and restart search */
cifs_dbg
(
FYI
,
"search backing up - close and restart search
\n
"
);
spin_lock
(
&
cifs_file_list_lock
);
if
(
!
cfile
->
srch_inf
.
endOfSearch
&&
!
cfile
->
invalidHandle
)
{
if
(
server
->
ops
->
dir_needs_close
(
cfile
)
)
{
cfile
->
invalidHandle
=
true
;
spin_unlock
(
&
cifs_file_list_lock
);
if
(
server
->
ops
->
close
)
server
->
ops
->
close
(
xid
,
tcon
,
&
cfile
->
fid
);
if
(
server
->
ops
->
close
_dir
)
server
->
ops
->
close
_dir
(
xid
,
tcon
,
&
cfile
->
fid
);
}
else
spin_unlock
(
&
cifs_file_list_lock
);
if
(
cfile
->
srch_inf
.
ntwrk_buf_start
)
{
...
...
sources/3.13/smb1ops.c
View file @
ae6f5a20
...
...
@@ -372,6 +372,16 @@ coalesce_t2(char *second_buf, struct smb_hdr *target_hdr)
return
0
;
}
static
void
cifs_downgrade_oplock
(
struct
TCP_Server_Info
*
server
,
struct
cifsInodeInfo
*
cinode
,
bool
set_level2
)
{
if
(
set_level2
)
cifs_set_oplock_level
(
cinode
,
OPLOCK_READ
);
else
cifs_set_oplock_level
(
cinode
,
0
);
}
static
bool
cifs_check_trans2
(
struct
mid_q_entry
*
mid
,
struct
TCP_Server_Info
*
server
,
char
*
buf
,
int
malformed
)
...
...
@@ -569,7 +579,7 @@ cifs_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
(
tmprc
==
-
EOPNOTSUPP
)
*
symlink
=
true
;
else
else
if
(
tmprc
==
0
)
CIFSSMBClose
(
xid
,
tcon
,
netfid
);
}
...
...
@@ -947,6 +957,12 @@ cifs_is_read_op(__u32 oplock)
return
oplock
==
OPLOCK_READ
;
}
static
bool
cifs_dir_needs_close
(
struct
cifsFileInfo
*
cfile
)
{
return
!
cfile
->
srch_inf
.
endOfSearch
&&
!
cfile
->
invalidHandle
;
}
struct
smb_version_operations
smb1_operations
=
{
.
send_cancel
=
send_nt_cancel
,
.
compare_fids
=
cifs_compare_fids
,
...
...
@@ -967,6 +983,7 @@ struct smb_version_operations smb1_operations = {
.
clear_stats
=
cifs_clear_stats
,
.
print_stats
=
cifs_print_stats
,
.
is_oplock_break
=
is_valid_oplock_break
,
.
downgrade_oplock
=
cifs_downgrade_oplock
,
.
check_trans2
=
cifs_check_trans2
,
.
need_neg
=
cifs_need_neg
,
.
negotiate
=
cifs_negotiate
,
...
...
@@ -1014,6 +1031,7 @@ struct smb_version_operations smb1_operations = {
.
push_mand_locks
=
cifs_push_mandatory_locks
,
.
query_mf_symlink
=
open_query_close_cifs_symlink
,
.
is_read_op
=
cifs_is_read_op
,
.
dir_needs_close
=
cifs_dir_needs_close
,
#ifdef CONFIG_CIFS_XATTR
.
query_all_EAs
=
CIFSSMBQAllEAs
,
.
set_EA
=
CIFSSMBSetEA
,
...
...
sources/3.13/smb2file.c
View file @
ae6f5a20
...
...
@@ -50,7 +50,7 @@ smb2_open_file(const unsigned int xid, struct cifs_open_parms *oparms,
goto
out
;
}
smb2_data
=
kzalloc
(
sizeof
(
struct
smb2_file_all_info
)
+
MAX_NAME
*
2
,
smb2_data
=
kzalloc
(
sizeof
(
struct
smb2_file_all_info
)
+
PATH_MAX
*
2
,
GFP_KERNEL
);
if
(
smb2_data
==
NULL
)
{
rc
=
-
ENOMEM
;
...
...
sources/3.13/smb2inode.c
View file @
ae6f5a20
...
...
@@ -132,7 +132,7 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
*
adjust_tz
=
false
;
*
symlink
=
false
;
smb2_data
=
kzalloc
(
sizeof
(
struct
smb2_file_all_info
)
+
MAX_NAME
*
2
,
smb2_data
=
kzalloc
(
sizeof
(
struct
smb2_file_all_info
)
+
PATH_MAX
*
2
,
GFP_KERNEL
);
if
(
smb2_data
==
NULL
)
return
-
ENOMEM
;
...
...
sources/3.13/smb2maperror.c
View file @
ae6f5a20
...
...
@@ -214,7 +214,7 @@ static const struct status_to_posix_error smb2_error_map_table[] = {
{
STATUS_BREAKPOINT
,
-
EIO
,
"STATUS_BREAKPOINT"
},
{
STATUS_SINGLE_STEP
,
-
EIO
,
"STATUS_SINGLE_STEP"
},
{
STATUS_BUFFER_OVERFLOW
,
-
EIO
,
"STATUS_BUFFER_OVERFLOW"
},
{
STATUS_NO_MORE_FILES
,
-
E
IO
,
"STATUS_NO_MORE_FILES"
},
{
STATUS_NO_MORE_FILES
,
-
E
NODATA
,
"STATUS_NO_MORE_FILES"
},
{
STATUS_WAKE_SYSTEM_DEBUGGER
,
-
EIO
,
"STATUS_WAKE_SYSTEM_DEBUGGER"
},
{
STATUS_HANDLES_CLOSED
,
-
EIO
,
"STATUS_HANDLES_CLOSED"
},
{
STATUS_NO_INHERITANCE
,
-
EIO
,
"STATUS_NO_INHERITANCE"
},
...
...
@@ -256,6 +256,8 @@ static const struct status_to_posix_error smb2_error_map_table[] = {
{
STATUS_DLL_MIGHT_BE_INCOMPATIBLE
,
-
EIO
,
"STATUS_DLL_MIGHT_BE_INCOMPATIBLE"
},
{
STATUS_STOPPED_ON_SYMLINK
,
-
EOPNOTSUPP
,
"STATUS_STOPPED_ON_SYMLINK"
},
{
STATUS_IO_REPARSE_TAG_NOT_HANDLED
,
-
EOPNOTSUPP
,
"STATUS_REPARSE_NOT_HANDLED"
},
{
STATUS_DEVICE_REQUIRES_CLEANING
,
-
EIO
,
"STATUS_DEVICE_REQUIRES_CLEANING"
},
{
STATUS_DEVICE_DOOR_OPEN
,
-
EIO
,
"STATUS_DEVICE_DOOR_OPEN"
},
...
...
@@ -605,7 +607,7 @@ static const struct status_to_posix_error smb2_error_map_table[] = {
{
STATUS_MAPPED_FILE_SIZE_ZERO
,
-
EIO
,
"STATUS_MAPPED_FILE_SIZE_ZERO"
},
{
STATUS_TOO_MANY_OPENED_FILES
,
-
EMFILE
,
"STATUS_TOO_MANY_OPENED_FILES"
},
{
STATUS_CANCELLED
,
-
EIO
,
"STATUS_CANCELLED"
},
{
STATUS_CANNOT_DELETE
,
-
E
IO
,
"STATUS_CANNOT_DELETE"
},
{
STATUS_CANNOT_DELETE
,
-
E
ACCES
,
"STATUS_CANNOT_DELETE"
},
{
STATUS_INVALID_COMPUTER_NAME
,
-
EIO
,
"STATUS_INVALID_COMPUTER_NAME"
},
{
STATUS_FILE_DELETED
,
-
EIO
,
"STATUS_FILE_DELETED"
},
{
STATUS_SPECIAL_ACCOUNT
,
-
EIO
,
"STATUS_SPECIAL_ACCOUNT"
},
...
...
sources/3.13/smb2misc.c
View file @
ae6f5a20
...
...
@@ -575,9 +575,21 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server)
else
cfile
->
oplock_break_cancelled
=
false
;
server
->
ops
->
set_oplock_level
(
cinode
,
rsp
->
OplockLevel
?
SMB2_OPLOCK_LEVEL_II
:
0
,
0
,
NULL
);
set_bit
(
CIFS_INODE_PENDING_OPLOCK_BREAK
,
&
cinode
->
flags
);
/*
* Set flag if the server downgrades the oplock
* to L2 else clear.
*/
if
(
rsp
->
OplockLevel
)
set_bit
(
CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2
,
&
cinode
->
flags
);
else
clear_bit
(
CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2
,
&
cinode
->
flags
);
queue_work
(
cifsiod_wq
,
&
cfile
->
oplock_break
);
...
...
sources/3.13/smb2ops.c
View file @
ae6f5a20
...
...
@@ -342,7 +342,7 @@ smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon,
int
rc
;
struct
smb2_file_all_info
*
smb2_data
;
smb2_data
=
kzalloc
(
sizeof
(
struct
smb2_file_all_info
)
+
MAX_NAME
*
2
,
smb2_data
=
kzalloc
(
sizeof
(
struct
smb2_file_all_info
)
+
PATH_MAX
*
2
,
GFP_KERNEL
);
if
(
smb2_data
==
NULL
)
return
-
ENOMEM
;
...
...
@@ -911,6 +911,17 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
}
static
void
smb2_downgrade_oplock
(
struct
TCP_Server_Info
*
server
,
struct
cifsInodeInfo
*
cinode
,
bool
set_level2
)
{
if
(
set_level2
)
server
->
ops
->
set_oplock_level
(
cinode
,
SMB2_OPLOCK_LEVEL_II
,
0
,
NULL
);
else
server
->
ops
->
set_oplock_level
(
cinode
,
0
,
0
,
NULL
);
}
static
void
smb2_set_oplock_level
(
struct
cifsInodeInfo
*
cinode
,
__u32
oplock
,
unsigned
int
epoch
,
bool
*
purge_cache
)
{
...
...
@@ -1097,6 +1108,12 @@ smb3_parse_lease_buf(void *buf, unsigned int *epoch)
return
le32_to_cpu
(
lc
->
lcontext
.
LeaseState
);
}
static
bool
smb2_dir_needs_close
(
struct
cifsFileInfo
*
cfile
)
{
return
!
cfile
->
invalidHandle
;
}
struct
smb_version_operations
smb20_operations
=
{
.
compare_fids
=
smb2_compare_fids
,
.
setup_request
=
smb2_setup_request
,
...
...
@@ -1116,6 +1133,7 @@ struct smb_version_operations smb20_operations = {
.
clear_stats
=
smb2_clear_stats
,
.
print_stats
=
smb2_print_stats
,
.
is_oplock_break
=
smb2_is_valid_oplock_break
,
.
downgrade_oplock
=
smb2_downgrade_oplock
,
.
need_neg
=
smb2_need_neg
,
.
negotiate
=
smb2_negotiate
,
.
negotiate_wsize
=
smb2_negotiate_wsize
,
...
...
@@ -1169,6 +1187,7 @@ struct smb_version_operations smb20_operations = {
.
create_lease_buf
=
smb2_create_lease_buf
,
.
parse_lease_buf
=
smb2_parse_lease_buf
,
.
clone_range
=
smb2_clone_range
,
.
dir_needs_close
=
smb2_dir_needs_close
,
};
struct
smb_version_operations
smb21_operations
=
{
...
...
@@ -1190,6 +1209,7 @@ struct smb_version_operations smb21_operations = {
.
clear_stats
=
smb2_clear_stats
,
.
print_stats
=
smb2_print_stats
,
.
is_oplock_break
=
smb2_is_valid_oplock_break
,
.
downgrade_oplock
=
smb2_downgrade_oplock
,
.
need_neg
=
smb2_need_neg
,
.
negotiate
=
smb2_negotiate
,
.
negotiate_wsize
=
smb2_negotiate_wsize
,
...
...
@@ -1243,6 +1263,7 @@ struct smb_version_operations smb21_operations = {
.
create_lease_buf
=
smb2_create_lease_buf
,
.
parse_lease_buf
=
smb2_parse_lease_buf
,
.
clone_range
=
smb2_clone_range
,
.
dir_needs_close
=
smb2_dir_needs_close
,
};
struct
smb_version_operations
smb30_operations
=
{
...
...
@@ -1265,6 +1286,7 @@ struct smb_version_operations smb30_operations = {
.
print_stats
=
smb2_print_stats
,
.
dump_share_caps
=
smb2_dump_share_caps
,
.
is_oplock_break
=
smb2_is_valid_oplock_break
,
.
downgrade_oplock
=
smb2_downgrade_oplock
,
.
need_neg
=
smb2_need_neg
,
.
negotiate
=
smb2_negotiate
,
.
negotiate_wsize
=
smb2_negotiate_wsize
,
...
...
@@ -1320,6 +1342,7 @@ struct smb_version_operations smb30_operations = {
.
parse_lease_buf
=
smb3_parse_lease_buf
,
.
clone_range
=
smb2_clone_range
,
.
validate_negotiate
=
smb3_validate_negotiate
,
.
dir_needs_close
=
smb2_dir_needs_close
,
};
struct
smb_version_values
smb20_values
=
{
...
...
sources/3.13/smb2pdu.c
View file @
ae6f5a20
...
...
@@ -916,7 +916,8 @@ tcon_exit:
tcon_error_exit:
if
(
rsp
->
hdr
.
Status
==
STATUS_BAD_NETWORK_NAME
)
{
cifs_dbg
(
VFS
,
"BAD_NETWORK_NAME: %s
\n
"
,
tree
);
tcon
->
bad_network_name
=
true
;
if
(
tcon
)
tcon
->
bad_network_name
=
true
;
}
goto
tcon_exit
;
}
...
...
@@ -1539,7 +1540,7 @@ SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
{
return
query_info
(
xid
,
tcon
,
persistent_fid
,
volatile_fid
,
FILE_ALL_INFORMATION
,
sizeof
(
struct
smb2_file_all_info
)
+
MAX_NAME
*
2
,
sizeof
(
struct
smb2_file_all_info
)
+
PATH_MAX
*
2
,
sizeof
(
struct
smb2_file_all_info
),
data
);
}
...
...
@@ -2134,6 +2135,10 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon,
rsp
=
(
struct
smb2_query_directory_rsp
*
)
iov
[
0
].
iov_base
;
if
(
rc
)
{
if
(
rc
==
-
ENODATA
&&
rsp
->
hdr
.
Status
==
STATUS_NO_MORE_FILES
)
{
srch_inf
->
endOfSearch
=
true
;
rc
=
0
;
}
cifs_stats_fail_inc
(
tcon
,
SMB2_QUERY_DIRECTORY_HE
);
goto
qdir_exit
;
}
...
...
@@ -2171,11 +2176,6 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon,
else
cifs_dbg
(
VFS
,
"illegal search buffer type
\n
"
);
if
(
rsp
->
hdr
.
Status
==
STATUS_NO_MORE_FILES
)
srch_inf
->
endOfSearch
=
1
;
else
srch_inf
->
endOfSearch
=
0
;
return
rc
;
qdir_exit:
...
...
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