Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
0a4b92c0
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
0a4b92c0
编写于
19年前
作者:
S
Steve French
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[CIFS] Add worker function for Get ACL cifs style
Signed-off-by:
N
Steve French
<
sfrench@us.ibm.com
>
上级
94bc2be3
无相关合并请求
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
292 addition
and
20 deletion
+292
-20
fs/cifs/CHANGES
fs/cifs/CHANGES
+3
-1
fs/cifs/cifs_fs_sb.h
fs/cifs/cifs_fs_sb.h
+3
-2
fs/cifs/cifsglob.h
fs/cifs/cifsglob.h
+2
-0
fs/cifs/cifspdu.h
fs/cifs/cifspdu.h
+78
-11
fs/cifs/cifsproto.h
fs/cifs/cifsproto.h
+3
-0
fs/cifs/cifssmb.c
fs/cifs/cifssmb.c
+176
-3
fs/cifs/connect.c
fs/cifs/connect.c
+7
-0
fs/cifs/transport.c
fs/cifs/transport.c
+0
-1
fs/cifs/xattr.c
fs/cifs/xattr.c
+20
-2
未找到文件。
fs/cifs/CHANGES
浏览文件 @
0a4b92c0
Version 1.40
------------
Use fsuid (fsgid) more consistently instead of uid (gid). Improve performance
of readpages by eliminating one extra memcpy.
of readpages by eliminating one extra memcpy. Allow update of file size
from remote server even if file is open for write as long as mount is
directio.
Version 1.39
------------
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/cifs_fs_sb.h
浏览文件 @
0a4b92c0
...
...
@@ -24,9 +24,10 @@
#define CIFS_MOUNT_DIRECT_IO 8
/* do not write nor read through page cache */
#define CIFS_MOUNT_NO_XATTR 0x10
/* if set - disable xattr support */
#define CIFS_MOUNT_MAP_SPECIAL_CHR 0x20
/* remap illegal chars in filenames */
#define CIFS_MOUNT_POSIX_PATHS
0x40
/* Negotiate posix pathnames if possible. */
#define CIFS_MOUNT_UNX_EMUL
0x80
/* Network compat with SFUnix emulation */
#define CIFS_MOUNT_POSIX_PATHS
0x40
/* Negotiate posix pathnames if possible. */
#define CIFS_MOUNT_UNX_EMUL
0x80
/* Network compat with SFUnix emulation */
#define CIFS_MOUNT_NO_BRL 0x100
/* No sending byte range locks to srv */
#define CIFS_MOUNT_CIFS_ACL 0x200
/* send ACL requests to non-POSIX srv */
struct
cifs_sb_info
{
struct
cifsTconInfo
*
tcon
;
/* primary mount */
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/cifsglob.h
浏览文件 @
0a4b92c0
...
...
@@ -233,6 +233,8 @@ struct cifsTconInfo {
atomic_t
num_hardlinks
;
atomic_t
num_symlinks
;
atomic_t
num_locks
;
atomic_t
num_acl_get
;
atomic_t
num_acl_set
;
#ifdef CONFIG_CIFS_STATS2
unsigned
long
long
time_writes
;
unsigned
long
long
time_reads
;
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/cifspdu.h
浏览文件 @
0a4b92c0
...
...
@@ -528,7 +528,7 @@ typedef union smb_com_session_setup_andx {
/* STRING PrimaryDomain */
/* STRING NativeOS */
/* STRING NativeLanMan */
}
__attribute__
((
packed
))
old_req
;
/* pre-NTLM (LANMAN2.1) request
format */
}
__attribute__
((
packed
))
old_req
;
/* pre-NTLM (LANMAN2.1) req
format */
struct
{
/* default (NTLM) response format */
struct
smb_hdr
hdr
;
/* wct = 3 */
...
...
@@ -540,7 +540,7 @@ typedef union smb_com_session_setup_andx {
unsigned
char
NativeOS
[
1
];
/* followed by */
/* unsigned char * NativeLanMan; */
/* unsigned char * PrimaryDomain; */
}
__attribute__
((
packed
))
old_resp
;
/* pre-NTLM (LANMAN2.1) response format
*/
}
__attribute__
((
packed
))
old_resp
;
/* pre-NTLM (LANMAN2.1) response
*/
}
__attribute__
((
packed
))
SESSION_SETUP_ANDX
;
#define CIFS_NETWORK_OPSYS "CIFS VFS Client for Linux"
...
...
@@ -1007,10 +1007,49 @@ typedef struct smb_com_setattr_rsp {
/* empty wct response to setattr */
/***************************************************/
/* NT Transact structure defintions follow */
/* Currently only ioctl and notify are implemented */
/***************************************************/
/*******************************************************/
/* NT Transact structure defintions follow */
/* Currently only ioctl, acl (get security descriptor) */
/* and notify are implemented */
/*******************************************************/
typedef
struct
smb_com_ntransact_req
{
struct
smb_hdr
hdr
;
/* wct >= 19 */
__u8
MaxSetupCount
;
__u16
Reserved
;
__le32
TotalParameterCount
;
__le32
TotalDataCount
;
__le32
MaxParameterCount
;
__le32
MaxDataCount
;
__le32
ParameterCount
;
__le32
ParameterOffset
;
__le32
DataCount
;
__le32
DataOffset
;
__u8
SetupCount
;
/* four setup words follow subcommand */
/* SNIA spec incorrectly included spurious pad here */
__le16
SubCommand
;
/* 2 = IOCTL/FSCTL */
/* SetupCount words follow then */
__le16
ByteCount
;
__u8
Pad
[
3
];
__u8
Parms
[
0
];
}
__attribute__
((
packed
))
NTRANSACT_REQ
;
typedef
struct
smb_com_ntransact_rsp
{
struct
smb_hdr
hdr
;
/* wct = 18 */
__u8
Reserved
[
3
];
__le32
TotalParameterCount
;
__le32
TotalDataCount
;
__le32
ParameterCount
;
__le32
ParameterOffset
;
__le32
ParameterDisplacement
;
__le32
DataCount
;
__le32
DataOffset
;
__le32
DataDisplacement
;
__u8
SetupCount
;
/* 0 */
__u16
ByteCount
;
/* __u8 Pad[3]; */
/* parms and data follow */
}
__attribute__
((
packed
))
NTRANSACT_RSP
;
typedef
struct
smb_com_transaction_ioctl_req
{
struct
smb_hdr
hdr
;
/* wct = 23 */
__u8
MaxSetupCount
;
...
...
@@ -1025,11 +1064,11 @@ typedef struct smb_com_transaction_ioctl_req {
__le32
DataOffset
;
__u8
SetupCount
;
/* four setup words follow subcommand */
/* SNIA spec incorrectly included spurious pad here */
__le16
SubCommand
;
/* 2 = IOCTL/FSCTL */
__le16
SubCommand
;
/* 2 = IOCTL/FSCTL */
__le32
FunctionCode
;
__u16
Fid
;
__u8
IsFsctl
;
/* 1 = File System Control, 0 = device control (IOCTL)
*/
__u8
IsRootFlag
;
/* 1 = apply command to root of share (must be DFS
share)
*/
__u8
IsFsctl
;
/* 1 = File System Control 0 = device control (IOCTL)
*/
__u8
IsRootFlag
;
/* 1 = apply command to root of share (must be DFS
)
*/
__le16
ByteCount
;
__u8
Pad
[
3
];
__u8
Data
[
1
];
...
...
@@ -1049,9 +1088,35 @@ typedef struct smb_com_transaction_ioctl_rsp {
__u8
SetupCount
;
/* 1 */
__le16
ReturnedDataLen
;
__u16
ByteCount
;
__u8
Pad
[
3
];
}
__attribute__
((
packed
))
TRANSACT_IOCTL_RSP
;
#define CIFS_ACL_OWNER 1
#define CIFS_ACL_GROUP 2
#define CIFS_ACL_DACL 4
#define CIFS_ACL_SACL 8
typedef
struct
smb_com_transaction_qsec_req
{
struct
smb_hdr
hdr
;
/* wct = 19 */
__u8
MaxSetupCount
;
__u16
Reserved
;
__le32
TotalParameterCount
;
__le32
TotalDataCount
;
__le32
MaxParameterCount
;
__le32
MaxDataCount
;
__le32
ParameterCount
;
__le32
ParameterOffset
;
__le32
DataCount
;
__le32
DataOffset
;
__u8
SetupCount
;
/* no setup words follow subcommand */
/* SNIA spec incorrectly included spurious pad here */
__le16
SubCommand
;
/* 6 = QUERY_SECURITY_DESC */
__le16
ByteCount
;
/* bcc = 3 + 8 */
__u8
Pad
[
3
];
__u16
Fid
;
__u16
Reserved2
;
__le32
AclFlags
;
}
__attribute__
((
packed
))
QUERY_SEC_DESC_REQ
;
typedef
struct
smb_com_transaction_change_notify_req
{
struct
smb_hdr
hdr
;
/* wct = 23 */
__u8
MaxSetupCount
;
...
...
@@ -1072,10 +1137,12 @@ typedef struct smb_com_transaction_change_notify_req {
__u8
WatchTree
;
/* 1 = Monitor subdirectories */
__u8
Reserved2
;
__le16
ByteCount
;
/* __u8 Pad[3];*/
/*
__u8 Pad[3];*/
/* __u8 Data[1];*/
}
__attribute__
((
packed
))
TRANSACT_CHANGE_NOTIFY_REQ
;
/* BB eventually change to use generic ntransact rsp struct
and validation routine */
typedef
struct
smb_com_transaction_change_notify_rsp
{
struct
smb_hdr
hdr
;
/* wct = 18 */
__u8
Reserved
[
3
];
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/cifsproto.h
浏览文件 @
0a4b92c0
...
...
@@ -299,6 +299,9 @@ extern int CIFSSMBSetEA(const int xid, struct cifsTconInfo *tcon,
const
char
*
fileName
,
const
char
*
ea_name
,
const
void
*
ea_value
,
const
__u16
ea_value_len
,
const
struct
nls_table
*
nls_codepage
,
int
remap_special_chars
);
extern
int
CIFSSMBGetCIFSACL
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
__u16
fid
,
char
*
acl_inf
,
const
int
buflen
,
const
int
acl_type
/* ACCESS vs. DEFAULT */
);
extern
int
CIFSSMBGetPosixACL
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
unsigned
char
*
searchName
,
char
*
acl_inf
,
const
int
buflen
,
const
int
acl_type
,
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/cifssmb.c
浏览文件 @
0a4b92c0
...
...
@@ -1926,6 +1926,90 @@ CIFSSMBUnixQuerySymLink(const int xid, struct cifsTconInfo *tcon,
return
rc
;
}
/* Initialize NT TRANSACT SMB into small smb request buffer.
This assumes that all NT TRANSACTS that we init here have
total parm and data under about 400 bytes (to fit in small cifs
buffer size), which is the case so far, it easily fits. NB:
Setup words themselves and ByteCount
MaxSetupCount (size of returned setup area) and
MaxParameterCount (returned parms size) must be set by caller */
static
int
smb_init_ntransact
(
const
__u16
sub_command
,
const
int
setup_count
,
const
int
parm_len
,
struct
cifsTconInfo
*
tcon
,
void
**
ret_buf
)
{
int
rc
;
__u32
temp_offset
;
struct
smb_com_ntransact_req
*
pSMB
;
rc
=
small_smb_init
(
SMB_COM_NT_TRANSACT
,
19
+
setup_count
,
tcon
,
(
void
**
)
&
pSMB
);
if
(
rc
)
return
rc
;
*
ret_buf
=
(
void
*
)
pSMB
;
pSMB
->
Reserved
=
0
;
pSMB
->
TotalParameterCount
=
cpu_to_le32
(
parm_len
);
pSMB
->
TotalDataCount
=
0
;
pSMB
->
MaxDataCount
=
cpu_to_le32
((
tcon
->
ses
->
server
->
maxBuf
-
MAX_CIFS_HDR_SIZE
)
&
0xFFFFFF00
);
pSMB
->
ParameterCount
=
pSMB
->
TotalParameterCount
;
pSMB
->
DataCount
=
pSMB
->
TotalDataCount
;
temp_offset
=
offsetof
(
struct
smb_com_ntransact_req
,
Parms
)
+
(
setup_count
*
2
)
-
4
/* for rfc1001 length itself */
;
pSMB
->
ParameterOffset
=
cpu_to_le32
(
temp_offset
);
pSMB
->
DataOffset
=
cpu_to_le32
(
temp_offset
+
parm_len
);
pSMB
->
SetupCount
=
setup_count
;
/* no need to le convert byte fields */
pSMB
->
SubCommand
=
cpu_to_le16
(
sub_command
);
return
0
;
}
static
int
validate_ntransact
(
char
*
buf
,
char
**
ppparm
,
char
**
ppdata
,
int
*
pdatalen
,
int
*
pparmlen
)
{
char
*
end_of_smb
;
__u32
data_count
,
data_offset
,
parm_count
,
parm_offset
;
struct
smb_com_ntransact_rsp
*
pSMBr
;
if
(
buf
==
NULL
)
return
-
EINVAL
;
pSMBr
=
(
struct
smb_com_ntransact_rsp
*
)
buf
;
/* ByteCount was converted from little endian in SendReceive */
end_of_smb
=
2
/* sizeof byte count */
+
pSMBr
->
ByteCount
+
(
char
*
)
&
pSMBr
->
ByteCount
;
data_offset
=
le32_to_cpu
(
pSMBr
->
DataOffset
);
data_count
=
le32_to_cpu
(
pSMBr
->
DataCount
);
parm_offset
=
le32_to_cpu
(
pSMBr
->
ParameterOffset
);
parm_count
=
le32_to_cpu
(
pSMBr
->
ParameterCount
);
*
ppparm
=
(
char
*
)
&
pSMBr
->
hdr
.
Protocol
+
parm_offset
;
*
ppdata
=
(
char
*
)
&
pSMBr
->
hdr
.
Protocol
+
data_offset
;
/* should we also check that parm and data areas do not overlap? */
if
(
*
ppparm
>
end_of_smb
)
{
cFYI
(
1
,(
"parms start after end of smb"
));
return
-
EINVAL
;
}
else
if
(
parm_count
+
*
ppparm
>
end_of_smb
)
{
cFYI
(
1
,(
"parm end after end of smb"
));
return
-
EINVAL
;
}
else
if
(
*
ppdata
>
end_of_smb
)
{
cFYI
(
1
,(
"data starts after end of smb"
));
return
-
EINVAL
;
}
else
if
(
data_count
+
*
ppdata
>
end_of_smb
)
{
cFYI
(
1
,(
"data %p + count %d (%p) ends after end of smb %p start %p"
,
*
ppdata
,
data_count
,
(
data_count
+
*
ppdata
),
end_of_smb
,
pSMBr
));
/* BB FIXME */
return
-
EINVAL
;
}
else
if
(
parm_count
+
data_count
>
pSMBr
->
ByteCount
)
{
cFYI
(
1
,(
"parm count and data count larger than SMB"
));
return
-
EINVAL
;
}
return
0
;
}
int
CIFSSMBQueryReparseLinkInfo
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
unsigned
char
*
searchName
,
...
...
@@ -1948,7 +2032,8 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
pSMB
->
TotalDataCount
=
0
;
pSMB
->
MaxParameterCount
=
cpu_to_le32
(
2
);
/* BB find exact data count max from sess structure BB */
pSMB
->
MaxDataCount
=
cpu_to_le32
(
4000
);
pSMB
->
MaxDataCount
=
cpu_to_le32
((
tcon
->
ses
->
server
->
maxBuf
-
MAX_CIFS_HDR_SIZE
)
&
0xFFFFFF00
);
pSMB
->
MaxSetupCount
=
4
;
pSMB
->
Reserved
=
0
;
pSMB
->
ParameterOffset
=
0
;
...
...
@@ -1975,7 +2060,9 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
rc
=
-
EIO
;
/* bad smb */
else
{
if
(
data_count
&&
(
data_count
<
2048
))
{
char
*
end_of_smb
=
pSMBr
->
ByteCount
+
(
char
*
)
&
pSMBr
->
ByteCount
;
char
*
end_of_smb
=
2
/* sizeof byte count */
+
pSMBr
->
ByteCount
+
(
char
*
)
&
pSMBr
->
ByteCount
;
struct
reparse_data
*
reparse_buf
=
(
struct
reparse_data
*
)
((
char
*
)
&
pSMBr
->
hdr
.
Protocol
+
data_offset
);
...
...
@@ -2219,6 +2306,7 @@ CIFSSMBGetPosixACL(const int xid, struct cifsTconInfo *tcon,
rc
=
SendReceive
(
xid
,
tcon
->
ses
,
(
struct
smb_hdr
*
)
pSMB
,
(
struct
smb_hdr
*
)
pSMBr
,
&
bytes_returned
,
0
);
cifs_stats_inc
(
&
tcon
->
num_acl_get
);
if
(
rc
)
{
cFYI
(
1
,
(
"Send error in Query POSIX ACL = %d"
,
rc
));
}
else
{
...
...
@@ -2406,6 +2494,87 @@ CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon,
#endif
/* CONFIG_POSIX */
/* Convert CIFS ACL to POSIX form */
static
int
parse_sec_desc
(
struct
sec_desc
*
psec_desc
,
int
acl_len
)
{
CHECK
ON
OTHER
COMPUTER
TO
SEE
IF
FORMAT
ENCODED
IN
CIFSPDU
.
H
ALREADY
return
0
;
}
/* Get Security Descriptor (by handle) from remote server for a file or dir */
int
CIFSSMBGetCIFSACL
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
__u16
fid
,
/* BB fix up return info */
char
*
acl_inf
,
const
int
buflen
,
const
int
acl_type
/* ACCESS/DEFAULT not sure implication */
)
{
int
rc
=
0
;
int
buf_type
=
0
;
QUERY_SEC_DESC_REQ
*
pSMB
;
struct
kvec
iov
[
1
];
cFYI
(
1
,
(
"GetCifsACL"
));
rc
=
smb_init_ntransact
(
NT_TRANSACT_QUERY_SECURITY_DESC
,
0
,
8
/* parm len */
,
tcon
,
(
void
**
)
&
pSMB
);
if
(
rc
)
return
rc
;
pSMB
->
MaxParameterCount
=
cpu_to_le32
(
4
);
/* BB TEST with big acls that might need to be e.g. larger than 16K */
pSMB
->
MaxSetupCount
=
0
;
pSMB
->
Fid
=
fid
;
/* file handle always le */
pSMB
->
AclFlags
=
cpu_to_le32
(
CIFS_ACL_OWNER
|
CIFS_ACL_GROUP
|
CIFS_ACL_DACL
);
pSMB
->
ByteCount
=
cpu_to_le16
(
11
);
/* 3 bytes pad + 8 bytes parm */
pSMB
->
hdr
.
smb_buf_length
+=
11
;
iov
[
0
].
iov_base
=
(
char
*
)
pSMB
;
iov
[
0
].
iov_len
=
pSMB
->
hdr
.
smb_buf_length
+
4
;
rc
=
SendReceive2
(
xid
,
tcon
->
ses
,
iov
,
1
/* num iovec */
,
&
buf_type
,
0
);
cifs_stats_inc
(
&
tcon
->
num_acl_get
);
if
(
rc
)
{
cFYI
(
1
,
(
"Send error in QuerySecDesc = %d"
,
rc
));
}
else
{
/* decode response */
struct
sec_desc
*
psec_desc
;
__le32
*
parm
;
int
parm_len
;
int
data_len
;
int
acl_len
;
struct
smb_com_ntransact_rsp
*
pSMBr
;
/* validate_nttransact */
rc
=
validate_ntransact
(
iov
[
0
].
iov_base
,
(
char
**
)
&
parm
,
(
char
**
)
&
psec_desc
,
&
parm_len
,
&
data_len
);
if
(
rc
)
goto
qsec_out
;
pSMBr
=
(
struct
smb_com_ntransact_rsp
*
)
iov
[
0
].
iov_base
;
cERROR
(
1
,(
"smb %p parm %p data %p"
,
pSMBr
,
parm
,
psec_desc
));
/* BB removeme BB */
if
(
le32_to_cpu
(
pSMBr
->
ParameterCount
)
!=
4
)
{
rc
=
-
EIO
;
/* bad smb */
goto
qsec_out
;
}
/* BB check that data area is minimum length and as big as acl_len */
acl_len
=
le32_to_cpu
(
*
(
__le32
*
)
parm
);
/* BB check if(acl_len > bufsize) */
parse_sec_desc
(
psec_desc
,
acl_len
);
}
qsec_out:
if
(
buf_type
==
CIFS_SMALL_BUFFER
)
cifs_small_buf_release
(
iov
[
0
].
iov_base
);
else
if
(
buf_type
==
CIFS_LARGE_BUFFER
)
cifs_buf_release
(
iov
[
0
].
iov_base
);
cifs_small_buf_release
(
pSMB
);
return
rc
;
}
/* Legacy Query Path Information call for lookup to old servers such
as Win9x/WinME */
int
SMBQueryInformation
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
...
...
@@ -4304,7 +4473,7 @@ int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
{
int
rc
=
0
;
struct
smb_com_transaction_change_notify_req
*
pSMB
=
NULL
;
struct
smb_com_transaction_change_notify_rsp
*
pSMBr
=
NULL
;
struct
smb_com_
n
transaction_change_notify_rsp
*
pSMBr
=
NULL
;
struct
dir_notify_req
*
dnotify_req
;
int
bytes_returned
;
...
...
@@ -4319,6 +4488,10 @@ int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
pSMB
->
MaxParameterCount
=
cpu_to_le32
(
2
);
/* BB find exact data count max from sess structure BB */
pSMB
->
MaxDataCount
=
0
;
/* same in little endian or be */
/* BB VERIFY verify which is correct for above BB */
pSMB
->
MaxDataCount
=
cpu_to_le32
((
tcon
->
ses
->
server
->
maxBuf
-
MAX_CIFS_HDR_SIZE
)
&
0xFFFFFF00
);
pSMB
->
MaxSetupCount
=
4
;
pSMB
->
Reserved
=
0
;
pSMB
->
ParameterOffset
=
0
;
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/connect.c
浏览文件 @
0a4b92c0
...
...
@@ -76,6 +76,7 @@ struct smb_vol {
unsigned
setuids
:
1
;
unsigned
noperm
:
1
;
unsigned
no_psx_acl
:
1
;
/* set if posix acl support should be disabled */
unsigned
cifs_acl
:
1
;
unsigned
no_xattr
:
1
;
/* set if xattr (EA) support should be disabled*/
unsigned
server_ino
:
1
;
/* use inode numbers from server ie UniqueId */
unsigned
direct_io
:
1
;
...
...
@@ -1159,6 +1160,10 @@ cifs_parse_mount_options(char *options, const char *devname,struct smb_vol *vol)
vol
->
server_ino
=
1
;
}
else
if
(
strnicmp
(
data
,
"noserverino"
,
9
)
==
0
)
{
vol
->
server_ino
=
0
;
}
else
if
(
strnicmp
(
data
,
"cifsacl"
,
7
)
==
0
)
{
vol
->
cifs_acl
=
1
;
}
else
if
(
strnicmp
(
data
,
"nocifsacl"
,
9
)
==
0
)
{
vol
->
cifs_acl
=
0
;
}
else
if
(
strnicmp
(
data
,
"acl"
,
3
)
==
0
)
{
vol
->
no_psx_acl
=
0
;
}
else
if
(
strnicmp
(
data
,
"noacl"
,
5
)
==
0
)
{
...
...
@@ -1806,6 +1811,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
cifs_sb
->
mnt_cifs_flags
|=
CIFS_MOUNT_UNX_EMUL
;
if
(
volume_info
.
nobrl
)
cifs_sb
->
mnt_cifs_flags
|=
CIFS_MOUNT_NO_BRL
;
if
(
volume_info
.
cifs_acl
)
cifs_sb
->
mnt_cifs_flags
|=
CIFS_MOUNT_CIFS_ACL
;
if
(
volume_info
.
direct_io
)
{
cFYI
(
1
,(
"mounting share using direct i/o"
));
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/transport.c
浏览文件 @
0a4b92c0
...
...
@@ -489,7 +489,6 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
receive_len
,
xid
));
rc
=
-
EIO
;
}
else
{
/* rcvd frame is ok */
if
(
midQ
->
resp_buf
&&
(
midQ
->
midState
==
MID_RESPONSE_RECEIVED
))
{
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/xattr.c
浏览文件 @
0a4b92c0
...
...
@@ -254,7 +254,8 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
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
,
strlen
(
POSIX_ACL_XATTR_ACCESS
))
==
0
)
{
}
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
)
rc
=
CIFSSMBGetPosixACL
(
xid
,
pTcon
,
full_path
,
...
...
@@ -262,10 +263,27 @@ ssize_t cifs_getxattr(struct dentry * direntry, const char * ea_name,
cifs_sb
->
local_nls
,
cifs_sb
->
mnt_cifs_flags
&
CIFS_MOUNT_MAP_SPECIAL_CHR
);
/* else if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
__u16 fid;
int oplock = FALSE;
rc = CIFSSMBOpen(xid, pTcon, full_path,
FILE_OPEN, GENERIC_READ, 0, &fid,
&oplock, NULL, cifs_sb->local_nls,
cifs_sb->mnt_cifs_flags &
CIFS_MOUNT_MAP_SPECIAL_CHR);
if(rc == 0) {
rc = CIFSSMBGetCIFSACL(xid, pTcon, fid,
ea_value, buf_size,
ACL_TYPE_ACCESS);
CIFSSMBClose(xid, pTcon, fid)
}
} */
/* BB enable after fixing up return data */
#else
cFYI
(
1
,(
"query POSIX ACL not supported yet"
));
#endif
/* CONFIG_CIFS_POSIX */
}
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
=
CIFSSMBGetPosixACL
(
xid
,
pTcon
,
full_path
,
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录