Hi, going through dm-snap.c I made some small modifications. o Minumum hash size of 64 instead of setting hash size to 64 if the calculated size would be smaller than 1. o Only use list_entry if we are working on a list. o Check for drop_snapshot function before calling it (transient snapshots don't have one). o Use correct size prefix in status sprintf for chunk size. o Use C99 initializers. --- linux.orig/drivers/md/dm-snap.c 2004-01-10 18:07:10.000000000 +0100 +++ linux/drivers/md/dm-snap.c 2004-01-10 18:33:22.000000000 +0100 @@ -373,7 +373,7 @@ * Make this smaller than the real hash table */ hash_size >>= 3; - if (!hash_size) + if (hash_size < 64) hash_size = 64; if (init_exception_table(&s->pending, hash_size)) { @@ -675,7 +675,7 @@ remove_exception(&pe->e); flush = __flush_bios(pe); - /* Submit any pending write BHs */ + /* Submit any pending write bios */ up_write(&s->lock); flush_bios(bio_list_get(&pe->snapshot_bios)); @@ -779,7 +779,7 @@ e = lookup_exception(&s->pending, chunk); if (e) { /* cast the exception to a pending exception */ - pe = list_entry(e, struct pending_exception, e); + pe = container_of(e, struct pending_exception, e); } else { /* @@ -793,7 +793,7 @@ e = lookup_exception(&s->pending, chunk); if (e) { free_pending_exception(pe); - pe = list_entry(e, struct pending_exception, e); + pe = container_of(e, struct pending_exception, e); } else { pe->e.old_chunk = chunk; bio_list_init(&pe->origin_bios); @@ -859,7 +859,8 @@ pe = __find_pending_exception(s, bio); if (!pe) { - s->store.drop_snapshot(&s->store); + if (s->store.drop_snapshot) + s->store.drop_snapshot(&s->store); s->valid = 0; r = -EIO; up_write(&s->lock); @@ -952,7 +953,7 @@ */ format_dev_t(cow, snap->cow->bdev->bd_dev); format_dev_t(org, snap->origin->bdev->bd_dev); - snprintf(result, maxlen, "%s %s %c %lld", org, cow, + snprintf(result, maxlen, "%s %s %c " SECTOR_FORMAT, org, cow, snap->type, snap->chunk_size); break; } @@ -1165,25 +1166,25 @@ } static struct target_type origin_target = { - name: "snapshot-origin", - version: {1, 0, 1}, - module: THIS_MODULE, - ctr: origin_ctr, - dtr: origin_dtr, - map: origin_map, - resume: origin_resume, - status: origin_status, + .name = "snapshot-origin", + .version = {1, 0, 1}, + .module = THIS_MODULE, + .ctr = origin_ctr, + .dtr = origin_dtr, + .map = origin_map, + .resume = origin_resume, + .status = origin_status, }; static struct target_type snapshot_target = { - name: "snapshot", - version: {1, 0, 1}, - module: THIS_MODULE, - ctr: snapshot_ctr, - dtr: snapshot_dtr, - map: snapshot_map, - resume: snapshot_resume, - status: snapshot_status, + .name = "snapshot", + .version = {1, 0, 1}, + .module = THIS_MODULE, + .ctr = snapshot_ctr, + .dtr = snapshot_dtr, + .map = snapshot_map, + .resume = snapshot_resume, + .status = snapshot_status, }; static int __init dm_snapshot_init(void)