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
6faf875a
Commit
6faf875a
authored
Mar 02, 2010
by
Pavel Shilovsky
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Pull from cifs-2.6 repo for 2.6.32
Implement WINE logic Fix losing locks during fork()
parent
ffdeafd1
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
129 additions
and
49 deletions
+129
-49
cifs_fs_sb.h
sources/2.6.32/cifs_fs_sb.h
+1
-0
cifsfs.c
sources/2.6.32/cifsfs.c
+9
-1
cifsglob.h
sources/2.6.32/cifsglob.h
+3
-0
cifsproto.h
sources/2.6.32/cifsproto.h
+8
-8
cifssmb.c
sources/2.6.32/cifssmb.c
+19
-8
connect.c
sources/2.6.32/connect.c
+7
-0
dir.c
sources/2.6.32/dir.c
+2
-2
file.c
sources/2.6.32/file.c
+74
-26
inode.c
sources/2.6.32/inode.c
+6
-4
No files found.
sources/2.6.32/cifs_fs_sb.h
View file @
6faf875a
...
...
@@ -33,6 +33,7 @@
#define CIFS_MOUNT_DYNPERM 0x1000
/* allow in-memory only mode setting */
#define CIFS_MOUNT_NOPOSIXBRL 0x2000
/* mandatory not posix byte range lock */
#define CIFS_MOUNT_NOSSYNC 0x4000
/* don't do slow SMBflush on every sync*/
#define CIFS_MOUNT_WINE_MODE 0x8000
/* use pid forwarding for wine apps */
struct
cifs_sb_info
{
struct
cifsTconInfo
*
tcon
;
/* primary mount */
...
...
sources/2.6.32/cifsfs.c
View file @
6faf875a
...
...
@@ -390,6 +390,10 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m)
seq_printf
(
s
,
",nocase"
);
if
(
tcon
->
retry
)
seq_printf
(
s
,
",hard"
);
if
(
tcon
->
unix_ext
)
seq_printf
(
s
,
",unix"
);
else
seq_printf
(
s
,
",nounix"
);
if
(
cifs_sb
->
prepath
)
seq_printf
(
s
,
",prepath=%s"
,
cifs_sb
->
prepath
);
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_POSIX_PATHS
)
...
...
@@ -398,6 +402,10 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m)
seq_printf
(
s
,
",setuids"
);
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_SERVER_INUM
)
seq_printf
(
s
,
",serverino"
);
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_WINE_MODE
)
seq_printf
(
s
,
",wine"
);
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NOPOSIXBRL
)
seq_printf
(
s
,
",forcemand"
);
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_DIRECT_IO
)
seq_printf
(
s
,
",directio"
);
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NO_XATTR
)
...
...
@@ -643,7 +651,7 @@ static ssize_t cifs_sync_read(struct file *filp, char __user *buf, size_t len, l
return
-
ENOENT
;
if
(
!
CIFS_I
(
filp
->
f_path
.
dentry
->
d_inode
)
->
clientCanCacheRead
&&
!
posix_locking
)
{
retval
=
cifs_lock
(
filp
,
F_GETLK
,
&
pfLock
);
retval
=
cifs_lock
(
filp
,
F_GETLK
|
CIFS_NOPOSIXBRL_READ
,
&
pfLock
);
if
(
retval
<
0
)
return
(
ssize_t
)
retval
;
if
(
pfLock
.
fl_type
==
F_UNLCK
)
...
...
sources/2.6.32/cifsglob.h
View file @
6faf875a
...
...
@@ -318,6 +318,8 @@ struct cifsLockInfo {
__u8
type
;
};
#define CIFS_NOPOSIXBRL_READ 64
/*
* One of these for each open instance of a file
*/
...
...
@@ -466,6 +468,7 @@ struct oplock_q_entry {
struct
inode
*
pinode
;
struct
cifsTconInfo
*
tcon
;
__u16
netfid
;
__u32
netpid
;
};
/* for pending dnotify requests */
...
...
sources/2.6.32/cifsproto.h
View file @
6faf875a
...
...
@@ -298,16 +298,16 @@ extern int CIFSSMBFlush(const int xid, struct cifsTconInfo *tcon,
const
int
smb_file_id
);
extern
int
CIFSSMBRead
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
int
netfid
,
unsigned
int
count
,
const
int
netfid
,
const
u32
netpid
,
unsigned
int
count
,
const
__u64
lseek
,
unsigned
int
*
nbytes
,
char
**
buf
,
int
*
return_buf_type
);
extern
int
CIFSSMBWrite
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
int
netfid
,
const
u
nsigned
int
count
,
const
__u64
lseek
,
unsigned
int
*
nbytes
,
const
char
*
buf
,
const
char
__user
*
u
buf
,
const
int
long_op
);
const
int
netfid
,
const
u
32
netpid
,
const
unsigned
int
count
,
const
__u64
lseek
,
unsigned
int
*
nbytes
,
const
char
*
buf
,
const
char
__user
*
ubuf
,
const
int
long_op
);
extern
int
CIFSSMBWrite2
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
int
netfid
,
const
unsigned
int
count
,
const
int
netfid
,
u32
netpid
,
const
unsigned
int
count
,
const
__u64
offset
,
unsigned
int
*
nbytes
,
struct
kvec
*
iov
,
const
int
nvec
,
const
int
long_op
);
extern
int
CIFSGetSrvInodeNumber
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
...
...
@@ -318,12 +318,12 @@ extern int cifsConvertToUCS(__le16 *target, const char *source, int maxlen,
const
struct
nls_table
*
cp
,
int
mapChars
);
extern
int
CIFSSMBLock
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
__u16
netfid
,
const
__u64
len
,
const
__u16
netfid
,
const
__u
32
netpid
,
const
__u
64
len
,
const
__u64
offset
,
const
__u32
numUnlock
,
const
__u32
numLock
,
const
__u8
lockType
,
const
bool
waitFlag
);
extern
int
CIFSSMBPosixLock
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
__u16
smb_file_id
,
const
int
get_flag
,
const
__u16
smb_file_id
,
const
__u32
netpid
,
const
int
get_flag
,
const
__u64
len
,
struct
file_lock
*
,
const
__u16
lock_type
,
const
bool
waitFlag
);
extern
int
CIFSSMBTDis
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
);
...
...
sources/2.6.32/cifssmb.c
View file @
6faf875a
...
...
@@ -1319,8 +1319,8 @@ openRetry:
int
CIFSSMBRead
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
int
netfid
,
const
u
nsigned
int
count
,
const
__u64
lseek
,
unsigned
int
*
nbytes
,
char
**
buf
,
int
*
pbuf_type
)
const
u
32
netpid
,
const
unsigned
int
count
,
const
__u64
lseek
,
unsigned
int
*
nbytes
,
char
**
buf
,
int
*
pbuf_type
)
{
int
rc
=
-
EACCES
;
READ_REQ
*
pSMB
=
NULL
;
...
...
@@ -1346,6 +1346,9 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, const int netfid,
if
(
rc
)
return
rc
;
pSMB
->
hdr
.
Pid
=
cpu_to_le16
((
__u16
)
netpid
);
pSMB
->
hdr
.
PidHigh
=
cpu_to_le16
((
__u16
)(
netpid
>>
16
));
/* tcon and ses pointer are checked in smb_init */
if
(
tcon
->
ses
->
server
==
NULL
)
return
-
ECONNABORTED
;
...
...
@@ -1424,7 +1427,7 @@ CIFSSMBRead(const int xid, struct cifsTconInfo *tcon, const int netfid,
int
CIFSSMBWrite
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
int
netfid
,
const
unsigned
int
count
,
const
int
netfid
,
const
u
32
netpid
,
const
u
nsigned
int
count
,
const
__u64
offset
,
unsigned
int
*
nbytes
,
const
char
*
buf
,
const
char
__user
*
ubuf
,
const
int
long_op
)
{
...
...
@@ -1453,6 +1456,10 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
(
void
**
)
&
pSMBr
);
if
(
rc
)
return
rc
;
pSMB
->
hdr
.
Pid
=
cpu_to_le16
((
__u16
)
netpid
);
pSMB
->
hdr
.
PidHigh
=
cpu_to_le16
((
__u16
)(
netpid
>>
16
));
/* tcon and ses pointer are checked in smb_init */
if
(
tcon
->
ses
->
server
==
NULL
)
return
-
ECONNABORTED
;
...
...
@@ -1534,7 +1541,7 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
int
CIFSSMBWrite2
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
int
netfid
,
const
unsigned
int
count
,
const
int
netfid
,
const
u
32
netpid
,
const
u
nsigned
int
count
,
const
__u64
offset
,
unsigned
int
*
nbytes
,
struct
kvec
*
iov
,
int
n_vec
,
const
int
long_op
)
{
...
...
@@ -1560,6 +1567,10 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
rc
=
small_smb_init
(
SMB_COM_WRITE_ANDX
,
wct
,
tcon
,
(
void
**
)
&
pSMB
);
if
(
rc
)
return
rc
;
pSMB
->
hdr
.
Pid
=
cpu_to_le16
((
__u16
)
netpid
);
pSMB
->
hdr
.
PidHigh
=
cpu_to_le16
((
__u16
)(
netpid
>>
16
));
/* tcon and ses pointer are checked in smb_init */
if
(
tcon
->
ses
->
server
==
NULL
)
return
-
ECONNABORTED
;
...
...
@@ -1627,7 +1638,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon,
int
CIFSSMBLock
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
__u16
smb_file_id
,
const
__u64
len
,
const
__u16
smb_file_id
,
const
__u
32
net_pid
,
const
__u
64
len
,
const
__u64
offset
,
const
__u32
numUnlock
,
const
__u32
numLock
,
const
__u8
lockType
,
const
bool
waitFlag
)
{
...
...
@@ -1661,7 +1672,7 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
pSMB
->
Fid
=
smb_file_id
;
/* netfid stays le */
if
((
numLock
!=
0
)
||
(
numUnlock
!=
0
))
{
pSMB
->
Locks
[
0
].
Pid
=
cpu_to_le16
(
current
->
tg
id
);
pSMB
->
Locks
[
0
].
Pid
=
cpu_to_le16
(
net_p
id
);
/* BB where to store pid high? */
pSMB
->
Locks
[
0
].
LengthLow
=
cpu_to_le32
((
u32
)
len
);
pSMB
->
Locks
[
0
].
LengthHigh
=
cpu_to_le32
((
u32
)(
len
>>
32
));
...
...
@@ -1695,7 +1706,7 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
int
CIFSSMBPosixLock
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
__u16
smb_file_id
,
const
int
get_flag
,
const
__u64
len
,
const
__u16
smb_file_id
,
const
__u32
net_pid
,
const
int
get_flag
,
const
__u64
len
,
struct
file_lock
*
pLockData
,
const
__u16
lock_type
,
const
bool
waitFlag
)
{
...
...
@@ -1755,7 +1766,7 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
}
else
pSMB
->
Timeout
=
0
;
parm_data
->
pid
=
cpu_to_le32
(
current
->
tg
id
);
parm_data
->
pid
=
cpu_to_le32
(
net_p
id
);
parm_data
->
start
=
cpu_to_le64
(
pLockData
->
fl_start
);
parm_data
->
length
=
cpu_to_le64
(
len
);
/* normalize negative numbers */
...
...
sources/2.6.32/connect.c
View file @
6faf875a
...
...
@@ -96,6 +96,7 @@ struct smb_vol {
bool
noblocksnd
:
1
;
bool
noautotune
:
1
;
bool
nostrictsync
:
1
;
/* do not force expensive SMBflush on every sync */
bool
wine_mode
:
1
;
unsigned
int
rsize
;
unsigned
int
wsize
;
unsigned
int
sockopt
;
...
...
@@ -1299,6 +1300,10 @@ cifs_parse_mount_options(char *options, const char *devname,
vol
->
server_ino
=
1
;
}
else
if
(
strnicmp
(
data
,
"noserverino"
,
9
)
==
0
)
{
vol
->
server_ino
=
0
;
}
else
if
(
strnicmp
(
data
,
"wine"
,
4
)
==
0
)
{
vol
->
wine_mode
=
1
;
vol
->
mand_lock
=
1
;
vol
->
direct_io
=
1
;
}
else
if
(
strnicmp
(
data
,
"cifsacl"
,
7
)
==
0
)
{
vol
->
cifs_acl
=
1
;
}
else
if
(
strnicmp
(
data
,
"nocifsacl"
,
9
)
==
0
)
{
...
...
@@ -2197,6 +2202,8 @@ static void setup_cifs_sb(struct smb_vol *pvolume_info,
cifs_sb
->
mnt_cifs_flags
|=
CIFS_MOUNT_NOSSYNC
;
if
(
pvolume_info
->
mand_lock
)
cifs_sb
->
mnt_cifs_flags
|=
CIFS_MOUNT_NOPOSIXBRL
;
if
(
pvolume_info
->
wine_mode
)
cifs_sb
->
mnt_cifs_flags
|=
CIFS_MOUNT_WINE_MODE
;
if
(
pvolume_info
->
cifs_acl
)
cifs_sb
->
mnt_cifs_flags
|=
CIFS_MOUNT_CIFS_ACL
;
if
(
pvolume_info
->
override_uid
)
...
...
sources/2.6.32/dir.c
View file @
6faf875a
...
...
@@ -570,7 +570,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
pdev
->
minor
=
cpu_to_le64
(
MINOR
(
device_number
));
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
fileHandle
,
fileHandle
,
current
->
tgid
,
sizeof
(
struct
win_dev
),
0
,
&
bytes_written
,
(
char
*
)
pdev
,
NULL
,
0
);
...
...
@@ -581,7 +581,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
pdev
->
minor
=
cpu_to_le64
(
MINOR
(
device_number
));
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
fileHandle
,
fileHandle
,
current
->
tgid
,
sizeof
(
struct
win_dev
),
0
,
&
bytes_written
,
(
char
*
)
pdev
,
NULL
,
0
);
...
...
sources/2.6.32/file.c
View file @
6faf875a
...
...
@@ -748,6 +748,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
bool
wait_flag
=
false
;
struct
cifs_sb_info
*
cifs_sb
;
struct
cifsTconInfo
*
tcon
;
__u32
netpid
;
__u16
netfid
;
__u8
lockType
=
LOCKING_ANDX_LARGE_FILES
;
bool
posix_locking
=
0
;
...
...
@@ -810,6 +811,14 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
}
netfid
=
((
struct
cifsFileInfo
*
)
file
->
private_data
)
->
netfid
;
if
((
cmd
&
CIFS_NOPOSIXBRL_READ
)
&&
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_WINE_MODE
))
netpid
=
((
struct
cifsFileInfo
*
)
file
->
private_data
)
->
pid
;
else
netpid
=
current
->
tgid
;
cmd
&=
~
CIFS_NOPOSIXBRL_READ
;
if
((
tcon
->
ses
->
capabilities
&
CAP_UNIX
)
&&
(
CIFS_UNIX_FCNTL_CAP
&
le64_to_cpu
(
tcon
->
fsUnixInfo
.
Capability
))
&&
((
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_NOPOSIXBRL
)
==
0
))
...
...
@@ -824,7 +833,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
posix_lock_type
=
CIFS_RDLCK
;
else
posix_lock_type
=
CIFS_WRLCK
;
rc
=
CIFSSMBPosixLock
(
xid
,
tcon
,
netfid
,
1
/* get */
,
rc
=
CIFSSMBPosixLock
(
xid
,
tcon
,
netfid
,
netpid
,
1
/* get */
,
length
,
pfLock
,
posix_lock_type
,
wait_flag
);
FreeXid
(
xid
);
...
...
@@ -832,10 +841,10 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
}
/* BB we could chain these into one lock request BB */
rc
=
CIFSSMBLock
(
xid
,
tcon
,
netfid
,
length
,
pfLock
->
fl_start
,
rc
=
CIFSSMBLock
(
xid
,
tcon
,
netfid
,
netpid
,
length
,
pfLock
->
fl_start
,
0
,
1
,
lockType
,
0
/* wait flag */
);
if
(
rc
==
0
)
{
rc
=
CIFSSMBLock
(
xid
,
tcon
,
netfid
,
length
,
rc
=
CIFSSMBLock
(
xid
,
tcon
,
netfid
,
netpid
,
length
,
pfLock
->
fl_start
,
1
/* numUnlock */
,
0
/* numLock */
,
lockType
,
0
/* wait flag */
);
...
...
@@ -852,13 +861,14 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
if
(
lockType
&
LOCKING_ANDX_SHARED_LOCK
)
{
pfLock
->
fl_type
=
F_WRLCK
;
}
else
{
rc
=
CIFSSMBLock
(
xid
,
tcon
,
netfid
,
length
,
pfLock
->
fl_start
,
0
,
1
,
rc
=
CIFSSMBLock
(
xid
,
tcon
,
netfid
,
netpid
,
length
,
pfLock
->
fl_start
,
0
,
1
,
lockType
|
LOCKING_ANDX_SHARED_LOCK
,
0
/* wait flag */
);
if
(
rc
==
0
)
{
rc
=
CIFSSMBLock
(
xid
,
tcon
,
netfid
,
length
,
pfLock
->
fl_start
,
1
,
0
,
netpid
,
length
,
pfLock
->
fl_start
,
1
,
0
,
lockType
|
LOCKING_ANDX_SHARED_LOCK
,
0
/* wait flag */
);
...
...
@@ -896,7 +906,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
if
(
numUnlock
==
1
)
posix_lock_type
=
CIFS_UNLCK
;
rc
=
CIFSSMBPosixLock
(
xid
,
tcon
,
netfid
,
0
/* set */
,
rc
=
CIFSSMBPosixLock
(
xid
,
tcon
,
netfid
,
netpid
,
0
/* set */
,
length
,
pfLock
,
posix_lock_type
,
wait_flag
);
}
else
{
...
...
@@ -904,7 +914,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
(
struct
cifsFileInfo
*
)
file
->
private_data
;
if
(
numLock
)
{
rc
=
CIFSSMBLock
(
xid
,
tcon
,
netfid
,
length
,
rc
=
CIFSSMBLock
(
xid
,
tcon
,
netfid
,
netpid
,
length
,
pfLock
->
fl_start
,
0
,
numLock
,
lockType
,
wait_flag
);
...
...
@@ -926,14 +936,15 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
(
pfLock
->
fl_start
+
length
)
>=
(
li
->
offset
+
li
->
length
))
{
stored_rc
=
CIFSSMBLock
(
xid
,
tcon
,
netfid
,
netfid
,
netpid
,
li
->
length
,
li
->
offset
,
1
,
0
,
li
->
type
,
false
);
if
(
stored_rc
)
rc
=
stored_rc
;
list_del
(
&
li
->
llist
);
kfree
(
li
);
else
{
list_del
(
&
li
->
llist
);
kfree
(
li
);
}
}
}
mutex_unlock
(
&
fid
->
lock_mutex
);
...
...
@@ -991,6 +1002,7 @@ ssize_t cifs_user_write(struct file *file, const char __user *write_data,
int
xid
,
long_op
;
struct
cifsFileInfo
*
open_file
;
struct
cifsInodeInfo
*
cifsi
=
CIFS_I
(
file
->
f_path
.
dentry
->
d_inode
);
__u32
netpid
;
cifs_sb
=
CIFS_SB
(
file
->
f_path
.
dentry
->
d_sb
);
...
...
@@ -1004,6 +1016,11 @@ ssize_t cifs_user_write(struct file *file, const char __user *write_data,
return
-
EBADF
;
open_file
=
(
struct
cifsFileInfo
*
)
file
->
private_data
;
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_WINE_MODE
)
netpid
=
open_file
->
pid
;
else
netpid
=
current
->
tgid
;
rc
=
generic_write_checks
(
file
,
poffset
,
&
write_size
,
0
);
if
(
rc
)
return
rc
;
...
...
@@ -1041,7 +1058,7 @@ ssize_t cifs_user_write(struct file *file, const char __user *write_data,
}
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
open_file
->
netfid
,
open_file
->
netfid
,
netpid
,
min_t
(
const
int
,
cifs_sb
->
wsize
,
write_size
-
total_written
),
*
poffset
,
&
bytes_written
,
...
...
@@ -1094,6 +1111,7 @@ static ssize_t cifs_write(struct file *file, const char *write_data,
int
xid
,
long_op
;
struct
cifsFileInfo
*
open_file
;
struct
cifsInodeInfo
*
cifsi
=
CIFS_I
(
file
->
f_path
.
dentry
->
d_inode
);
__u32
netpid
;
cifs_sb
=
CIFS_SB
(
file
->
f_path
.
dentry
->
d_sb
);
...
...
@@ -1106,6 +1124,11 @@ static ssize_t cifs_write(struct file *file, const char *write_data,
return
-
EBADF
;
open_file
=
(
struct
cifsFileInfo
*
)
file
->
private_data
;
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_WINE_MODE
)
netpid
=
open_file
->
pid
;
else
netpid
=
current
->
tgid
;
xid
=
GetXid
();
long_op
=
cifs_write_timeout
(
cifsi
,
*
poffset
);
...
...
@@ -1152,12 +1175,13 @@ static ssize_t cifs_write(struct file *file, const char *write_data,
total_written
;
iov
[
1
].
iov_len
=
len
;
rc
=
CIFSSMBWrite2
(
xid
,
pTcon
,
open_file
->
netfid
,
len
,
*
poffset
,
&
bytes_written
,
iov
,
1
,
long_op
);
open_file
->
netfid
,
netpid
,
len
,
*
poffset
,
&
bytes_written
,
iov
,
1
,
long_op
);
}
else
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
open_file
->
netfid
,
open_file
->
netfid
,
netpid
,
min_t
(
const
int
,
cifs_sb
->
wsize
,
write_size
-
total_written
),
*
poffset
,
&
bytes_written
,
...
...
@@ -1393,6 +1417,7 @@ static int cifs_writepages(struct address_space *mapping,
int
rc
=
0
;
int
scanned
=
0
;
int
xid
,
long_op
;
__u32
netpid
;
cifs_sb
=
CIFS_SB
(
mapping
->
host
->
i_sb
);
...
...
@@ -1532,13 +1557,18 @@ retry:
* we used to still be valid
*/
open_file
=
find_writable_file
(
CIFS_I
(
mapping
->
host
));
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_WINE_MODE
)
netpid
=
open_file
->
pid
;
else
netpid
=
current
->
tgid
;
if
(
!
open_file
)
{
cERROR
(
1
,
(
"No writable handles for inode"
));
rc
=
-
EBADF
;
}
else
{
long_op
=
cifs_write_timeout
(
cifsi
,
offset
);
rc
=
CIFSSMBWrite2
(
xid
,
cifs_sb
->
tcon
,
open_file
->
netfid
,
open_file
->
netfid
,
netpid
,
bytes_to_write
,
offset
,
&
bytes_written
,
iov
,
n_iov
,
long_op
);
...
...
@@ -1783,6 +1813,7 @@ ssize_t cifs_user_read(struct file *file, char __user *read_data,
char
*
smb_read_data
;
char
__user
*
current_offset
;
struct
smb_com_read_rsp
*
pSMBr
;
__u32
netpid
;
xid
=
GetXid
();
cifs_sb
=
CIFS_SB
(
file
->
f_path
.
dentry
->
d_sb
);
...
...
@@ -1795,6 +1826,11 @@ ssize_t cifs_user_read(struct file *file, char __user *read_data,
}
open_file
=
(
struct
cifsFileInfo
*
)
file
->
private_data
;
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_WINE_MODE
)
netpid
=
open_file
->
pid
;
else
netpid
=
current
->
tgid
;
if
((
file
->
f_flags
&
O_ACCMODE
)
==
O_WRONLY
)
cFYI
(
1
,
(
"attempting read on write only file instance"
));
...
...
@@ -1814,7 +1850,7 @@ ssize_t cifs_user_read(struct file *file, char __user *read_data,
break
;
}
rc
=
CIFSSMBRead
(
xid
,
pTcon
,
open_file
->
netfid
,
open_file
->
netfid
,
netpid
,
current_read_size
,
*
poffset
,
&
bytes_read
,
&
smb_read_data
,
&
buf_type
);
...
...
@@ -1864,6 +1900,7 @@ static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size,
char
*
current_offset
;
struct
cifsFileInfo
*
open_file
;
int
buf_type
=
CIFS_NO_BUFFER
;
__u32
netpid
;
xid
=
GetXid
();
cifs_sb
=
CIFS_SB
(
file
->
f_path
.
dentry
->
d_sb
);
...
...
@@ -1876,6 +1913,11 @@ static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size,
}
open_file
=
(
struct
cifsFileInfo
*
)
file
->
private_data
;
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_WINE_MODE
)
netpid
=
open_file
->
pid
;
else
netpid
=
current
->
tgid
;
if
((
file
->
f_flags
&
O_ACCMODE
)
==
O_WRONLY
)
cFYI
(
1
,
(
"attempting read on write only file instance"
));
...
...
@@ -1900,7 +1942,7 @@ static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size,
break
;
}
rc
=
CIFSSMBRead
(
xid
,
pTcon
,
open_file
->
netfid
,
open_file
->
netfid
,
netpid
,
current_read_size
,
*
poffset
,
&
bytes_read
,
&
current_offset
,
&
buf_type
);
...
...
@@ -2002,6 +2044,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
struct
pagevec
lru_pvec
;
struct
cifsFileInfo
*
open_file
;
int
buf_type
=
CIFS_NO_BUFFER
;
__u32
netpid
;
xid
=
GetXid
();
if
(
file
->
private_data
==
NULL
)
{
...
...
@@ -2013,6 +2056,11 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
cifs_sb
=
CIFS_SB
(
file
->
f_path
.
dentry
->
d_sb
);
pTcon
=
cifs_sb
->
tcon
;
if
(
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_WINE_MODE
)
netpid
=
open_file
->
pid
;
else
netpid
=
current
->
tgid
;
pagevec_init
(
&
lru_pvec
,
0
);
cFYI
(
DBG2
,
(
"rpages: num pages %d"
,
num_pages
));
for
(
i
=
0
;
i
<
num_pages
;
)
{
...
...
@@ -2059,10 +2107,9 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
}
rc
=
CIFSSMBRead
(
xid
,
pTcon
,
open_file
->
netfid
,
read_size
,
offset
,
&
bytes_read
,
&
smb_read_data
,
&
buf_type
);
open_file
->
netfid
,
netpid
,
read_size
,
offset
,
&
bytes_read
,
&
smb_read_data
,
&
buf_type
);
/* BB more RC checks ? */
if
(
rc
==
-
EAGAIN
)
{
if
(
smb_read_data
)
{
...
...
@@ -2345,8 +2392,9 @@ cifs_oplock_break(struct slow_work *work)
* disconnected since oplock already released by the server
*/
if
(
!
cfile
->
closePend
&&
!
cfile
->
oplock_break_cancelled
)
{
rc
=
CIFSSMBLock
(
0
,
cifs_sb
->
tcon
,
cfile
->
netfid
,
0
,
0
,
0
,
0
,
LOCKING_ANDX_OPLOCK_RELEASE
,
false
);
rc
=
CIFSSMBLock
(
0
,
cifs_sb
->
tcon
,
cfile
->
netfid
,
cfile
->
pid
,
0
,
0
,
0
,
0
,
LOCKING_ANDX_OPLOCK_RELEASE
,
false
);
cFYI
(
1
,
(
"Oplock release rc = %d"
,
rc
));
}
}
...
...
sources/2.6.32/inode.c
View file @
6faf875a
...
...
@@ -304,7 +304,7 @@ cifs_sfu_type(struct cifs_fattr *fattr, const unsigned char *path,
if
(
rc
==
0
)
{
int
buf_type
=
CIFS_NO_BUFFER
;
/* Read header */
rc
=
CIFSSMBRead
(
xid
,
pTcon
,
netfid
,
rc
=
CIFSSMBRead
(
xid
,
pTcon
,
netfid
,
current
->
tgid
,
24
/* length */
,
0
/* offset */
,
&
bytes_read
,
&
pbuf
,
&
buf_type
);
if
((
rc
==
0
)
&&
(
bytes_read
>=
8
))
{
...
...
@@ -1599,8 +1599,9 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs,
cFYI
(
1
,
(
"SetFSize for attrs rc = %d"
,
rc
));
if
((
rc
==
-
EINVAL
)
||
(
rc
==
-
EOPNOTSUPP
))
{
unsigned
int
bytes_written
;
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
nfid
,
0
,
attrs
->
ia_size
,
&
bytes_written
,
NULL
,
NULL
,
1
);
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
nfid
,
npid
,
0
,
attrs
->
ia_size
,
&
bytes_written
,
NULL
,
NULL
,
1
);
cFYI
(
1
,
(
"Wrt seteof rc %d"
,
rc
));
}
}
else
...
...
@@ -1628,7 +1629,8 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs,
CIFS_MOUNT_MAP_SPECIAL_CHR
);
if
(
rc
==
0
)
{
unsigned
int
bytes_written
;
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
netfid
,
0
,
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
netfid
,
current
->
tgid
,
0
,
attrs
->
ia_size
,
&
bytes_written
,
NULL
,
NULL
,
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