|
@@ -242,19 +242,17 @@ static int shmem_radix_tree_replace(struct address_space *mapping,
|
|
|
pgoff_t index, void *expected, void *replacement)
|
|
|
{
|
|
|
void **pslot;
|
|
|
- void *item = NULL;
|
|
|
+ void *item;
|
|
|
|
|
|
VM_BUG_ON(!expected);
|
|
|
+ VM_BUG_ON(!replacement);
|
|
|
pslot = radix_tree_lookup_slot(&mapping->page_tree, index);
|
|
|
- if (pslot)
|
|
|
- item = radix_tree_deref_slot_protected(pslot,
|
|
|
- &mapping->tree_lock);
|
|
|
+ if (!pslot)
|
|
|
+ return -ENOENT;
|
|
|
+ item = radix_tree_deref_slot_protected(pslot, &mapping->tree_lock);
|
|
|
if (item != expected)
|
|
|
return -ENOENT;
|
|
|
- if (replacement)
|
|
|
- radix_tree_replace_slot(pslot, replacement);
|
|
|
- else
|
|
|
- radix_tree_delete(&mapping->page_tree, index);
|
|
|
+ radix_tree_replace_slot(pslot, replacement);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -386,14 +384,15 @@ export:
|
|
|
static int shmem_free_swap(struct address_space *mapping,
|
|
|
pgoff_t index, void *radswap)
|
|
|
{
|
|
|
- int error;
|
|
|
+ void *old;
|
|
|
|
|
|
spin_lock_irq(&mapping->tree_lock);
|
|
|
- error = shmem_radix_tree_replace(mapping, index, radswap, NULL);
|
|
|
+ old = radix_tree_delete_item(&mapping->page_tree, index, radswap);
|
|
|
spin_unlock_irq(&mapping->tree_lock);
|
|
|
- if (!error)
|
|
|
- free_swap_and_cache(radix_to_swp_entry(radswap));
|
|
|
- return error;
|
|
|
+ if (old != radswap)
|
|
|
+ return -ENOENT;
|
|
|
+ free_swap_and_cache(radix_to_swp_entry(radswap));
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/*
|