void dm_put(struct mapped_device *md) { struct dm_table *map = dm_get_table(md); if (atomic_dec_and_test(&md->holders)) { if (!test_bit(DMF_SUSPENDED, &md->flags) && map) dm_table_suspend_targets(map); __unbind(md); free_dev(md); } dm_table_put(map); }
void dm_put(struct mapped_device *md) { struct dm_table *map = dm_get_table(md); if (atomic_dec_and_test(&md->holders)) { if (!dm_suspended(md)) { dm_table_presuspend_targets(map); dm_table_postsuspend_targets(map); } __unbind(md); free_dev(md); } dm_table_put(map); }
/* * Swap in a new table (destroying old one). */ int dm_swap_table(struct mapped_device *md, struct dm_table *table) { int r = -EINVAL; down(&md->suspend_lock); /* device must be suspended */ if (!dm_suspended(md)) goto out; __unbind(md); r = __bind(md, table); out: up(&md->suspend_lock); return r; }
/* * Swap in a new table (destroying old one). */ int dm_swap_table(struct mapped_device *md, struct dm_table *table) { int r; down_write(&md->lock); /* device must be suspended */ if (!test_bit(DMF_SUSPENDED, &md->flags)) { up_write(&md->lock); return -EPERM; } __unbind(md); r = __bind(md, table); if (r) return r; up_write(&md->lock); return 0; }
void dm_put(struct mapped_device *md) { struct dm_table *map; BUG_ON(test_bit(DMF_FREEING, &md->flags)); if (atomic_dec_and_lock(&md->holders, &_minor_lock)) { map = dm_get_table(md); idr_replace(&_minor_idr, MINOR_ALLOCED, dm_disk(md)->first_minor); set_bit(DMF_FREEING, &md->flags); spin_unlock(&_minor_lock); if (!dm_suspended(md)) { dm_table_presuspend_targets(map); dm_table_postsuspend_targets(map); } __unbind(md); dm_table_put(map); free_dev(md); } }
/* * Swap in a new table (destroying old one). */ int dm_swap_table(struct mapped_device *md, struct dm_table *table) { int r = -EINVAL; down(&md->suspend_lock); /* device must be suspended */ if (!dm_suspended(md)) goto out; /* without bdev, the device size cannot be changed */ if (!md->suspended_bdev) if (get_capacity(md->disk) != dm_table_get_size(table)) goto out; __unbind(md); r = __bind(md, table); out: up(&md->suspend_lock); return r; }