diff -urNp --exclude CVS --exclude BitKeeper x-ref/drivers/md/lvm-snap.c x/drivers/md/lvm-snap.c --- x-ref/drivers/md/lvm-snap.c 2003-09-22 08:04:59.000000000 +0200 +++ x/drivers/md/lvm-snap.c 2003-09-23 02:29:32.000000000 +0200 @@ -120,6 +120,8 @@ static inline lv_block_exception_t *lvm_ 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; diff -urNp --exclude CVS --exclude BitKeeper x-ref/drivers/md/lvm.c x/drivers/md/lvm.c --- x-ref/drivers/md/lvm.c 2003-09-22 08:04:59.000000000 +0200 +++ x/drivers/md/lvm.c 2003-09-23 02:30:04.000000000 +0200 @@ -1183,7 +1183,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); @@ -1193,11 +1194,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)