projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
e6e6d07
)
bio-integrity: Do not allocate integrity context for bio w/o data
author
Dmitry Monakhov
<dmonakhov@openvz.org>
Wed, 10 May 2017 15:20:44 +0000
(19:20 +0400)
committer
Jens Axboe
<axboe@fb.com>
Sat, 3 Jun 2017 13:36:27 +0000
(07:36 -0600)
If bio has no data, such as ones from blkdev_issue_flush(),
then we have nothing to protect.
This patch prevent bugon like follows:
kfree_debugcheck: out of range ptr ac1fa1d106742a5ah
kernel BUG at mm/slab.c:2773!
invalid opcode: 0000 [#1] SMP
Modules linked in: bcache
CPU: 0 PID: 4428 Comm: xfs_io Tainted: G W
4.11.0-rc4-ext4-00041-g2ef0043
-dirty #43
Hardware name: Virtuozzo KVM, BIOS seabios-1.7.5-11.vz7.4 04/01/2014
task:
ffff880137786440
task.stack:
ffffc90000ba8000
RIP: 0010:kfree_debugcheck+0x25/0x2a
RSP: 0018:
ffffc90000babde0
EFLAGS:
00010082
RAX:
0000000000000034
RBX:
ac1fa1d106742a5a
RCX:
0000000000000007
RDX:
0000000000000000
RSI:
0000000000000000
RDI:
ffff88013f3ccb40
RBP:
ffffc90000babde8
R08:
0000000000000000
R09:
0000000000000000
R10:
00000000fcb76420
R11:
00000000725172ed
R12:
0000000000000282
R13:
ffffffff8150e766
R14:
ffff88013a145e00
R15:
0000000000000001
FS:
00007fb09384bf40
(0000) GS:
ffff88013f200000
(0000) knlGS:
0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
CR2:
00007fd0172f9e40
CR3:
0000000137fa9000
CR4:
00000000000006f0
Call Trace:
kfree+0xc8/0x1b3
bio_integrity_free+0xc3/0x16b
bio_free+0x25/0x66
bio_put+0x14/0x26
blkdev_issue_flush+0x7a/0x85
blkdev_fsync+0x35/0x42
vfs_fsync_range+0x8e/0x9f
vfs_fsync+0x1c/0x1e
do_fsync+0x31/0x4a
SyS_fsync+0x10/0x14
entry_SYSCALL_64_fastpath+0x1f/0xc2
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/bio-integrity.c
patch
|
blob
|
history
diff --git
a/block/bio-integrity.c
b/block/bio-integrity.c
index 5384713d48bc9929e2a4dc8b1b9f22b2e1c5bcd3..b5009a896a7faa1dfc9fe4320181798cc42ccfa5 100644
(file)
--- a/
block/bio-integrity.c
+++ b/
block/bio-integrity.c
@@
-175,6
+175,9
@@
bool bio_integrity_enabled(struct bio *bio)
if (bio_op(bio) != REQ_OP_READ && bio_op(bio) != REQ_OP_WRITE)
return false;
+ if (!bio_sectors(bio))
+ return false;
+
/* Already protected? */
if (bio_integrity(bio))
return false;