[PATCH] dm table: store md

Store an up-pointer to the owning struct mapped_device in every table when it
is created.

Access it with:
  struct mapped_device *dm_table_get_md(struct dm_table *t)

Tables linked to md must be destroyed before the md itself.

Signed-off-by: Mike Anderson <andmike@us.ibm.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Mike Anderson
2006-03-27 01:17:54 -08:00
committed by Linus Torvalds
parent 9ade92a9a5
commit 1134e5ae79
4 changed files with 40 additions and 17 deletions

View File

@@ -244,9 +244,9 @@ static void __hash_remove(struct hash_cell *hc)
dm_table_put(table);
}
dm_put(hc->md);
if (hc->new_map)
dm_table_put(hc->new_map);
dm_put(hc->md);
free_cell(hc);
}
@@ -985,33 +985,43 @@ static int table_load(struct dm_ioctl *param, size_t param_size)
int r;
struct hash_cell *hc;
struct dm_table *t;
struct mapped_device *md;
r = dm_table_create(&t, get_mode(param), param->target_count);
md = find_device(param);
if (!md)
return -ENXIO;
r = dm_table_create(&t, get_mode(param), param->target_count, md);
if (r)
return r;
goto out;
r = populate_table(t, param, param_size);
if (r) {
dm_table_put(t);
return r;
goto out;
}
down_write(&_hash_lock);
hc = __find_device_hash_cell(param);
if (!hc) {
DMWARN("device doesn't appear to be in the dev hash table.");
up_write(&_hash_lock);
hc = dm_get_mdptr(md);
if (!hc || hc->md != md) {
DMWARN("device has been removed from the dev hash table.");
dm_table_put(t);
return -ENXIO;
up_write(&_hash_lock);
r = -ENXIO;
goto out;
}
if (hc->new_map)
dm_table_put(hc->new_map);
hc->new_map = t;
param->flags |= DM_INACTIVE_PRESENT_FLAG;
r = __dev_status(hc->md, param);
up_write(&_hash_lock);
param->flags |= DM_INACTIVE_PRESENT_FLAG;
r = __dev_status(md, param);
out:
dm_put(md);
return r;
}