diff -urN 2.4.19pre2/drivers/md/lvm-snap.c lvm/drivers/md/lvm-snap.c --- 2.4.19pre2/drivers/md/lvm-snap.c Fri Mar 1 00:09:33 2002 +++ lvm/drivers/md/lvm-snap.c Sun Mar 10 07:36:03 2002 @@ -112,6 +112,8 @@ 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 -urN 2.4.19pre2/drivers/md/lvm.c lvm/drivers/md/lvm.c --- 2.4.19pre2/drivers/md/lvm.c Fri Mar 1 00:09:33 2002 +++ lvm/drivers/md/lvm.c Sun Mar 10 07:37:01 2002 @@ -1147,7 +1147,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); @@ -1157,11 +1158,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)