[dm-devel] [PATCH] dm-cache: Add handle to contlr if cache_create failed.

majianpeng majianpeng at gmail.com
Fri Mar 8 01:51:24 UTC 2013


It  ignored to judge the result of cache_create.
If cache_create failed, but the copy_ctr_args successed.
It will incur oops. Kernel messages as following:
[   73.533782] device-mapper: cache-policy: unknown policy type
[   73.533808] BUG: unable to handle kernel NULL pointer dereference at 0000000000000338
[   73.533841] IP: [<ffffffffa00bf76d>] cache_ctr+0xb2d/0xc90 [dm_cache]
[   73.533864] PGD 57caa067 PUD 56665067 PMD 0
[   73.533881] Oops: 0002 [#1] SMP
[   73.533896] Modules linked in: dm_cache dm_bio_prison dm_persistent_data dm_bufio libcrc32c fuse dm_mod dcdbas raid456 async_pq async_xor xor async_memcpy async_raid6_recov ata_piix r8169 raid6_pq
async_tx raid1
[   73.533974] CPU 0
[   73.533983] Pid: 5479, comm: dmsetup Not tainted 3.9.0-rc1+ #25 Dell Inc. OptiPlex 390/0M5DCD
[   73.534008] RIP: 0010:[<ffffffffa00bf76d>]  [<ffffffffa00bf76d>] cache_ctr+0xb2d/0xc90 [dm_cache]
[   73.534035] RSP: 0018:ffff88004dbb9b58  EFLAGS: 00010246
[   73.534051] RAX: ffffc90004552040 RBX: ffff88004db12840 RCX: 0000000000000000
[   73.534072] RDX: 0000000000000005 RSI: ffff8800500d41ba RDI: ffff880070096b8a
[   73.534092] RBP: ffff88004dbb9bf8 R08: ffff880075dd6400 R09: ffff880057c71300
[   73.534112] R10: 0000000000000005 R11: 0000000000000000 R12: 0000000000000000
[   73.534132] R13: ffff88006f932000 R14: 0000000000000005 R15: ffff880057c71300
[   73.534152] FS:  00007f60cc261700(0000) GS:ffff880075c00000(0000) knlGS:0000000000000000
[   73.534175] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[   73.534192] CR2: 0000000000000338 CR3: 000000004daea000 CR4: 00000000000407f0
[   73.534212] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[   73.534232] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[   73.534252] Process dmsetup (pid: 5479, threadinfo ffff88004dbb8000, task ffff8800659a0000)
[   73.534275] Stack:
[   73.534282]  ffff88006f932000 0000000000000000 0000000000000000 ffff88004db12840
[   73.534307]  ffffc90004552040 0000000500000000 ffff8800500d4160 0000000002800000
[   73.534333]  ffff88004dbb9bf8 ffffffffa007e91c 0000000002800000 ffff880000000000
[   73.534358] Call Trace:
[   73.534370]  [<ffffffffa007e91c>] ? dm_split_args+0x5c/0x160 [dm_mod]
[   73.534390]  [<ffffffffa007ebbc>] dm_table_add_target+0x19c/0x450 [dm_mod]
[   73.534412]  [<ffffffffa0081b24>] table_load+0xe4/0x330 [dm_mod]
[   73.534431]  [<ffffffffa0081a40>] ? list_devices+0x190/0x190 [dm_mod]
[   73.534451]  [<ffffffffa00831a6>] ctl_ioctl+0x246/0x4d0 [dm_mod]
[   73.534471]  [<ffffffff81666900>] ? __do_page_fault+0x190/0x4f0
[   73.534489]  [<ffffffffa0083443>] dm_ctl_ioctl+0x13/0x20 [dm_mod]
[   73.534508]  [<ffffffff8116ca66>] do_vfs_ioctl+0x96/0x570
[   73.534526]  [<ffffffff81267eba>] ? inode_has_perm.isra.30.constprop.62+0x2a/0x30
[   73.534547]  [<ffffffff81269797>] ? file_has_perm+0x97/0xb0
[   73.534564]  [<ffffffff8116cfd1>] sys_ioctl+0x91/0xb0
[   73.534581]  [<ffffffff812c1d6e>] ? trace_hardirqs_on_thunk+0x3a/0x3f
[   73.534600]  [<ffffffff8166b342>] system_call_fastpath+0x16/0x1b
[   73.534617] Code: 41 8d 45 ff 75 e8 4c 89 ff e8 90 43 09 e1 e9 8d fa ff ff 0f 1f 00 48 8b 9d 78 ff ff ff 4c 8b a5 70 ff ff ff 8b 55 8c 48 8b 45 80 <4d> 89 bc 24 38 03 00 00 41 89 94 24 30 03 00 00
4c 89 60 40 e9
[   73.534762] RIP  [<ffffffffa00bf76d>] cache_ctr+0xb2d/0xc90 [dm_cache]
[   73.534783]  RSP <ffff88004dbb9b58>
[   73.534794] CR2: 0000000000000338
[   73.538947] ---[ end trace 86024887f593090b ]---

Signed-off-by: Jianpeng Ma <majianpeng at gmail.com>
---
 drivers/md/dm-cache-target.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
index 0f4e84b..6cfd43d 100644
--- a/drivers/md/dm-cache-target.c
+++ b/drivers/md/dm-cache-target.c
@@ -2002,6 +2002,8 @@ static int cache_ctr(struct dm_target *ti, unsigned argc, char **argv)
         goto out;
 
     r = cache_create(ca, &cache);
+    if (r)
+        goto out;
 
     r = copy_ctr_args(cache, argc - 3, (const char **)argv + 3);
     if (r) {
-- 
1.8.2.rc2.4.g7799588




More information about the dm-devel mailing list