Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
843e8ddb
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看板
提交
843e8ddb
编写于
6月 01, 2015
作者:
J
Jens Axboe
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-4.2/core' into for-4.2/drivers
上级
75619bfa
f26cdc85
变更
24
隐藏空白更改
内联
并排
Showing
24 changed file
with
157 addition
and
302 deletion
+157
-302
block/bio-integrity.c
block/bio-integrity.c
+2
-2
block/bio.c
block/bio.c
+14
-21
block/blk-core.c
block/blk-core.c
+11
-83
block/blk-merge.c
block/blk-merge.c
+2
-1
block/blk-mq-tag.c
block/blk-mq-tag.c
+38
-0
block/blk-mq-tag.h
block/blk-mq-tag.h
+1
-0
block/blk-mq.c
block/blk-mq.c
+10
-2
drivers/md/bcache/io.c
drivers/md/bcache/io.c
+1
-1
drivers/md/dm-cache-target.c
drivers/md/dm-cache-target.c
+0
-6
drivers/md/dm-raid1.c
drivers/md/dm-raid1.c
+0
-2
drivers/md/dm-snap.c
drivers/md/dm-snap.c
+0
-1
drivers/md/dm-table.c
drivers/md/dm-table.c
+16
-9
drivers/md/dm-thin.c
drivers/md/dm-thin.c
+3
-6
drivers/md/dm-verity.c
drivers/md/dm-verity.c
+1
-1
drivers/md/dm.c
drivers/md/dm.c
+40
-131
drivers/md/dm.h
drivers/md/dm.h
+3
-2
fs/btrfs/disk-io.c
fs/btrfs/disk-io.c
+1
-1
fs/btrfs/volumes.c
fs/btrfs/volumes.c
+5
-11
fs/btrfs/volumes.h
fs/btrfs/volumes.h
+0
-2
fs/buffer.c
fs/buffer.c
+1
-2
include/linux/bio.h
include/linux/bio.h
+0
-12
include/linux/blk-mq.h
include/linux/blk-mq.h
+4
-0
include/linux/blk_types.h
include/linux/blk_types.h
+2
-0
include/linux/blkdev.h
include/linux/blkdev.h
+2
-6
未找到文件。
block/bio-integrity.c
浏览文件 @
843e8ddb
...
...
@@ -361,7 +361,7 @@ static void bio_integrity_verify_fn(struct work_struct *work)
/* Restore original bio completion handler */
bio
->
bi_end_io
=
bip
->
bip_end_io
;
bio_endio
_nodec
(
bio
,
error
);
bio_endio
(
bio
,
error
);
}
/**
...
...
@@ -388,7 +388,7 @@ void bio_integrity_endio(struct bio *bio, int error)
*/
if
(
error
)
{
bio
->
bi_end_io
=
bip
->
bip_end_io
;
bio_endio
_nodec
(
bio
,
error
);
bio_endio
(
bio
,
error
);
return
;
}
...
...
block/bio.c
浏览文件 @
843e8ddb
...
...
@@ -303,6 +303,17 @@ static void bio_chain_endio(struct bio *bio, int error)
bio_put
(
bio
);
}
/*
* Increment chain count for the bio. Make sure the CHAIN flag update
* is visible before the raised count.
*/
static
inline
void
bio_inc_remaining
(
struct
bio
*
bio
)
{
bio
->
bi_flags
|=
(
1
<<
BIO_CHAIN
);
smp_mb__before_atomic
();
atomic_inc
(
&
bio
->
__bi_remaining
);
}
/**
* bio_chain - chain bio completions
* @bio: the target bio
...
...
@@ -1756,8 +1767,10 @@ static inline bool bio_remaining_done(struct bio *bio)
BUG_ON
(
atomic_read
(
&
bio
->
__bi_remaining
)
<=
0
);
if
(
atomic_dec_and_test
(
&
bio
->
__bi_remaining
))
if
(
atomic_dec_and_test
(
&
bio
->
__bi_remaining
))
{
clear_bit
(
BIO_CHAIN
,
&
bio
->
bi_flags
);
return
true
;
}
return
false
;
}
...
...
@@ -1808,26 +1821,6 @@ void bio_endio(struct bio *bio, int error)
}
EXPORT_SYMBOL
(
bio_endio
);
/**
* bio_endio_nodec - end I/O on a bio, without decrementing bi_remaining
* @bio: bio
* @error: error, if any
*
* For code that has saved and restored bi_end_io; thing hard before using this
* function, probably you should've cloned the entire bio.
**/
void
bio_endio_nodec
(
struct
bio
*
bio
,
int
error
)
{
/*
* If it's not flagged as a chain, we are not going to dec the count
*/
if
(
bio_flagged
(
bio
,
BIO_CHAIN
))
bio_inc_remaining
(
bio
);
bio_endio
(
bio
,
error
);
}
EXPORT_SYMBOL
(
bio_endio_nodec
);
/**
* bio_split - split a bio
* @bio: bio to split
...
...
block/blk-core.c
浏览文件 @
843e8ddb
...
...
@@ -117,7 +117,7 @@ EXPORT_SYMBOL(blk_rq_init);
static
void
req_bio_endio
(
struct
request
*
rq
,
struct
bio
*
bio
,
unsigned
int
nbytes
,
int
error
)
{
if
(
error
)
if
(
error
&&
!
(
rq
->
cmd_flags
&
REQ_CLONE
)
)
clear_bit
(
BIO_UPTODATE
,
&
bio
->
bi_flags
);
else
if
(
!
test_bit
(
BIO_UPTODATE
,
&
bio
->
bi_flags
))
error
=
-
EIO
;
...
...
@@ -128,7 +128,8 @@ static void req_bio_endio(struct request *rq, struct bio *bio,
bio_advance
(
bio
,
nbytes
);
/* don't actually finish bio if it's part of flush sequence */
if
(
bio
->
bi_iter
.
bi_size
==
0
&&
!
(
rq
->
cmd_flags
&
REQ_FLUSH_SEQ
))
if
(
bio
->
bi_iter
.
bi_size
==
0
&&
!
(
rq
->
cmd_flags
&
(
REQ_FLUSH_SEQ
|
REQ_CLONE
)))
bio_endio
(
bio
,
error
);
}
...
...
@@ -2909,95 +2910,22 @@ int blk_lld_busy(struct request_queue *q)
}
EXPORT_SYMBOL_GPL
(
blk_lld_busy
);
/**
* blk_rq_unprep_clone - Helper function to free all bios in a cloned request
* @rq: the clone request to be cleaned up
*
* Description:
* Free all bios in @rq for a cloned request.
*/
void
blk_rq_unprep_clone
(
struct
request
*
rq
)
{
struct
bio
*
bio
;
while
((
bio
=
rq
->
bio
)
!=
NULL
)
{
rq
->
bio
=
bio
->
bi_next
;
bio_put
(
bio
);
}
}
EXPORT_SYMBOL_GPL
(
blk_rq_unprep_clone
);
/*
* Copy attributes of the original request to the clone request.
* The actual data parts (e.g. ->cmd, ->sense) are not copied.
*/
static
void
__blk_rq_prep_clone
(
struct
request
*
dst
,
struct
request
*
src
)
void
blk_rq_prep_clone
(
struct
request
*
dst
,
struct
request
*
src
)
{
dst
->
cpu
=
src
->
cpu
;
dst
->
cmd_flags
|=
(
src
->
cmd_flags
&
REQ_CLONE_MASK
)
|
REQ_NOMERGE
;
dst
->
cmd_flags
|=
(
src
->
cmd_flags
&
REQ_CLONE_MASK
);
dst
->
cmd_flags
|=
REQ_NOMERGE
|
REQ_CLONE
;
dst
->
cmd_type
=
src
->
cmd_type
;
dst
->
__sector
=
blk_rq_pos
(
src
);
dst
->
__data_len
=
blk_rq_bytes
(
src
);
dst
->
nr_phys_segments
=
src
->
nr_phys_segments
;
dst
->
ioprio
=
src
->
ioprio
;
dst
->
extra_len
=
src
->
extra_len
;
}
/**
* blk_rq_prep_clone - Helper function to setup clone request
* @rq: the request to be setup
* @rq_src: original request to be cloned
* @bs: bio_set that bios for clone are allocated from
* @gfp_mask: memory allocation mask for bio
* @bio_ctr: setup function to be called for each clone bio.
* Returns %0 for success, non %0 for failure.
* @data: private data to be passed to @bio_ctr
*
* Description:
* Clones bios in @rq_src to @rq, and copies attributes of @rq_src to @rq.
* The actual data parts of @rq_src (e.g. ->cmd, ->sense)
* are not copied, and copying such parts is the caller's responsibility.
* Also, pages which the original bios are pointing to are not copied
* and the cloned bios just point same pages.
* So cloned bios must be completed before original bios, which means
* the caller must complete @rq before @rq_src.
*/
int
blk_rq_prep_clone
(
struct
request
*
rq
,
struct
request
*
rq_src
,
struct
bio_set
*
bs
,
gfp_t
gfp_mask
,
int
(
*
bio_ctr
)(
struct
bio
*
,
struct
bio
*
,
void
*
),
void
*
data
)
{
struct
bio
*
bio
,
*
bio_src
;
if
(
!
bs
)
bs
=
fs_bio_set
;
__rq_for_each_bio
(
bio_src
,
rq_src
)
{
bio
=
bio_clone_fast
(
bio_src
,
gfp_mask
,
bs
);
if
(
!
bio
)
goto
free_and_out
;
if
(
bio_ctr
&&
bio_ctr
(
bio
,
bio_src
,
data
))
goto
free_and_out
;
if
(
rq
->
bio
)
{
rq
->
biotail
->
bi_next
=
bio
;
rq
->
biotail
=
bio
;
}
else
rq
->
bio
=
rq
->
biotail
=
bio
;
}
__blk_rq_prep_clone
(
rq
,
rq_src
);
return
0
;
free_and_out:
if
(
bio
)
bio_put
(
bio
);
blk_rq_unprep_clone
(
rq
);
return
-
ENOMEM
;
dst
->
bio
=
src
->
bio
;
dst
->
biotail
=
src
->
biotail
;
dst
->
cmd
=
src
->
cmd
;
dst
->
cmd_len
=
src
->
cmd_len
;
dst
->
sense
=
src
->
sense
;
}
EXPORT_SYMBOL_GPL
(
blk_rq_prep_clone
);
...
...
block/blk-merge.c
浏览文件 @
843e8ddb
...
...
@@ -589,7 +589,8 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
!
blk_write_same_mergeable
(
rq
->
bio
,
bio
))
return
false
;
if
(
q
->
queue_flags
&
(
1
<<
QUEUE_FLAG_SG_GAPS
))
{
/* Only check gaps if the bio carries data */
if
(
q
->
queue_flags
&
(
1
<<
QUEUE_FLAG_SG_GAPS
)
&&
bio_has_data
(
bio
))
{
struct
bio_vec
*
bprev
;
bprev
=
&
rq
->
biotail
->
bi_io_vec
[
rq
->
biotail
->
bi_vcnt
-
1
];
...
...
block/blk-mq-tag.c
浏览文件 @
843e8ddb
...
...
@@ -438,6 +438,39 @@ static void bt_for_each(struct blk_mq_hw_ctx *hctx,
}
}
static
void
bt_tags_for_each
(
struct
blk_mq_tags
*
tags
,
struct
blk_mq_bitmap_tags
*
bt
,
unsigned
int
off
,
busy_tag_iter_fn
*
fn
,
void
*
data
,
bool
reserved
)
{
struct
request
*
rq
;
int
bit
,
i
;
if
(
!
tags
->
rqs
)
return
;
for
(
i
=
0
;
i
<
bt
->
map_nr
;
i
++
)
{
struct
blk_align_bitmap
*
bm
=
&
bt
->
map
[
i
];
for
(
bit
=
find_first_bit
(
&
bm
->
word
,
bm
->
depth
);
bit
<
bm
->
depth
;
bit
=
find_next_bit
(
&
bm
->
word
,
bm
->
depth
,
bit
+
1
))
{
rq
=
blk_mq_tag_to_rq
(
tags
,
off
+
bit
);
fn
(
rq
,
data
,
reserved
);
}
off
+=
(
1
<<
bt
->
bits_per_word
);
}
}
void
blk_mq_all_tag_busy_iter
(
struct
blk_mq_tags
*
tags
,
busy_tag_iter_fn
*
fn
,
void
*
priv
)
{
if
(
tags
->
nr_reserved_tags
)
bt_tags_for_each
(
tags
,
&
tags
->
breserved_tags
,
0
,
fn
,
priv
,
true
);
bt_tags_for_each
(
tags
,
&
tags
->
bitmap_tags
,
tags
->
nr_reserved_tags
,
fn
,
priv
,
false
);
}
EXPORT_SYMBOL
(
blk_mq_all_tag_busy_iter
);
void
blk_mq_tag_busy_iter
(
struct
blk_mq_hw_ctx
*
hctx
,
busy_iter_fn
*
fn
,
void
*
priv
)
{
...
...
@@ -580,6 +613,11 @@ struct blk_mq_tags *blk_mq_init_tags(unsigned int total_tags,
if
(
!
tags
)
return
NULL
;
if
(
!
zalloc_cpumask_var
(
&
tags
->
cpumask
,
GFP_KERNEL
))
{
kfree
(
tags
);
return
NULL
;
}
tags
->
nr_tags
=
total_tags
;
tags
->
nr_reserved_tags
=
reserved_tags
;
...
...
block/blk-mq-tag.h
浏览文件 @
843e8ddb
...
...
@@ -44,6 +44,7 @@ struct blk_mq_tags {
struct
list_head
page_list
;
int
alloc_policy
;
cpumask_var_t
cpumask
;
};
...
...
block/blk-mq.c
浏览文件 @
843e8ddb
...
...
@@ -1525,7 +1525,6 @@ static struct blk_mq_tags *blk_mq_init_rq_map(struct blk_mq_tag_set *set,
i
++
;
}
}
return
tags
;
fail:
...
...
@@ -1821,6 +1820,7 @@ static void blk_mq_map_swqueue(struct request_queue *q)
hctx
=
q
->
mq_ops
->
map_queue
(
q
,
i
);
cpumask_set_cpu
(
i
,
hctx
->
cpumask
);
cpumask_set_cpu
(
i
,
hctx
->
tags
->
cpumask
);
ctx
->
index_hw
=
hctx
->
nr_ctx
;
hctx
->
ctxs
[
hctx
->
nr_ctx
++
]
=
ctx
;
}
...
...
@@ -2187,6 +2187,12 @@ static int blk_mq_alloc_rq_maps(struct blk_mq_tag_set *set)
return
0
;
}
struct
cpumask
*
blk_mq_tags_cpumask
(
struct
blk_mq_tags
*
tags
)
{
return
tags
->
cpumask
;
}
EXPORT_SYMBOL_GPL
(
blk_mq_tags_cpumask
);
/*
* Alloc a tag set to be associated with one or more request queues.
* May fail with EINVAL for various error conditions. May adjust the
...
...
@@ -2248,8 +2254,10 @@ void blk_mq_free_tag_set(struct blk_mq_tag_set *set)
int
i
;
for
(
i
=
0
;
i
<
set
->
nr_hw_queues
;
i
++
)
{
if
(
set
->
tags
[
i
])
if
(
set
->
tags
[
i
])
{
blk_mq_free_rq_map
(
set
,
set
->
tags
[
i
],
i
);
free_cpumask_var
(
set
->
tags
[
i
]
->
cpumask
);
}
}
kfree
(
set
->
tags
);
...
...
drivers/md/bcache/io.c
浏览文件 @
843e8ddb
...
...
@@ -55,7 +55,7 @@ static void bch_bio_submit_split_done(struct closure *cl)
s
->
bio
->
bi_end_io
=
s
->
bi_end_io
;
s
->
bio
->
bi_private
=
s
->
bi_private
;
bio_endio
_nodec
(
s
->
bio
,
0
);
bio_endio
(
s
->
bio
,
0
);
closure_debug_destroy
(
&
s
->
cl
);
mempool_free
(
s
,
s
->
p
->
bio_split_hook
);
...
...
drivers/md/dm-cache-target.c
浏览文件 @
843e8ddb
...
...
@@ -86,12 +86,6 @@ static void dm_unhook_bio(struct dm_hook_info *h, struct bio *bio)
{
bio
->
bi_end_io
=
h
->
bi_end_io
;
bio
->
bi_private
=
h
->
bi_private
;
/*
* Must bump bi_remaining to allow bio to complete with
* restored bi_end_io.
*/
bio_inc_remaining
(
bio
);
}
/*----------------------------------------------------------------*/
...
...
drivers/md/dm-raid1.c
浏览文件 @
843e8ddb
...
...
@@ -1254,8 +1254,6 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error)
dm_bio_restore
(
bd
,
bio
);
bio_record
->
details
.
bi_bdev
=
NULL
;
bio_inc_remaining
(
bio
);
queue_bio
(
ms
,
bio
,
rw
);
return
DM_ENDIO_INCOMPLETE
;
}
...
...
drivers/md/dm-snap.c
浏览文件 @
843e8ddb
...
...
@@ -1478,7 +1478,6 @@ static void pending_complete(struct dm_snap_pending_exception *pe, int success)
if
(
full_bio
)
{
full_bio
->
bi_end_io
=
pe
->
full_bio_end_io
;
full_bio
->
bi_private
=
pe
->
full_bio_private
;
bio_inc_remaining
(
full_bio
);
}
increment_pending_exceptions_done_count
();
...
...
drivers/md/dm-table.c
浏览文件 @
843e8ddb
...
...
@@ -940,21 +940,28 @@ static int dm_table_alloc_md_mempools(struct dm_table *t, struct mapped_device *
{
unsigned
type
=
dm_table_get_type
(
t
);
unsigned
per_bio_data_size
=
0
;
struct
dm_target
*
tgt
;
unsigned
i
;
if
(
unlikely
(
type
==
DM_TYPE_NONE
))
{
switch
(
type
)
{
case
DM_TYPE_BIO_BASED
:
for
(
i
=
0
;
i
<
t
->
num_targets
;
i
++
)
{
struct
dm_target
*
tgt
=
t
->
targets
+
i
;
per_bio_data_size
=
max
(
per_bio_data_size
,
tgt
->
per_bio_data_size
);
}
t
->
mempools
=
dm_alloc_bio_mempools
(
t
->
integrity_supported
,
per_bio_data_size
);
break
;
case
DM_TYPE_REQUEST_BASED
:
case
DM_TYPE_MQ_REQUEST_BASED
:
t
->
mempools
=
dm_alloc_rq_mempools
(
md
,
type
);
break
;
default:
DMWARN
(
"no table type is set, can't allocate mempools"
);
return
-
EINVAL
;
}
if
(
type
==
DM_TYPE_BIO_BASED
)
for
(
i
=
0
;
i
<
t
->
num_targets
;
i
++
)
{
tgt
=
t
->
targets
+
i
;
per_bio_data_size
=
max
(
per_bio_data_size
,
tgt
->
per_bio_data_size
);
}
t
->
mempools
=
dm_alloc_md_mempools
(
md
,
type
,
t
->
integrity_supported
,
per_bio_data_size
);
if
(
!
t
->
mempools
)
return
-
ENOMEM
;
...
...
drivers/md/dm-thin.c
浏览文件 @
843e8ddb
...
...
@@ -793,10 +793,9 @@ static void inc_remap_and_issue_cell(struct thin_c *tc,
static
void
process_prepared_mapping_fail
(
struct
dm_thin_new_mapping
*
m
)
{
if
(
m
->
bio
)
{
if
(
m
->
bio
)
m
->
bio
->
bi_end_io
=
m
->
saved_bi_end_io
;
bio_inc_remaining
(
m
->
bio
);
}
cell_error
(
m
->
tc
->
pool
,
m
->
cell
);
list_del
(
&
m
->
list
);
mempool_free
(
m
,
m
->
tc
->
pool
->
mapping_pool
);
...
...
@@ -810,10 +809,8 @@ static void process_prepared_mapping(struct dm_thin_new_mapping *m)
int
r
;
bio
=
m
->
bio
;
if
(
bio
)
{
if
(
bio
)
bio
->
bi_end_io
=
m
->
saved_bi_end_io
;
bio_inc_remaining
(
bio
);
}
if
(
m
->
err
)
{
cell_error
(
pool
,
m
->
cell
);
...
...
drivers/md/dm-verity.c
浏览文件 @
843e8ddb
...
...
@@ -459,7 +459,7 @@ static void verity_finish_io(struct dm_verity_io *io, int error)
bio
->
bi_end_io
=
io
->
orig_bi_end_io
;
bio
->
bi_private
=
io
->
orig_bi_private
;
bio_endio
_nodec
(
bio
,
error
);
bio_endio
(
bio
,
error
);
}
static
void
verity_work
(
struct
work_struct
*
w
)
...
...
drivers/md/dm.c
浏览文件 @
843e8ddb
...
...
@@ -990,57 +990,6 @@ static void clone_endio(struct bio *bio, int error)
dec_pending
(
io
,
error
);
}
/*
* Partial completion handling for request-based dm
*/
static
void
end_clone_bio
(
struct
bio
*
clone
,
int
error
)
{
struct
dm_rq_clone_bio_info
*
info
=
container_of
(
clone
,
struct
dm_rq_clone_bio_info
,
clone
);
struct
dm_rq_target_io
*
tio
=
info
->
tio
;
struct
bio
*
bio
=
info
->
orig
;
unsigned
int
nr_bytes
=
info
->
orig
->
bi_iter
.
bi_size
;
bio_put
(
clone
);
if
(
tio
->
error
)
/*
* An error has already been detected on the request.
* Once error occurred, just let clone->end_io() handle
* the remainder.
*/
return
;
else
if
(
error
)
{
/*
* Don't notice the error to the upper layer yet.
* The error handling decision is made by the target driver,
* when the request is completed.
*/
tio
->
error
=
error
;
return
;
}
/*
* I/O for the bio successfully completed.
* Notice the data completion to the upper layer.
*/
/*
* bios are processed from the head of the list.
* So the completing bio should always be rq->bio.
* If it's not, something wrong is happening.
*/
if
(
tio
->
orig
->
bio
!=
bio
)
DMERR
(
"bio completion is going in the middle of the request"
);
/*
* Update the original request.
* Do not use blk_end_request() here, because it may complete
* the original request before the clone, and break the ordering.
*/
blk_update_request
(
tio
->
orig
,
0
,
nr_bytes
);
}
static
struct
dm_rq_target_io
*
tio_from_request
(
struct
request
*
rq
)
{
return
(
rq
->
q
->
mq_ops
?
blk_mq_rq_to_pdu
(
rq
)
:
rq
->
special
);
...
...
@@ -1089,8 +1038,6 @@ static void free_rq_clone(struct request *clone, bool must_be_mapped)
WARN_ON_ONCE
(
must_be_mapped
&&
!
clone
->
q
);
blk_rq_unprep_clone
(
clone
);
if
(
md
->
type
==
DM_TYPE_MQ_REQUEST_BASED
)
/* stacked on blk-mq queue(s) */
tio
->
ti
->
type
->
release_clone_rq
(
clone
);
...
...
@@ -1821,39 +1768,13 @@ static void dm_dispatch_clone_request(struct request *clone, struct request *rq)
dm_complete_request
(
rq
,
r
);
}
static
int
dm_rq_bio_constructor
(
struct
bio
*
bio
,
struct
bio
*
bio_orig
,
void
*
data
)
static
void
setup_clone
(
struct
request
*
clone
,
struct
request
*
rq
,
struct
dm_rq_target_io
*
tio
)
{
struct
dm_rq_target_io
*
tio
=
data
;
struct
dm_rq_clone_bio_info
*
info
=
container_of
(
bio
,
struct
dm_rq_clone_bio_info
,
clone
);
info
->
orig
=
bio_orig
;
info
->
tio
=
tio
;
bio
->
bi_end_io
=
end_clone_bio
;
return
0
;
}
static
int
setup_clone
(
struct
request
*
clone
,
struct
request
*
rq
,
struct
dm_rq_target_io
*
tio
,
gfp_t
gfp_mask
)
{
int
r
;
r
=
blk_rq_prep_clone
(
clone
,
rq
,
tio
->
md
->
bs
,
gfp_mask
,
dm_rq_bio_constructor
,
tio
);
if
(
r
)
return
r
;
clone
->
cmd
=
rq
->
cmd
;
clone
->
cmd_len
=
rq
->
cmd_len
;
clone
->
sense
=
rq
->
sense
;
blk_rq_prep_clone
(
clone
,
rq
);
clone
->
end_io
=
end_clone_request
;
clone
->
end_io_data
=
tio
;
tio
->
clone
=
clone
;
return
0
;
}
static
struct
request
*
clone_rq
(
struct
request
*
rq
,
struct
mapped_device
*
md
,
...
...
@@ -1874,12 +1795,7 @@ static struct request *clone_rq(struct request *rq, struct mapped_device *md,
clone
=
tio
->
clone
;
blk_rq_init
(
NULL
,
clone
);
if
(
setup_clone
(
clone
,
rq
,
tio
,
gfp_mask
))
{
/* -ENOMEM */
if
(
alloc_clone
)
free_clone_request
(
md
,
clone
);
return
NULL
;
}
setup_clone
(
clone
,
rq
,
tio
);
return
clone
;
}
...
...
@@ -1973,11 +1889,7 @@ static int map_request(struct dm_rq_target_io *tio, struct request *rq,
}
if
(
IS_ERR
(
clone
))
return
DM_MAPIO_REQUEUE
;
if
(
setup_clone
(
clone
,
rq
,
tio
,
GFP_ATOMIC
))
{
/* -ENOMEM */
ti
->
type
->
release_clone_rq
(
clone
);
return
DM_MAPIO_REQUEUE
;
}
setup_clone
(
clone
,
rq
,
tio
);
}
switch
(
r
)
{
...
...
@@ -2431,8 +2343,6 @@ static void __bind_mempools(struct mapped_device *md, struct dm_table *t)
goto
out
;
}
BUG_ON
(
!
p
||
md
->
io_pool
||
md
->
rq_pool
||
md
->
bs
);
md
->
io_pool
=
p
->
io_pool
;
p
->
io_pool
=
NULL
;
md
->
rq_pool
=
p
->
rq_pool
;
...
...
@@ -3536,48 +3446,23 @@ int dm_noflush_suspending(struct dm_target *ti)
}
EXPORT_SYMBOL_GPL
(
dm_noflush_suspending
);
struct
dm_md_mempools
*
dm_alloc_
md_mempools
(
struct
mapped_device
*
md
,
unsigned
type
,
unsigned
integrity
,
unsigned
per_bio_data_size
)
struct
dm_md_mempools
*
dm_alloc_
bio_mempools
(
unsigned
integrity
,
unsigned
per_bio_data_size
)
{
struct
dm_md_mempools
*
pools
=
kzalloc
(
sizeof
(
*
pools
),
GFP_KERNEL
);
struct
kmem_cache
*
cachep
=
NULL
;
unsigned
int
pool_size
=
0
;
struct
dm_md_mempools
*
pools
;
unsigned
int
pool_size
=
dm_get_reserved_bio_based_ios
();
unsigned
int
front_pad
;
pools
=
kzalloc
(
sizeof
(
*
pools
),
GFP_KERNEL
);
if
(
!
pools
)
return
NULL
;
type
=
filter_md_type
(
type
,
md
);
front_pad
=
roundup
(
per_bio_data_size
,
__alignof__
(
struct
dm_target_io
))
+
offsetof
(
struct
dm_target_io
,
clone
);
switch
(
type
)
{
case
DM_TYPE_BIO_BASED
:
cachep
=
_io_cache
;
pool_size
=
dm_get_reserved_bio_based_ios
();
front_pad
=
roundup
(
per_bio_data_size
,
__alignof__
(
struct
dm_target_io
))
+
offsetof
(
struct
dm_target_io
,
clone
);
break
;
case
DM_TYPE_REQUEST_BASED
:
cachep
=
_rq_tio_cache
;
pool_size
=
dm_get_reserved_rq_based_ios
();
pools
->
rq_pool
=
mempool_create_slab_pool
(
pool_size
,
_rq_cache
);
if
(
!
pools
->
rq_pool
)
goto
out
;
/* fall through to setup remaining rq-based pools */
case
DM_TYPE_MQ_REQUEST_BASED
:
if
(
!
pool_size
)
pool_size
=
dm_get_reserved_rq_based_ios
();
front_pad
=
offsetof
(
struct
dm_rq_clone_bio_info
,
clone
);
/* per_bio_data_size is not used. See __bind_mempools(). */
WARN_ON
(
per_bio_data_size
!=
0
);
break
;
default:
BUG
();
}
if
(
cachep
)
{
pools
->
io_pool
=
mempool_create_slab_pool
(
pool_size
,
cachep
);
if
(
!
pools
->
io_pool
)
goto
out
;
}
pools
->
io_pool
=
mempool_create_slab_pool
(
pool_size
,
_io_cache
);
if
(
!
pools
->
io_pool
)
goto
out
;
pools
->
bs
=
bioset_create_nobvec
(
pool_size
,
front_pad
);
if
(
!
pools
->
bs
)
...
...
@@ -3587,10 +3472,34 @@ struct dm_md_mempools *dm_alloc_md_mempools(struct mapped_device *md, unsigned t
goto
out
;
return
pools
;
out:
dm_free_md_mempools
(
pools
);
return
NULL
;
}
struct
dm_md_mempools
*
dm_alloc_rq_mempools
(
struct
mapped_device
*
md
,
unsigned
type
)
{
unsigned
int
pool_size
=
dm_get_reserved_rq_based_ios
();
struct
dm_md_mempools
*
pools
;
pools
=
kzalloc
(
sizeof
(
*
pools
),
GFP_KERNEL
);
if
(
!
pools
)
return
NULL
;
if
(
filter_md_type
(
type
,
md
)
==
DM_TYPE_REQUEST_BASED
)
{
pools
->
rq_pool
=
mempool_create_slab_pool
(
pool_size
,
_rq_cache
);
if
(
!
pools
->
rq_pool
)
goto
out
;
}
pools
->
io_pool
=
mempool_create_slab_pool
(
pool_size
,
_rq_tio_cache
);
if
(
!
pools
->
io_pool
)
goto
out
;
return
pools
;
out:
dm_free_md_mempools
(
pools
);
return
NULL
;
}
...
...
drivers/md/dm.h
浏览文件 @
843e8ddb
...
...
@@ -222,8 +222,9 @@ void dm_kcopyd_exit(void);
/*
* Mempool operations
*/
struct
dm_md_mempools
*
dm_alloc_md_mempools
(
struct
mapped_device
*
md
,
unsigned
type
,
unsigned
integrity
,
unsigned
per_bio_data_size
);
struct
dm_md_mempools
*
dm_alloc_bio_mempools
(
unsigned
integrity
,
unsigned
per_bio_data_size
);
struct
dm_md_mempools
*
dm_alloc_rq_mempools
(
struct
mapped_device
*
md
,
unsigned
type
);
void
dm_free_md_mempools
(
struct
dm_md_mempools
*
pools
);
/*
...
...
fs/btrfs/disk-io.c
浏览文件 @
843e8ddb
...
...
@@ -1745,7 +1745,7 @@ static void end_workqueue_fn(struct btrfs_work *work)
bio
->
bi_private
=
end_io_wq
->
private
;
bio
->
bi_end_io
=
end_io_wq
->
end_io
;
kmem_cache_free
(
btrfs_end_io_wq_cache
,
end_io_wq
);
bio_endio
_nodec
(
bio
,
error
);
bio_endio
(
bio
,
error
);
}
static
int
cleaner_kthread
(
void
*
arg
)
...
...
fs/btrfs/volumes.c
浏览文件 @
843e8ddb
...
...
@@ -5585,10 +5585,10 @@ int btrfs_rmap_block(struct btrfs_mapping_tree *map_tree,
static
inline
void
btrfs_end_bbio
(
struct
btrfs_bio
*
bbio
,
struct
bio
*
bio
,
int
err
)
{
if
(
likely
(
bbio
->
flags
&
BTRFS_BIO_ORIG_BIO_SUBMITTED
))
bio_endio_nodec
(
bio
,
err
)
;
else
bio_endio
(
bio
,
err
);
bio
->
bi_private
=
bbio
->
private
;
bio
->
bi_end_io
=
bbio
->
end_io
;
bio_endio
(
bio
,
err
);
btrfs_put_bbio
(
bbio
);
}
...
...
@@ -5632,8 +5632,6 @@ static void btrfs_end_bio(struct bio *bio, int err)
bio
=
bbio
->
orig_bio
;
}
bio
->
bi_private
=
bbio
->
private
;
bio
->
bi_end_io
=
bbio
->
end_io
;
btrfs_io_bio
(
bio
)
->
mirror_num
=
bbio
->
mirror_num
;
/* only send an error to the higher layers if it is
* beyond the tolerance of the btrfs bio
...
...
@@ -5815,8 +5813,6 @@ static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical)
/* Shoud be the original bio. */
WARN_ON
(
bio
!=
bbio
->
orig_bio
);
bio
->
bi_private
=
bbio
->
private
;
bio
->
bi_end_io
=
bbio
->
end_io
;
btrfs_io_bio
(
bio
)
->
mirror_num
=
bbio
->
mirror_num
;
bio
->
bi_iter
.
bi_sector
=
logical
>>
9
;
...
...
@@ -5897,10 +5893,8 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio,
if
(
dev_nr
<
total_devs
-
1
)
{
bio
=
btrfs_bio_clone
(
first_bio
,
GFP_NOFS
);
BUG_ON
(
!
bio
);
/* -ENOMEM */
}
else
{
}
else
bio
=
first_bio
;
bbio
->
flags
|=
BTRFS_BIO_ORIG_BIO_SUBMITTED
;
}
submit_stripe_bio
(
root
,
bbio
,
bio
,
bbio
->
stripes
[
dev_nr
].
physical
,
dev_nr
,
rw
,
...
...
fs/btrfs/volumes.h
浏览文件 @
843e8ddb
...
...
@@ -292,8 +292,6 @@ struct btrfs_bio_stripe {
struct
btrfs_bio
;
typedef
void
(
btrfs_bio_end_io_t
)
(
struct
btrfs_bio
*
bio
,
int
err
);
#define BTRFS_BIO_ORIG_BIO_SUBMITTED (1 << 0)
struct
btrfs_bio
{
atomic_t
refs
;
atomic_t
stripes_pending
;
...
...
fs/buffer.c
浏览文件 @
843e8ddb
...
...
@@ -2996,7 +2996,6 @@ void guard_bio_eod(int rw, struct bio *bio)
int
_submit_bh
(
int
rw
,
struct
buffer_head
*
bh
,
unsigned
long
bio_flags
)
{
struct
bio
*
bio
;
int
ret
=
0
;
BUG_ON
(
!
buffer_locked
(
bh
));
BUG_ON
(
!
buffer_mapped
(
bh
));
...
...
@@ -3038,7 +3037,7 @@ int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags)
rw
|=
REQ_PRIO
;
submit_bio
(
rw
,
bio
);
return
ret
;
return
0
;
}
EXPORT_SYMBOL_GPL
(
_submit_bh
);
...
...
include/linux/bio.h
浏览文件 @
843e8ddb
...
...
@@ -427,7 +427,6 @@ static inline struct bio *bio_clone_kmalloc(struct bio *bio, gfp_t gfp_mask)
}
extern
void
bio_endio
(
struct
bio
*
,
int
);
extern
void
bio_endio_nodec
(
struct
bio
*
,
int
);
struct
request_queue
;
extern
int
bio_phys_segments
(
struct
request_queue
*
,
struct
bio
*
);
...
...
@@ -658,17 +657,6 @@ static inline struct bio *bio_list_get(struct bio_list *bl)
return
bio
;
}
/*
* Increment chain count for the bio. Make sure the CHAIN flag update
* is visible before the raised count.
*/
static
inline
void
bio_inc_remaining
(
struct
bio
*
bio
)
{
bio
->
bi_flags
|=
(
1
<<
BIO_CHAIN
);
smp_mb__before_atomic
();
atomic_inc
(
&
bio
->
__bi_remaining
);
}
/*
* bio_set is used to allow other portions of the IO system to
* allocate their own private memory pools for bio and iovec structures.
...
...
include/linux/blk-mq.h
浏览文件 @
843e8ddb
...
...
@@ -96,6 +96,7 @@ typedef void (exit_request_fn)(void *, struct request *, unsigned int,
typedef
void
(
busy_iter_fn
)(
struct
blk_mq_hw_ctx
*
,
struct
request
*
,
void
*
,
bool
);
typedef
void
(
busy_tag_iter_fn
)(
struct
request
*
,
void
*
,
bool
);
struct
blk_mq_ops
{
/*
...
...
@@ -182,6 +183,7 @@ bool blk_mq_can_queue(struct blk_mq_hw_ctx *);
struct
request
*
blk_mq_alloc_request
(
struct
request_queue
*
q
,
int
rw
,
gfp_t
gfp
,
bool
reserved
);
struct
request
*
blk_mq_tag_to_rq
(
struct
blk_mq_tags
*
tags
,
unsigned
int
tag
);
struct
cpumask
*
blk_mq_tags_cpumask
(
struct
blk_mq_tags
*
tags
);
enum
{
BLK_MQ_UNIQUE_TAG_BITS
=
16
,
...
...
@@ -224,6 +226,8 @@ void blk_mq_run_hw_queues(struct request_queue *q, bool async);
void
blk_mq_delay_queue
(
struct
blk_mq_hw_ctx
*
hctx
,
unsigned
long
msecs
);
void
blk_mq_tag_busy_iter
(
struct
blk_mq_hw_ctx
*
hctx
,
busy_iter_fn
*
fn
,
void
*
priv
);
void
blk_mq_all_tag_busy_iter
(
struct
blk_mq_tags
*
tags
,
busy_tag_iter_fn
*
fn
,
void
*
priv
);
void
blk_mq_freeze_queue
(
struct
request_queue
*
q
);
void
blk_mq_unfreeze_queue
(
struct
request_queue
*
q
);
void
blk_mq_freeze_queue_start
(
struct
request_queue
*
q
);
...
...
include/linux/blk_types.h
浏览文件 @
843e8ddb
...
...
@@ -192,6 +192,7 @@ enum rq_flag_bits {
__REQ_HASHED
,
/* on IO scheduler merge hash */
__REQ_MQ_INFLIGHT
,
/* track inflight for MQ */
__REQ_NO_TIMEOUT
,
/* requests may never expire */
__REQ_CLONE
,
/* cloned bios */
__REQ_NR_BITS
,
/* stops here */
};
...
...
@@ -246,5 +247,6 @@ enum rq_flag_bits {
#define REQ_HASHED (1ULL << __REQ_HASHED)
#define REQ_MQ_INFLIGHT (1ULL << __REQ_MQ_INFLIGHT)
#define REQ_NO_TIMEOUT (1ULL << __REQ_NO_TIMEOUT)
#define REQ_CLONE (1ULL << __REQ_CLONE)
#endif
/* __LINUX_BLK_TYPES_H */
include/linux/blkdev.h
浏览文件 @
843e8ddb
...
...
@@ -775,11 +775,7 @@ extern void blk_add_request_payload(struct request *rq, struct page *page,
unsigned
int
len
);
extern
int
blk_rq_check_limits
(
struct
request_queue
*
q
,
struct
request
*
rq
);
extern
int
blk_lld_busy
(
struct
request_queue
*
q
);
extern
int
blk_rq_prep_clone
(
struct
request
*
rq
,
struct
request
*
rq_src
,
struct
bio_set
*
bs
,
gfp_t
gfp_mask
,
int
(
*
bio_ctr
)(
struct
bio
*
,
struct
bio
*
,
void
*
),
void
*
data
);
extern
void
blk_rq_unprep_clone
(
struct
request
*
rq
);
extern
void
blk_rq_prep_clone
(
struct
request
*
rq
,
struct
request
*
rq_src
);
extern
int
blk_insert_cloned_request
(
struct
request_queue
*
q
,
struct
request
*
rq
);
extern
void
blk_delay_queue
(
struct
request_queue
*
,
unsigned
long
);
...
...
@@ -907,7 +903,7 @@ static inline unsigned int blk_rq_get_max_sectors(struct request *rq)
if
(
unlikely
(
rq
->
cmd_type
==
REQ_TYPE_BLOCK_PC
))
return
q
->
limits
.
max_hw_sectors
;
if
(
!
q
->
limits
.
chunk_sectors
)
if
(
!
q
->
limits
.
chunk_sectors
||
(
rq
->
cmd_flags
&
REQ_DISCARD
)
)
return
blk_queue_get_max_sectors
(
q
,
rq
->
cmd_flags
);
return
min
(
blk_max_size_offset
(
q
,
blk_rq_pos
(
rq
)),
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录