Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
5f702c8e
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
5f702c8e
编写于
4月 06, 2018
作者:
D
David Howells
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
afs: Trace protocol errors
Trace protocol errors detected in afs. Signed-off-by:
N
David Howells
<
dhowells@redhat.com
>
上级
63a4681f
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
79 addition
and
46 deletion
+79
-46
fs/afs/cmservice.c
fs/afs/cmservice.c
+2
-2
fs/afs/fsclient.c
fs/afs/fsclient.c
+35
-33
fs/afs/inode.c
fs/afs/inode.c
+1
-1
fs/afs/internal.h
fs/afs/internal.h
+1
-0
fs/afs/rxrpc.c
fs/afs/rxrpc.c
+9
-0
fs/afs/vlclient.c
fs/afs/vlclient.c
+10
-10
include/trace/events/afs.h
include/trace/events/afs.h
+21
-0
未找到文件。
fs/afs/cmservice.c
浏览文件 @
5f702c8e
...
...
@@ -201,7 +201,7 @@ static int afs_deliver_cb_callback(struct afs_call *call)
call
->
count
=
ntohl
(
call
->
tmp
);
_debug
(
"FID count: %u"
,
call
->
count
);
if
(
call
->
count
>
AFSCBMAX
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
call
->
buffer
=
kmalloc
(
call
->
count
*
3
*
4
,
GFP_KERNEL
);
if
(
!
call
->
buffer
)
...
...
@@ -245,7 +245,7 @@ static int afs_deliver_cb_callback(struct afs_call *call)
call
->
count2
=
ntohl
(
call
->
tmp
);
_debug
(
"CB count: %u"
,
call
->
count2
);
if
(
call
->
count2
!=
call
->
count
&&
call
->
count2
!=
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
call
->
offset
=
0
;
call
->
unmarshall
++
;
...
...
fs/afs/fsclient.c
浏览文件 @
5f702c8e
...
...
@@ -126,7 +126,8 @@ void afs_update_inode_from_status(struct afs_vnode *vnode,
/*
* decode an AFSFetchStatus block
*/
static
int
xdr_decode_AFSFetchStatus
(
const
__be32
**
_bp
,
static
int
xdr_decode_AFSFetchStatus
(
struct
afs_call
*
call
,
const
__be32
**
_bp
,
struct
afs_file_status
*
status
,
struct
afs_vnode
*
vnode
,
const
afs_dataversion_t
*
expected_version
,
...
...
@@ -167,6 +168,7 @@ static int xdr_decode_AFSFetchStatus(const __be32 **_bp,
case
AFS_FTYPE_INVALID
:
if
(
abort_code
!=
0
)
{
status
->
abort_code
=
abort_code
;
ret
=
0
;
goto
out
;
}
/* Fall through */
...
...
@@ -229,7 +231,7 @@ static int xdr_decode_AFSFetchStatus(const __be32 **_bp,
bad:
xdr_dump_bad
(
*
_bp
);
ret
=
-
EBADMSG
;
ret
=
afs_protocol_error
(
call
,
-
EBADMSG
)
;
goto
out
;
}
...
...
@@ -372,9 +374,9 @@ static int afs_deliver_fs_fetch_status_vnode(struct afs_call *call)
/* unmarshall the reply once we've received all of it */
bp
=
call
->
buffer
;
if
(
xdr_decode_AFSFetchStatus
(
&
bp
,
&
vnode
->
status
,
vnode
,
if
(
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
vnode
->
status
,
vnode
,
&
call
->
expected_version
,
NULL
)
<
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
xdr_decode_AFSCallBack
(
call
,
vnode
,
&
bp
);
if
(
call
->
reply
[
1
])
xdr_decode_AFSVolSync
(
&
bp
,
call
->
reply
[
1
]);
...
...
@@ -553,9 +555,9 @@ static int afs_deliver_fs_fetch_data(struct afs_call *call)
return
ret
;
bp
=
call
->
buffer
;
if
(
xdr_decode_AFSFetchStatus
(
&
bp
,
&
vnode
->
status
,
vnode
,
if
(
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
vnode
->
status
,
vnode
,
&
vnode
->
status
.
data_version
,
req
)
<
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
xdr_decode_AFSCallBack
(
call
,
vnode
,
&
bp
);
if
(
call
->
reply
[
1
])
xdr_decode_AFSVolSync
(
&
bp
,
call
->
reply
[
1
]);
...
...
@@ -706,10 +708,10 @@ static int afs_deliver_fs_create_vnode(struct afs_call *call)
/* unmarshall the reply once we've received all of it */
bp
=
call
->
buffer
;
xdr_decode_AFSFid
(
&
bp
,
call
->
reply
[
1
]);
if
(
xdr_decode_AFSFetchStatus
(
&
bp
,
call
->
reply
[
2
],
NULL
,
NULL
,
NULL
)
<
0
||
xdr_decode_AFSFetchStatus
(
&
bp
,
&
vnode
->
status
,
vnode
,
if
(
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
call
->
reply
[
2
],
NULL
,
NULL
,
NULL
)
<
0
||
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
vnode
->
status
,
vnode
,
&
call
->
expected_version
,
NULL
)
<
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
xdr_decode_AFSCallBack_raw
(
&
bp
,
call
->
reply
[
3
]);
/* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
...
...
@@ -812,9 +814,9 @@ static int afs_deliver_fs_remove(struct afs_call *call)
/* unmarshall the reply once we've received all of it */
bp
=
call
->
buffer
;
if
(
xdr_decode_AFSFetchStatus
(
&
bp
,
&
vnode
->
status
,
vnode
,
if
(
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
vnode
->
status
,
vnode
,
&
call
->
expected_version
,
NULL
)
<
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
/* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
_leave
(
" = 0 [done]"
);
...
...
@@ -902,10 +904,10 @@ static int afs_deliver_fs_link(struct afs_call *call)
/* unmarshall the reply once we've received all of it */
bp
=
call
->
buffer
;
if
(
xdr_decode_AFSFetchStatus
(
&
bp
,
&
vnode
->
status
,
vnode
,
NULL
,
NULL
)
<
0
||
xdr_decode_AFSFetchStatus
(
&
bp
,
&
dvnode
->
status
,
dvnode
,
if
(
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
vnode
->
status
,
vnode
,
NULL
,
NULL
)
<
0
||
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
dvnode
->
status
,
dvnode
,
&
call
->
expected_version
,
NULL
)
<
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
/* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
_leave
(
" = 0 [done]"
);
...
...
@@ -989,10 +991,10 @@ static int afs_deliver_fs_symlink(struct afs_call *call)
/* unmarshall the reply once we've received all of it */
bp
=
call
->
buffer
;
xdr_decode_AFSFid
(
&
bp
,
call
->
reply
[
1
]);
if
(
xdr_decode_AFSFetchStatus
(
&
bp
,
call
->
reply
[
2
],
NULL
,
NULL
,
NULL
)
||
xdr_decode_AFSFetchStatus
(
&
bp
,
&
vnode
->
status
,
vnode
,
if
(
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
call
->
reply
[
2
],
NULL
,
NULL
,
NULL
)
||
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
vnode
->
status
,
vnode
,
&
call
->
expected_version
,
NULL
)
<
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
/* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
_leave
(
" = 0 [done]"
);
...
...
@@ -1095,13 +1097,13 @@ static int afs_deliver_fs_rename(struct afs_call *call)
/* unmarshall the reply once we've received all of it */
bp
=
call
->
buffer
;
if
(
xdr_decode_AFSFetchStatus
(
&
bp
,
&
orig_dvnode
->
status
,
orig_dvnode
,
if
(
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
orig_dvnode
->
status
,
orig_dvnode
,
&
call
->
expected_version
,
NULL
)
<
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
if
(
new_dvnode
!=
orig_dvnode
&&
xdr_decode_AFSFetchStatus
(
&
bp
,
&
new_dvnode
->
status
,
new_dvnode
,
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
new_dvnode
->
status
,
new_dvnode
,
&
call
->
expected_version_2
,
NULL
)
<
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
/* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
_leave
(
" = 0 [done]"
);
...
...
@@ -1204,9 +1206,9 @@ static int afs_deliver_fs_store_data(struct afs_call *call)
/* unmarshall the reply once we've received all of it */
bp
=
call
->
buffer
;
if
(
xdr_decode_AFSFetchStatus
(
&
bp
,
&
vnode
->
status
,
vnode
,
if
(
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
vnode
->
status
,
vnode
,
&
call
->
expected_version
,
NULL
)
<
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
/* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
afs_pages_written_back
(
vnode
,
call
);
...
...
@@ -1380,9 +1382,9 @@ static int afs_deliver_fs_store_status(struct afs_call *call)
/* unmarshall the reply once we've received all of it */
bp
=
call
->
buffer
;
if
(
xdr_decode_AFSFetchStatus
(
&
bp
,
&
vnode
->
status
,
vnode
,
if
(
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
vnode
->
status
,
vnode
,
&
call
->
expected_version
,
NULL
)
<
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
/* xdr_decode_AFSVolSync(&bp, call->reply[X]); */
_leave
(
" = 0 [done]"
);
...
...
@@ -1585,7 +1587,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call)
call
->
count
=
ntohl
(
call
->
tmp
);
_debug
(
"volname length: %u"
,
call
->
count
);
if
(
call
->
count
>=
AFSNAMEMAX
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
call
->
offset
=
0
;
call
->
unmarshall
++
;
...
...
@@ -1632,7 +1634,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call)
call
->
count
=
ntohl
(
call
->
tmp
);
_debug
(
"offline msg length: %u"
,
call
->
count
);
if
(
call
->
count
>=
AFSNAMEMAX
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
call
->
offset
=
0
;
call
->
unmarshall
++
;
...
...
@@ -1679,7 +1681,7 @@ static int afs_deliver_fs_get_volume_status(struct afs_call *call)
call
->
count
=
ntohl
(
call
->
tmp
);
_debug
(
"motd length: %u"
,
call
->
count
);
if
(
call
->
count
>=
AFSNAMEMAX
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
call
->
offset
=
0
;
call
->
unmarshall
++
;
...
...
@@ -2082,7 +2084,7 @@ static int afs_deliver_fs_fetch_status(struct afs_call *call)
/* unmarshall the reply once we've received all of it */
bp
=
call
->
buffer
;
xdr_decode_AFSFetchStatus
(
&
bp
,
status
,
vnode
,
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
status
,
vnode
,
&
call
->
expected_version
,
NULL
);
callback
[
call
->
count
].
version
=
ntohl
(
bp
[
0
]);
callback
[
call
->
count
].
expiry
=
ntohl
(
bp
[
1
]);
...
...
@@ -2179,7 +2181,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call)
tmp
=
ntohl
(
call
->
tmp
);
_debug
(
"status count: %u/%u"
,
tmp
,
call
->
count2
);
if
(
tmp
!=
call
->
count2
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
call
->
count
=
0
;
call
->
unmarshall
++
;
...
...
@@ -2194,10 +2196,10 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call)
bp
=
call
->
buffer
;
statuses
=
call
->
reply
[
1
];
if
(
xdr_decode_AFSFetchStatus
(
&
bp
,
&
statuses
[
call
->
count
],
if
(
xdr_decode_AFSFetchStatus
(
call
,
&
bp
,
&
statuses
[
call
->
count
],
call
->
count
==
0
?
vnode
:
NULL
,
NULL
,
NULL
)
<
0
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
call
->
count
++
;
if
(
call
->
count
<
call
->
count2
)
...
...
@@ -2217,7 +2219,7 @@ static int afs_deliver_fs_inline_bulk_status(struct afs_call *call)
tmp
=
ntohl
(
call
->
tmp
);
_debug
(
"CB count: %u"
,
tmp
);
if
(
tmp
!=
call
->
count2
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
call
->
count
=
0
;
call
->
unmarshall
++
;
more_cbs:
...
...
fs/afs/inode.c
浏览文件 @
5f702c8e
...
...
@@ -82,7 +82,7 @@ static int afs_inode_init_from_status(struct afs_vnode *vnode, struct key *key)
default:
printk
(
"kAFS: AFS vnode with undefined type
\n
"
);
read_sequnlock_excl
(
&
vnode
->
cb_lock
);
return
-
EBADMSG
;
return
afs_protocol_error
(
NULL
,
-
EBADMSG
)
;
}
inode
->
i_blocks
=
0
;
...
...
fs/afs/internal.h
浏览文件 @
5f702c8e
...
...
@@ -875,6 +875,7 @@ extern void afs_flat_call_destructor(struct afs_call *);
extern
void
afs_send_empty_reply
(
struct
afs_call
*
);
extern
void
afs_send_simple_reply
(
struct
afs_call
*
,
const
void
*
,
size_t
);
extern
int
afs_extract_data
(
struct
afs_call
*
,
void
*
,
size_t
,
bool
);
extern
int
afs_protocol_error
(
struct
afs_call
*
,
int
);
static
inline
int
afs_transfer_reply
(
struct
afs_call
*
call
)
{
...
...
fs/afs/rxrpc.c
浏览文件 @
5f702c8e
...
...
@@ -926,3 +926,12 @@ int afs_extract_data(struct afs_call *call, void *buf, size_t count,
afs_set_call_complete
(
call
,
ret
,
remote_abort
);
return
ret
;
}
/*
* Log protocol error production.
*/
noinline
int
afs_protocol_error
(
struct
afs_call
*
call
,
int
error
)
{
trace_afs_protocol_error
(
call
,
error
,
__builtin_return_address
(
0
));
return
error
;
}
fs/afs/vlclient.c
浏览文件 @
5f702c8e
...
...
@@ -450,7 +450,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
call
->
count2
=
ntohl
(
*
bp
);
/* Type or next count */
if
(
call
->
count
>
YFS_MAXENDPOINTS
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
alist
=
afs_alloc_addrlist
(
call
->
count
,
FS_SERVICE
,
AFS_FS_PORT
);
if
(
!
alist
)
...
...
@@ -474,7 +474,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
size
=
sizeof
(
__be32
)
*
(
1
+
4
+
1
);
break
;
default:
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
}
size
+=
sizeof
(
__be32
);
...
...
@@ -487,18 +487,18 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
switch
(
call
->
count2
)
{
case
YFS_ENDPOINT_IPV4
:
if
(
ntohl
(
bp
[
0
])
!=
sizeof
(
__be32
)
*
2
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
afs_merge_fs_addr4
(
alist
,
bp
[
1
],
ntohl
(
bp
[
2
]));
bp
+=
3
;
break
;
case
YFS_ENDPOINT_IPV6
:
if
(
ntohl
(
bp
[
0
])
!=
sizeof
(
__be32
)
*
5
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
afs_merge_fs_addr6
(
alist
,
bp
+
1
,
ntohl
(
bp
[
5
]));
bp
+=
6
;
break
;
default:
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
}
/* Got either the type of the next entry or the count of
...
...
@@ -517,7 +517,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
if
(
!
call
->
count
)
goto
end
;
if
(
call
->
count
>
YFS_MAXENDPOINTS
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
call
->
unmarshall
=
3
;
...
...
@@ -545,7 +545,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
size
=
sizeof
(
__be32
)
*
(
1
+
4
+
1
);
break
;
default:
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
}
if
(
call
->
count
>
1
)
...
...
@@ -558,16 +558,16 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
switch
(
call
->
count2
)
{
case
YFS_ENDPOINT_IPV4
:
if
(
ntohl
(
bp
[
0
])
!=
sizeof
(
__be32
)
*
2
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
bp
+=
3
;
break
;
case
YFS_ENDPOINT_IPV6
:
if
(
ntohl
(
bp
[
0
])
!=
sizeof
(
__be32
)
*
5
)
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
bp
+=
6
;
break
;
default:
return
-
EBADMSG
;
return
afs_protocol_error
(
call
,
-
EBADMSG
)
;
}
/* Got either the type of the next entry or the count of
...
...
include/trace/events/afs.h
浏览文件 @
5f702c8e
...
...
@@ -554,6 +554,27 @@ TRACE_EVENT(afs_edit_dir,
__entry
->
name
)
);
TRACE_EVENT
(
afs_protocol_error
,
TP_PROTO
(
struct
afs_call
*
call
,
int
error
,
const
void
*
where
),
TP_ARGS
(
call
,
error
,
where
),
TP_STRUCT__entry
(
__field
(
unsigned
int
,
call
)
__field
(
int
,
error
)
__field
(
const
void
*
,
where
)
),
TP_fast_assign
(
__entry
->
call
=
call
?
call
->
debug_id
:
0
;
__entry
->
error
=
error
;
__entry
->
where
=
where
;
),
TP_printk
(
"c=%08x r=%d sp=%pSR"
,
__entry
->
call
,
__entry
->
error
,
__entry
->
where
)
);
#endif
/* _TRACE_AFS_H */
/* This part must be outside protection */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录