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>
This commit is contained in:
parent
26d2b3106f
commit
bf99ec1332
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user