401 Star 1.4K Fork 1.3K

GVPopenEuler / kernel

 / 详情

【OLK 5.10】修复nbd异常参数告警问题

已完成
任务
创建于  
2022-04-11 11:25

问题:
el0_svc_handler+0x190/0x260 arch/arm64/kernel/syscall.c:190
el0_svc+0x10/0x218 arch/arm64/kernel/entry.S:1017
kobject_add_internal failed for 43:0 with -EEXIST, don't try to register things with the same name in the same directory.
------------[ cut here ]------------
WARNING: CPU: 0 PID: 239 at block/genhd.c:724 __device_add_disk+0xb98/0xdf8 block/genhd.c:724
Modules linked in:

问题分析:
nbd_genl_connect
(获取index)
nbd_dev_add(传入巨大负数index,check的时候进行左移比较,仍可正常创建,index值可能与已有的index重复);

int first_minor = index << part_shift;

/*
 * Too big index can cause duplicate creation of sysfs files/links,
 * because MKDEV() expect that the max first minor is MINORMASK, or
 * index << part_shift can overflow.
 */
if (first_minor < index || first_minor > MINORMASK)
	return -EINVAL;

    当巨大的负值左移时,有可能将其左移成正数,可能与原index重复,导致异常

问题复现:
构造问题场景:
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index a35189098581..3773bcf83993 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -1702,8 +1702,14 @@ static int nbd_dev_add(int index)
struct gendisk *disk;
struct request_queue *q;
int err = -ENOMEM;

  •   int first_minor = index << part_shift;
    
  •   printk("%s index %d %d\n", __func__, index,  MINORMASK);
    
  •   if (index == 1) {
    
  •           index = -2147483648;
    
  •   }
    
  •   int first_minor = index << part_shift;
    
  •   printk("first_minor %d\n", first_minor);
      /*
       * Too big index can cause duplicate creation of sysfs files/links,
       * because MKDEV() expect that the max first minor is MINORMASK, or
    

@@ -1854,6 +1860,7 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)
printk(KERN_ERR "nbd: must specify a size in bytes for the device\n");
return -EINVAL;
}
+

复现结果如下:

localhost login: [ 28.306327] nbd_dev_add index 0 1048575
[ 28.307030] first_minor 0
[ 28.309128] nbd_dev_add index 1 1048575
[ 28.309812] first_minor 0
[ 28.310589] sysfs: cannot create duplicate filename '/devices/virtual/bdi/43:0'
[ 28.311837] CPU: 25 PID: 1166 Comm: modprobe Not tainted 4.19.90-dirty #145
[ 28.313010] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20190727_073836-buildvm-ppc64le-16.ppc.fedoraproject.org-3.fc31 04/01/2014
[ 28.315252] Call Trace:
[ 28.315699] dump_stack+0xd4/0x10f
[ 28.316284] sysfs_warn_dup.cold+0x27/0x45
[ 28.316982] sysfs_create_dir_ns+0xec/0x110
[ 28.317682] kobject_add_internal+0x127/0x520
[ 28.318422] kobject_add_varg+0x39/0x50
[ 28.319073] kobject_add+0x60/0x90
[ 28.319649] ? mutex_lock+0x16/0x60
[ 28.320240] ? get_device_parent.isra.0+0x106/0x310
[ 28.321070] device_add+0x1ae/0xb10
[ 28.321665] bdi_register_va+0x10b/0x430
[ 28.322329] bdi_register+0x5b/0x80
[ 28.322923] ? vsnprintf+0x440/0x7d0
[ 28.323520] bdi_register_owner+0x34/0x80
[ 28.324197] __device_add_disk+0x52b/0x6a0
[ 28.324900] device_add_disk+0x17/0x20
[ 28.325533] nbd_dev_add+0x370/0x3cf [nbd]
[ 28.326225] ? 0xffffffffc0368000
[ 28.326783] nbd_init+0x18a/0x1000 [nbd]
[ 28.327442] do_one_initcall+0x7b/0x33f
[ 28.328088] ? gcov_event+0x70/0x676
[ 28.328690] do_init_module+0xa6/0x340
[ 28.329328] load_module+0x2132/0x24d0
[ 28.329969] ? __do_sys_finit_module+0x13a/0x190
[ 28.330732] __do_sys_finit_module+0x13a/0x190
[ 28.331481] __x64_sys_finit_module+0x1e/0x30
[ 28.332215] do_syscall_64+0xc1/0x250
[ 28.332838] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[ 28.333682] RIP: 0033:0x7f2fdedbc4e9
[ 28.334279] Code: 00 f3 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 6f 39 2c 00 f7 d8 64 89 01 48
[ 28.337318] RSP: 002b:00007fff2a5cac68 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ 28.338576] RAX: ffffffffffffffda RBX: 00005563cf1473d0 RCX: 00007f2fdedbc4e9
[ 28.339759] RDX: 0000000000000000 RSI: 00005563cee1bc26 RDI: 0000000000000003
[ 28.340932] RBP: 00005563cee1bc26 R08: 0000000000000000 R09: 0000000000000000
[ 28.342099] R10: 0000000000000003 R11: 0000000000000246 R12: 0000000000000000
[ 28.343171] R13: 00005563cf147360 R14: 0000000000040000 R15: 00005563cf1473d0
[ 28.344130] kobject_add_internal failed for 43:0 with -EEXIST, don't try to register things with the same name in the same directory.
[ 28.345695] ------------[ cut here ]------------
[ 28.346334] WARNING: CPU: 25 PID: 1166 at block/genhd.c:725 __device_add_disk.cold+0x40/0x150
[ 28.347444] Modules linked in: nbd(+)
[ 28.347941] CPU: 25 PID: 1166 Comm: modprobe Not tainted 4.19.90-dirty #145
[ 28.348851] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20190727_073836-buildvm-ppc64le-16.ppc.fedoraproject.org-3.fc31 04/01/2014
[ 28.350579] RIP: 0010:__device_add_disk.cold+0x40/0x150
[ 28.351268] Code: ff 48 83 05 76 7b 8e 04 01 e9 95 ea ff ff 48 c7 c7 90 2c be 9e 48 83 05 6a 6c 8e 04 01 e8 13 b2 7a ff 48 83 05 65 6c 8e 04 01 <0f> 0b 48 83 05 63 6c 8e 04 01 48 83 05 63 6c 8e 04 01 e9 29 ed ff
[ 28.353701] RSP: 0018:ffffc900084e7c28 EFLAGS: 00010202
[ 28.354388] RAX: 0000000000000024 RBX: 0000000000000000 RCX: 0000000000000000
[ 28.355323] RDX: 0000000000000000 RSI: ffff88900f255bf8 RDI: ffff88900f255bf8
[ 28.356253] RBP: ffff88810845c000 R08: ffff88900f255bf8 R09: 0000000000000005
[ 28.357186] R10: 00000000000003df R11: ffffffff9feb6f4d R12: 0000000000000001
[ 28.358117] R13: ffff88810845c00c R14: 0000000000000000 R15: ffff88810845c070
[ 28.359050] FS: 00007f2fdf8e9040(0000) GS:ffff88900f240000(0000) knlGS:0000000000000000
[ 28.360103] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 28.360857] CR2: 00007f2fdee32395 CR3: 0000000123954000 CR4: 00000000000006e0
[ 28.361796] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 28.362721] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 28.363648] Call Trace:
[ 28.363978] device_add_disk+0x17/0x20
[ 28.364472] nbd_dev_add+0x370/0x3cf [nbd]
[ 28.365014] ? 0xffffffffc0368000
[ 28.365450] nbd_init+0x18a/0x1000 [nbd]
[ 28.365975] do_one_initcall+0x7b/0x33f
[ 28.366475] ? gcov_event+0x70/0x676
[ 28.366954] do_init_module+0xa6/0x340
[ 28.367443] load_module+0x2132/0x24d0
[ 28.367944] ? __do_sys_finit_module+0x13a/0x190
[ 28.368542] __do_sys_finit_module+0x13a/0x190
[ 28.369123] __x64_sys_finit_module+0x1e/0x30
[ 28.369694] do_syscall_64+0xc1/0x250
[ 28.370178] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[ 28.370838] RIP: 0033:0x7f2fdedbc4e9
[ 28.371307] Code: 00 f3 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 6f 39 2c 00 f7 d8 64 89 01 48
[ 28.373705] RSP: 002b:00007fff2a5cac68 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ 28.374680] RAX: ffffffffffffffda RBX: 00005563cf1473d0 RCX: 00007f2fdedbc4e9
[ 28.375593] RDX: 0000000000000000 RSI: 00005563cee1bc26 RDI: 0000000000000003
[ 28.376493] RBP: 00005563cee1bc26 R08: 0000000000000000 R09: 0000000000000000
[ 28.377395] R10: 0000000000000003 R11: 0000000000000246 R12: 0000000000000000
[ 28.378297] R13: 00005563cf147360 R14: 0000000000040000 R15: 00005563cf1473d0
[ 28.379202] ---[ end trace c19b64e7262f65ca ]---
[ 28.379837] sysfs: cannot create duplicate filename '/dev/block/43:0'
[ 28.380673] CPU: 25 PID: 1166 Comm: modprobe Tainted: G W 4.19.90-dirty #145
[ 28.381744] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20190727_073836-buildvm-ppc64le-16.ppc.fedoraproject.org-3.fc31 04/01/2014
[ 28.383421] Call Trace:
[ 28.383750] dump_stack+0xd4/0x10f
[ 28.384193] sysfs_warn_dup.cold+0x27/0x45
[ 28.384722] sysfs_do_create_link_sd.isra.0+0x107/0x120
[ 28.385400] sysfs_create_link+0x29/0x60
[ 28.385910] device_add+0xa87/0xb10
[ 28.386362] __device_add_disk+0x1fe/0x6a0
[ 28.386895] device_add_disk+0x17/0x20
[ 28.387381] nbd_dev_add+0x370/0x3cf [nbd]
[ 28.387918] ? 0xffffffffc0368000
[ 28.388350] nbd_init+0x18a/0x1000 [nbd]
[ 28.388860] do_one_initcall+0x7b/0x33f
[ 28.389353] ? gcov_event+0x70/0x676
[ 28.389821] do_init_module+0xa6/0x340
[ 28.390309] load_module+0x2132/0x24d0
[ 28.390798] ? __do_sys_finit_module+0x13a/0x190
[ 28.391394] __do_sys_finit_module+0x13a/0x190
[ 28.391969] __x64_sys_finit_module+0x1e/0x30
[ 28.392529] do_syscall_64+0xc1/0x250
[ 28.393015] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[ 28.393660] RIP: 0033:0x7f2fdedbc4e9
[ 28.394122] Code: 00 f3 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 6f 39 2c 00 f7 d8 64 89 01 48
[ 28.396488] RSP: 002b:00007fff2a5cac68 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ 28.397451] RAX: ffffffffffffffda RBX: 00005563cf1473d0 RCX: 00007f2fdedbc4e9
[ 28.398366] RDX: 0000000000000000 RSI: 00005563cee1bc26 RDI: 0000000000000003
[ 28.399277] RBP: 00005563cee1bc26 R08: 0000000000000000 R09: 0000000000000000
[ 28.400193] R10: 0000000000000003 R11: 0000000000000246 R12: 0000000000000000
[ 28.401107] R13: 00005563cf147360 R14: 0000000000040000 R15: 00005563cf1473d0
[ 28.402056] ------------[ cut here ]------------
[ 28.402662] WARNING: CPU: 25 PID: 1166 at fs/sysfs/group.c:115 internal_create_group+0x348/0x660
[ 28.403796] Modules linked in: nbd(+)
[ 28.404277] CPU: 25 PID: 1166 Comm: modprobe Tainted: G W 4.19.90-dirty #145
[ 28.405353] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20190727_073836-buildvm-ppc64le-16.ppc.fedoraproject.org-3.fc31 04/01/2014
[ 28.407056] RIP: 0010:internal_create_group+0x348/0x660
[ 28.407731] Code: 04 01 89 e8 eb 8f 48 83 05 b4 f9 c0 04 01 48 c7 c7 90 2c be 9e 48 83 05 c5 f9

评论 (1)

zhangwensheng 创建了任务

Hi wenSenTer, welcome to the openEuler Community.
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here.
If you have any questions, please contact the SIG: Kernel, and any of the maintainers: @YangYingliang , @pi3orama , @成坚 (CHENG Jian) , @jiaoff , @Qiuuuuu , @zhengzengkai , @Xie XiuQi

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(2)
5329419 openeuler ci bot 1632792936
C
1
https://gitee.com/openeuler/kernel.git
git@gitee.com:openeuler/kernel.git
openeuler
kernel
kernel

搜索帮助