diff options
author | Mike Christie <mchristi@redhat.com> | 2017-11-28 13:40:28 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2018-01-12 18:07:10 -0500 |
commit | bf99ec13327bb5b0f6475aea8735c0ca34cc2a26 (patch) | |
tree | 4fe2578718085fe6727454484774c53031676bf3 /drivers/target | |
parent | 26d2b3106f6015b1d19ae5f8b0cc1fc7fe8e669e (diff) |
tcmu: merge common block release code
Have unmap_thread_fn use tcmu_blocks_release.
Signed-off-by: Mike Christie <mchristi@redhat.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r-- | drivers/target/target_core_user.c | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c index 6bcaa8b5684c..d9fd91ee8282 100644 --- a/drivers/target/target_core_user.c +++ b/drivers/target/target_core_user.c | |||
@@ -1302,21 +1302,19 @@ static int tcmu_check_and_free_pending_cmd(struct tcmu_cmd *cmd) | |||
1302 | return -EINVAL; | 1302 | return -EINVAL; |
1303 | } | 1303 | } |
1304 | 1304 | ||
1305 | static void tcmu_blocks_release(struct tcmu_dev *udev) | 1305 | static void tcmu_blocks_release(struct radix_tree_root *blocks, |
1306 | int start, int end) | ||
1306 | { | 1307 | { |
1307 | int i; | 1308 | int i; |
1308 | struct page *page; | 1309 | struct page *page; |
1309 | 1310 | ||
1310 | /* Try to release all block pages */ | 1311 | for (i = start; i < end; i++) { |
1311 | mutex_lock(&udev->cmdr_lock); | 1312 | page = radix_tree_delete(blocks, i); |
1312 | for (i = 0; i <= udev->dbi_max; i++) { | ||
1313 | page = radix_tree_delete(&udev->data_blocks, i); | ||
1314 | if (page) { | 1313 | if (page) { |
1315 | __free_page(page); | 1314 | __free_page(page); |
1316 | atomic_dec(&global_db_count); | 1315 | atomic_dec(&global_db_count); |
1317 | } | 1316 | } |
1318 | } | 1317 | } |
1319 | mutex_unlock(&udev->cmdr_lock); | ||
1320 | } | 1318 | } |
1321 | 1319 | ||
1322 | static void tcmu_dev_kref_release(struct kref *kref) | 1320 | static void tcmu_dev_kref_release(struct kref *kref) |
@@ -1340,7 +1338,9 @@ static void tcmu_dev_kref_release(struct kref *kref) | |||
1340 | spin_unlock_irq(&udev->commands_lock); | 1338 | spin_unlock_irq(&udev->commands_lock); |
1341 | WARN_ON(!all_expired); | 1339 | WARN_ON(!all_expired); |
1342 | 1340 | ||
1343 | tcmu_blocks_release(udev); | 1341 | mutex_lock(&udev->cmdr_lock); |
1342 | tcmu_blocks_release(&udev->data_blocks, 0, udev->dbi_max + 1); | ||
1343 | mutex_unlock(&udev->cmdr_lock); | ||
1344 | 1344 | ||
1345 | call_rcu(&dev->rcu_head, tcmu_dev_call_rcu); | 1345 | call_rcu(&dev->rcu_head, tcmu_dev_call_rcu); |
1346 | } | 1346 | } |
@@ -1978,8 +1978,6 @@ static int unmap_thread_fn(void *data) | |||
1978 | struct tcmu_dev *udev; | 1978 | struct tcmu_dev *udev; |
1979 | loff_t off; | 1979 | loff_t off; |
1980 | uint32_t start, end, block; | 1980 | uint32_t start, end, block; |
1981 | struct page *page; | ||
1982 | int i; | ||
1983 | 1981 | ||
1984 | while (!kthread_should_stop()) { | 1982 | while (!kthread_should_stop()) { |
1985 | DEFINE_WAIT(__wait); | 1983 | DEFINE_WAIT(__wait); |
@@ -2027,13 +2025,7 @@ static int unmap_thread_fn(void *data) | |||
2027 | unmap_mapping_range(udev->inode->i_mapping, off, 0, 1); | 2025 | unmap_mapping_range(udev->inode->i_mapping, off, 0, 1); |
2028 | 2026 | ||
2029 | /* Release the block pages */ | 2027 | /* Release the block pages */ |
2030 | for (i = start; i < end; i++) { | 2028 | tcmu_blocks_release(&udev->data_blocks, start, end); |
2031 | page = radix_tree_delete(&udev->data_blocks, i); | ||
2032 | if (page) { | ||
2033 | __free_page(page); | ||
2034 | atomic_dec(&global_db_count); | ||
2035 | } | ||
2036 | } | ||
2037 | mutex_unlock(&udev->cmdr_lock); | 2029 | mutex_unlock(&udev->cmdr_lock); |
2038 | } | 2030 | } |
2039 | 2031 | ||