From a3569061ea4bc59a8aba54f9e47e54f0b05382fb Mon Sep 17 00:00:00 2001
From: Mike Christie <mchristi@redhat.com>
Date: Tue, 28 Nov 2017 12:40:28 -0600
Subject: [PATCH] tcmu: merge common block release code
Git-commit: bf99ec13327bb5b0f6475aea8735c0ca34cc2a26
Patch-mainline: v4.16-rc1
References: bsc#1118978
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>
Acked-by: David Disseldorp <ddiss@suse.de>
---
drivers/target/target_core_user.c | 24 ++++++++----------------
1 file changed, 8 insertions(+), 16 deletions(-)
diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c
index 8f41283733dd..29b9f5efbd74 100644
--- a/drivers/target/target_core_user.c
+++ b/drivers/target/target_core_user.c
@@ -1331,21 +1331,19 @@ static int tcmu_check_and_free_pending_cmd(struct tcmu_cmd *cmd)
return -EINVAL;
}
-static void tcmu_blocks_release(struct tcmu_dev *udev)
+static void tcmu_blocks_release(struct radix_tree_root *blocks,
+ int start, int end)
{
int i;
struct page *page;
- /* Try to release all block pages */
- mutex_lock(&udev->cmdr_lock);
- for (i = 0; i <= udev->dbi_max; i++) {
- page = radix_tree_delete(&udev->data_blocks, i);
+ for (i = start; i < end; i++) {
+ page = radix_tree_delete(blocks, i);
if (page) {
__free_page(page);
atomic_dec(&global_db_count);
}
}
- mutex_unlock(&udev->cmdr_lock);
}
static void tcmu_dev_kref_release(struct kref *kref)
@@ -1369,7 +1367,9 @@ static void tcmu_dev_kref_release(struct kref *kref)
spin_unlock_irq(&udev->commands_lock);
WARN_ON(!all_expired);
- tcmu_blocks_release(udev);
+ mutex_lock(&udev->cmdr_lock);
+ tcmu_blocks_release(&udev->data_blocks, 0, udev->dbi_max + 1);
+ mutex_unlock(&udev->cmdr_lock);
call_rcu(&dev->rcu_head, tcmu_dev_call_rcu);
}
@@ -2007,8 +2007,6 @@ static int unmap_thread_fn(void *data)
struct tcmu_dev *udev;
loff_t off;
uint32_t start, end, block;
- struct page *page;
- int i;
while (!kthread_should_stop()) {
DEFINE_WAIT(__wait);
@@ -2056,13 +2054,7 @@ static int unmap_thread_fn(void *data)
unmap_mapping_range(udev->inode->i_mapping, off, 0, 1);
/* Release the block pages */
- for (i = start; i < end; i++) {
- page = radix_tree_delete(&udev->data_blocks, i);
- if (page) {
- __free_page(page);
- atomic_dec(&global_db_count);
- }
- }
+ tcmu_blocks_release(&udev->data_blocks, start, end);
mutex_unlock(&udev->cmdr_lock);
}
--
2.13.7