Revert "dm: fix a race condition in retrieve_deps"
This reverts commit dbf1a71985
which is
commit f6007dce0cd35d634d9be91ef3515a6385dcee16 upstream.
It breaks the Android ABI and can be brought back later in an abi-safe
way if needed.
Bug: 161946584
Change-Id: Ief37eab88188180ba9884987d9731b10d1527051
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
parent
d07ffd5565
commit
7bcb060a61
@ -214,7 +214,6 @@ struct dm_table {
|
||||
|
||||
/* a list of devices used by this table */
|
||||
struct list_head devices;
|
||||
struct rw_semaphore devices_lock;
|
||||
|
||||
/* events get handed up using this callback */
|
||||
void (*event_fn)(void *);
|
||||
|
@ -1566,8 +1566,6 @@ static void retrieve_deps(struct dm_table *table,
|
||||
struct dm_dev_internal *dd;
|
||||
struct dm_target_deps *deps;
|
||||
|
||||
down_read(&table->devices_lock);
|
||||
|
||||
deps = get_result_buffer(param, param_size, &len);
|
||||
|
||||
/*
|
||||
@ -1582,7 +1580,7 @@ static void retrieve_deps(struct dm_table *table,
|
||||
needed = struct_size(deps, dev, count);
|
||||
if (len < needed) {
|
||||
param->flags |= DM_BUFFER_FULL_FLAG;
|
||||
goto out;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1594,9 +1592,6 @@ static void retrieve_deps(struct dm_table *table,
|
||||
deps->dev[count++] = huge_encode_dev(dd->dm_dev->bdev->bd_dev);
|
||||
|
||||
param->data_size = param->data_start + needed;
|
||||
|
||||
out:
|
||||
up_read(&table->devices_lock);
|
||||
}
|
||||
|
||||
static int table_deps(struct file *filp, struct dm_ioctl *param, size_t param_size)
|
||||
|
@ -134,7 +134,6 @@ int dm_table_create(struct dm_table **result, fmode_t mode,
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_LIST_HEAD(&t->devices);
|
||||
init_rwsem(&t->devices_lock);
|
||||
|
||||
if (!num_targets)
|
||||
num_targets = KEYS_PER_NODE;
|
||||
@ -363,19 +362,15 @@ int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
down_write(&t->devices_lock);
|
||||
|
||||
dd = find_device(&t->devices, dev);
|
||||
if (!dd) {
|
||||
dd = kmalloc(sizeof(*dd), GFP_KERNEL);
|
||||
if (!dd) {
|
||||
r = -ENOMEM;
|
||||
goto unlock_ret_r;
|
||||
}
|
||||
if (!dd)
|
||||
return -ENOMEM;
|
||||
|
||||
if ((r = dm_get_table_device(t->md, dev, mode, &dd->dm_dev))) {
|
||||
kfree(dd);
|
||||
goto unlock_ret_r;
|
||||
return r;
|
||||
}
|
||||
|
||||
refcount_set(&dd->count, 1);
|
||||
@ -385,17 +380,12 @@ int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode,
|
||||
} else if (dd->dm_dev->mode != (mode | dd->dm_dev->mode)) {
|
||||
r = upgrade_mode(dd, mode, t->md);
|
||||
if (r)
|
||||
goto unlock_ret_r;
|
||||
return r;
|
||||
}
|
||||
refcount_inc(&dd->count);
|
||||
out:
|
||||
up_write(&t->devices_lock);
|
||||
*result = dd->dm_dev;
|
||||
return 0;
|
||||
|
||||
unlock_ret_r:
|
||||
up_write(&t->devices_lock);
|
||||
return r;
|
||||
}
|
||||
EXPORT_SYMBOL(dm_get_device);
|
||||
|
||||
@ -431,12 +421,9 @@ static int dm_set_device_limits(struct dm_target *ti, struct dm_dev *dev,
|
||||
void dm_put_device(struct dm_target *ti, struct dm_dev *d)
|
||||
{
|
||||
int found = 0;
|
||||
struct dm_table *t = ti->table;
|
||||
struct list_head *devices = &t->devices;
|
||||
struct list_head *devices = &ti->table->devices;
|
||||
struct dm_dev_internal *dd;
|
||||
|
||||
down_write(&t->devices_lock);
|
||||
|
||||
list_for_each_entry(dd, devices, list) {
|
||||
if (dd->dm_dev == d) {
|
||||
found = 1;
|
||||
@ -445,17 +432,14 @@ void dm_put_device(struct dm_target *ti, struct dm_dev *d)
|
||||
}
|
||||
if (!found) {
|
||||
DMERR("%s: device %s not in table devices list",
|
||||
dm_device_name(t->md), d->name);
|
||||
goto unlock_ret;
|
||||
dm_device_name(ti->table->md), d->name);
|
||||
return;
|
||||
}
|
||||
if (refcount_dec_and_test(&dd->count)) {
|
||||
dm_put_table_device(t->md, d);
|
||||
dm_put_table_device(ti->table->md, d);
|
||||
list_del(&dd->list);
|
||||
kfree(dd);
|
||||
}
|
||||
|
||||
unlock_ret:
|
||||
up_write(&t->devices_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(dm_put_device);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user