/* * Return the exception data for a sector, or NULL if not * remapped. */ static struct exception *lookup_exception(struct exception_table *et, chunk_t chunk) { struct list_head *slot; struct exception *e; slot = &et->table[exception_hash(et, chunk)]; list_for_each_entry (e, slot, hash_list) if (e->old_chunk == chunk) return e; return NULL; }
/* * Return the exception data for a sector, or NULL if not * remapped. */ static struct dm_snap_exception *lookup_exception(struct exception_table *et, chunk_t chunk) { struct list_head *slot; struct dm_snap_exception *e; slot = &et->table[exception_hash(et, chunk)]; list_for_each_entry (e, slot, hash_list) if (chunk >= e->old_chunk && chunk <= e->old_chunk + dm_consecutive_chunk_count(e)) return e; return NULL; }
static void insert_completed_exception(struct dm_snapshot *s, struct dm_snap_exception *new_e) { struct exception_table *eh = &s->complete; struct list_head *l; struct dm_snap_exception *e = NULL; l = &eh->table[exception_hash(eh, new_e->old_chunk)]; /* Add immediately if this table doesn't support consecutive chunks */ if (!eh->hash_shift) goto out; /* List is ordered by old_chunk */ list_for_each_entry_reverse(e, l, hash_list) { /* Insert after an existing chunk? */ if (new_e->old_chunk == (e->old_chunk + dm_consecutive_chunk_count(e) + 1) && new_e->new_chunk == (dm_chunk_number(e->new_chunk) + dm_consecutive_chunk_count(e) + 1)) { dm_consecutive_chunk_count_inc(e); free_exception(new_e); return; } /* Insert before an existing chunk? */ if (new_e->old_chunk == (e->old_chunk - 1) && new_e->new_chunk == (dm_chunk_number(e->new_chunk) - 1)) { dm_consecutive_chunk_count_inc(e); e->old_chunk--; e->new_chunk--; free_exception(new_e); return; } if (new_e->old_chunk > e->old_chunk) break; } out: list_add(&new_e->hash_list, e ? &e->hash_list : l); }
static void insert_exception(struct exception_table *eh, struct exception *e) { struct list_head *l = &eh->table[exception_hash(eh, e->old_chunk)]; list_add(&e->hash_list, l); }