diff -urNp ref/drivers/md/lvm-snap.c 2.4.20pre5aa1/drivers/md/lvm-snap.c --- ref/drivers/md/lvm-snap.c Thu Aug 29 02:13:10 2002 +++ 2.4.20pre5aa1/drivers/md/lvm-snap.c Fri Aug 30 02:22:36 2002 @@ -113,6 +113,8 @@ lvm_find_exception_table(kdev_t org_dev, lv_block_exception_t * ret; int i = 0; + if (!hash_table) + BUG() ; hash_table = &hash_table[hashfn(org_dev, org_start, mask, chunk_size)]; ret = NULL; for (next = hash_table->next; next != hash_table; next = next->next) diff -urNp ref/drivers/md/lvm.c 2.4.20pre5aa1/drivers/md/lvm.c --- ref/drivers/md/lvm.c Thu Aug 29 02:13:10 2002 +++ 2.4.20pre5aa1/drivers/md/lvm.c Fri Aug 30 02:24:20 2002 @@ -1151,7 +1151,8 @@ static void __remap_snapshot(kdev_t rdev /* 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); @@ -1160,11 +1161,12 @@ static void __remap_snapshot(kdev_t rdev 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)