|
@@ -168,24 +168,18 @@ int nilfs_btnode_prepare_change_key(struct address_space *btnc,
|
|
|
ctxt->newbh = NULL;
|
|
|
|
|
|
if (inode->i_blkbits == PAGE_SHIFT) {
|
|
|
- lock_page(obh->b_page);
|
|
|
- /*
|
|
|
- * We cannot call radix_tree_preload for the kernels older
|
|
|
- * than 2.6.23, because it is not exported for modules.
|
|
|
- */
|
|
|
+ struct page *opage = obh->b_page;
|
|
|
+ lock_page(opage);
|
|
|
retry:
|
|
|
- err = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM);
|
|
|
- if (err)
|
|
|
- goto failed_unlock;
|
|
|
/* BUG_ON(oldkey != obh->b_page->index); */
|
|
|
- if (unlikely(oldkey != obh->b_page->index))
|
|
|
- NILFS_PAGE_BUG(obh->b_page,
|
|
|
+ if (unlikely(oldkey != opage->index))
|
|
|
+ NILFS_PAGE_BUG(opage,
|
|
|
"invalid oldkey %lld (newkey=%lld)",
|
|
|
(unsigned long long)oldkey,
|
|
|
(unsigned long long)newkey);
|
|
|
|
|
|
xa_lock_irq(&btnc->i_pages);
|
|
|
- err = radix_tree_insert(&btnc->i_pages, newkey, obh->b_page);
|
|
|
+ err = __xa_insert(&btnc->i_pages, newkey, opage, GFP_NOFS);
|
|
|
xa_unlock_irq(&btnc->i_pages);
|
|
|
/*
|
|
|
* Note: page->index will not change to newkey until
|
|
@@ -193,7 +187,6 @@ retry:
|
|
|
* To protect the page in intermediate state, the page lock
|
|
|
* is held.
|
|
|
*/
|
|
|
- radix_tree_preload_end();
|
|
|
if (!err)
|
|
|
return 0;
|
|
|
else if (err != -EEXIST)
|
|
@@ -203,7 +196,7 @@ retry:
|
|
|
if (!err)
|
|
|
goto retry;
|
|
|
/* fallback to copy mode */
|
|
|
- unlock_page(obh->b_page);
|
|
|
+ unlock_page(opage);
|
|
|
}
|
|
|
|
|
|
nbh = nilfs_btnode_create_block(btnc, newkey);
|
|
@@ -243,9 +236,8 @@ void nilfs_btnode_commit_change_key(struct address_space *btnc,
|
|
|
mark_buffer_dirty(obh);
|
|
|
|
|
|
xa_lock_irq(&btnc->i_pages);
|
|
|
- radix_tree_delete(&btnc->i_pages, oldkey);
|
|
|
- radix_tree_tag_set(&btnc->i_pages, newkey,
|
|
|
- PAGECACHE_TAG_DIRTY);
|
|
|
+ __xa_erase(&btnc->i_pages, oldkey);
|
|
|
+ __xa_set_mark(&btnc->i_pages, newkey, PAGECACHE_TAG_DIRTY);
|
|
|
xa_unlock_irq(&btnc->i_pages);
|
|
|
|
|
|
opage->index = obh->b_blocknr = newkey;
|
|
@@ -275,7 +267,7 @@ void nilfs_btnode_abort_change_key(struct address_space *btnc,
|
|
|
|
|
|
if (nbh == NULL) { /* blocksize == pagesize */
|
|
|
xa_lock_irq(&btnc->i_pages);
|
|
|
- radix_tree_delete(&btnc->i_pages, newkey);
|
|
|
+ __xa_erase(&btnc->i_pages, newkey);
|
|
|
xa_unlock_irq(&btnc->i_pages);
|
|
|
unlock_page(ctxt->bh->b_page);
|
|
|
} else
|