Commit bf99ec13 authored by Mike Christie's avatar Mike Christie Committed by Nicholas Bellinger

tcmu: merge common block release code

Have unmap_thread_fn use tcmu_blocks_release.
Signed-off-by: default avatarMike Christie <mchristi@redhat.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 26d2b310
...@@ -1302,21 +1302,19 @@ static int tcmu_check_and_free_pending_cmd(struct tcmu_cmd *cmd) ...@@ -1302,21 +1302,19 @@ static int tcmu_check_and_free_pending_cmd(struct tcmu_cmd *cmd)
return -EINVAL; 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; int i;
struct page *page; struct page *page;
/* Try to release all block pages */ for (i = start; i < end; i++) {
mutex_lock(&udev->cmdr_lock); page = radix_tree_delete(blocks, i);
for (i = 0; i <= udev->dbi_max; i++) {
page = radix_tree_delete(&udev->data_blocks, i);
if (page) { if (page) {
__free_page(page); __free_page(page);
atomic_dec(&global_db_count); atomic_dec(&global_db_count);
} }
} }
mutex_unlock(&udev->cmdr_lock);
} }
static void tcmu_dev_kref_release(struct kref *kref) static void tcmu_dev_kref_release(struct kref *kref)
...@@ -1340,7 +1338,9 @@ static void tcmu_dev_kref_release(struct kref *kref) ...@@ -1340,7 +1338,9 @@ static void tcmu_dev_kref_release(struct kref *kref)
spin_unlock_irq(&udev->commands_lock); spin_unlock_irq(&udev->commands_lock);
WARN_ON(!all_expired); 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); call_rcu(&dev->rcu_head, tcmu_dev_call_rcu);
} }
...@@ -1978,8 +1978,6 @@ static int unmap_thread_fn(void *data) ...@@ -1978,8 +1978,6 @@ static int unmap_thread_fn(void *data)
struct tcmu_dev *udev; struct tcmu_dev *udev;
loff_t off; loff_t off;
uint32_t start, end, block; uint32_t start, end, block;
struct page *page;
int i;
while (!kthread_should_stop()) { while (!kthread_should_stop()) {
DEFINE_WAIT(__wait); DEFINE_WAIT(__wait);
...@@ -2027,13 +2025,7 @@ static int unmap_thread_fn(void *data) ...@@ -2027,13 +2025,7 @@ static int unmap_thread_fn(void *data)
unmap_mapping_range(udev->inode->i_mapping, off, 0, 1); unmap_mapping_range(udev->inode->i_mapping, off, 0, 1);
/* Release the block pages */ /* Release the block pages */
for (i = start; i < end; i++) { tcmu_blocks_release(&udev->data_blocks, start, end);
page = radix_tree_delete(&udev->data_blocks, i);
if (page) {
__free_page(page);
atomic_dec(&global_db_count);
}
}
mutex_unlock(&udev->cmdr_lock); mutex_unlock(&udev->cmdr_lock);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment