Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
2f240c4a
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看板
提交
2f240c4a
编写于
9月 24, 2017
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
vhost/scsi: switch to iov_iter_get_pages()
Signed-off-by:
N
Al Viro
<
viro@zeniv.linux.org.uk
>
上级
11d49e9d
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
20 addition
and
48 deletion
+20
-48
drivers/vhost/scsi.c
drivers/vhost/scsi.c
+20
-48
未找到文件。
drivers/vhost/scsi.c
浏览文件 @
2f240c4a
...
@@ -210,12 +210,6 @@ static struct workqueue_struct *vhost_scsi_workqueue;
...
@@ -210,12 +210,6 @@ static struct workqueue_struct *vhost_scsi_workqueue;
static
DEFINE_MUTEX
(
vhost_scsi_mutex
);
static
DEFINE_MUTEX
(
vhost_scsi_mutex
);
static
LIST_HEAD
(
vhost_scsi_list
);
static
LIST_HEAD
(
vhost_scsi_list
);
static
int
iov_num_pages
(
void
__user
*
iov_base
,
size_t
iov_len
)
{
return
(
PAGE_ALIGN
((
unsigned
long
)
iov_base
+
iov_len
)
-
((
unsigned
long
)
iov_base
&
PAGE_MASK
))
>>
PAGE_SHIFT
;
}
static
void
vhost_scsi_done_inflight
(
struct
kref
*
kref
)
static
void
vhost_scsi_done_inflight
(
struct
kref
*
kref
)
{
{
struct
vhost_scsi_inflight
*
inflight
;
struct
vhost_scsi_inflight
*
inflight
;
...
@@ -618,48 +612,31 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg,
...
@@ -618,48 +612,31 @@ vhost_scsi_get_tag(struct vhost_virtqueue *vq, struct vhost_scsi_tpg *tpg,
*/
*/
static
int
static
int
vhost_scsi_map_to_sgl
(
struct
vhost_scsi_cmd
*
cmd
,
vhost_scsi_map_to_sgl
(
struct
vhost_scsi_cmd
*
cmd
,
void
__user
*
ptr
,
struct
iov_iter
*
iter
,
size_t
len
,
struct
scatterlist
*
sgl
,
struct
scatterlist
*
sgl
,
bool
write
)
bool
write
)
{
{
unsigned
int
npages
=
0
,
offset
,
nbytes
;
unsigned
int
pages_nr
=
iov_num_pages
(
ptr
,
len
);
struct
scatterlist
*
sg
=
sgl
;
struct
page
**
pages
=
cmd
->
tvc_upages
;
struct
page
**
pages
=
cmd
->
tvc_upages
;
int
ret
,
i
;
struct
scatterlist
*
sg
=
sgl
;
ssize_t
bytes
;
if
(
pages_nr
>
VHOST_SCSI_PREALLOC_UPAGES
)
{
size_t
offset
;
pr_err
(
"vhost_scsi_map_to_sgl() pages_nr: %u greater than"
unsigned
int
npages
=
0
;
" preallocated VHOST_SCSI_PREALLOC_UPAGES: %u
\n
"
,
pages_nr
,
VHOST_SCSI_PREALLOC_UPAGES
);
return
-
ENOBUFS
;
}
ret
=
get_user_pages_fast
((
unsigned
long
)
ptr
,
pages_nr
,
write
,
pages
);
bytes
=
iov_iter_get_pages
(
iter
,
pages
,
LONG_MAX
,
VHOST_SCSI_PREALLOC_UPAGES
,
&
offset
);
/* No pages were pinned */
/* No pages were pinned */
if
(
ret
<
0
)
if
(
bytes
<=
0
)
goto
out
;
return
bytes
<
0
?
bytes
:
-
EFAULT
;
/* Less pages pinned than wanted */
if
(
ret
!=
pages_nr
)
{
for
(
i
=
0
;
i
<
ret
;
i
++
)
put_page
(
pages
[
i
]);
ret
=
-
EFAULT
;
goto
out
;
}
while
(
len
>
0
)
{
iov_iter_advance
(
iter
,
bytes
);
offset
=
(
uintptr_t
)
ptr
&
~
PAGE_MASK
;
nbytes
=
min_t
(
unsigned
int
,
PAGE_SIZE
-
offset
,
len
);
sg_set_page
(
sg
,
pages
[
npages
],
nbytes
,
offset
);
ptr
+=
nbytes
;
len
-=
nbytes
;
sg
++
;
npages
++
;
}
out:
while
(
bytes
)
{
return
ret
;
unsigned
n
=
min_t
(
unsigned
,
PAGE_SIZE
-
offset
,
bytes
);
sg_set_page
(
sg
++
,
pages
[
npages
++
],
n
,
offset
);
bytes
-=
n
;
offset
=
0
;
}
return
npages
;
}
}
static
int
static
int
...
@@ -687,15 +664,11 @@ vhost_scsi_iov_to_sgl(struct vhost_scsi_cmd *cmd, bool write,
...
@@ -687,15 +664,11 @@ vhost_scsi_iov_to_sgl(struct vhost_scsi_cmd *cmd, bool write,
struct
iov_iter
*
iter
,
struct
iov_iter
*
iter
,
struct
scatterlist
*
sg
,
int
sg_count
)
struct
scatterlist
*
sg
,
int
sg_count
)
{
{
size_t
off
=
iter
->
iov_offset
;
struct
scatterlist
*
p
=
sg
;
struct
scatterlist
*
p
=
sg
;
int
i
,
ret
;
int
ret
;
for
(
i
=
0
;
i
<
iter
->
nr_segs
;
i
++
)
{
void
__user
*
base
=
iter
->
iov
[
i
].
iov_base
+
off
;
size_t
len
=
iter
->
iov
[
i
].
iov_len
-
off
;
ret
=
vhost_scsi_map_to_sgl
(
cmd
,
base
,
len
,
sg
,
write
);
while
(
iov_iter_count
(
iter
))
{
ret
=
vhost_scsi_map_to_sgl
(
cmd
,
iter
,
sg
,
write
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
while
(
p
<
sg
)
{
while
(
p
<
sg
)
{
struct
page
*
page
=
sg_page
(
p
++
);
struct
page
*
page
=
sg_page
(
p
++
);
...
@@ -705,7 +678,6 @@ vhost_scsi_iov_to_sgl(struct vhost_scsi_cmd *cmd, bool write,
...
@@ -705,7 +678,6 @@ vhost_scsi_iov_to_sgl(struct vhost_scsi_cmd *cmd, bool write,
return
ret
;
return
ret
;
}
}
sg
+=
ret
;
sg
+=
ret
;
off
=
0
;
}
}
return
0
;
return
0
;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录