[linux-lvm] Re: [OOPS] full snapshot (with test vfs locking patch for reiserfs snapshots in 11-pre)
Ed Tomlinson
tomlins at CAM.ORG
Tue Oct 9 01:57:59 UTC 2001
Hi Chris
> Ok, that first patch won't quite fix it, as we can still oops
> in lvm_snapshot_COW. This one works better for me:
Looks like this one has problems too. Here is the oops I get with it:
ksymoops 2.4.3 on i586 2.4.10-e1. Options used
-V (default)
-k 20011008181015.ksyms (specified)
-l 20011008181015.modules (specified)
-o /lib/modules/2.4.11-pre5 (specified)
-m /boot/System.map-2.4.11-pre5 (specified)
Unable to handle kernel NULL pointer dereference at virtual address 00000008
d680b179
*pde = 00000000
Oops: 0002
CPU: 0
EIP: 0010:[<d680b179>] Tainted: P
Using defaults from ksymoops -t elf32-i386 -a i386
EFLAGS: 00010286
eax: 00000000 ebx: d36e4000 ecx: d36e4000 edx: d36e0600
esi: d36e0600 edi: d36e0600 ebp: c4aa3d3c esp: c4aa2cb8
ds: 0018 es: 0018 ss: 0018
Process dbench (pid: 864, stackpage=c4aa3000)
Stack: c15713a0 d680a50a d36e4000 d36e0600 00003a04 00000000 00000627 0170a470
d36e0600 c4aa3d3c d680aafd d36e4000 d36e0600 d680d3cb d36e0600 0170a470
d36e4000 00000000 00000002 000003ff 00000be4 00010000 c4aa2d38 00000400
Call Trace: [<d680a50a>] [<d680aafd>] [<d680d3cb>] [<c01503d1>] [<c015d9e1>]
[<c014fcec>] [<c0158cbf>] [<c0159543>] [<c015036e>] [<c01503d1>] [<c015e32f>]
[<c015d6bf>] [<c01578ae>] [<c0157c18>] [<c01503d1>] [<c015dc6b>] [<c014ff11>]
[<c0158cbf>] [<c0159543>] [<c015036e>] [<c018a8ed>] [<c018a943>] [<c01629a3>]
[<c012e1dc>] [<c015fef7>] [<c0160700>] [<c010ffba>] [<d68071e5>] [<d68075f3>]
[<d6807695>] [<c0185b4c>] [<c0185bb1>] [<c012d4ab>] [<c012d552>] [<c012e25b>]
[<c012ebaf>] [<c012f0f7>] [<c0155975>] [<c0152f34>] [<c0122e42>] [<c012c86a>]
[<c0106d53>]
Code: c7 40 08 01 00 00 00 89 e0 50 6a 00 52 51 e8 78 fc ff ff 83
>>EIP; d680b178 <[lvm-mod]_disable_snapshot+10/44> <=====
Trace; d680a50a <[lvm-mod]lvm_drop_snapshot+22/94>
Trace; d680aafc <[lvm-mod]lvm_snapshot_COW+3b4/3f4>
Trace; d680d3ca <[lvm-mod]lvm_name+8c2/e76>
Trace; c01503d0 <do_balance_mark_leaf_dirty+54/64>
Trace; c015d9e0 <leaf_insert_into_buf+23c/248>
Trace; c014fcec <balance_leaf+2210/24e8>
Trace; c0158cbe <reiserfs_kfree+12/38>
Trace; c0159542 <unfix_nodes+146/154>
Trace; c015036e <do_balance+ea/f8>
Trace; c01503d0 <do_balance_mark_leaf_dirty+54/64>
Trace; c015e32e <leaf_delete_items_entirely+1b2/1c0>
Trace; c015d6be <leaf_delete_items+5a/140>
Trace; c01578ae <get_parents+1aa/1c0>
Trace; c0157c18 <ip_check_balance+354/aac>
Trace; c01503d0 <do_balance_mark_leaf_dirty+54/64>
Trace; c015dc6a <leaf_paste_in_buffer+27e/28c>
Trace; c014ff10 <balance_leaf+2434/24e8>
Trace; c0158cbe <reiserfs_kfree+12/38>
Trace; c0159542 <unfix_nodes+146/154>
Trace; c015036e <do_balance+ea/f8>
Trace; c018a8ec <start_request+130/1f4>
Trace; c018a942 <start_request+186/1f4>
Trace; c01629a2 <reiserfs_paste_into_item+86/e0>
Trace; c012e1dc <getblk+18/40>
Trace; c015fef6 <is_tree_node+36/54>
Trace; c0160700 <search_by_key+7ec/c44>
Trace; c010ffba <schedule+256/384>
Trace; d68071e4 <[lvm-mod]__remap_snapshot+5c/88>
Trace; d68075f2 <[lvm-mod]lvm_map+3e2/478>
Trace; d6807694 <[lvm-mod]lvm_make_request_fn+c/1c>
Trace; c0185b4c <generic_make_request+130/140>
Trace; c0185bb0 <submit_bh+54/70>
Trace; c012d4aa <write_locked_buffers+1e/28>
Trace; c012d552 <write_some_buffers+9e/110>
Trace; c012e25a <balance_dirty+12/30>
Trace; c012ebae <__block_commit_write+a2/c0>
Trace; c012f0f6 <generic_commit_write+32/5c>
Trace; c0155974 <reiserfs_commit_write+30/a8>
Trace; c0152f34 <reiserfs_get_block+0/ca0>
Trace; c0122e42 <generic_file_write+4a6/5ac>
Trace; c012c86a <sys_write+8e/c4>
Trace; c0106d52 <system_call+32/40>
Code; d680b178 <[lvm-mod]_disable_snapshot+10/44>
00000000 <_EIP>:
Code; d680b178 <[lvm-mod]_disable_snapshot+10/44> <=====
0: c7 40 08 01 00 00 00 movl $0x1,0x8(%eax) <=====
Code; d680b17e <[lvm-mod]_disable_snapshot+16/44>
7: 89 e0 mov %esp,%eax
Code; d680b180 <[lvm-mod]_disable_snapshot+18/44>
9: 50 push %eax
Code; d680b182 <[lvm-mod]_disable_snapshot+1a/44>
a: 6a 00 push $0x0
Code; d680b184 <[lvm-mod]_disable_snapshot+1c/44>
c: 52 push %edx
Code; d680b184 <[lvm-mod]_disable_snapshot+1c/44>
d: 51 push %ecx
Code; d680b186 <[lvm-mod]_disable_snapshot+1e/44>
e: e8 78 fc ff ff call fffffc8b <_EIP+0xfffffc8b> d680ae02 <[lvm-mod]lvm_snapshot_release+b6/b8>
Code; d680b18a <[lvm-mod]_disable_snapshot+22/44>
13: 83 00 00 addl $0x0,(%eax)
Needed to reiserfsck with --fix-fixable after this one...
Hope this helps.
Ed
> --- 0.21/drivers/md/lvm.c Sun, 07 Oct 2001 22:15:54 -0400
> +++ 0.21(w)/drivers/md/lvm.c Mon, 08 Oct 2001 15:54:42 -0400
> @@ -1142,7 +1142,8 @@
>
> /* we must redo lvm_snapshot_remap_block in order to avoid a
> race condition in the gap where no lock was held */
> - if (!lvm_snapshot_remap_block(&rdev, &rsector, pe_start, lv) &&
> + if (lv->lv_block_exception &&
> + !lvm_snapshot_remap_block(&rdev, &rsector, pe_start, lv) &&
> !lvm_snapshot_COW(rdev, rsector, pe_start, rsector, vg, lv))
> lvm_write_COW_table_block(vg, lv);
>
> @@ -1151,11 +1152,12 @@
>
> static inline void _remap_snapshot(kdev_t rdev, ulong rsector,
> ulong pe_start, lv_t *lv, vg_t *vg) {
> - int r;
> + int r = 0;
>
> /* check to see if this chunk is already in the snapshot */
> down_read(&lv->lv_lock);
> - r = lvm_snapshot_remap_block(&rdev, &rsector, pe_start, lv);
> + if (lv->lv_block_exception)
> + r = lvm_snapshot_remap_block(&rdev, &rsector, pe_start, lv);
> up_read(&lv->lv_lock);
>
> if (!r)
> Index: 0.21/drivers/md/lvm-snap.c
> --- 0.21/drivers/md/lvm-snap.c Sat, 06 Oct 2001 00:07:22 -0400 root
> (linux/i/c/38_lvm-snap.c 1.1.2.1.2.1 644) +++ 0.21(w)/drivers/md/lvm-snap.c
> Mon, 08 Oct 2001 15:13:10 -0400 root (linux/i/c/38_lvm-snap.c 1.1.2.1.2.1
> 644) @@ -140,6 +140,8 @@
> unsigned long mask = lv->lv_snapshot_hash_mask;
> int chunk_size = lv->lv_chunk_size;
>
> + if (!hash_table)
> + BUG() ;
> hash_table = &hash_table[hashfn(org_dev, org_start, mask, chunk_size)];
> list_add(&exception->hash, hash_table);
> }
More information about the linux-lvm
mailing list