summaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorMike Christie <mchristi@redhat.com>2017-11-28 13:40:28 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2018-01-12 18:07:10 -0500
commitbf99ec13327bb5b0f6475aea8735c0ca34cc2a26 (patch)
tree4fe2578718085fe6727454484774c53031676bf3 /drivers/target
parent26d2b3106f6015b1d19ae5f8b0cc1fc7fe8e669e (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.c24
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
1305static void tcmu_blocks_release(struct tcmu_dev *udev) 1305static 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
1322static void tcmu_dev_kref_release(struct kref *kref) 1320static 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