|
@@ -880,14 +880,20 @@ sector_t target_to_linux_sector(struct se_device *dev, sector_t lb)
|
|
EXPORT_SYMBOL(target_to_linux_sector);
|
|
EXPORT_SYMBOL(target_to_linux_sector);
|
|
|
|
|
|
struct devices_idr_iter {
|
|
struct devices_idr_iter {
|
|
|
|
+ struct config_item *prev_item;
|
|
int (*fn)(struct se_device *dev, void *data);
|
|
int (*fn)(struct se_device *dev, void *data);
|
|
void *data;
|
|
void *data;
|
|
};
|
|
};
|
|
|
|
|
|
static int target_devices_idr_iter(int id, void *p, void *data)
|
|
static int target_devices_idr_iter(int id, void *p, void *data)
|
|
|
|
+ __must_hold(&device_mutex)
|
|
{
|
|
{
|
|
struct devices_idr_iter *iter = data;
|
|
struct devices_idr_iter *iter = data;
|
|
struct se_device *dev = p;
|
|
struct se_device *dev = p;
|
|
|
|
+ int ret;
|
|
|
|
+
|
|
|
|
+ config_item_put(iter->prev_item);
|
|
|
|
+ iter->prev_item = NULL;
|
|
|
|
|
|
/*
|
|
/*
|
|
* We add the device early to the idr, so it can be used
|
|
* We add the device early to the idr, so it can be used
|
|
@@ -898,7 +904,15 @@ static int target_devices_idr_iter(int id, void *p, void *data)
|
|
if (!(dev->dev_flags & DF_CONFIGURED))
|
|
if (!(dev->dev_flags & DF_CONFIGURED))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- return iter->fn(dev, iter->data);
|
|
|
|
|
|
+ iter->prev_item = config_item_get_unless_zero(&dev->dev_group.cg_item);
|
|
|
|
+ if (!iter->prev_item)
|
|
|
|
+ return 0;
|
|
|
|
+ mutex_unlock(&device_mutex);
|
|
|
|
+
|
|
|
|
+ ret = iter->fn(dev, iter->data);
|
|
|
|
+
|
|
|
|
+ mutex_lock(&device_mutex);
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -912,15 +926,13 @@ static int target_devices_idr_iter(int id, void *p, void *data)
|
|
int target_for_each_device(int (*fn)(struct se_device *dev, void *data),
|
|
int target_for_each_device(int (*fn)(struct se_device *dev, void *data),
|
|
void *data)
|
|
void *data)
|
|
{
|
|
{
|
|
- struct devices_idr_iter iter;
|
|
|
|
|
|
+ struct devices_idr_iter iter = { .fn = fn, .data = data };
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- iter.fn = fn;
|
|
|
|
- iter.data = data;
|
|
|
|
-
|
|
|
|
mutex_lock(&device_mutex);
|
|
mutex_lock(&device_mutex);
|
|
ret = idr_for_each(&devices_idr, target_devices_idr_iter, &iter);
|
|
ret = idr_for_each(&devices_idr, target_devices_idr_iter, &iter);
|
|
mutex_unlock(&device_mutex);
|
|
mutex_unlock(&device_mutex);
|
|
|
|
+ config_item_put(iter.prev_item);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|